## **Bug 描述:** > 包含特定语法(`${...}` 和 HTML 标签)的长文本在发送后,消息气泡内容发生错乱。输入框的内容与最终发送/展示的内容不一致,疑似前端 Markdown 解析或插值语法冲突。 <img width="858" height="157" alt="Image" src="https://github.com/user-attachments/assets/1d3840b2-2293-429f-86ba-1d8b886047da" /> ## **复现步骤:** > 1. 在输入框输入文本:`<TableOperator v-model="columns" :tableId="TABLE_ID_CONST.BUSINESS.${basic.businessModule.toUpperCase()}.Demo" :refresh="queryData" /> 咋更离谱呢,要不就去掉 ${basic.businessModule.toUpperCase()} 不要这个变量,直接拼后面部分` > 2. 点击发送。 > 3. 观察消息气泡,发现代码部分被吞掉,或者显示格式完全错乱。 > ## **期望结果:** 发送出来的文本应该和输入框里的一模一样,即使它包含代码和特殊符号。
Activity
feat(chat): 增加单条用户消息原文与渲染切换
tossp commentedon Oct 25, 2026
我们也遇到了同类情况:直接粘贴 HTML 的 innerHTML / outerHTML 后,消息气泡会把标签当作可渲染内容处理,导致输入内容与展示内容不一致。使用本议题中的
<TableOperator … />样例,在main(e533d9b)也能复现标签内容被吞掉。补充一下本次排查结果,供参考:
${…}内容做求值或转写。${…}并不是在前端被当作 JavaScript 执行。rehypeRaw解析并经rehypeSanitize清理;普通 HTML 可能被渲染,不支持的标签及属性可能被移除。因此,存储的消息正文与气泡的视觉展示需要分开看待。我们实现并测试了一个不改变现有默认行为的展示方案:在每条带文字的用户消息下,保留复制、从此处编辑、新会话三个操作,新增第四个动态操作:
${…}、实体、Markdown 和公式不再进入解析管线。该方案已通过单元测试以及 1280px / 375px 浏览器回归,使用者也已部署测试并反馈正常。对应实现已提交为 #1420,供维护者评估。
需要明确的是:这提供了查看原文的入口,并未把所有用户消息的默认展示都改成纯文本。因此先作为本议题的补充方案,不预设它已满足本议题的全部预期,也不自动关闭议题。
test(chat): 将 Mermaid 原文按钮定位限定在代码块内
fix(chat): show HTML in user messages as text, like pi's TUI (#1444)