From 6845ee1664e2156ba62bc76a2221c1c44948fda7 Mon Sep 17 00:00:00 2001 From: kangfenmao Date: Sat, 21 Sep 2024 10:27:32 +0800 Subject: [PATCH] feat: improved formula rendering with new escaping functions - Improved formula rendering by removing unnecessary escaping of dollar numbers. - Implemented two new string escaping functions to prevent incorrect LaTeX formula rendering. #101 --- .../src/pages/home/Markdown/Markdown.tsx | 34 ++----------------- src/renderer/src/utils/formula.ts | 30 ++++++++++++++++ 2 files changed, 32 insertions(+), 32 deletions(-) create mode 100644 src/renderer/src/utils/formula.ts diff --git a/src/renderer/src/pages/home/Markdown/Markdown.tsx b/src/renderer/src/pages/home/Markdown/Markdown.tsx index f6ec08b6..18d757a0 100644 --- a/src/renderer/src/pages/home/Markdown/Markdown.tsx +++ b/src/renderer/src/pages/home/Markdown/Markdown.tsx @@ -1,6 +1,7 @@ import 'katex/dist/katex.min.css' import { Message } from '@renderer/types' +import { escapeBrackets } from '@renderer/utils/formula' import { isEmpty } from 'lodash' import { FC, useMemo } from 'react' import { useTranslation } from 'react-i18next' @@ -31,7 +32,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 escapeBrackets(escapeDollarNumber(content)) + return escapeBrackets(content) }, [message.content, message.status, t]) return ( @@ -50,35 +51,4 @@ 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 diff --git a/src/renderer/src/utils/formula.ts b/src/renderer/src/utils/formula.ts new file mode 100644 index 00000000..3c582840 --- /dev/null +++ b/src/renderer/src/utils/formula.ts @@ -0,0 +1,30 @@ +export 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 +} + +export 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 + }) +}