{"version":3,"file":"chat-content.mjs","sources":["../../src/chat/chat-content.tsx"],"sourcesContent":["import { defineComponent, computed, onMounted, inject, ComputedRef } from 'vue';\nimport Clipboard from 'clipboard';\nimport hljs from 'highlight.js';\nimport { Marked } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\nimport props from './props';\nimport { usePrefixClass, useConfig } from '../hooks/useConfig';\n\nconst escapeTest = /[&<>\"']/;\nconst escapeReplace = new RegExp(escapeTest.source, 'g');\nconst escapeTestNoEncode = /[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/;\nconst escapeReplaceNoEncode = new RegExp(escapeTestNoEncode.source, 'g');\ntype IEscape = {\n  [key in '&<>\"\\'']: string;\n};\nconst escapeReplacements: IEscape = {\n  // @ts-ignore\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  \"'\": '&#39;',\n};\nconst getEscapeReplacement = (ch: string): string => escapeReplacements[ch as keyof IEscape];\n\nfunction escape(html: string, encode: Boolean = false) {\n  if (encode) {\n    if (escapeTest.test(html)) {\n      return html.replace(escapeReplace, getEscapeReplacement);\n    }\n  } else if (escapeTestNoEncode.test(html)) {\n    return html.replace(escapeReplaceNoEncode, getEscapeReplacement);\n  }\n\n  return html;\n}\n\nexport default defineComponent({\n  name: 'TChatContent',\n  components: {},\n  props,\n  setup(props) {\n    const COMPONENT_NAME = usePrefixClass('chat');\n    const { globalConfig } = useConfig('chat');\n    const { copyCodeBtnText, copyCodeSuccessText } = globalConfig.value;\n\n    // role 没被注入的时候，使用props.role来自chat-item传入，content在插槽里的inject，修复role数据混乱问题\n    const injectedRole = inject<ComputedRef<string>>('role');\n    const role = computed(() => props.role || injectedRole?.value || '');\n    onMounted(() => {\n      const clipboard = new Clipboard(`.${COMPONENT_NAME.value}__copy-btn`, {\n        target: (trigger: HTMLDivElement) => (trigger.parentNode as HTMLElement).nextElementSibling,\n      });\n\n      clipboard.on('success', (e) => {\n        e.trigger.textContent = copyCodeSuccessText;\n        setTimeout(() => {\n          e.trigger.textContent = copyCodeBtnText;\n        }, 2000);\n        e.clearSelection();\n      });\n    });\n\n    const marked = new Marked(\n      markedHighlight({\n        highlight(code) {\n          return hljs.highlightAuto(code).value;\n        },\n      }),\n      {\n        renderer: {\n          code(code, lang, escaped) {\n            return `<pre class=\"hljs\"><div class=\"t-chat__code-header\">\n        <span class=\"t-chat__language-txt\">${escape(lang) || ''}</span>\n        <div class=\"t-chat__copy-btn\" data-clipboard-action=\"copy\">${copyCodeBtnText}</div>\n        </div><code class=\"hljs language-${escape(lang)}\" >${escaped ? code : escape(code)}</code></pre>`;\n          },\n        },\n      },\n    );\n\n    const getHtmlByMarked = (markdown: string) => {\n      if (!markdown) {\n        return '<div class=\"waiting\"></div>';\n      }\n      return marked.parse(markdown);\n    };\n    const textInfo = computed(() => {\n      if (role.value === 'model-change') {\n        return props.content || '';\n      }\n\n      if (role.value === 'user' && typeof props.content === 'string') {\n        return escape(props.content);\n      }\n      // @ts-ignore 暂时处理\n      return getHtmlByMarked(props.content);\n    });\n    return () => (\n      <div class={[`${COMPONENT_NAME.value}__text`]}>\n        {role.value === 'user' ? (\n          <div class={`${COMPONENT_NAME.value}__text--${role.value}`}>\n            <pre v-html={textInfo.value}></pre>\n          </div>\n        ) : (\n          <div class={`${COMPONENT_NAME.value}__text__assistant`}>\n            <div\n              class={[`${COMPONENT_NAME.value}__text__content`, `${COMPONENT_NAME.value}__text--${role.value}`]}\n              v-html={textInfo.value}\n            ></div>\n          </div>\n        )}\n      </div>\n    );\n  },\n});\n"],"names":["escapeTest","escapeReplace","RegExp","source","escapeTestNoEncode","escapeReplaceNoEncode","escapeReplacements","getEscapeReplacement","ch","escape","html","encode","arguments","length","undefined","test","replace","defineComponent","name","components","props","setup","COMPONENT_NAME","usePrefixClass","_useConfig","useConfig","globalConfig","_globalConfig$value","value","copyCodeBtnText","copyCodeSuccessText","injectedRole","inject","role","computed","onMounted","clipboard","Clipboard","concat","target","trigger","parentNode","nextElementSibling","on","e","textContent","setTimeout","clearSelection","marked","Marked","markedHighlight","highlight","code","hljs","highlightAuto","renderer","lang","escaped","getHtmlByMarked","markdown","parse","textInfo","content","_createVNode"],"mappings":"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"}