{"version":3,"file":"chat-content.mjs","sources":["../../../pro-components/chat/chat-content/chat-content.tsx"],"sourcesContent":["import { defineComponent, computed, inject, onMounted, ComputedRef } from 'vue';\nimport { useConfig } from 'tdesign-vue-next/es/config-provider/hooks';\nimport { usePrefixClass } from '@tdesign/shared-hooks';\nimport { Marked } from 'marked';\nimport { markedHighlight } from 'marked-highlight';\nimport hljs from 'highlight.js';\nimport Clipboard from 'clipboard';\nimport props from './chat-content-props';\nimport ChatMarkdown from '../chat-markdown';\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\n    // role 没被注入的时候，使用props.role来自chat-item传入，content在插槽里的inject，修复role数据混乱问题\n    const injectedRole = inject<ComputedRef<string>>('role', null);\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      const { copyCodeBtnText, copyCodeSuccessText } = globalConfig.value;\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\">${globalConfig.value.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 (props.markdownProps.engine !== 'marked') return;\n      if (!markdown) {\n        return '<div class=\"waiting\"></div>';\n      }\n      return marked.parse(markdown);\n    };\n    const textInfo = computed(() => {\n      if (props.status === 'error' || ['model-change', 'system', 'error'].includes(role.value)) {\n        return props.content || '';\n      }\n      if (typeof props.content === 'string') {\n        return role.value === 'user' ? escape(props.content) : getHtmlByMarked(props.content);\n      }\n      // 处理结构化内容类型\n      if (typeof props.content === 'object' && props.content !== null) {\n        const { type, data } = props.content;\n        switch (type) {\n          case 'text':\n            return escape(data || '');\n          case 'markdown':\n            return getHtmlByMarked(data || '');\n          default:\n            return getHtmlByMarked(JSON.stringify(data) || '');\n        }\n      }\n      // 如果内容为空或不是字符串，返回空内容\n      return props.content || '';\n    });\n    return () => (\n      <div class={[`${COMPONENT_NAME.value}__text`]}>\n        {/* role兼容旧版 status为error*/}\n        {props.status === 'error' ||\n        (typeof props.content === 'object' && props.content?.type === 'text') ||\n        (role.value && ['user', 'model-change', 'system'].includes(role.value)) ? (\n          <div class={[`${COMPONENT_NAME.value}__text--user`, `other__${props.status || role.value}`]}>\n            <pre v-html={textInfo.value}></pre>\n          </div>\n        ) : props.markdownProps?.engine && props.markdownProps?.engine === 'marked' ? (\n          <div class={`${COMPONENT_NAME.value}__text__assistant`}>\n            <div\n              class={[`${COMPONENT_NAME.value}__text__content`, `${COMPONENT_NAME.value}__text--assistant`]}\n              v-html={textInfo.value}\n            ></div>\n          </div>\n        ) : (\n          <ChatMarkdown\n            content={\n              typeof props.content === 'string'\n                ? props.content\n                : typeof props.content === 'object' && props.content?.type === 'markdown'\n                ? props.content.data\n                : JSON.stringify(props.content)\n            }\n            options={props.markdownProps.options}\n          />\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","injectedRole","inject","role","computed","value","onMounted","clipboard","Clipboard","concat","target","trigger","parentNode","nextElementSibling","_globalConfig$value","copyCodeBtnText","copyCodeSuccessText","on","e","textContent","setTimeout","clearSelection","marked","Marked","markedHighlight","highlight","code","hljs","highlightAuto","renderer","lang","escaped","getHtmlByMarked","markdown","markdownProps","engine","parse","textInfo","status","includes","content","_typeof","_props2$content","type","data","JSON","stringify","_props2$content2","_props2$markdownProps","_props2$markdownProps2","_props2$content3","_createVNode","ChatMarkdown","options"],"mappings":"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"}