diff --git a/src/renderer/src/pages/home/Markdown/Markdown.tsx b/src/renderer/src/pages/home/Markdown/Markdown.tsx index 8cd65258..f6ec08b6 100644 --- a/src/renderer/src/pages/home/Markdown/Markdown.tsx +++ b/src/renderer/src/pages/home/Markdown/Markdown.tsx @@ -17,7 +17,7 @@ interface Props { } const rehypePlugins = [rehypeKatex] -const remarkPlugins = [remarkGfm, remarkMath] +const remarkPlugins = [remarkMath, remarkGfm] const components = { code: CodeBlock, @@ -31,7 +31,7 @@ const Markdown: FC = ({ message }) => { const empty = isEmpty(message.content) const paused = message.status === 'paused' const content = empty && paused ? t('message.chat.completion.paused') : message.content - return content + return escapeBrackets(escapeDollarNumber(content)) }, [message.content, message.status, t]) return ( @@ -50,4 +50,35 @@ const Markdown: FC = ({ message }) => { ) } +function escapeDollarNumber(text: string) { + let escapedText = '' + + for (let i = 0; i < text.length; i += 1) { + let char = text[i] + const nextChar = text[i + 1] || ' ' + + if (char === '$' && nextChar >= '0' && nextChar <= '9') { + char = '\\$' + } + + escapedText += char + } + + return escapedText +} + +function escapeBrackets(text: string) { + const pattern = /(```[\s\S]*?```|`.*?`)|\\\[([\s\S]*?[^\\])\\\]|\\\((.*?)\\\)/g + return text.replace(pattern, (match, codeBlock, squareBracket, roundBracket) => { + if (codeBlock) { + return codeBlock + } else if (squareBracket) { + return `$$${squareBracket}$$` + } else if (roundBracket) { + return `$${roundBracket}$` + } + return match + }) +} + export default Markdown