blob: 38eb4ef08a4745ad33f439ad0dae913fbe7e82e0 [file] [log] [blame]
Christophe Dervieux8afae132021-12-06 15:16:42 +01001/**
2 * A plugin which enables rendering of math equations inside
3 * of reveal.js slides. Essentially a thin wrapper for MathJax 3
4 *
5 * @author Hakim El Hattab
6 * @author Gerhard Burger
7 */
8export const MathJax3 = () => {
9
10 // The reveal.js instance this plugin is attached to
11 let deck;
12
13 let defaultOptions = {
14 tex: {
15 inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ]
16 },
17 options: {
18 skipHtmlTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ]
19 },
20 startup: {
21 ready: () => {
22 MathJax.startup.defaultReady();
23 MathJax.startup.promise.then(() => {
24 Reveal.layout();
25 });
26 }
27 }
28 };
29
30 function loadScript( url, callback ) {
31
32 let script = document.createElement( 'script' );
33 script.type = "text/javascript"
34 script.id = "MathJax-script"
35 script.src = url;
36 script.async = true
37
38 // Wrapper for callback to make sure it only fires once
39 script.onload = () => {
40 if (typeof callback === 'function') {
41 callback.call();
42 callback = null;
43 }
44 };
45
46 document.head.appendChild( script );
47
48 }
49
50 return {
51 id: 'mathjax3',
52 init: function(reveal) {
53
54 deck = reveal;
55
56 let revealOptions = deck.getConfig().mathjax3 || {};
57 let options = {...defaultOptions, ...revealOptions};
58 options.tex = {...defaultOptions.tex, ...revealOptions.tex}
59 options.options = {...options.options, ...defaultOptions.options}
60 options.startup = {...defaultOptions.startup, ...revealOptions.startup}
61
62 let url = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js';
63 options.mathjax = null;
64
65 window.MathJax = options;
66
67 loadScript( url, function() {
68 // Reprocess equations in slides when they turn visible
69 Reveal.addEventListener( 'slidechanged', function( event ) {
70 MathJax.typeset();
71 } );
72 } );
73
74 }
75 }
76
77};