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 ''; +}