123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /**
- * A plugin which enables rendering of math equations inside
- * of reveal.js slides. Essentially a thin wrapper for KaTeX.
- *
- * @author Hakim El Hattab
- * @author Gerhard Burger
- */
- export const KaTeX = () => {
- let deck;
- let defaultOptions = {
- version: 'latest',
- delimiters: [
- {left: '$$', right: '$$', display: true}, // Note: $$ has to come before $
- {left: '$', right: '$', display: false},
- {left: '\\(', right: '\\)', display: false},
- {left: '\\[', right: '\\]', display: true}
- ],
- ignoredTags: ['script', 'noscript', 'style', 'textarea', 'pre']
- }
- const loadCss = src => {
- let link = document.createElement('link');
- link.rel = 'stylesheet';
- link.href = src;
- document.head.appendChild(link);
- };
- /**
- * Loads a JavaScript file and returns a Promise for when it is loaded
- * Credits: https://aaronsmith.online/easily-load-an-external-script-using-javascript/
- */
- const loadScript = src => {
- return new Promise((resolve, reject) => {
- const script = document.createElement('script')
- script.type = 'text/javascript'
- script.onload = resolve
- script.onerror = reject
- script.src = src
- document.head.append(script)
- })
- };
- async function loadScripts(urls) {
- for(const url of urls) {
- await loadScript(url);
- }
- }
- return {
- id: 'katex',
- init: function (reveal) {
- deck = reveal;
- let revealOptions = deck.getConfig().katex || {};
- let options = {...defaultOptions, ...revealOptions};
- const {local, version, extensions, ...katexOptions} = options;
- let baseUrl = options.local || 'https://cdn.jsdelivr.net/npm/katex';
- let versionString = options.local ? '' : '@' + options.version;
- let cssUrl = baseUrl + versionString + '/dist/katex.min.css';
- let katexUrl = baseUrl + versionString + '/dist/katex.min.js';
- let mhchemUrl = baseUrl + versionString + '/dist/contrib/mhchem.min.js'
- let karUrl = baseUrl + versionString + '/dist/contrib/auto-render.min.js';
- let katexScripts = [katexUrl];
- if(options.extensions && options.extensions.includes("mhchem")) {
- katexScripts.push(mhchemUrl);
- }
- katexScripts.push(karUrl);
- const renderMath = () => {
- renderMathInElement(reveal.getSlidesElement(), katexOptions);
- deck.layout();
- }
- loadCss(cssUrl);
- // For some reason dynamically loading with defer attribute doesn't result in the expected behavior, the below code does
- loadScripts(katexScripts).then(() => {
- if( deck.isReady() ) {
- renderMath();
- }
- else {
- deck.on( 'ready', renderMath.bind( this ) );
- }
- });
- }
- }
- };
|