Commit 478ba65e authored by nick zheng's avatar nick zheng

chore: 对数学公式等显示优化

parent 7a7d98ad
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"marked": "^15.0.0", "marked": "^15.0.0",
"marked-highlight": "^2.2.1", "marked-highlight": "^2.2.1",
"marked-katex-extension": "^5.1.4",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"nanoid": "^5.0.7", "nanoid": "^5.0.7",
"pinia": "^2.2.2", "pinia": "^2.2.2",
......
...@@ -68,6 +68,9 @@ importers: ...@@ -68,6 +68,9 @@ importers:
marked-highlight: marked-highlight:
specifier: ^2.2.1 specifier: ^2.2.1
version: 2.2.1(marked@15.0.0) version: 2.2.1(marked@15.0.0)
marked-katex-extension:
specifier: ^5.1.4
version: 5.1.4(katex@0.16.21)(marked@15.0.0)
mitt: mitt:
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1 version: 3.0.1
...@@ -137,10 +140,10 @@ importers: ...@@ -137,10 +140,10 @@ importers:
version: 13.12.2 version: 13.12.2
'@typescript-eslint/parser': '@typescript-eslint/parser':
specifier: ^7.18.0 specifier: ^7.18.0
version: 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) version: 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
'@unocss/eslint-config': '@unocss/eslint-config':
specifier: ^0.61.9 specifier: ^0.61.9
version: 0.61.9(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) version: 0.61.9(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
'@vitejs/plugin-vue': '@vitejs/plugin-vue':
specifier: ^4.6.2 specifier: ^4.6.2
version: 4.6.2(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0))(vue@3.5.13(typescript@5.6.2)) version: 4.6.2(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0))(vue@3.5.13(typescript@5.6.2))
...@@ -152,16 +155,16 @@ importers: ...@@ -152,16 +155,16 @@ importers:
version: 10.4.20(postcss@8.4.47) version: 10.4.20(postcss@8.4.47)
eslint: eslint:
specifier: ^9.10.0 specifier: ^9.10.0
version: 9.10.0(jiti@1.21.6) version: 9.10.0(jiti@2.0.0-beta.3)
eslint-config-prettier: eslint-config-prettier:
specifier: ^9.1.0 specifier: ^9.1.0
version: 9.1.0(eslint@9.10.0(jiti@1.21.6)) version: 9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3))
eslint-plugin-prettier: eslint-plugin-prettier:
specifier: ^5.2.1 specifier: ^5.2.1
version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@1.21.6)))(eslint@9.10.0(jiti@1.21.6))(prettier@3.3.3) version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3)))(eslint@9.10.0(jiti@2.0.0-beta.3))(prettier@3.3.3)
eslint-plugin-vue: eslint-plugin-vue:
specifier: ^9.28.0 specifier: ^9.28.0
version: 9.28.0(eslint@9.10.0(jiti@1.21.6)) version: 9.28.0(eslint@9.10.0(jiti@2.0.0-beta.3))
globals: globals:
specifier: ^15.9.0 specifier: ^15.9.0
version: 15.9.0 version: 15.9.0
...@@ -224,7 +227,7 @@ importers: ...@@ -224,7 +227,7 @@ importers:
version: 5.6.2 version: 5.6.2
typescript-eslint: typescript-eslint:
specifier: ^7.18.0 specifier: ^7.18.0
version: 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) version: 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
unocss: unocss:
specifier: ^0.61.9 specifier: ^0.61.9
version: 0.61.9(postcss@8.4.47)(rollup@4.21.3)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0)) version: 0.61.9(postcss@8.4.47)(rollup@4.21.3)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0))
...@@ -239,13 +242,13 @@ importers: ...@@ -239,13 +242,13 @@ importers:
version: 5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0) version: 5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0)
vite-plugin-checker: vite-plugin-checker:
specifier: ^0.7.2 specifier: ^0.7.2
version: 0.7.2(eslint@9.10.0(jiti@1.21.6))(optionator@0.9.4)(stylelint@16.9.0(typescript@5.6.2))(typescript@5.6.2)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0))(vue-tsc@2.0.29(typescript@5.6.2)) version: 0.7.2(eslint@9.10.0(jiti@2.0.0-beta.3))(meow@13.2.0)(optionator@0.9.4)(stylelint@16.9.0(typescript@5.6.2))(typescript@5.6.2)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0))(vue-tsc@2.0.29(typescript@5.6.2))
vite-svg-loader: vite-svg-loader:
specifier: ^5.1.0 specifier: ^5.1.0
version: 5.1.0(vue@3.5.13(typescript@5.6.2)) version: 5.1.0(vue@3.5.13(typescript@5.6.2))
vue-eslint-parser: vue-eslint-parser:
specifier: ^9.4.3 specifier: ^9.4.3
version: 9.4.3(eslint@9.10.0(jiti@1.21.6)) version: 9.4.3(eslint@9.10.0(jiti@2.0.0-beta.3))
vue-tsc: vue-tsc:
specifier: ^2.0.29 specifier: ^2.0.29
version: 2.0.29(typescript@5.6.2) version: 2.0.29(typescript@5.6.2)
...@@ -2429,6 +2432,12 @@ packages: ...@@ -2429,6 +2432,12 @@ packages:
peerDependencies: peerDependencies:
marked: '>=4 <16' marked: '>=4 <16'
marked-katex-extension@5.1.4:
resolution: {integrity: sha512-GQOio4vCp0laxB1IY+2oNVo5nbn82yWMDP/jILRYHmyu2WXMVlXCB+krq2/U2fQn+V9j8aqDmnNdrsgqG2AkGQ==}
peerDependencies:
katex: '>=0.16 <0.17'
marked: '>=4 <16'
marked@15.0.0: marked@15.0.0:
resolution: {integrity: sha512-0mouKmBROJv/WSHJBPZZyYofUgawMChnD5je/g+aOBXsHDjb/IsnTQj7mnhQZu+qPJmRQ0ecX3mLGEUm3BgwYA==} resolution: {integrity: sha512-0mouKmBROJv/WSHJBPZZyYofUgawMChnD5je/g+aOBXsHDjb/IsnTQj7mnhQZu+qPJmRQ0ecX3mLGEUm3BgwYA==}
engines: {node: '>= 18'} engines: {node: '>= 18'}
...@@ -4016,9 +4025,9 @@ snapshots: ...@@ -4016,9 +4025,9 @@ snapshots:
'@esbuild/win32-x64@0.23.1': '@esbuild/win32-x64@0.23.1':
optional: true optional: true
'@eslint-community/eslint-utils@4.4.0(eslint@9.10.0(jiti@1.21.6))': '@eslint-community/eslint-utils@4.4.0(eslint@9.10.0(jiti@2.0.0-beta.3))':
dependencies: dependencies:
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.11.1': {} '@eslint-community/regexpp@4.11.1': {}
...@@ -4260,15 +4269,15 @@ snapshots: ...@@ -4260,15 +4269,15 @@ snapshots:
'@types/web-bluetooth@0.0.20': {} '@types/web-bluetooth@0.0.20': {}
'@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2))(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)':
dependencies: dependencies:
'@eslint-community/regexpp': 4.11.1 '@eslint-community/regexpp': 4.11.1
'@typescript-eslint/parser': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/parser': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
'@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/type-utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/type-utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
'@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
graphemer: 1.4.0 graphemer: 1.4.0
ignore: 5.3.2 ignore: 5.3.2
natural-compare: 1.4.0 natural-compare: 1.4.0
...@@ -4278,14 +4287,14 @@ snapshots: ...@@ -4278,14 +4287,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': '@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/types': 7.18.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0
debug: 4.3.7 debug: 4.3.7
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
...@@ -4296,12 +4305,12 @@ snapshots: ...@@ -4296,12 +4305,12 @@ snapshots:
'@typescript-eslint/types': 7.18.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0
'@typescript-eslint/type-utils@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': '@typescript-eslint/type-utils@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2)
'@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
debug: 4.3.7 debug: 4.3.7
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
ts-api-utils: 1.3.0(typescript@5.6.2) ts-api-utils: 1.3.0(typescript@5.6.2)
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
...@@ -4325,13 +4334,13 @@ snapshots: ...@@ -4325,13 +4334,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@typescript-eslint/utils@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': '@typescript-eslint/utils@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)':
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@2.0.0-beta.3))
'@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/types': 7.18.0 '@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2)
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
...@@ -4380,17 +4389,17 @@ snapshots: ...@@ -4380,17 +4389,17 @@ snapshots:
'@unocss/core@0.61.9': {} '@unocss/core@0.61.9': {}
'@unocss/eslint-config@0.61.9(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': '@unocss/eslint-config@0.61.9(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)':
dependencies: dependencies:
'@unocss/eslint-plugin': 0.61.9(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@unocss/eslint-plugin': 0.61.9(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
transitivePeerDependencies: transitivePeerDependencies:
- eslint - eslint
- supports-color - supports-color
- typescript - typescript
'@unocss/eslint-plugin@0.61.9(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2)': '@unocss/eslint-plugin@0.61.9(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)':
dependencies: dependencies:
'@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
'@unocss/config': 0.61.9 '@unocss/config': 0.61.9
'@unocss/core': 0.61.9 '@unocss/core': 0.61.9
magic-string: 0.30.11 magic-string: 0.30.11
...@@ -5175,29 +5184,29 @@ snapshots: ...@@ -5175,29 +5184,29 @@ snapshots:
optionalDependencies: optionalDependencies:
source-map: 0.6.1 source-map: 0.6.1
eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@1.21.6)): eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3)):
dependencies: dependencies:
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@1.21.6)))(eslint@9.10.0(jiti@1.21.6))(prettier@3.3.3): eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3)))(eslint@9.10.0(jiti@2.0.0-beta.3))(prettier@3.3.3):
dependencies: dependencies:
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
prettier: 3.3.3 prettier: 3.3.3
prettier-linter-helpers: 1.0.0 prettier-linter-helpers: 1.0.0
synckit: 0.9.1 synckit: 0.9.1
optionalDependencies: optionalDependencies:
eslint-config-prettier: 9.1.0(eslint@9.10.0(jiti@1.21.6)) eslint-config-prettier: 9.1.0(eslint@9.10.0(jiti@2.0.0-beta.3))
eslint-plugin-vue@9.28.0(eslint@9.10.0(jiti@1.21.6)): eslint-plugin-vue@9.28.0(eslint@9.10.0(jiti@2.0.0-beta.3)):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@2.0.0-beta.3))
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
globals: 13.24.0 globals: 13.24.0
natural-compare: 1.4.0 natural-compare: 1.4.0
nth-check: 2.1.1 nth-check: 2.1.1
postcss-selector-parser: 6.1.2 postcss-selector-parser: 6.1.2
semver: 7.6.3 semver: 7.6.3
vue-eslint-parser: 9.4.3(eslint@9.10.0(jiti@1.21.6)) vue-eslint-parser: 9.4.3(eslint@9.10.0(jiti@2.0.0-beta.3))
xml-name-validator: 4.0.0 xml-name-validator: 4.0.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
...@@ -5216,9 +5225,9 @@ snapshots: ...@@ -5216,9 +5225,9 @@ snapshots:
eslint-visitor-keys@4.0.0: {} eslint-visitor-keys@4.0.0: {}
eslint@9.10.0(jiti@1.21.6): eslint@9.10.0(jiti@2.0.0-beta.3):
dependencies: dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6)) '@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@2.0.0-beta.3))
'@eslint-community/regexpp': 4.11.1 '@eslint-community/regexpp': 4.11.1
'@eslint/config-array': 0.18.0 '@eslint/config-array': 0.18.0
'@eslint/eslintrc': 3.1.0 '@eslint/eslintrc': 3.1.0
...@@ -5253,7 +5262,7 @@ snapshots: ...@@ -5253,7 +5262,7 @@ snapshots:
strip-ansi: 6.0.1 strip-ansi: 6.0.1
text-table: 0.2.0 text-table: 0.2.0
optionalDependencies: optionalDependencies:
jiti: 1.21.6 jiti: 2.0.0-beta.3
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
...@@ -5772,6 +5781,11 @@ snapshots: ...@@ -5772,6 +5781,11 @@ snapshots:
dependencies: dependencies:
marked: 15.0.0 marked: 15.0.0
marked-katex-extension@5.1.4(katex@0.16.21)(marked@15.0.0):
dependencies:
katex: 0.16.21
marked: 15.0.0
marked@15.0.0: {} marked@15.0.0: {}
math-intrinsics@1.1.0: {} math-intrinsics@1.1.0: {}
...@@ -6465,12 +6479,12 @@ snapshots: ...@@ -6465,12 +6479,12 @@ snapshots:
type-fest@4.26.1: {} type-fest@4.26.1: {}
typescript-eslint@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2): typescript-eslint@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2):
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2))(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2))(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
'@typescript-eslint/parser': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/parser': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
'@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@1.21.6))(typescript@5.6.2) '@typescript-eslint/utils': 7.18.0(eslint@9.10.0(jiti@2.0.0-beta.3))(typescript@5.6.2)
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
optionalDependencies: optionalDependencies:
typescript: 5.6.2 typescript: 5.6.2
transitivePeerDependencies: transitivePeerDependencies:
...@@ -6604,7 +6618,7 @@ snapshots: ...@@ -6604,7 +6618,7 @@ snapshots:
evtd: 0.2.4 evtd: 0.2.4
vue: 3.5.13(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vite-plugin-checker@0.7.2(eslint@9.10.0(jiti@1.21.6))(optionator@0.9.4)(stylelint@16.9.0(typescript@5.6.2))(typescript@5.6.2)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0))(vue-tsc@2.0.29(typescript@5.6.2)): vite-plugin-checker@0.7.2(eslint@9.10.0(jiti@2.0.0-beta.3))(meow@13.2.0)(optionator@0.9.4)(stylelint@16.9.0(typescript@5.6.2))(typescript@5.6.2)(vite@5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0))(vue-tsc@2.0.29(typescript@5.6.2)):
dependencies: dependencies:
'@babel/code-frame': 7.24.7 '@babel/code-frame': 7.24.7
ansi-escapes: 4.3.2 ansi-escapes: 4.3.2
...@@ -6622,7 +6636,8 @@ snapshots: ...@@ -6622,7 +6636,8 @@ snapshots:
vscode-languageserver-textdocument: 1.0.12 vscode-languageserver-textdocument: 1.0.12
vscode-uri: 3.0.8 vscode-uri: 3.0.8
optionalDependencies: optionalDependencies:
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
meow: 13.2.0
optionator: 0.9.4 optionator: 0.9.4
stylelint: 16.9.0(typescript@5.6.2) stylelint: 16.9.0(typescript@5.6.2)
typescript: 5.6.2 typescript: 5.6.2
...@@ -6676,10 +6691,10 @@ snapshots: ...@@ -6676,10 +6691,10 @@ snapshots:
dependencies: dependencies:
vue: 3.5.13(typescript@5.6.2) vue: 3.5.13(typescript@5.6.2)
vue-eslint-parser@9.4.3(eslint@9.10.0(jiti@1.21.6)): vue-eslint-parser@9.4.3(eslint@9.10.0(jiti@2.0.0-beta.3)):
dependencies: dependencies:
debug: 4.3.7 debug: 4.3.7
eslint: 9.10.0(jiti@1.21.6) eslint: 9.10.0(jiti@2.0.0-beta.3)
eslint-scope: 7.2.2 eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3 eslint-visitor-keys: 3.4.3
espree: 9.6.1 espree: 9.6.1
......
...@@ -8,7 +8,7 @@ import DOMPurify from 'dompurify' ...@@ -8,7 +8,7 @@ import DOMPurify from 'dompurify'
import hljs from 'highlight.js' import hljs from 'highlight.js'
import 'highlight.js/styles/panda-syntax-light.css' import 'highlight.js/styles/panda-syntax-light.css'
import 'github-markdown-css' import 'github-markdown-css'
import markedKatex, { MarkedKatexOptions } from './plugins/katex' import markedKatex, { MarkedKatexOptions } from 'marked-katex-extension'
interface Props { interface Props {
rawTextContent: string rawTextContent: string
...@@ -52,6 +52,15 @@ const articleContainerStyle = computed(() => { ...@@ -52,6 +52,15 @@ const articleContainerStyle = computed(() => {
} }
}) })
const katexDelimiters = (text: string) => {
/**
* 1. 将 \( 和 \\() 转为 $ 以支持行内公式
* 2. 将 \[ 和 \\[ 转为 $$ 以支持块级公式
*/
const replaceKatexText = text.replace(/\\\\\(|\\\\\)|\\\(|\\\)/g, '$').replace(/\\\\\[|\\\\\]|\\\[|\\\]/g, '$$$$')
return replaceKatexText
}
const textContentParser = throttle( const textContentParser = throttle(
(text: string) => { (text: string) => {
;(marked.parse(text) as Promise<string>).then((res) => { ;(marked.parse(text) as Promise<string>).then((res) => {
...@@ -63,7 +72,8 @@ const textContentParser = throttle( ...@@ -63,7 +72,8 @@ const textContentParser = throttle(
) )
watchEffect(() => { watchEffect(() => {
textContentParser(props.rawTextContent) const text = katexDelimiters(props.rawTextContent)
textContentParser(text)
}) })
function getRenderTextContent() { function getRenderTextContent() {
......
/**
* @file katex.ts
* @description markdown渲染插件,用于解析渲染katex数学公式, 依赖katex库, 请确保已经引入katex库
* @description 该插件支持公式行内公式$...$、\(...\)和块内公式$$...$$、\[...\]两种形式
*/
import katex, { KatexOptions } from 'katex'
import { MarkedExtension, TokenizerAndRendererExtension, Tokens } from 'marked'
export interface MarkedKatexOptions extends KatexOptions {
nonStandard?: boolean
}
const inlineRule = /^(\${1,2})(?!\$)((?:\\.|[^\\\n])*?(?:\\.|[^\\\n\\$]))\1(?=[\s?!\\.,:?!。,:]|$)/
const inlineRuleNonStandard = /^(\${1,2})(?!\$)((?:\\.|[^\\\n])*?(?:\\.|[^\\\n\\$]))\1/
const blockRule = /^(?:(\${2})\n([\s\S]+?)\n\1|\\\[([\s\S]+?)\\\](?:\n|$))/
export default function (options: MarkedKatexOptions = {}): MarkedExtension {
return {
extensions: [
inlineKatex(options, createRenderer(options, false)),
blockKatex(options, createRenderer(options, true)),
],
}
}
function createRenderer(options: MarkedKatexOptions, newlineAfter: boolean) {
return (token: Tokens.Generic) => {
return katex.renderToString(token.text, { ...options, displayMode: token.displayMode }) + (newlineAfter ? '\n' : '')
}
}
function inlineKatex(
options: MarkedKatexOptions,
renderer: (token: Tokens.Generic) => string,
): TokenizerAndRendererExtension {
const nonStandard = options && options.nonStandard
const ruleReg = nonStandard ? inlineRuleNonStandard : inlineRule
return {
name: 'inlineKatex',
level: 'inline',
start(src: string) {
let index
let indexSrc = src
while (indexSrc) {
index = indexSrc.search(/(?:\\\(|\$)/)
if (index === -1) {
return
}
const char = indexSrc[index]
const possibleKatex = indexSrc.substring(index)
const isParen = char === '\\' && indexSrc[index + 1] === '('
const isDollar = char === '$'
const f = nonStandard ? true : index === 0 || indexSrc.charAt(index - 1).match(/\s/)
if (f) {
if (isDollar && possibleKatex.match(ruleReg)) {
return index
} else if (isParen && possibleKatex.match(/^\\\(((?:\\[^]|[^\\\n)])*?)\\\)/)) {
return index
}
}
indexSrc = indexSrc.substring(index + (isParen ? 2 : 1))
}
},
tokenizer(src: string) {
const dollarMatch = src.match(ruleReg)
if (dollarMatch) {
return {
type: 'inlineKatex',
raw: dollarMatch[0],
text: dollarMatch[2].trim(),
displayMode: dollarMatch[1].length === 2,
}
}
// 匹配\(...\)包裹的内容
const parenMatch = src.match(/^\\\(((?:\\[^]|[^\\\n)])*?)\\\)/)
if (parenMatch) {
return {
type: 'inlineKatex',
raw: parenMatch[0],
text: parenMatch[1].trim(),
displayMode: false,
}
}
},
renderer,
}
}
function blockKatex(
_options: KatexOptions,
renderer: (token: Tokens.Generic) => string,
): TokenizerAndRendererExtension {
return {
name: 'blockKatex',
level: 'block',
tokenizer(src: string) {
const match = src.match(blockRule)
if (match) {
// 处理 $$...$$
if (match[1]) {
return {
type: 'blockKatex',
raw: match[0],
text: match[2].trim(),
displayMode: true,
}
} else {
// 处理 \[...\]
return {
type: 'blockKatex',
raw: match[0],
text: match[3].trim(),
displayMode: true,
}
}
}
return undefined
},
renderer,
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment