| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- 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));
- }
|