feat: 优化打字机的显示效果,避免 网页闭合标签扰乱

This commit is contained in:
2025-07-29 22:17:00 +08:00
parent 9353af4973
commit ea941341c6

View File

@@ -14,14 +14,13 @@
<span class="speakLoadingToast pv10">
<van-loading type="spinner" :color="primaryColor" size="20px" v-if="!message.text" />
<span class="loading-text">{{ message.text ? '思考完成' : '思考中...' }}</span>
<van-icon name="arrow-up" :class="message.showThink ? 'rate360' : 'rate180'" @click="showThink(message)"
v-if="message.think" />
<van-icon name="arrow-up" :class="message.showThink ? 'rate360' : 'rate180'" @click="showThink(message)" v-if="message.think" />
</span>
<!--开启思考-->
<p v-html="md.render(message.think)" v-if="message.think && message.showThink" class="thinkText" />
</span>
<div style="width: 100%">
<p v-html="render(message)" class='render-container'></p>
<p v-html="render(message)" class="render-container"></p>
<span class="speakLoadingToast pv10" v-if="!filterVisible(message)">
<van-loading type="spinner" :color="primaryColor" size="20px" />
</span>
@@ -51,7 +50,7 @@ import markdownItKatex from 'markdown-it-katex'
const md = new MarkdownIt({
html: true,
linkify: true,
typographer: true,
typographer: true
}).use(markdownItKatex)
export default {
@@ -60,21 +59,21 @@ export default {
props: {
messagesList: {
type: Array,
default: () => [],
default: () => []
},
thinkOk: {
type: Boolean,
default: false,
default: false
},
isDeep: {
type: Boolean,
default: false,
},
default: false
}
},
data() {
return {
md,
primaryColor: '#57a6fc',
primaryColor: '#57a6fc'
}
},
methods: {
@@ -85,23 +84,24 @@ export default {
this.$emit('setProductName', e)
},
filterVisible(message) {
// 捕获 不包含 < 的后置标签 ( .*>)
let _text = message.text.replace(/(?<![/|<])^\w*>/g, '')
// 把 未闭合的标签替换成空白
_text = _text.replace(/<\/\w*$/g, '')
return _text
if (!message.text.startsWith('<')) {
return message.text
let text = message.text
// 如果开头是中文,直接返回
if (new RegExp('^[\u4e00-\u9fa5]+', 'g').test(text)) return text
// 捕获 不包含 < 的后置标签 span> /span> a</span>
text = text.replace(/^[\/]?[a-zA-z0-9]+[</\w>]+/g, '')
// 尝试匹配 </abc> 标签
text = text.replace(/^<\/\w+>/g, '')
// 尝试把 </ 标签去除
text = text.replace(/[<\/]+$/g, '')
console.log(text);
return text
}
// 只把 text 标签内容渲染
let match = /<text>([^<]*)(?:<\/text>)?/.exec(message.text)
let text = match ? match[1] : ''
// 捕获 不包含 < 的后置标签 ( .*>)
text = text.replace(/(?<![/|<])^\w*>/g, '')
// 把 未闭合的标签替换成空白
text = text.replace(/<\/\w*$/g, '')
console.log(text);
return text
},
showThink(message) {
@@ -119,7 +119,7 @@ export default {
}
// 触发父组件的更新事件
this.$emit('update-message', { ...message })
},
}
},
mounted() {
window.md = md