feat: add support for 'none' option in math engine settings (#5122)

This commit is contained in:
PilgrimLyieu 2025-04-23 14:53:19 +08:00 committed by GitHub
parent 6c6b2f0b9e
commit 8125fac309
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 40 additions and 13 deletions

View File

@ -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",

View File

@ -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": "メッセージナビゲーション",

View File

@ -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": "Навигация сообщений",

View File

@ -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": "对话导航按钮",

View File

@ -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": "訊息導航",

View File

@ -32,12 +32,18 @@ interface Props {
message: Message
}
const remarkPlugins = [remarkMath, remarkGfm, remarkCjkFriendly]
const Markdown: FC<Props> = ({ 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<Props> = ({ 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 = {

View File

@ -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> = (props) => {
<SettingRowTitleSmall>{t('settings.messages.math_engine')}</SettingRowTitleSmall>
<StyledSelect
value={mathEngine}
onChange={(value) => dispatch(setMathEngine(value as 'MathJax' | 'KaTeX'))}
onChange={(value) => dispatch(setMathEngine(value as MathEngine))}
style={{ width: 135 }}
size="small">
<Select.Option value="KaTeX">KaTeX</Select.Option>
<Select.Option value="MathJax">MathJax</Select.Option>
<Select.Option value="none">{t('settings.messages.math_engine.none')}</Select.Option>
</StyledSelect>
</SettingRow>
<SettingDivider />

View File

@ -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<number>) => {
state.codeCacheThreshold = action.payload
},
setMathEngine: (state, action: PayloadAction<'MathJax' | 'KaTeX'>) => {
setMathEngine: (state, action: PayloadAction<MathEngine>) => {
state.mathEngine = action.payload
},
setFoldDisplayMode: (state, action: PayloadAction<'expanded' | 'compact'>) => {

View File

@ -510,3 +510,5 @@ export interface Citation {
title?: string
content?: string
}
export type MathEngine = 'KaTeX' | 'MathJax' | 'none'