Path: blob/main/src/resources/formats/revealjs/reveal/plugin/math/katex.js
12923 views
/**1* A plugin which enables rendering of math equations inside2* of reveal.js slides. Essentially a thin wrapper for KaTeX.3*4* @author Hakim El Hattab5* @author Gerhard Burger6*/7export const KaTeX = () => {8let deck;910let defaultOptions = {11version: 'latest',12delimiters: [13{left: '$$', right: '$$', display: true}, // Note: $$ has to come before $14{left: '$', right: '$', display: false},15{left: '\\(', right: '\\)', display: false},16{left: '\\[', right: '\\]', display: true}17],18ignoredTags: ['script', 'noscript', 'style', 'textarea', 'pre']19}2021const loadCss = src => {22let link = document.createElement('link');23link.rel = 'stylesheet';24link.href = src;25document.head.appendChild(link);26};2728/**29* Loads a JavaScript file and returns a Promise for when it is loaded30* Credits: https://aaronsmith.online/easily-load-an-external-script-using-javascript/31*/32const loadScript = src => {33return new Promise((resolve, reject) => {34const script = document.createElement('script')35script.type = 'text/javascript'36script.onload = resolve37script.onerror = reject38script.src = src39document.head.append(script)40})41};4243async function loadScripts(urls) {44for(const url of urls) {45await loadScript(url);46}47}4849return {50id: 'katex',5152init: function (reveal) {5354deck = reveal;5556let revealOptions = deck.getConfig().katex || {};5758let options = {...defaultOptions, ...revealOptions};59const {local, version, extensions, ...katexOptions} = options;6061let baseUrl = options.local || 'https://cdn.jsdelivr.net/npm/katex';62let versionString = options.local ? '' : '@' + options.version;6364let cssUrl = baseUrl + versionString + '/dist/katex.min.css';65let katexUrl = baseUrl + versionString + '/dist/katex.min.js';66let mhchemUrl = baseUrl + versionString + '/dist/contrib/mhchem.min.js'67let karUrl = baseUrl + versionString + '/dist/contrib/auto-render.min.js';6869let katexScripts = [katexUrl];70if(options.extensions && options.extensions.includes("mhchem")) {71katexScripts.push(mhchemUrl);72}73katexScripts.push(karUrl);7475const renderMath = () => {76renderMathInElement(reveal.getSlidesElement(), katexOptions);77deck.layout();78}7980loadCss(cssUrl);8182// For some reason dynamically loading with defer attribute doesn't result in the expected behavior, the below code does83loadScripts(katexScripts).then(() => {84if( deck.isReady() ) {85renderMath();86}87else {88deck.on( 'ready', renderMath.bind( this ) );89}90});9192}93}9495};969798