From 4009823fbd2db8326788c2a7c17a3ad272449c76 Mon Sep 17 00:00:00 2001 From: gushishang <117088703+gushishang@users.noreply.github.com> Date: Sun, 17 May 2026 23:13:23 +0800 Subject: [PATCH] feat(settings): add developer options and mermaid toggle --- src/config/user.config.ts | 98 +++++++++--------------- src/i18n/de.ts | 6 +- src/i18n/en.ts | 6 +- src/i18n/fr.ts | 6 +- src/i18n/ja.ts | 6 +- src/i18n/zh.ts | 4 + src/services/pltxt2htm/advancedParser.ts | 6 +- src/services/utils.ts | 8 +- src/views/Settings.vue | 24 +++++- 9 files changed, 94 insertions(+), 70 deletions(-) diff --git a/src/config/user.config.ts b/src/config/user.config.ts index 80beae3..b940979 100644 --- a/src/config/user.config.ts +++ b/src/config/user.config.ts @@ -6,30 +6,15 @@ type SupportedLocale = 'English' | 'Chinese' | 'German' | 'Japanese' | 'French' function createLanguageOptions() { return [ - { - label: i18n.global.t('settings.languageOptions.chinese'), - value: 'Chinese', - }, - { - label: i18n.global.t('settings.languageOptions.english'), - value: 'English', - }, - { - label: i18n.global.t('settings.languageOptions.german'), - value: 'German', - }, - { - label: i18n.global.t('settings.languageOptions.japanese'), - value: 'Japanese', - }, - { - label: i18n.global.t('settings.languageOptions.french'), - value: 'French', - }, + { label: i18n.global.t('settings.languageOptions.chinese'), value: 'Chinese' }, + { label: i18n.global.t('settings.languageOptions.english'), value: 'English' }, + { label: i18n.global.t('settings.languageOptions.german'), value: 'German' }, + { label: i18n.global.t('settings.languageOptions.japanese'), value: 'Japanese' }, + { label: i18n.global.t('settings.languageOptions.french'), value: 'French' }, ] } -function createDebuggerOptions() { +function createBinaryOptions() { return [ { label: i18n.global.t('settings.debuggerOptions.on'), value: 'on' }, { label: i18n.global.t('settings.debuggerOptions.off'), value: 'off' }, @@ -48,49 +33,55 @@ export const settingsConfig = [ options: createLanguageOptions(), callBack: (newValue: string) => { i18n.global.locale.value = newValue as SupportedLocale - const generalItems = settingsConfig[0]?.items || [] - const languageItem = generalItems.find((item) => item.key === 'language') - const debuggerItem = generalItems.find((item) => item.key === 'debugger') + const languageItem = settingsConfig[0]?.items.find((item) => item.key === 'language') if (languageItem?.type === 'link') { languageItem.options = createLanguageOptions() } - if (debuggerItem?.type === 'link') { - debuggerItem.options = createDebuggerOptions() - } - // Save language setting to localStorage const userConfig = storageManager.getObj('userConfig')?.value || {} userConfig.language = newValue userConfig.languageManuallySelected = true storageManager.setObj('userConfig', userConfig) - window.$Logger.logEvent({ - category: 'Account', - action: 'Switch-Language', - label: newValue, - timestamp: Date.now(), - }) + window.$Logger.logEvent({ category: 'Account', action: 'Switch-Language', label: newValue, timestamp: Date.now() }) showDialog('info', { title: i18n.global.t('settings.languageChangeTitle'), content: i18n.global.t('settings.languageChangeContent'), positiveText: i18n.global.t('login.confirm'), - onPositiveClick: () => { - showNotification({ - type: 'success', - title: i18n.global.t('settings.languageChangeTitle'), - }) - }, + onPositiveClick: () => showNotification({ type: 'success', title: i18n.global.t('settings.languageChangeTitle') }), }) }, }, + { + key: 'mermaid', + label: i18n.global.t('settings.mermaid'), + type: 'link', + value: 'on', + options: createBinaryOptions(), + }, + ], + }, + { + title: 'developer', + items: [ + { + key: 'apiBaseUrl', + label: i18n.global.t('settings.apiBaseUrl'), + type: 'input', + value: '', + }, + { + key: 'staticBaseUrl', + label: i18n.global.t('settings.staticBaseUrl'), + type: 'input', + value: '', + }, { key: 'debugger', label: i18n.global.t('settings.debugger'), type: 'link', value: 'on', - options: createDebuggerOptions(), + options: createBinaryOptions(), callBack: (newValue: string) => { - if (newValue === 'off') { - localStorage.removeItem('error_logs') - } + if (newValue === 'off') localStorage.removeItem('error_logs') showDialog('warning', { title: i18n.global.t('login.reLogin'), content: i18n.global.t('login.reLoginContent'), @@ -98,12 +89,7 @@ export const settingsConfig = [ onPositiveClick: async () => { storageManager.remove('userInfo') storageManager.remove('userAuthInfo') - window.$Logger.logEvent({ - category: 'Account', - action: 'Toggle-Error-Logger', - label: newValue, - timestamp: Date.now(), - }) + window.$Logger.logEvent({ category: 'Account', action: 'Toggle-Error-Logger', label: newValue, timestamp: Date.now() }) }, }) }, @@ -114,19 +100,9 @@ export const settingsConfig = [ type: 'button', callBack: () => { window.$ErrorLogger.exportToTxt() - window.$Logger.logEvent({ - category: 'Account', - action: 'Export-Error-Logs', - timestamp: Date.now(), - }) + window.$Logger.logEvent({ category: 'Account', action: 'Export-Error-Logs', timestamp: Date.now() }) }, }, - // { - // key: "", - // label: "如题", - // type: "toggle", - // value: false, - // }, ], }, ] diff --git a/src/i18n/de.ts b/src/i18n/de.ts index d46cf83..1362693 100644 --- a/src/i18n/de.ts +++ b/src/i18n/de.ts @@ -121,7 +121,11 @@ export default { language: 'Sprache', settings: 'Einstellungen', general: 'Allgemein', - debugger: 'Protokolle sammeln', + developer: 'Entwickleroptionen', + mermaid: 'Mermaid-Rendering', + apiBaseUrl: 'Benutzerdefinierte Server-Base-URL', + staticBaseUrl: 'Bild-Host-Base-URL', + debugger: 'Debug-Protokolle sammeln', exportLogs: 'Fehlerprotokolle exportieren', languageChangeTitle: 'Sprache geändert', languageChangeContent: diff --git a/src/i18n/en.ts b/src/i18n/en.ts index eabfd6c..31f165f 100644 --- a/src/i18n/en.ts +++ b/src/i18n/en.ts @@ -121,7 +121,11 @@ export default { language: 'Language', settings: 'settings', general: 'General', - debugger: 'collect logs', + developer: 'Developer Options', + mermaid: 'Mermaid Rendering', + apiBaseUrl: 'Custom Server Base URL', + staticBaseUrl: 'Image Host Base URL', + debugger: 'Collect Debug Logs', exportLogs: 'Export Error Logs', languageChangeTitle: 'Language Changed', languageChangeContent: 'Some features need to re-login to apply the new language completely', diff --git a/src/i18n/fr.ts b/src/i18n/fr.ts index 05b88d3..1442e5f 100644 --- a/src/i18n/fr.ts +++ b/src/i18n/fr.ts @@ -121,7 +121,11 @@ export default { language: 'Langue', settings: 'Paramètres', general: 'Général', - debugger: 'Collecter les journaux', + developer: 'Options développeur', + mermaid: 'Rendu Mermaid', + apiBaseUrl: 'URL de base serveur personnalisée', + staticBaseUrl: "URL de base de l'hébergeur d'images", + debugger: 'Collecter les journaux de débogage', exportLogs: "Exporter les journaux d'erreurs", languageChangeTitle: 'Langue modifiée', languageChangeContent: diff --git a/src/i18n/ja.ts b/src/i18n/ja.ts index 8466b66..4f119ad 100644 --- a/src/i18n/ja.ts +++ b/src/i18n/ja.ts @@ -121,7 +121,11 @@ export default { language: '言語', settings: '設定', general: '一般', - debugger: 'ログを収集', + developer: '開発者オプション', + mermaid: 'Mermaid レンダリング', + apiBaseUrl: 'カスタムサーバー Base URL', + staticBaseUrl: '画像ホスト Base URL', + debugger: 'デバッグログを収集', exportLogs: 'エラーログをエクスポート', languageChangeTitle: '言語が変更されました', languageChangeContent: diff --git a/src/i18n/zh.ts b/src/i18n/zh.ts index 677d8b7..5053b51 100644 --- a/src/i18n/zh.ts +++ b/src/i18n/zh.ts @@ -118,6 +118,10 @@ export default { language: '界面语言', settings: '应用设置', general: '通用设置', + developer: '开发人员选项', + mermaid: 'Mermaid 渲染', + apiBaseUrl: '自定义服务器 Base URL', + staticBaseUrl: '图床 Base URL', debugger: '收集调试信息', exportLogs: '导出错误日志', languageChangeTitle: '语言已切换', diff --git a/src/services/pltxt2htm/advancedParser.ts b/src/services/pltxt2htm/advancedParser.ts index d3cb694..f0a87fb 100644 --- a/src/services/pltxt2htm/advancedParser.ts +++ b/src/services/pltxt2htm/advancedParser.ts @@ -4,6 +4,7 @@ import hljs from 'highlight.js' import mermaid from 'mermaid' import renderMathInElement from 'katex/contrib/auto-render/auto-render.js' import 'katex/dist/katex.min.css' +import storageManager from '@storage/index' interface ParseContext { host?: string @@ -115,7 +116,10 @@ async function parse(source: string, context: ParseContext = {}) { }) } - await renderMermaidDiagrams(tempDiv) + const enableMermaid = (storageManager.getObj('userConfig')?.value?.mermaid ?? 'on') === 'on' + if (enableMermaid) { + await renderMermaidDiagrams(tempDiv) + } tempDiv.querySelectorAll('pre code:not(.language-mermaid)').forEach((block) => { hljs.highlightElement(block as HTMLElement) diff --git a/src/services/utils.ts b/src/services/utils.ts index de20dc6..779f8db 100644 --- a/src/services/utils.ts +++ b/src/services/utils.ts @@ -24,8 +24,8 @@ type PProjects = { Image?: number } -const apiUrl = import.meta.env.VITE_API_URL -const staticUrl = import.meta.env.VITE_STATIC_URL +const defaultApiUrl = import.meta.env.VITE_API_URL +const defaultStaticUrl = import.meta.env.VITE_STATIC_URL const rootUrl = import.meta.env.VITE_ROOT_URL const baseUrl = import.meta.env.VITE_BASE_URL @@ -40,6 +40,10 @@ const baseUrl = import.meta.env.VITE_BASE_URL */ export function getPath(path: string): string { + const userConfig = storageManager.getObj('userConfig')?.value || {} + const apiUrl = (userConfig.apiBaseUrl as string) || defaultApiUrl + const staticUrl = (userConfig.staticBaseUrl as string) || defaultStaticUrl + const a = path .replace(/\/@api/g, apiUrl) .replace(/\/@static/g, staticUrl) diff --git a/src/views/Settings.vue b/src/views/Settings.vue index a6b1b21..2f749b2 100644 --- a/src/views/Settings.vue +++ b/src/views/Settings.vue @@ -29,6 +29,18 @@ /> + + + +