修复列表下的数学公式不能渲染列表
This commit is contained in:
parent
66e916517e
commit
fca0d65829
@ -37,17 +37,18 @@ export class MarkdownRenderer {
|
|||||||
name: 'latexBlock',
|
name: 'latexBlock',
|
||||||
level: 'block',
|
level: 'block',
|
||||||
start(src: string) {
|
start(src: string) {
|
||||||
return src.match(/^\$\$\n/)?.index
|
return src.match(/^\$\$/)?.index
|
||||||
},
|
},
|
||||||
tokenizer(src: string) {
|
tokenizer(src: string) {
|
||||||
const rule = /^\$\$\n([\s\S]*?)\n\$\$/
|
const rule = /^\$\$([\s\S]*?)\$\$/
|
||||||
const match = rule.exec(src)
|
const match = rule.exec(src)
|
||||||
if (match) {
|
if (match) {
|
||||||
|
const content = match[1].trim()
|
||||||
return {
|
return {
|
||||||
type: 'latexBlock',
|
type: 'latexBlock',
|
||||||
raw: match[0],
|
raw: match[0],
|
||||||
tokens: [],
|
tokens: [],
|
||||||
text: match[1].trim()
|
text: content
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -136,17 +137,15 @@ export class MarkdownRenderer {
|
|||||||
private initializeRenderer() {
|
private initializeRenderer() {
|
||||||
// 重写 text 方法来处理行内 LaTeX 公式
|
// 重写 text 方法来处理行内 LaTeX 公式
|
||||||
this.renderer.text = (token: Tokens.Text | Tokens.Escape) => {
|
this.renderer.text = (token: Tokens.Text | Tokens.Escape) => {
|
||||||
// 处理行内公式 $...$ 和行间公式 $$`...`$$
|
// 只处理行内公式
|
||||||
return token.text.replace(/\$\$`([^`]+)`\$\$|\$([^$\n]+?)\$/g, (match, backtick, inline) => {
|
return token.text.replace(/(?<!\$)\$([^\n$]+?)\$/g, (match, inline) => {
|
||||||
try {
|
try {
|
||||||
const formula = backtick || inline
|
return katex.renderToString(inline.trim(), {
|
||||||
const isDisplayMode = !!backtick
|
displayMode: false,
|
||||||
return katex.renderToString(formula.trim(), {
|
|
||||||
displayMode: isDisplayMode,
|
|
||||||
throwOnError: false
|
throwOnError: false
|
||||||
})
|
})
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('LaTeX rendering error:', error)
|
console.error('LaTeX inline rendering error:', error)
|
||||||
return match
|
return match
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -239,8 +238,7 @@ export class MarkdownRenderer {
|
|||||||
const tokens = marked.Lexer.lexInline(text)
|
const tokens = marked.Lexer.lexInline(text)
|
||||||
const content = marked.Parser.parseInline(tokens, { renderer: this.renderer })
|
const content = marked.Parser.parseInline(tokens, { renderer: this.renderer })
|
||||||
|
|
||||||
return `<em${styleStr ? ` style="${styleStr}"` : ''}>${content}</em>`
|
return `<em${styleStr ? ` style="${styleStr}"` : ''}>${content}</em>` }
|
||||||
}
|
|
||||||
|
|
||||||
// 重写 strong 方法
|
// 重写 strong 方法
|
||||||
this.renderer.strong = ({ text }: Tokens.Strong) => {
|
this.renderer.strong = ({ text }: Tokens.Strong) => {
|
||||||
@ -312,23 +310,55 @@ export class MarkdownRenderer {
|
|||||||
}
|
}
|
||||||
const styleStr = cssPropertiesToString(style)
|
const styleStr = cssPropertiesToString(style)
|
||||||
|
|
||||||
// 处理嵌套列表
|
// 处理嵌套列表和内容
|
||||||
let content = item.text
|
let content = item.text
|
||||||
if (item.tokens) {
|
if (item.tokens) {
|
||||||
content = item.tokens.map(token => {
|
content = item.tokens.map(token => {
|
||||||
if (token.type === 'list') {
|
if (token.type === 'list') {
|
||||||
// 递归处理嵌套列表
|
// 递归处理嵌套列表
|
||||||
return this.renderer.list(token as Tokens.List)
|
return this.renderer.list(token as Tokens.List)
|
||||||
|
} else if (token.type === 'text' || token.type === 'paragraph') {
|
||||||
|
// 处理文本节点和段落节点
|
||||||
|
// 首先处理块级公式
|
||||||
|
const processedText = (token.text || token.raw).replace(/\$\$([\s\S]+?)\$\$/g, (match: string, formula: string) => {
|
||||||
|
try {
|
||||||
|
const latexStyle = (this.options.block?.latex || {})
|
||||||
|
const style = {
|
||||||
|
...latexStyle,
|
||||||
|
display: 'block',
|
||||||
|
margin: '1em 0',
|
||||||
|
textAlign: 'center' as const
|
||||||
|
}
|
||||||
|
const styleStr = cssPropertiesToString(style)
|
||||||
|
const rendered = katex.renderToString(formula.trim(), {
|
||||||
|
displayMode: true,
|
||||||
|
throwOnError: false
|
||||||
|
})
|
||||||
|
return `<div${styleStr ? ` style="${styleStr}"` : ''}>${rendered}</div>`
|
||||||
|
} catch (error) {
|
||||||
|
console.error('LaTeX block rendering error:', error)
|
||||||
|
return match
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// 然后处理其他内联标记
|
||||||
|
const inlineTokens = marked.Lexer.lexInline(processedText)
|
||||||
|
return marked.Parser.parseInline(inlineTokens, { renderer: this.renderer })
|
||||||
} else {
|
} else {
|
||||||
// 处理其他类型的 token
|
// 对于其他类型的 token,直接使用其原始内容
|
||||||
const tokens = marked.Lexer.lexInline(token.raw)
|
return token.raw
|
||||||
return marked.Parser.parseInline(tokens, { renderer: this.renderer })
|
|
||||||
}
|
}
|
||||||
}).join('')
|
}).join('')
|
||||||
} else {
|
} else {
|
||||||
// 如果没有 tokens,则按普通文本处理
|
// 如果没有 tokens,则按普通文本处理
|
||||||
const tokens = marked.Lexer.lexInline(content)
|
const inlineTokens = marked.Lexer.lexInline(content)
|
||||||
content = marked.Parser.parseInline(tokens, { renderer: this.renderer })
|
content = marked.Parser.parseInline(inlineTokens, { renderer: this.renderer })
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理任务列表项
|
||||||
|
if (item.task) {
|
||||||
|
const checkbox = `<input type="checkbox"${item.checked ? ' checked=""' : ''} disabled="" /> `
|
||||||
|
content = checkbox + content
|
||||||
}
|
}
|
||||||
|
|
||||||
return `<li${styleStr ? ` style="${styleStr}"` : ''}>${content}</li>`
|
return `<li${styleStr ? ` style="${styleStr}"` : ''}>${content}</li>`
|
||||||
|
Loading…
Reference in New Issue
Block a user