From 2de89ad631fec05cd3fe5920feb094d6136133a8 Mon Sep 17 00:00:00 2001 From: thzxx Date: Sat, 27 Jun 2026 23:00:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BB=A3=E7=A0=81=E5=9D=97=20[object=20?= =?UTF-8?q?Object]=20=E2=80=94=20rehype-highlight=20=E6=9B=BF=E6=8D=A2=20s?= =?UTF-8?q?pan=20=E5=90=8E=20String()=20=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: rehype-highlight 将代码文本替换为 元素后, children 变成 React 元素数组, String(children) → '[object Object]' 修复: extractTextContent 递归提取纯文本,绕过语法高亮 span --- src/components/chat/AssistantMessage.tsx | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/chat/AssistantMessage.tsx b/src/components/chat/AssistantMessage.tsx index f2a7091..05f3e5f 100644 --- a/src/components/chat/AssistantMessage.tsx +++ b/src/components/chat/AssistantMessage.tsx @@ -118,7 +118,8 @@ export function AssistantMessage({ message, isStreaming, streamContent }: Assist components={{ code({ className, children, ...props }) { const match = /language-(\w+)/.exec(className ?? ''); - const codeStr = String(children).replace(/\n$/, ''); + // rehype-highlight 会把代码替换为 高亮元素,需提取纯文本 + const codeStr = extractTextContent(children).replace(/\n$/, ''); if (!match) return {children}; return ; }, @@ -185,3 +186,15 @@ function CodeBlock({ language, code }: { language: string; code: string }): Reac ); } + +/** 从 React children(可能含高亮 span)递归提取纯文本 */ +function extractTextContent(children: React.ReactNode): string { + if (typeof children === 'string') return children; + if (typeof children === 'number') return String(children); + if (!children) return ''; + if (Array.isArray(children)) return children.map(extractTextContent).join(''); + if (typeof children === 'object' && 'props' in children) { + return extractTextContent((children as React.ReactElement).props.children); + } + return ''; +}