From 67132b1e64038f65e9b8917ea29748785819f168 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 19 Jun 2020 19:09:33 +0530 Subject: [PATCH] Get MathJax 3 working with PDF output as well --- resources/pdf-mathjax-loader.js | 76 +++++++++++++++-------------- src/calibre/gui2/viewer/web_view.py | 29 +---------- 2 files changed, 40 insertions(+), 65 deletions(-) diff --git a/resources/pdf-mathjax-loader.js b/resources/pdf-mathjax-loader.js index 7a47fc4b56..bb941b807c 100644 --- a/resources/pdf-mathjax-loader.js +++ b/resources/pdf-mathjax-loader.js @@ -8,44 +8,46 @@ (function() { "use strict"; + var base = document.currentScript ? document.currentScript.getAttribute('data-mathjax-path') : null; + var for_pdf_renderer = !!base; - function init_mathjax() { - var orig = window.MathJax.Ajax.fileURL.bind(window.MathJax.Ajax); - - window.MathJax.Ajax.fileURL = function(mathjax_name) { - var ans = orig(mathjax_name); - if (mathjax_name.startsWith('[MathJax]/../fonts')) { - ans = ans.replace('/../fonts', '/fonts'); - } - return ans; - }; + function on_mathjax_finish() { + if (for_pdf_renderer) document.title = "mathjax-load-complete"; + else document.documentElement.dispatchEvent(new CustomEvent("calibre-mathjax-typeset-done")); } - - var base = document.currentScript.getAttribute('data-mathjax-path'); - if (!base.endsWith('/')) base += '/'; - - var script = document.createElement('script'); - script.type = 'text/javascript'; - script.setAttribute('async', 'async'); - script.onerror = function (ev) { - console.log('Failed to load MathJax script: ' + ev.target.src); + window.MathJax = {}; + window.MathJax.options = { + renderActions: { + // disable the mathjax context menu + addMenu: [0, '', ''], + }, }; - script.src = base + 'MathJax.js'; - window.MathJax = {AuthorInit: init_mathjax}; - script.text = ` - document.title = 'mathjax-load-started'; - MathJax.Hub.signal.Interest(function (message) {if (String(message).match(/error/i)) {console.log(message)}}); - MathJax.Hub.Config({ - positionToHash: false, - showMathMenu: false, - extensions: ["tex2jax.js", "asciimath2jax.js", "mml2jax.js"], - jax: ["input/TeX", "input/MathML", "input/AsciiMath", "output/CommonHTML"], - TeX: { - extensions: ["AMSmath.js", "AMSsymbols.js", "noErrors.js", "noUndefined.js"] - } - }); - MathJax.Hub.Startup.onload(); - MathJax.Hub.Register.StartupHook("End", function() { document.title = "mathjax-load-complete"; }); - `.trim(); - document.head.appendChild(script); + window.MathJax.loader = { + load: ['input/tex-full', 'input/asciimath', 'input/mml', 'output/chtml'], + }; + window.MathJax.startup = { + ready: () => { + MathJax.startup.defaultReady(); + MathJax.startup.promise.then(on_mathjax_finish); + }, + }; + for (const s of document.scripts) { + if (s.type === "text/x-mathjax-config") { + var es = document.createElement('script'); + es.text = s.text; + document.head.appendChild(es); + document.head.removeChild(es); + } + } + if (for_pdf_renderer) { + if (!base.endsWith('/')) base += '/'; + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.setAttribute('async', 'async'); + script.onerror = function (ev) { + console.log('Failed to load MathJax script: ' + ev.target.src); + }; + script.src = base + 'startup.js'; + document.head.appendChild(script); + } })(); diff --git a/src/calibre/gui2/viewer/web_view.py b/src/calibre/gui2/viewer/web_view.py index 62e568c257..83fe3de839 100644 --- a/src/calibre/gui2/viewer/web_view.py +++ b/src/calibre/gui2/viewer/web_view.py @@ -178,34 +178,7 @@ class UrlSchemeHandler(QWebEngineUrlSchemeHandler): prints("Failed to get mathjax file: {} with error: {}".format(name, err)) return self.fail_request(rq, rq.RequestFailed) if name.endswith('/startup.js'): - raw = b''' - window.MathJax = {}; - window.MathJax.options = { - renderActions: { - // disable the mathjax context menu - addMenu: [0, '', ''], - }, - }; - window.MathJax.loader = { - load: ['input/tex-full', 'input/asciimath', 'input/mml', 'output/chtml'], - }; - window.MathJax.startup = { - ready: () => { - MathJax.startup.defaultReady(); - MathJax.startup.promise.then(() => { - document.documentElement.dispatchEvent(new CustomEvent("calibre-mathjax-typeset-done")); - }); - }, - }; - for (const s of document.scripts) { - if (s.type === "text/x-mathjax-config") { - es = document.createElement('script'); - es.text = s.text; - document.head.appendChild(es); - document.head.removeChild(es); - } - } - ''' + raw + raw = P('pdf-mathjax-loader.js', data=True, allow_user_override=False) + raw send_reply(rq, mt, raw) elif not name: send_reply(rq, 'text/html', viewer_html())