diff --git a/src/renderer/src/i18n/locales/en-us.json b/src/renderer/src/i18n/locales/en-us.json index ff375dda..2bada24b 100644 --- a/src/renderer/src/i18n/locales/en-us.json +++ b/src/renderer/src/i18n/locales/en-us.json @@ -1168,6 +1168,7 @@ "messages.input.enable_delete_model": "Enable the backspace key to delete models/attachments.", "messages.markdown_rendering_input_message": "Markdown render input message", "messages.math_engine": "Math engine", + "messages.math_engine.none": "None", "messages.metrics": "{{time_first_token_millsec}}ms to first token | {{token_speed}} tok/sec", "messages.model.title": "Model Settings", "messages.navigation": "Message Navigation", diff --git a/src/renderer/src/i18n/locales/ja-jp.json b/src/renderer/src/i18n/locales/ja-jp.json index b60c4d55..5b9ed287 100644 --- a/src/renderer/src/i18n/locales/ja-jp.json +++ b/src/renderer/src/i18n/locales/ja-jp.json @@ -1167,6 +1167,7 @@ "messages.input.enable_delete_model": "バックスペースキーでモデル/添付ファイルを削除します。", "messages.markdown_rendering_input_message": "Markdownで入力メッセージをレンダリング", "messages.math_engine": "数式エンジン", + "messages.math_engine.none": "なし", "messages.metrics": "最初のトークンまでの時間 {{time_first_token_millsec}}ms | トークン速度 {{token_speed}} tok/sec", "messages.model.title": "モデル設定", "messages.navigation": "メッセージナビゲーション", diff --git a/src/renderer/src/i18n/locales/ru-ru.json b/src/renderer/src/i18n/locales/ru-ru.json index 6f9ddf49..4f266b25 100644 --- a/src/renderer/src/i18n/locales/ru-ru.json +++ b/src/renderer/src/i18n/locales/ru-ru.json @@ -1167,6 +1167,7 @@ "messages.input.enable_delete_model": "Включите удаление модели/вложения с помощью клавиши Backspace", "messages.markdown_rendering_input_message": "Отображение ввода в формате Markdown", "messages.math_engine": "Математический движок", + "messages.math_engine.none": "Нет", "messages.metrics": "{{time_first_token_millsec}}ms до первого токена | {{token_speed}} tok/sec", "messages.model.title": "Настройки модели", "messages.navigation": "Навигация сообщений", diff --git a/src/renderer/src/i18n/locales/zh-cn.json b/src/renderer/src/i18n/locales/zh-cn.json index 90d2f922..8da18e72 100644 --- a/src/renderer/src/i18n/locales/zh-cn.json +++ b/src/renderer/src/i18n/locales/zh-cn.json @@ -1168,6 +1168,7 @@ "messages.input.enable_delete_model": "启用删除键删除输入的模型/附件", "messages.markdown_rendering_input_message": "Markdown 渲染输入消息", "messages.math_engine": "数学公式引擎", + "messages.math_engine.none": "无", "messages.metrics": "首字时延 {{time_first_token_millsec}}ms | 每秒 {{token_speed}} tokens", "messages.model.title": "模型设置", "messages.navigation": "对话导航按钮", diff --git a/src/renderer/src/i18n/locales/zh-tw.json b/src/renderer/src/i18n/locales/zh-tw.json index def47d7e..05249184 100644 --- a/src/renderer/src/i18n/locales/zh-tw.json +++ b/src/renderer/src/i18n/locales/zh-tw.json @@ -1166,7 +1166,8 @@ "messages.input.enable_quick_triggers": "啟用 '/' 和 '@' 觸發快捷選單", "messages.input.enable_delete_model": "啟用刪除鍵刪除模型/附件", "messages.markdown_rendering_input_message": "Markdown 渲染輸入訊息", - "messages.math_engine": "Markdown 渲染輸入訊息", + "messages.math_engine": "數學公式引擎", + "messages.math_engine.none": "無", "messages.metrics": "首字延遲 {{time_first_token_millsec}}ms | 每秒 {{token_speed}} tokens", "messages.model.title": "模型設定", "messages.navigation": "訊息導航", diff --git a/src/renderer/src/pages/home/Markdown/Markdown.tsx b/src/renderer/src/pages/home/Markdown/Markdown.tsx index 6627b707..60b83ec4 100644 --- a/src/renderer/src/pages/home/Markdown/Markdown.tsx +++ b/src/renderer/src/pages/home/Markdown/Markdown.tsx @@ -32,12 +32,18 @@ interface Props { message: Message } -const remarkPlugins = [remarkMath, remarkGfm, remarkCjkFriendly] - const Markdown: FC = ({ message }) => { const { t } = useTranslation() const { renderInputMessageAsMarkdown, mathEngine } = useSettings() + const remarkPlugins = useMemo(() => { + const plugins = [remarkGfm, remarkCjkFriendly] + if (mathEngine !== 'none') { + plugins.push(remarkMath) + } + return plugins + }, [mathEngine]) + const messageContent = useMemo(() => { const empty = isEmpty(message.content) const paused = message.status === 'paused' @@ -45,12 +51,18 @@ const Markdown: FC = ({ message }) => { return removeSvgEmptyLines(escapeBrackets(content)) }, [message, t]) - const rehypeMath = useMemo(() => (mathEngine === 'KaTeX' ? rehypeKatex : rehypeMathjax), [mathEngine]) - const rehypePlugins = useMemo(() => { - const hasElements = ALLOWED_ELEMENTS.test(messageContent) - return hasElements ? [rehypeRaw, rehypeMath] : [rehypeMath] - }, [messageContent, rehypeMath]) + const plugins: any[] = [] + if (ALLOWED_ELEMENTS.test(messageContent)) { + plugins.push(rehypeRaw) + } + if (mathEngine === 'KaTeX') { + plugins.push(rehypeKatex as any) + } else if (mathEngine === 'MathJax') { + plugins.push(rehypeMathjax as any) + } + return plugins + }, [mathEngine, messageContent]) const components = useMemo(() => { const baseComponents = { diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index a2ba0868..ed0d0659 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -42,7 +42,14 @@ import { setShowMessageDivider, setThoughtAutoCollapse } from '@renderer/store/settings' -import { Assistant, AssistantSettings, CodeStyleVarious, ThemeMode, TranslateLanguageVarious } from '@renderer/types' +import { + Assistant, + AssistantSettings, + CodeStyleVarious, + MathEngine, + ThemeMode, + TranslateLanguageVarious +} from '@renderer/types' import { modalConfirm } from '@renderer/utils' import { Button, Col, InputNumber, Row, Segmented, Select, Slider, Switch, Tooltip } from 'antd' import { CircleHelp, RotateCcw, Settings2 } from 'lucide-react' @@ -512,11 +519,12 @@ const SettingsTab: FC = (props) => { {t('settings.messages.math_engine')} dispatch(setMathEngine(value as 'MathJax' | 'KaTeX'))} + onChange={(value) => dispatch(setMathEngine(value as MathEngine))} style={{ width: 135 }} size="small"> KaTeX MathJax + {t('settings.messages.math_engine.none')} diff --git a/src/renderer/src/store/settings.ts b/src/renderer/src/store/settings.ts index f153ff69..c03433ab 100644 --- a/src/renderer/src/store/settings.ts +++ b/src/renderer/src/store/settings.ts @@ -1,6 +1,6 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit' import { TRANSLATE_PROMPT } from '@renderer/config/prompts' -import { CodeStyleVarious, LanguageVarious, ThemeMode, TranslateLanguageVarious } from '@renderer/types' +import { CodeStyleVarious, LanguageVarious, MathEngine, ThemeMode, TranslateLanguageVarious } from '@renderer/types' import { IpcChannel } from '@shared/IpcChannel' import { WebDAVSyncState } from './backup' @@ -58,7 +58,7 @@ export interface SettingsState { codeCacheMaxSize: number codeCacheTTL: number codeCacheThreshold: number - mathEngine: 'MathJax' | 'KaTeX' + mathEngine: MathEngine messageStyle: 'plain' | 'bubble' codeStyle: CodeStyleVarious foldDisplayMode: 'expanded' | 'compact' @@ -360,7 +360,7 @@ const settingsSlice = createSlice({ setCodeCacheThreshold: (state, action: PayloadAction) => { state.codeCacheThreshold = action.payload }, - setMathEngine: (state, action: PayloadAction<'MathJax' | 'KaTeX'>) => { + setMathEngine: (state, action: PayloadAction) => { state.mathEngine = action.payload }, setFoldDisplayMode: (state, action: PayloadAction<'expanded' | 'compact'>) => { diff --git a/src/renderer/src/types/index.ts b/src/renderer/src/types/index.ts index 8fde9cab..8974e37b 100644 --- a/src/renderer/src/types/index.ts +++ b/src/renderer/src/types/index.ts @@ -510,3 +510,5 @@ export interface Citation { title?: string content?: string } + +export type MathEngine = 'KaTeX' | 'MathJax' | 'none'