import katex from "katex"; import splitAtDelimiters from "./splitAtDelimiters"; const renderMathInText = function(text, optionsCopy) { const data = splitAtDelimiters(text, optionsCopy.delimiters); if (data.length === 1 && data[0].type === 'text') { // There is no formula in the text. // Let's return null which means there is no need to replace // the current text node with a new one. return data[0].data; } let html = '' for (let i = 0; i < data.length; i++) { if (data[i].type === "text") { html += data[i].data; } else { let math = data[i].data; // Override any display mode defined in the settings with that // defined by the text itself optionsCopy.displayMode = data[i].display; try { if (optionsCopy.preProcess) { math = optionsCopy.preProcess(math); } html += katex.renderToString(math, optionsCopy); } catch (e) { if (!(e instanceof katex.ParseError)) { throw e; } optionsCopy.errorCallback( "KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e ); html += data[i].rawData; continue; } } } return html; }; const renderMath = function(text, options) { if (!text) { throw new Error("No text provided to render"); } const optionsCopy = {}; // Object.assign(optionsCopy, option) for (const option in options) { if (options.hasOwnProperty(option)) { optionsCopy[option] = options[option]; } } // default options optionsCopy.delimiters = optionsCopy.delimiters || [ {left: "$$", right: "$$", display: true}, {left: "\\(", right: "\\)", display: false}, // LaTeX uses $…$, but it ruins the display of normal `$` in text: {left: "$", right: "$", display: false}, // $ must come after $$ // Render AMS environments even if outside $$…$$ delimiters. {left: "\\begin{equation}", right: "\\end{equation}", display: true}, {left: "\\begin{align}", right: "\\end{align}", display: true}, {left: "\\begin{alignat}", right: "\\end{alignat}", display: true}, {left: "\\begin{gather}", right: "\\end{gather}", display: true}, {left: "\\begin{CD}", right: "\\end{CD}", display: true}, {left: "\\[", right: "\\]", display: true}, ]; optionsCopy.ignoredTags = optionsCopy.ignoredTags || [ "script", "noscript", "style", "textarea", "pre", "code", "option", ]; optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || []; optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different // math elements within a single call to `renderMathInElement`. optionsCopy.macros = optionsCopy.macros || {}; return renderMathInText(text, optionsCopy); }; export default renderMath;