chore: render katex in markdown

This commit is contained in:
jialin
2025-02-18 19:51:22 +08:00
parent ea34431cf7
commit 4c77151877
26 changed files with 693 additions and 208 deletions
@@ -1,4 +1,4 @@
import MarkdownViewer from '@/components/markdown-viewer';
import FullMarkdown from '@/components/markdown-viewer/full-markdown';
import { Input } from 'antd';
import classNames from 'classnames';
import _ from 'lodash';
@@ -35,7 +35,9 @@ const MessageBody: React.FC<MessageBodyProps> = ({
thinkerRef.current = new ThinkParser();
}
if (actions?.includes('markdown')) {
return thinkerRef.current.parse(data.content);
const res = thinkerRef.current.parse(data.content);
console.log('markdown parse:', res);
return res;
}
return {
thought: '',
@@ -206,12 +208,9 @@ const MessageBody: React.FC<MessageBodyProps> = ({
{actions?.includes('markdown') ? (
<>
<ThinkContent content={content.thought}></ThinkContent>
<div style={{ paddingInline: 4 }}>
<MarkdownViewer
content={content.result || ''}
theme="light"
/>
</div>
<FullMarkdown
content={`${content.result || ''}`}
></FullMarkdown>
</>
) : (
<Input.TextArea
@@ -18,31 +18,31 @@ class ThinkParser {
if (!this.collecting) {
if (endIndex !== -1 && (startIndex === -1 || endIndex < startIndex)) {
// 1 发现 `</think>`,但之前没有 `<think>`
// `result` + `</think>` 之前的内容作为 `thought`
// 1 Found `</think>`, but there was no `<think>` before:
// Take `result` + the content before `</think>` as `thought`
this.thought =
this.result + chunk.substring(this.lastCheckedIndex, endIndex);
this.result = ''; // **清空 result**
this.lastCheckedIndex = endIndex + 8; // 跳过 `</think>`
this.result = ''; // **clear result**
this.lastCheckedIndex = endIndex + 8; // Skip `</think>`
} else if (startIndex !== -1) {
// 2 发现 `<think>`,进入思考模式:
// 2 Found `<think>`, start thinking mode:
this.result += chunk.substring(this.lastCheckedIndex, startIndex);
this.collecting = true;
this.lastCheckedIndex = startIndex + 7; // 跳过 `<think>`
this.lastCheckedIndex = startIndex + 7; // Skip `<think>`
} else {
// 3 没有 `<think>` 也没有 `</think>`,直接追加到 `result`
// 3 Still in normal mode, append to `result`
this.result += chunk.substring(this.lastCheckedIndex);
this.lastCheckedIndex = chunk.length;
}
} else {
if (endIndex !== -1) {
// 4 发现 `</think>`,结束思考模式:
// 4 Found `</think>`, end thinking mode:
this.thought += chunk.substring(this.lastCheckedIndex, endIndex);
this.collecting = false;
this.lastCheckedIndex = endIndex + 8; // 跳过 `</think>`
this.lastCheckedIndex = endIndex + 8; // Skip `</think>`
} else {
// 5 仍在思考模式中,追加到 `thought`
// 5 Still in thinking mode, append to `thought`
this.thought += chunk.substring(this.lastCheckedIndex);
this.lastCheckedIndex = chunk.length;
}