diff --git a/editors/demo/src/Editoria/layout/EditorElements.js b/editors/demo/src/Editoria/layout/EditorElements.js index 7aa3866787d6ad64c7d9aaa06ac3785299998adc..c6d44d363c8bf8c02e55a0f60785465b5441e79a 100644 --- a/editors/demo/src/Editoria/layout/EditorElements.js +++ b/editors/demo/src/Editoria/layout/EditorElements.js @@ -386,6 +386,7 @@ export default css` math-display .math-render { display: block; + text-align: center; } math-display.ProseMirror-selectednode { @@ -404,10 +405,6 @@ export default css` color: #b0b0b0; } - math-display .katex-display { - margin: 0; - } - /* -- Selection Plugin ---------------------------------- */ p::selection, diff --git a/editors/demo/src/Editoria/layout/EditoriaLayout.js b/editors/demo/src/Editoria/layout/EditoriaLayout.js index 0fc9665168b670d03fb8d1118bfc7d2d5a6f9795..3a40000d648c92e861529ce56da83459e152a775 100644 --- a/editors/demo/src/Editoria/layout/EditoriaLayout.js +++ b/editors/demo/src/Editoria/layout/EditoriaLayout.js @@ -7,9 +7,6 @@ import { grid, th } from '@pubsweet/ui-toolkit'; import { cokoTheme } from '../theme'; import EditorElements from './EditorElements'; -/* Katex css */ -import '~../../katex/dist/katex.min.css'; - const divider = css` .panelGroup { background: #fff; diff --git a/editors/demo/src/Editoria/layout/EditoriaMobileLayout.js b/editors/demo/src/Editoria/layout/EditoriaMobileLayout.js index b0fd63c353d526a34bde8d38c03c75afddaa7a69..8bb9cc23dd4fe33a50a9002e2ab44dd6bc3a2c3e 100644 --- a/editors/demo/src/Editoria/layout/EditoriaMobileLayout.js +++ b/editors/demo/src/Editoria/layout/EditoriaMobileLayout.js @@ -8,9 +8,6 @@ import { grid, th } from '@pubsweet/ui-toolkit'; import { cokoTheme } from '../theme'; import EditorElements from './EditorElements'; -/* Katex css */ -import '~../../katex/dist/katex.min.css'; - const divider = css` .panelGroup { background: #fff; diff --git a/editors/demo/src/HHMI/layout/EditorElements.js b/editors/demo/src/HHMI/layout/EditorElements.js index a8f39f97290c16ed5e941712347e307fca169c11..4d3b79fc0c922fe76bca10d0c36807d780af3101 100644 --- a/editors/demo/src/HHMI/layout/EditorElements.js +++ b/editors/demo/src/HHMI/layout/EditorElements.js @@ -280,6 +280,7 @@ export default css` math-display .math-render { display: block; + text-align: center; } math-display.ProseMirror-selectednode { @@ -298,10 +299,6 @@ export default css` color: #b0b0b0; } - math-display .katex-display { - margin: 0; - } - /* -- Selection Plugin ---------------------------------- */ p::selection, diff --git a/editors/demo/src/HHMI/layout/HhmiLayout.js b/editors/demo/src/HHMI/layout/HhmiLayout.js index d01b2740b5b68860b187ab3367e63ea036c68b69..d71d53845b509faed167d2a0f488ab08aecd9813 100644 --- a/editors/demo/src/HHMI/layout/HhmiLayout.js +++ b/editors/demo/src/HHMI/layout/HhmiLayout.js @@ -5,8 +5,6 @@ import { grid, th } from '@pubsweet/ui-toolkit'; import { cokoTheme } from '../theme'; import 'antd/dist/antd.css'; import EditorElements from './EditorElements'; -/* Katex css */ -import '~../../katex/dist/katex.min.css'; const Wrapper = styled.div` background: ${th('colorBackground')}; diff --git a/wax-prosemirror-plugins/package.json b/wax-prosemirror-plugins/package.json index 033239fcaa07dc6156b3cd593e9bc0a3dfabb3d5..eea70a391c1bb1f0942df3823d178f374306c40e 100644 --- a/wax-prosemirror-plugins/package.json +++ b/wax-prosemirror-plugins/package.json @@ -14,7 +14,7 @@ }, "dependencies": { "highlight.js": "^10.1.1", - "katex": "^0.12.0", + "mathjax-full": "3.1.4", "lodash": "^4.17.4", "prosemirror-commands": "1.1.10", "prosemirror-highlightjs": "^0.2.0", diff --git a/wax-prosemirror-plugins/src/math/math-nodeview.js b/wax-prosemirror-plugins/src/math/math-nodeview.js index 48e209e7c04d137ccd6694535eeb4abc5be3f37d..04dd5c4e85965a6dd1b7a126dd782d293f24b00f 100644 --- a/wax-prosemirror-plugins/src/math/math-nodeview.js +++ b/wax-prosemirror-plugins/src/math/math-nodeview.js @@ -8,9 +8,43 @@ import { chainCommands, deleteSelection, } from 'prosemirror-commands'; -// katex -import katex, { ParseError } from 'katex'; import { collapseMathCmd } from './helpers/collapse-math-cmd'; +// mathjax + +import { mathjax } from 'mathjax-full/js/mathjax'; +import { TeX } from 'mathjax-full/js/input/tex.js'; +import { SVG } from 'mathjax-full/js/output/svg'; +import { liteAdaptor } from 'mathjax-full/js/adaptors/liteAdaptor.js'; +import { browserAdaptor } from 'mathjax-full/js/adaptors/browserAdaptor'; +import { RegisterHTMLHandler } from 'mathjax-full/js/handlers/html'; +import { AssistiveMmlHandler } from 'mathjax-full/js/a11y/assistive-mml.js'; + +import { AllPackages } from 'mathjax-full/js/input/tex/AllPackages.js'; +import { STATE } from 'mathjax-full/js/core/MathItem'; + +// +// Minimal CSS needed for stand-alone image +// +const CSS = [ + 'svg a{fill:blue;stroke:blue}', + '[data-mml-node="merror"]>g{fill:red;stroke:red}', + '[data-mml-node="merror"]>rect[data-background]{fill:yellow;stroke:none}', + '[data-frame],[data-line]{stroke-width:70px;fill:none}', + '.mjx-dashed{stroke-dasharray:140}', + '.mjx-dotted{stroke-linecap:round;stroke-dasharray:0,140}', + 'use[data-c]{stroke-width:3px}', +].join(''); + +// +// Create DOM adaptor and register it for HTML documents +// +const packages = AllPackages.sort().join(', '); +const adaptor = liteAdaptor(); +const handler = RegisterHTMLHandler(adaptor); +// if (argv.assistiveMml) AssistiveMmlHandler(handler); +const tex = new TeX({ packages: packages.split(/\s*,\s*/) }); +const svg = new SVG({ fontCache: 'none' }); +const html = mathjax.document('', { InputJax: tex, OutputJax: svg }); export class MathView { // == Lifecycle ===================================== // @@ -161,20 +195,14 @@ export class MathView { } else { this.dom.classList.remove('empty-math'); } - // render katex, but fail gracefully - try { - katex.render(texString, this._mathRenderElt, this._katexOptions); - this._mathRenderElt.classList.remove('parse-error'); - this.dom.setAttribute('title', ''); - } catch (err) { - if (err instanceof ParseError) { - console.error(err); - this._mathRenderElt.classList.add('parse-error'); - this.dom.setAttribute('title', err.toString()); - } else { - throw err; - } - } + + const node = html.convert(texString || '', { + em: 16, + ex: 8, + containerWidth: 700, + }); + + this._mathRenderElt.innerHTML = adaptor.innerHTML(node); } // == Inner Editor ================================== // dispatchInner(tr) { diff --git a/yarn.lock b/yarn.lock index 1f0d4bf0e13f2afef25b477285d979c1c450ea22..2a29678a27a84b556eca7a56e4cd502de9673bfa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5854,6 +5854,11 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@>=7.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + commander@^2.11.0, commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -7949,6 +7954,11 @@ eslint@^6.6.0, eslint@^6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +esm@^3.2.25: + version "3.2.25" + resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" + integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== + espree@^6.1.2: version "6.2.1" resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" @@ -11327,13 +11337,6 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3, jsx-ast-utils@^2.4.1: array-includes "^3.1.1" object.assign "^4.1.0" -katex@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/katex/-/katex-0.12.0.tgz#2fb1c665dbd2b043edcf8a1f5c555f46beaa0cb9" - integrity sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg== - dependencies: - commander "^2.19.0" - killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -11996,6 +11999,15 @@ math-expression-evaluator@^1.2.14: resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz#c14dcb3d8b4d150e5dcea9c68c8dad80309b0d5e" integrity sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ== +mathjax-full@3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/mathjax-full/-/mathjax-full-3.1.4.tgz#ec9c51abf55b427e0fd54760ca9478d439406e59" + integrity sha512-80lZZci7vqQQV2wdLcnFUtI7z5Aru0RL03wPw8JM6kFPmX4CA/SYfnlQQ1WIIBU+0p0YoxJ6Z3gAUcVzvDArhw== + dependencies: + esm "^3.2.25" + mj-context-menu "^0.6.1" + speech-rule-engine "^3.2.0" + mathml-tag-names@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" @@ -12469,6 +12481,11 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" +mj-context-menu@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/mj-context-menu/-/mj-context-menu-0.6.1.tgz#a043c5282bf7e1cf3821de07b13525ca6f85aa69" + integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== + mkdirp@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" @@ -17222,6 +17239,15 @@ specificity@^0.4.1: resolved "https://registry.yarnpkg.com/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== +speech-rule-engine@^3.2.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/speech-rule-engine/-/speech-rule-engine-3.3.3.tgz#781ed03cbcf3279f94d1d80241025ea954c6d571" + integrity sha512-0exWw+0XauLjat+f/aFeo5T8SiDsO1JtwpY3qgJE4cWt+yL/Stl0WP4VNDWdh7lzGkubUD9lWP4J1ASnORXfyQ== + dependencies: + commander ">=7.0.0" + wicked-good-xpath "^1.3.0" + xmldom-sre "^0.1.31" + split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" @@ -19192,6 +19218,11 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" +wicked-good-xpath@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz#81b0e95e8650e49c94b22298fff8686b5553cf6c" + integrity sha1-gbDpXoZQ5JyUsiKY//hoa1VTz2w= + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -19493,6 +19524,11 @@ xmlchars@^2.1.1: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmldom-sre@^0.1.31: + version "0.1.31" + resolved "https://registry.yarnpkg.com/xmldom-sre/-/xmldom-sre-0.1.31.tgz#10860d5bab2c603144597d04bf2c4980e98067f4" + integrity sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw== + xregexp@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50"