Files
Gists/public/latex.ts

67 lines
1.9 KiB
TypeScript

import katex from 'katex';
const delimiters = [
{ left: '\\\$\\\$', right: '\\\$\\\$', multiline: true },
{ left: '\\\$', right: '\\\$', multiline: false },
{ left: '\\\\\[', right: '\\\\\]', multiline: true },
{ left: '\\\\\(', right: '\\\\\)', multiline: false },
];
const delimiterMatchers = delimiters.map(
(delimiter) => new RegExp(
`${delimiter.left}(.*?)${delimiter.right}`,
`g${delimiter.multiline ? 'ms' : ''}`
)
);
// Replace LaTeX delimiters in a string with KaTeX rendering
function render(text: string): string {
// Step 1: Replace all LaTeX expressions with placeholders
const expressions: Array<{ placeholder: string; latex: string; displayMode: boolean }> = [];
let modifiedText = text;
let placeholderIndex = 0;
// Process each delimiter type
delimiters.forEach((delimiter, i) => {
// Find all matches and replace with placeholders
modifiedText = modifiedText.replace(delimiterMatchers[i], (match, latex) => {
if (!latex.trim()) {
return match; // Return original if content is empty
}
const placeholder = `__KATEX_PLACEHOLDER_${placeholderIndex++}__`;
expressions.push({
placeholder,
latex,
displayMode: delimiter.multiline,
});
return placeholder;
});
});
// Step 2: Replace placeholders with rendered LaTeX
for (const { placeholder, latex, displayMode } of expressions) {
try {
const rendered = katex.renderToString(latex, {
throwOnError: false,
displayMode,
});
modifiedText = modifiedText.replace(placeholder, rendered);
} catch (error) {
console.error('KaTeX rendering error:', error);
// Replace placeholder with original LaTeX if rendering fails
modifiedText = modifiedText.replace(
placeholder,
displayMode ? `$$${latex}$$` : `$${latex}$`
);
}
}
return modifiedText;
}
export default {
render,
};