Commit f80cf91d authored by nick zheng's avatar nick zheng

Merge branch 'beta' into 'master'

Beta

See merge request !200
parents c76b82ab 66de222c
......@@ -36,6 +36,7 @@
"lodash-es": "^4.17.21",
"marked": "^15.0.0",
"marked-highlight": "^2.2.1",
"marked-katex-extension": "^5.1.4",
"mitt": "^3.0.1",
"nanoid": "^5.0.7",
"pinia": "^2.2.2",
......
......@@ -68,6 +68,9 @@ importers:
marked-highlight:
specifier: ^2.2.1
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:
specifier: ^3.0.1
version: 3.0.1
......@@ -137,10 +140,10 @@ importers:
version: 13.12.2
'@typescript-eslint/parser':
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':
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':
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))
......@@ -152,16 +155,16 @@ importers:
version: 10.4.20(postcss@8.4.47)
eslint:
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:
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:
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:
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:
specifier: ^15.9.0
version: 15.9.0
......@@ -224,7 +227,7 @@ importers:
version: 5.6.2
typescript-eslint:
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:
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))
......@@ -239,13 +242,13 @@ importers:
version: 5.4.6(@types/node@20.16.5)(sass@1.79.1)(terser@5.39.0)
vite-plugin-checker:
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:
specifier: ^5.1.0
version: 5.1.0(vue@3.5.13(typescript@5.6.2))
vue-eslint-parser:
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:
specifier: ^2.0.29
version: 2.0.29(typescript@5.6.2)
......@@ -2429,6 +2432,12 @@ packages:
peerDependencies:
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:
resolution: {integrity: sha512-0mouKmBROJv/WSHJBPZZyYofUgawMChnD5je/g+aOBXsHDjb/IsnTQj7mnhQZu+qPJmRQ0ecX3mLGEUm3BgwYA==}
engines: {node: '>= 18'}
......@@ -4016,9 +4025,9 @@ snapshots:
'@esbuild/win32-x64@0.23.1':
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:
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-community/regexpp@4.11.1': {}
......@@ -4260,15 +4269,15 @@ snapshots:
'@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:
'@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/type-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@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@2.0.0-beta.3))(typescript@5.6.2)
'@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
ignore: 5.3.2
natural-compare: 1.4.0
......@@ -4278,14 +4287,14 @@ snapshots:
transitivePeerDependencies:
- 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:
'@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/types': 7.18.0
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.2)
'@typescript-eslint/visitor-keys': 7.18.0
debug: 4.3.7
eslint: 9.10.0(jiti@1.21.6)
eslint: 9.10.0(jiti@2.0.0-beta.3)
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
......@@ -4296,12 +4305,12 @@ snapshots:
'@typescript-eslint/types': 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:
'@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
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)
optionalDependencies:
typescript: 5.6.2
......@@ -4325,13 +4334,13 @@ snapshots:
transitivePeerDependencies:
- 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:
'@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/types': 7.18.0
'@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:
- supports-color
- typescript
......@@ -4380,17 +4389,17 @@ snapshots:
'@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:
'@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:
- eslint
- supports-color
- 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:
'@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/core': 0.61.9
magic-string: 0.30.11
......@@ -5175,29 +5184,29 @@ snapshots:
optionalDependencies:
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:
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:
eslint: 9.10.0(jiti@1.21.6)
eslint: 9.10.0(jiti@2.0.0-beta.3)
prettier: 3.3.3
prettier-linter-helpers: 1.0.0
synckit: 0.9.1
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:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.10.0(jiti@1.21.6))
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@2.0.0-beta.3)
globals: 13.24.0
natural-compare: 1.4.0
nth-check: 2.1.1
postcss-selector-parser: 6.1.2
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
transitivePeerDependencies:
- supports-color
......@@ -5216,9 +5225,9 @@ snapshots:
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:
'@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/config-array': 0.18.0
'@eslint/eslintrc': 3.1.0
......@@ -5253,7 +5262,7 @@ snapshots:
strip-ansi: 6.0.1
text-table: 0.2.0
optionalDependencies:
jiti: 1.21.6
jiti: 2.0.0-beta.3
transitivePeerDependencies:
- supports-color
......@@ -5772,6 +5781,11 @@ snapshots:
dependencies:
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: {}
math-intrinsics@1.1.0: {}
......@@ -6465,12 +6479,12 @@ snapshots:
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:
'@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/parser': 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@1.21.6))(typescript@5.6.2)
eslint: 9.10.0(jiti@1.21.6)
'@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@2.0.0-beta.3))(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@2.0.0-beta.3)
optionalDependencies:
typescript: 5.6.2
transitivePeerDependencies:
......@@ -6604,7 +6618,7 @@ snapshots:
evtd: 0.2.4
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:
'@babel/code-frame': 7.24.7
ansi-escapes: 4.3.2
......@@ -6622,7 +6636,8 @@ snapshots:
vscode-languageserver-textdocument: 1.0.12
vscode-uri: 3.0.8
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
stylelint: 16.9.0(typescript@5.6.2)
typescript: 5.6.2
......@@ -6676,10 +6691,10 @@ snapshots:
dependencies:
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:
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-visitor-keys: 3.4.3
espree: 9.6.1
......
......@@ -8,7 +8,7 @@ import DOMPurify from 'dompurify'
import hljs from 'highlight.js'
import 'highlight.js/styles/panda-syntax-light.css'
import 'github-markdown-css'
import markedKatex, { MarkedKatexOptions } from './plugins/katex'
import markedKatex, { MarkedKatexOptions } from 'marked-katex-extension'
interface Props {
rawTextContent: string
......@@ -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(
(text: string) => {
;(marked.parse(text) as Promise<string>).then((res) => {
......@@ -63,7 +72,8 @@ const textContentParser = throttle(
)
watchEffect(() => {
textContentParser(props.rawTextContent)
const text = katexDelimiters(props.rawTextContent)
textContentParser(text)
})
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