Spaces:
Build error
Build error
| import katex from 'katex'; | |
| // Adapted from https://github.com/SchneeHertz/markdown-it-katex-gpt | |
| // MIT license | |
| const defaultOptions = { | |
| delimiters: [ | |
| { left: '\\[', right: '\\]', display: true }, | |
| { left: '\\(', right: '\\)', display: false }, | |
| ], | |
| }; | |
| export function renderLatexHTML(content, display = false) { | |
| return katex.renderToString(content, { | |
| throwOnError: false, | |
| output: 'mathml', | |
| displayMode: display, | |
| }); | |
| } | |
| function escapedBracketRule(options) { | |
| return (state, silent) => { | |
| const max = state.posMax; | |
| const start = state.pos; | |
| for (const { left, right, display } of options.delimiters) { | |
| // Check if it starts with the left delimiter | |
| if (!state.src.slice(start).startsWith(left)) continue; | |
| // Skip the length of the left delimiter | |
| let pos = start + left.length; | |
| // Find the matching right delimiter | |
| while (pos < max) { | |
| if (state.src.slice(pos).startsWith(right)) { | |
| break; | |
| } | |
| pos++; | |
| } | |
| // No matching right delimiter found, skip to the next match | |
| if (pos >= max) continue; | |
| // If not in silent mode, convert LaTeX formula to MathML | |
| if (!silent) { | |
| const content = state.src.slice(start + left.length, pos); | |
| try { | |
| const renderedContent = renderLatexHTML(content, display); | |
| const token = state.push('html_inline', '', 0); | |
| token.content = renderedContent; | |
| } catch (e) { | |
| console.error(e); | |
| } | |
| } | |
| // Update position, skip the length of the right delimiter | |
| state.pos = pos + right.length; | |
| return true; | |
| } | |
| } | |
| } | |
| export default function (md, options = defaultOptions) { | |
| md.inline.ruler.after('text', 'escaped_bracket', escapedBracketRule(options)); | |
| } | |