1
0
Fork 0
why-cant-we-deploy-today/plugin/math/mathjax3.js

77 lines
1.9 KiB
JavaScript

/**
* A plugin which enables rendering of math equations inside
* of reveal.js slides. Essentially a thin wrapper for MathJax 3
*
* @author Hakim El Hattab
* @author Gerhard Burger
*/
export const MathJax3 = () => {
// The reveal.js instance this plugin is attached to
let deck;
let defaultOptions = {
tex: {
inlineMath: [
["$", "$"],
["\\(", "\\)"],
],
},
options: {
skipHtmlTags: ["script", "noscript", "style", "textarea", "pre"],
},
startup: {
ready: () => {
MathJax.startup.defaultReady();
MathJax.startup.promise.then(() => {
Reveal.layout();
});
},
},
};
function loadScript(url, callback) {
let script = document.createElement("script");
script.type = "text/javascript";
script.id = "MathJax-script";
script.src = url;
script.async = true;
// Wrapper for callback to make sure it only fires once
script.onload = () => {
if (typeof callback === "function") {
callback.call();
callback = null;
}
};
document.head.appendChild(script);
}
return {
id: "mathjax3",
init: function (reveal) {
deck = reveal;
let revealOptions = deck.getConfig().mathjax3 || {};
let options = { ...defaultOptions, ...revealOptions };
options.tex = { ...defaultOptions.tex, ...revealOptions.tex };
options.options = { ...defaultOptions.options, ...revealOptions.options };
options.startup = { ...defaultOptions.startup, ...revealOptions.startup };
let url =
options.mathjax ||
"https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js";
options.mathjax = null;
window.MathJax = options;
loadScript(url, function () {
// Reprocess equations in slides when they turn visible
Reveal.addEventListener("slidechanged", function (event) {
MathJax.typeset();
});
});
},
};
};