/
githubmirror
/
marktext
Обзор
Документация
Войти
/
githubmirror
/
marktext
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
packages/muya/src/utils/marked/extensions/math.ts
109 строк
3 KB
Ran Luo
fix(muya): load mhchem onto the same katex instance so \ce renders (#4670) (#4674)
24 июн 2026, 14:53
Не верифицирован
24 июн 2026, 14:53
d0a0534
Код
Авторство
О чём код?
import katex from 'katex'; import 'katex/dist/contrib/mhchem.mjs'; export interface IMathToken { type: 'inlineMath' | 'multiplemath'; raw: string; text: string; displayMode: boolean; mathStyle?: '' | 'gitlab'; } interface IOptions { throwOnError?: boolean; useKatexRender?: boolean; } const inlineStartRule = /(\s|^)\${1,2}(?!\$)/; const inlineRule = /^(\${1,2})(?!\$)((?:\\.|[^\\\n])*?(?:\\.|[^\\\n$]))\1(?=[\s?!.,:]|$)/; const blockRule = /^(\${1,2})\n((?:\\[\s\S]|[^\\])+?)\n\1[ \t]*(?:\n|$)/; const DEFAULT_OPTIONS = { throwOnError: false, useKatexRender: false, }; export default function (options: IOptions = {}) { const opts = Object.assign({}, DEFAULT_OPTIONS, options); return { extensions: [ inlineKatex(createRenderer(opts, false)), blockKatex(createRenderer(opts, true)), ], }; } function createRenderer(options: IOptions, newlineAfter: boolean) { return (token: IMathToken) => { const { useKatexRender, ...otherOpts } = options; const { type, text, displayMode, mathStyle } = token; if (useKatexRender) { return ( katex.renderToString(text, { ...otherOpts, displayMode, }) + (newlineAfter ? '\n' : '') ); } else { return type === 'inlineMath' ? `$${text}$` : `<pre class="multiple-math" data-math-style="${mathStyle}">${text}</pre>\n`; } }; } function inlineKatex(renderer: (token: IMathToken) => string) { return { name: 'inlineMath', level: 'inline' as const, start(src: string) { const match = src.match(inlineStartRule); if (!match) return; const index = (match.index || 0) + match[1].length; const possibleKatex = src.substring(index); if (inlineRule.test(possibleKatex)) return index; }, tokenizer(src: string) { const match = src.match(inlineRule); if (match) { return { type: 'inlineMath', raw: match[0], text: match[2].trim(), displayMode: match[1].length === 2, }; } }, renderer, }; } function blockKatex(renderer: (token: IMathToken) => string) { return { name: 'multiplemath', level: 'block' as const, start(src: string) { return src.indexOf('\n$'); }, tokenizer(src: string) { const match = src.match(blockRule); if (match) { return { type: 'multiplemath', raw: match[0], text: match[2].trim(), displayMode: match[1].length === 2, mathStyle: '', }; } }, renderer, }; }