From 827178f3307b7e67ae46da17d90edc57017e80c4 Mon Sep 17 00:00:00 2001 From: Sarah Jamie Lewis Date: Mon, 9 Aug 2021 22:24:26 -0700 Subject: [PATCH] Start of a new Blog --- footer.html | 6 + header.html | 30 + hello_world.html | 50 + index.html | 40 + index.md | 1 + katex/README.md | 92 + katex/auto-render.min.js | 1 + katex/contrib/auto-render.js | 327 + katex/contrib/auto-render.min.js | 1 + katex/contrib/auto-render.mjs | 222 + katex/contrib/copy-tex.css | 14 + katex/contrib/copy-tex.js | 116 + katex/contrib/copy-tex.min.css | 1 + katex/contrib/copy-tex.min.js | 1 + katex/contrib/copy-tex.mjs | 86 + katex/contrib/mathtex-script-type.js | 112 + katex/contrib/mathtex-script-type.min.js | 1 + katex/contrib/mathtex-script-type.mjs | 24 + katex/contrib/mhchem.js | 3216 ++++ katex/contrib/mhchem.min.js | 1 + katex/contrib/mhchem.mjs | 3109 +++ katex/contrib/render-a11y-string.js | 875 + katex/contrib/render-a11y-string.min.js | 1 + katex/contrib/render-a11y-string.mjs | 794 + katex/fonts/KaTeX_AMS-Regular.ttf | Bin 0 -> 70948 bytes katex/fonts/KaTeX_AMS-Regular.woff | Bin 0 -> 36920 bytes katex/fonts/KaTeX_AMS-Regular.woff2 | Bin 0 -> 31272 bytes katex/fonts/KaTeX_Caligraphic-Bold.ttf | Bin 0 -> 15424 bytes katex/fonts/KaTeX_Caligraphic-Bold.woff | Bin 0 -> 9384 bytes katex/fonts/KaTeX_Caligraphic-Bold.woff2 | Bin 0 -> 8408 bytes katex/fonts/KaTeX_Caligraphic-Regular.ttf | Bin 0 -> 14920 bytes katex/fonts/KaTeX_Caligraphic-Regular.woff | Bin 0 -> 9160 bytes katex/fonts/KaTeX_Caligraphic-Regular.woff2 | Bin 0 -> 8248 bytes katex/fonts/KaTeX_Fraktur-Bold.ttf | Bin 0 -> 24408 bytes katex/fonts/KaTeX_Fraktur-Bold.woff | Bin 0 -> 16216 bytes katex/fonts/KaTeX_Fraktur-Bold.woff2 | Bin 0 -> 13912 bytes katex/fonts/KaTeX_Fraktur-Regular.ttf | Bin 0 -> 23916 bytes katex/fonts/KaTeX_Fraktur-Regular.woff | Bin 0 -> 15884 bytes katex/fonts/KaTeX_Fraktur-Regular.woff2 | Bin 0 -> 13656 bytes katex/fonts/KaTeX_Main-Bold.ttf | Bin 0 -> 59980 bytes katex/fonts/KaTeX_Main-Bold.woff | Bin 0 -> 35060 bytes katex/fonts/KaTeX_Main-Bold.woff2 | Bin 0 -> 30000 bytes katex/fonts/KaTeX_Main-BoldItalic.ttf | Bin 0 -> 42884 bytes katex/fonts/KaTeX_Main-BoldItalic.woff | Bin 0 -> 24504 bytes katex/fonts/KaTeX_Main-BoldItalic.woff2 | Bin 0 -> 21232 bytes katex/fonts/KaTeX_Main-Italic.ttf | Bin 0 -> 46036 bytes katex/fonts/KaTeX_Main-Italic.woff | Bin 0 -> 25360 bytes katex/fonts/KaTeX_Main-Italic.woff2 | Bin 0 -> 22020 bytes katex/fonts/KaTeX_Main-Regular.ttf | Bin 0 -> 68892 bytes katex/fonts/KaTeX_Main-Regular.woff | Bin 0 -> 37864 bytes katex/fonts/KaTeX_Main-Regular.woff2 | Bin 0 -> 32360 bytes katex/fonts/KaTeX_Math-BoldItalic.ttf | Bin 0 -> 42312 bytes katex/fonts/KaTeX_Math-BoldItalic.woff | Bin 0 -> 23988 bytes katex/fonts/KaTeX_Math-BoldItalic.woff2 | Bin 0 -> 21268 bytes katex/fonts/KaTeX_Math-Italic.ttf | Bin 0 -> 44492 bytes katex/fonts/KaTeX_Math-Italic.woff | Bin 0 -> 24672 bytes katex/fonts/KaTeX_Math-Italic.woff2 | Bin 0 -> 21868 bytes katex/fonts/KaTeX_SansSerif-Bold.ttf | Bin 0 -> 32596 bytes katex/fonts/KaTeX_SansSerif-Bold.woff | Bin 0 -> 17988 bytes katex/fonts/KaTeX_SansSerif-Bold.woff2 | Bin 0 -> 15288 bytes katex/fonts/KaTeX_SansSerif-Italic.ttf | Bin 0 -> 29868 bytes katex/fonts/KaTeX_SansSerif-Italic.woff | Bin 0 -> 17052 bytes katex/fonts/KaTeX_SansSerif-Italic.woff2 | Bin 0 -> 14492 bytes katex/fonts/KaTeX_SansSerif-Regular.ttf | Bin 0 -> 28720 bytes katex/fonts/KaTeX_SansSerif-Regular.woff | Bin 0 -> 15724 bytes katex/fonts/KaTeX_SansSerif-Regular.woff2 | Bin 0 -> 13308 bytes katex/fonts/KaTeX_Script-Regular.ttf | Bin 0 -> 23532 bytes katex/fonts/KaTeX_Script-Regular.woff | Bin 0 -> 13000 bytes katex/fonts/KaTeX_Script-Regular.woff2 | Bin 0 -> 11784 bytes katex/fonts/KaTeX_Size1-Regular.ttf | Bin 0 -> 11944 bytes katex/fonts/KaTeX_Size1-Regular.woff | Bin 0 -> 6304 bytes katex/fonts/KaTeX_Size1-Regular.woff2 | Bin 0 -> 5328 bytes katex/fonts/KaTeX_Size2-Regular.ttf | Bin 0 -> 11092 bytes katex/fonts/KaTeX_Size2-Regular.woff | Bin 0 -> 6016 bytes katex/fonts/KaTeX_Size2-Regular.woff2 | Bin 0 -> 5116 bytes katex/fonts/KaTeX_Size3-Regular.ttf | Bin 0 -> 7040 bytes katex/fonts/KaTeX_Size3-Regular.woff | Bin 0 -> 4156 bytes katex/fonts/KaTeX_Size3-Regular.woff2 | Bin 0 -> 3432 bytes katex/fonts/KaTeX_Size4-Regular.ttf | Bin 0 -> 10020 bytes katex/fonts/KaTeX_Size4-Regular.woff | Bin 0 -> 5828 bytes katex/fonts/KaTeX_Size4-Regular.woff2 | Bin 0 -> 4764 bytes katex/fonts/KaTeX_Typewriter-Regular.ttf | Bin 0 -> 34572 bytes katex/fonts/KaTeX_Typewriter-Regular.woff | Bin 0 -> 19708 bytes katex/fonts/KaTeX_Typewriter-Regular.woff2 | Bin 0 -> 16840 bytes katex/katex.css | 1079 ++ katex/katex.js | 18102 ++++++++++++++++++ katex/katex.min.css | 1 + katex/katex.min.js | 1 + katex/katex.mjs | 17727 +++++++++++++++++ posts/hello_world.md | 17 + ssb | 1 + styles.css | 152 + woff2/spectral-regular.woff2 | Bin 0 -> 81960 bytes 93 files changed, 46201 insertions(+) create mode 100644 footer.html create mode 100644 header.html create mode 100644 hello_world.html create mode 100644 index.html create mode 100644 index.md create mode 100644 katex/README.md create mode 100644 katex/auto-render.min.js create mode 100644 katex/contrib/auto-render.js create mode 100644 katex/contrib/auto-render.min.js create mode 100644 katex/contrib/auto-render.mjs create mode 100644 katex/contrib/copy-tex.css create mode 100644 katex/contrib/copy-tex.js create mode 100644 katex/contrib/copy-tex.min.css create mode 100644 katex/contrib/copy-tex.min.js create mode 100644 katex/contrib/copy-tex.mjs create mode 100644 katex/contrib/mathtex-script-type.js create mode 100644 katex/contrib/mathtex-script-type.min.js create mode 100644 katex/contrib/mathtex-script-type.mjs create mode 100644 katex/contrib/mhchem.js create mode 100644 katex/contrib/mhchem.min.js create mode 100644 katex/contrib/mhchem.mjs create mode 100644 katex/contrib/render-a11y-string.js create mode 100644 katex/contrib/render-a11y-string.min.js create mode 100644 katex/contrib/render-a11y-string.mjs create mode 100644 katex/fonts/KaTeX_AMS-Regular.ttf create mode 100644 katex/fonts/KaTeX_AMS-Regular.woff create mode 100644 katex/fonts/KaTeX_AMS-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Caligraphic-Bold.ttf create mode 100644 katex/fonts/KaTeX_Caligraphic-Bold.woff create mode 100644 katex/fonts/KaTeX_Caligraphic-Bold.woff2 create mode 100644 katex/fonts/KaTeX_Caligraphic-Regular.ttf create mode 100644 katex/fonts/KaTeX_Caligraphic-Regular.woff create mode 100644 katex/fonts/KaTeX_Caligraphic-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Fraktur-Bold.ttf create mode 100644 katex/fonts/KaTeX_Fraktur-Bold.woff create mode 100644 katex/fonts/KaTeX_Fraktur-Bold.woff2 create mode 100644 katex/fonts/KaTeX_Fraktur-Regular.ttf create mode 100644 katex/fonts/KaTeX_Fraktur-Regular.woff create mode 100644 katex/fonts/KaTeX_Fraktur-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Main-Bold.ttf create mode 100644 katex/fonts/KaTeX_Main-Bold.woff create mode 100644 katex/fonts/KaTeX_Main-Bold.woff2 create mode 100644 katex/fonts/KaTeX_Main-BoldItalic.ttf create mode 100644 katex/fonts/KaTeX_Main-BoldItalic.woff create mode 100644 katex/fonts/KaTeX_Main-BoldItalic.woff2 create mode 100644 katex/fonts/KaTeX_Main-Italic.ttf create mode 100644 katex/fonts/KaTeX_Main-Italic.woff create mode 100644 katex/fonts/KaTeX_Main-Italic.woff2 create mode 100644 katex/fonts/KaTeX_Main-Regular.ttf create mode 100644 katex/fonts/KaTeX_Main-Regular.woff create mode 100644 katex/fonts/KaTeX_Main-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Math-BoldItalic.ttf create mode 100644 katex/fonts/KaTeX_Math-BoldItalic.woff create mode 100644 katex/fonts/KaTeX_Math-BoldItalic.woff2 create mode 100644 katex/fonts/KaTeX_Math-Italic.ttf create mode 100644 katex/fonts/KaTeX_Math-Italic.woff create mode 100644 katex/fonts/KaTeX_Math-Italic.woff2 create mode 100644 katex/fonts/KaTeX_SansSerif-Bold.ttf create mode 100644 katex/fonts/KaTeX_SansSerif-Bold.woff create mode 100644 katex/fonts/KaTeX_SansSerif-Bold.woff2 create mode 100644 katex/fonts/KaTeX_SansSerif-Italic.ttf create mode 100644 katex/fonts/KaTeX_SansSerif-Italic.woff create mode 100644 katex/fonts/KaTeX_SansSerif-Italic.woff2 create mode 100644 katex/fonts/KaTeX_SansSerif-Regular.ttf create mode 100644 katex/fonts/KaTeX_SansSerif-Regular.woff create mode 100644 katex/fonts/KaTeX_SansSerif-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Script-Regular.ttf create mode 100644 katex/fonts/KaTeX_Script-Regular.woff create mode 100644 katex/fonts/KaTeX_Script-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Size1-Regular.ttf create mode 100644 katex/fonts/KaTeX_Size1-Regular.woff create mode 100644 katex/fonts/KaTeX_Size1-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Size2-Regular.ttf create mode 100644 katex/fonts/KaTeX_Size2-Regular.woff create mode 100644 katex/fonts/KaTeX_Size2-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Size3-Regular.ttf create mode 100644 katex/fonts/KaTeX_Size3-Regular.woff create mode 100644 katex/fonts/KaTeX_Size3-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Size4-Regular.ttf create mode 100644 katex/fonts/KaTeX_Size4-Regular.woff create mode 100644 katex/fonts/KaTeX_Size4-Regular.woff2 create mode 100644 katex/fonts/KaTeX_Typewriter-Regular.ttf create mode 100644 katex/fonts/KaTeX_Typewriter-Regular.woff create mode 100644 katex/fonts/KaTeX_Typewriter-Regular.woff2 create mode 100644 katex/katex.css create mode 100644 katex/katex.js create mode 100644 katex/katex.min.css create mode 100644 katex/katex.min.js create mode 100644 katex/katex.mjs create mode 100644 posts/hello_world.md create mode 100644 styles.css create mode 100644 woff2/spectral-regular.woff2 diff --git a/footer.html b/footer.html new file mode 100644 index 0000000..6228ea4 --- /dev/null +++ b/footer.html @@ -0,0 +1,6 @@ + + + diff --git a/header.html b/header.html new file mode 100644 index 0000000..160ed7d --- /dev/null +++ b/header.html @@ -0,0 +1,30 @@ + + + + + + Title + + + + + + + + + + + + + + +
+ +
+
+ diff --git a/hello_world.html b/hello_world.html new file mode 100644 index 0000000..0501787 --- /dev/null +++ b/hello_world.html @@ -0,0 +1,50 @@ + + + + + + Title + + + + + + + + + + + + + + +
+ +
+
+ +

Hello World

+This is a test. I like writing tests…. +

+This is another test +

+

And there we go

+

Regardless I will probably end up writing some amount of work here…

+

This is some more words

+


x = π

+


αβγρσδϵ

+


xn + yn = zn

+— +
+

2021-08-09 – Hello World

+
+ Created with ssb – a simple + static blogger. +
+ + diff --git a/index.html b/index.html new file mode 100644 index 0000000..486e610 --- /dev/null +++ b/index.html @@ -0,0 +1,40 @@ + + + + + + Title + + + + + + + + + + + + + + +
+ +
+
+ +

Welcome!

+— +
+

2021-08-09 – Hello World

+
+ Created with ssb – a simple + static blogger. +
+ + diff --git a/index.md b/index.md new file mode 100644 index 0000000..aa3c4b9 --- /dev/null +++ b/index.md @@ -0,0 +1 @@ +# Welcome! diff --git a/katex/README.md b/katex/README.md new file mode 100644 index 0000000..148ae68 --- /dev/null +++ b/katex/README.md @@ -0,0 +1,92 @@ +# [KaTeX](https://katex.org/) +[![npm](https://img.shields.io/npm/v/katex.svg)](https://www.npmjs.com/package/katex) +[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release) +[![CI](https://github.com/KaTeX/KaTeX/workflows/CI/badge.svg?branch=master&event=push)](https://github.com/KaTeX/KaTeX/actions?query=workflow%3ACI) +[![codecov](https://codecov.io/gh/KaTeX/KaTeX/branch/master/graph/badge.svg)](https://codecov.io/gh/KaTeX/KaTeX) +[![Discussions](https://img.shields.io/badge/Discussions-join-brightgreen)](https://github.com/KaTeX/KaTeX/discussions) +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/katex/badge?style=rounded)](https://www.jsdelivr.com/package/npm/katex) +![katex.min.js size](https://img.badgesize.io/https://unpkg.com/katex/dist/katex.min.js?compression=gzip) +[![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/KaTeX/KaTeX) + +KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web. + + * **Fast:** KaTeX renders its math synchronously and doesn't need to reflow the page. See how it compares to a competitor in [this speed test](http://www.intmath.com/cg5/katex-mathjax-comparison.php). + * **Print quality:** KaTeX's layout is based on Donald Knuth's TeX, the gold standard for math typesetting. + * **Self contained:** KaTeX has no dependencies and can easily be bundled with your website resources. + * **Server side rendering:** KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML. + +KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 11. + +KaTeX supports much (but not all) of LaTeX and many LaTeX packages. See the [list of supported functions](https://katex.org/docs/supported.html). + +Try out KaTeX [on the demo page](https://katex.org/#demo)! + +## Getting started + +### Starter template + +```html + + + + + + + + + + + + + ... + +``` + +You can also [download KaTeX](https://github.com/KaTeX/KaTeX/releases) and host it yourself. + +For details on how to configure auto-render extension, refer to [the documentation](https://katex.org/docs/autorender.html). + +### API + +Call `katex.render` to render a TeX expression directly into a DOM element. +For example: + +```js +katex.render("c = \\pm\\sqrt{a^2 + b^2}", element, { + throwOnError: false +}); +``` + +Call `katex.renderToString` to generate an HTML string of the rendered math, +e.g., for server-side rendering. For example: + +```js +var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}", { + throwOnError: false +}); +// '...' +``` + +Make sure to include the CSS and font files in both cases. +If you are doing all rendering on the server, there is no need to include the +JavaScript on the client. + +The examples above use the `throwOnError: false` option, which renders invalid +inputs as the TeX source code in red (by default), with the error message as +hover text. For other available options, see the +[API documentation](https://katex.org/docs/api.html), +[options documentation](https://katex.org/docs/options.html), and +[handling errors documentation](https://katex.org/docs/error.html). + +## Demo and Documentation + +Learn more about using KaTeX [on the website](https://katex.org)! + +## Contributing + +See [CONTRIBUTING.md](CONTRIBUTING.md) + +## License + +KaTeX is licensed under the [MIT License](http://opensource.org/licenses/MIT). diff --git a/katex/auto-render.min.js b/katex/auto-render.min.js new file mode 100644 index 0000000..92bf352 --- /dev/null +++ b/katex/auto-render.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={974:function(t){t.exports=e}},r={};function n(e){var a=r[e];if(void 0!==a)return a.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,n),i.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var a={};return function(){n.d(a,{default:function(){return s}});var e=n(974),t=n.n(e),r=function(e,t,r){for(var n=r,a=0,i=e.length;n0&&(a.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=i.test(d)?d:e.slice(t[l].left.length,n);a.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&a.push({type:"text",data:e}),a},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var a=document.createDocumentFragment(),i=0;i 0) { + data.push({ + type: "text", + data: text.slice(0, index) + }); + text = text.slice(index); // now text starts with delimiter + } // ... so this always succeeds: + + + var i = delimiters.findIndex(function (delim) { + return text.startsWith(delim.left); + }); + index = findEndOfMath(delimiters[i].right, text, delimiters[i].left.length); + + if (index === -1) { + break; + } + + var rawData = text.slice(0, index + delimiters[i].right.length); + var math = amsRegex.test(rawData) ? rawData : text.slice(delimiters[i].left.length, index); + data.push({ + type: "math", + data: math, + rawData: rawData, + display: delimiters[i].display + }); + text = text.slice(index + delimiters[i].right.length); + } + + if (text !== "") { + data.push({ + type: "text", + data: text + }); + } + + return data; +}; + +/* harmony default export */ var auto_render_splitAtDelimiters = (splitAtDelimiters); +;// CONCATENATED MODULE: ./contrib/auto-render/auto-render.js +/* eslint no-console:0 */ + + +/* Note: optionsCopy is mutated by this method. If it is ever exposed in the + * API, we should copy it before mutating. + */ + +var renderMathInText = function renderMathInText(text, optionsCopy) { + var data = auto_render_splitAtDelimiters(text, optionsCopy.delimiters); + + if (data.length === 1 && data[0].type === 'text') { + // There is no formula in the text. + // Let's return null which means there is no need to replace + // the current text node with a new one. + return null; + } + + var fragment = document.createDocumentFragment(); + + for (var i = 0; i < data.length; i++) { + if (data[i].type === "text") { + fragment.appendChild(document.createTextNode(data[i].data)); + } else { + var span = document.createElement("span"); + var math = data[i].data; // Override any display mode defined in the settings with that + // defined by the text itself + + optionsCopy.displayMode = data[i].display; + + try { + if (optionsCopy.preProcess) { + math = optionsCopy.preProcess(math); + } + + external_katex_default().render(math, span, optionsCopy); + } catch (e) { + if (!(e instanceof (external_katex_default()).ParseError)) { + throw e; + } + + optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e); + fragment.appendChild(document.createTextNode(data[i].rawData)); + continue; + } + + fragment.appendChild(span); + } + } + + return fragment; +}; + +var renderElem = function renderElem(elem, optionsCopy) { + for (var i = 0; i < elem.childNodes.length; i++) { + var childNode = elem.childNodes[i]; + + if (childNode.nodeType === 3) { + // Text node + var frag = renderMathInText(childNode.textContent, optionsCopy); + + if (frag) { + i += frag.childNodes.length - 1; + elem.replaceChild(frag, childNode); + } + } else if (childNode.nodeType === 1) { + (function () { + // Element node + var className = ' ' + childNode.className + ' '; + var shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(function (x) { + return className.indexOf(' ' + x + ' ') === -1; + }); + + if (shouldRender) { + renderElem(childNode, optionsCopy); + } + })(); + } // Otherwise, it's something else, and ignore it. + + } +}; + +var renderMathInElement = function renderMathInElement(elem, options) { + if (!elem) { + throw new Error("No element provided to render"); + } + + var optionsCopy = {}; // Object.assign(optionsCopy, option) + + for (var option in options) { + if (options.hasOwnProperty(option)) { + optionsCopy[option] = options[option]; + } + } // default options + + + optionsCopy.delimiters = optionsCopy.delimiters || [{ + left: "$$", + right: "$$", + display: true + }, { + left: "\\(", + right: "\\)", + display: false + }, // LaTeX uses $…$, but it ruins the display of normal `$` in text: + // {left: "$", right: "$", display: false}, + // $ must come after $$ + // Render AMS environments even if outside $$…$$ delimiters. + { + left: "\\begin{equation}", + right: "\\end{equation}", + display: true + }, { + left: "\\begin{align}", + right: "\\end{align}", + display: true + }, { + left: "\\begin{alignat}", + right: "\\end{alignat}", + display: true + }, { + left: "\\begin{gather}", + right: "\\end{gather}", + display: true + }, { + left: "\\begin{CD}", + right: "\\end{CD}", + display: true + }, { + left: "\\[", + right: "\\]", + display: true + }]; + optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code", "option"]; + optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || []; + optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different + // math elements within a single call to `renderMathInElement`. + + optionsCopy.macros = optionsCopy.macros || {}; + renderElem(elem, optionsCopy); +}; + +/* harmony default export */ var auto_render = (renderMathInElement); +}(); +__webpack_exports__ = __webpack_exports__.default; +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/katex/contrib/auto-render.min.js b/katex/contrib/auto-render.min.js new file mode 100644 index 0000000..92bf352 --- /dev/null +++ b/katex/contrib/auto-render.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={974:function(t){t.exports=e}},r={};function n(e){var a=r[e];if(void 0!==a)return a.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,n),i.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var a={};return function(){n.d(a,{default:function(){return s}});var e=n(974),t=n.n(e),r=function(e,t,r){for(var n=r,a=0,i=e.length;n0&&(a.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=i.test(d)?d:e.slice(t[l].left.length,n);a.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&a.push({type:"text",data:e}),a},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var a=document.createDocumentFragment(),i=0;i escapeRegex(x.left)).join("|") + ")"); + + while (true) { + index = text.search(regexLeft); + + if (index === -1) { + break; + } + + if (index > 0) { + data.push({ + type: "text", + data: text.slice(0, index) + }); + text = text.slice(index); // now text starts with delimiter + } // ... so this always succeeds: + + + var i = delimiters.findIndex(delim => text.startsWith(delim.left)); + index = findEndOfMath(delimiters[i].right, text, delimiters[i].left.length); + + if (index === -1) { + break; + } + + var rawData = text.slice(0, index + delimiters[i].right.length); + var math = amsRegex.test(rawData) ? rawData : text.slice(delimiters[i].left.length, index); + data.push({ + type: "math", + data: math, + rawData, + display: delimiters[i].display + }); + text = text.slice(index + delimiters[i].right.length); + } + + if (text !== "") { + data.push({ + type: "text", + data: text + }); + } + + return data; +}; + +/* eslint no-console:0 */ +/* Note: optionsCopy is mutated by this method. If it is ever exposed in the + * API, we should copy it before mutating. + */ + +var renderMathInText = function renderMathInText(text, optionsCopy) { + var data = splitAtDelimiters(text, optionsCopy.delimiters); + + if (data.length === 1 && data[0].type === 'text') { + // There is no formula in the text. + // Let's return null which means there is no need to replace + // the current text node with a new one. + return null; + } + + var fragment = document.createDocumentFragment(); + + for (var i = 0; i < data.length; i++) { + if (data[i].type === "text") { + fragment.appendChild(document.createTextNode(data[i].data)); + } else { + var span = document.createElement("span"); + var math = data[i].data; // Override any display mode defined in the settings with that + // defined by the text itself + + optionsCopy.displayMode = data[i].display; + + try { + if (optionsCopy.preProcess) { + math = optionsCopy.preProcess(math); + } + + katex.render(math, span, optionsCopy); + } catch (e) { + if (!(e instanceof katex.ParseError)) { + throw e; + } + + optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e); + fragment.appendChild(document.createTextNode(data[i].rawData)); + continue; + } + + fragment.appendChild(span); + } + } + + return fragment; +}; + +var renderElem = function renderElem(elem, optionsCopy) { + for (var i = 0; i < elem.childNodes.length; i++) { + var childNode = elem.childNodes[i]; + + if (childNode.nodeType === 3) { + // Text node + var frag = renderMathInText(childNode.textContent, optionsCopy); + + if (frag) { + i += frag.childNodes.length - 1; + elem.replaceChild(frag, childNode); + } + } else if (childNode.nodeType === 1) { + (function () { + // Element node + var className = ' ' + childNode.className + ' '; + var shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(x => className.indexOf(' ' + x + ' ') === -1); + + if (shouldRender) { + renderElem(childNode, optionsCopy); + } + })(); + } // Otherwise, it's something else, and ignore it. + + } +}; + +var renderMathInElement = function renderMathInElement(elem, options) { + if (!elem) { + throw new Error("No element provided to render"); + } + + var optionsCopy = {}; // Object.assign(optionsCopy, option) + + for (var option in options) { + if (options.hasOwnProperty(option)) { + optionsCopy[option] = options[option]; + } + } // default options + + + optionsCopy.delimiters = optionsCopy.delimiters || [{ + left: "$$", + right: "$$", + display: true + }, { + left: "\\(", + right: "\\)", + display: false + }, // LaTeX uses $…$, but it ruins the display of normal `$` in text: + // {left: "$", right: "$", display: false}, + // $ must come after $$ + // Render AMS environments even if outside $$…$$ delimiters. + { + left: "\\begin{equation}", + right: "\\end{equation}", + display: true + }, { + left: "\\begin{align}", + right: "\\end{align}", + display: true + }, { + left: "\\begin{alignat}", + right: "\\end{alignat}", + display: true + }, { + left: "\\begin{gather}", + right: "\\end{gather}", + display: true + }, { + left: "\\begin{CD}", + right: "\\end{CD}", + display: true + }, { + left: "\\[", + right: "\\]", + display: true + }]; + optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code", "option"]; + optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || []; + optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different + // math elements within a single call to `renderMathInElement`. + + optionsCopy.macros = optionsCopy.macros || {}; + renderElem(elem, optionsCopy); +}; + +export default renderMathInElement; diff --git a/katex/contrib/copy-tex.css b/katex/contrib/copy-tex.css new file mode 100644 index 0000000..f925578 --- /dev/null +++ b/katex/contrib/copy-tex.css @@ -0,0 +1,14 @@ +/* Force selection of entire .katex/.katex-display blocks, so that we can + * copy/paste the entire source code. If you omit this CSS, partial + * selections of a formula will work, but will copy the ugly HTML + * representation instead of the LaTeX source code. (Full selections will + * still produce the LaTeX source code.) + */ +.katex, +.katex-display { + -webkit-user-select: all; + -moz-user-select: all; + -ms-user-select: all; + user-select: all; +} + diff --git a/katex/contrib/copy-tex.js b/katex/contrib/copy-tex.js new file mode 100644 index 0000000..7e629bd --- /dev/null +++ b/katex/contrib/copy-tex.js @@ -0,0 +1,116 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(); + else if(typeof define === 'function' && define.amd) + define([], factory); + else { + var a = factory(); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})((typeof self !== 'undefined' ? self : this), function() { +return /******/ (function() { // webpackBootstrap +/******/ "use strict"; +var __webpack_exports__ = {}; + +;// CONCATENATED MODULE: ./contrib/copy-tex/katex2tex.js +// Set these to how you want inline and display math to be delimited. +var defaultCopyDelimiters = { + inline: ['$', '$'], + // alternative: ['\(', '\)'] + display: ['$$', '$$'] // alternative: ['\[', '\]'] + +}; // Replace .katex elements with their TeX source ( element). +// Modifies fragment in-place. Useful for writing your own 'copy' handler, +// as in copy-tex.js. + +var katexReplaceWithTex = function katexReplaceWithTex(fragment, copyDelimiters) { + if (copyDelimiters === void 0) { + copyDelimiters = defaultCopyDelimiters; + } + + // Remove .katex-html blocks that are preceded by .katex-mathml blocks + // (which will get replaced below). + var katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html'); + + for (var i = 0; i < katexHtml.length; i++) { + var element = katexHtml[i]; + + if (element.remove) { + element.remove(null); + } else { + element.parentNode.removeChild(element); + } + } // Replace .katex-mathml elements with their annotation (TeX source) + // descendant, with inline delimiters. + + + var katexMathml = fragment.querySelectorAll('.katex-mathml'); + + for (var _i = 0; _i < katexMathml.length; _i++) { + var _element = katexMathml[_i]; + + var texSource = _element.querySelector('annotation'); + + if (texSource) { + if (_element.replaceWith) { + _element.replaceWith(texSource); + } else { + _element.parentNode.replaceChild(texSource, _element); + } + + texSource.innerHTML = copyDelimiters.inline[0] + texSource.innerHTML + copyDelimiters.inline[1]; + } + } // Switch display math to display delimiters. + + + var displays = fragment.querySelectorAll('.katex-display annotation'); + + for (var _i2 = 0; _i2 < displays.length; _i2++) { + var _element2 = displays[_i2]; + _element2.innerHTML = copyDelimiters.display[0] + _element2.innerHTML.substr(copyDelimiters.inline[0].length, _element2.innerHTML.length - copyDelimiters.inline[0].length - copyDelimiters.inline[1].length) + copyDelimiters.display[1]; + } + + return fragment; +}; +/* harmony default export */ var katex2tex = (katexReplaceWithTex); +;// CONCATENATED MODULE: ./contrib/copy-tex/copy-tex.js + // Global copy handler to modify behavior on .katex elements. + +document.addEventListener('copy', function (event) { + var selection = window.getSelection(); + + if (selection.isCollapsed) { + return; // default action OK if selection is empty + } + + var fragment = selection.getRangeAt(0).cloneContents(); + + if (!fragment.querySelector('.katex-mathml')) { + return; // default action OK if no .katex-mathml elements + } // Preserve usual HTML copy/paste behavior. + + + var html = []; + + for (var i = 0; i < fragment.childNodes.length; i++) { + html.push(fragment.childNodes[i].outerHTML); + } + + event.clipboardData.setData('text/html', html.join('')); // Rewrite plain-text version. + + event.clipboardData.setData('text/plain', katex2tex(fragment).textContent); // Prevent normal copy handling. + + event.preventDefault(); +}); +;// CONCATENATED MODULE: ./contrib/copy-tex/copy-tex.webpack.js +/** + * This is the webpack entry point for KaTeX. As ECMAScript doesn't support + * CSS modules natively, a separate entry point is used. + */ + + +__webpack_exports__ = __webpack_exports__.default; +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/katex/contrib/copy-tex.min.css b/katex/contrib/copy-tex.min.css new file mode 100644 index 0000000..6f97f56 --- /dev/null +++ b/katex/contrib/copy-tex.min.css @@ -0,0 +1 @@ +.katex,.katex-display{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all} diff --git a/katex/contrib/copy-tex.min.js b/katex/contrib/copy-tex.min.js new file mode 100644 index 0000000..9e9d26e --- /dev/null +++ b/katex/contrib/copy-tex.min.js @@ -0,0 +1 @@ +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var n=t();for(var l in n)("object"==typeof exports?exports:e)[l]=n[l]}}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={},t={inline:["$","$"],display:["$$","$$"]},n=function(e,n){void 0===n&&(n=t);for(var l=e.querySelectorAll(".katex-mathml + .katex-html"),r=0;r element). +// Modifies fragment in-place. Useful for writing your own 'copy' handler, +// as in copy-tex.js. + +var katexReplaceWithTex = function katexReplaceWithTex(fragment, copyDelimiters) { + if (copyDelimiters === void 0) { + copyDelimiters = defaultCopyDelimiters; + } + + // Remove .katex-html blocks that are preceded by .katex-mathml blocks + // (which will get replaced below). + var katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html'); + + for (var i = 0; i < katexHtml.length; i++) { + var element = katexHtml[i]; + + if (element.remove) { + element.remove(null); + } else { + element.parentNode.removeChild(element); + } + } // Replace .katex-mathml elements with their annotation (TeX source) + // descendant, with inline delimiters. + + + var katexMathml = fragment.querySelectorAll('.katex-mathml'); + + for (var _i = 0; _i < katexMathml.length; _i++) { + var _element = katexMathml[_i]; + + var texSource = _element.querySelector('annotation'); + + if (texSource) { + if (_element.replaceWith) { + _element.replaceWith(texSource); + } else { + _element.parentNode.replaceChild(texSource, _element); + } + + texSource.innerHTML = copyDelimiters.inline[0] + texSource.innerHTML + copyDelimiters.inline[1]; + } + } // Switch display math to display delimiters. + + + var displays = fragment.querySelectorAll('.katex-display annotation'); + + for (var _i2 = 0; _i2 < displays.length; _i2++) { + var _element2 = displays[_i2]; + _element2.innerHTML = copyDelimiters.display[0] + _element2.innerHTML.substr(copyDelimiters.inline[0].length, _element2.innerHTML.length - copyDelimiters.inline[0].length - copyDelimiters.inline[1].length) + copyDelimiters.display[1]; + } + + return fragment; +}; + +document.addEventListener('copy', function (event) { + var selection = window.getSelection(); + + if (selection.isCollapsed) { + return; // default action OK if selection is empty + } + + var fragment = selection.getRangeAt(0).cloneContents(); + + if (!fragment.querySelector('.katex-mathml')) { + return; // default action OK if no .katex-mathml elements + } // Preserve usual HTML copy/paste behavior. + + + var html = []; + + for (var i = 0; i < fragment.childNodes.length; i++) { + html.push(fragment.childNodes[i].outerHTML); + } + + event.clipboardData.setData('text/html', html.join('')); // Rewrite plain-text version. + + event.clipboardData.setData('text/plain', katexReplaceWithTex(fragment).textContent); // Prevent normal copy handling. + + event.preventDefault(); +}); diff --git a/katex/contrib/mathtex-script-type.js b/katex/contrib/mathtex-script-type.js new file mode 100644 index 0000000..b8c13cd --- /dev/null +++ b/katex/contrib/mathtex-script-type.js @@ -0,0 +1,112 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("katex")); + else if(typeof define === 'function' && define.amd) + define(["katex"], factory); + else { + var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__974__) { +return /******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 974: +/***/ (function(module) { + +module.exports = __WEBPACK_EXTERNAL_MODULE__974__; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(974); +/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); + +var scripts = document.body.getElementsByTagName("script"); +scripts = Array.prototype.slice.call(scripts); +scripts.forEach(function (script) { + if (!script.type || !script.type.match(/math\/tex/i)) { + return -1; + } + + var display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null; + var katexElement = document.createElement(display ? "div" : "span"); + katexElement.setAttribute("class", display ? "equation" : "inline-equation"); + + try { + katex__WEBPACK_IMPORTED_MODULE_0___default().render(script.text, katexElement, { + displayMode: display + }); + } catch (err) { + //console.error(err); linter doesn't like this + katexElement.textContent = script.text; + } + + script.parentNode.replaceChild(katexElement, script); +}); +}(); +__webpack_exports__ = __webpack_exports__.default; +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/katex/contrib/mathtex-script-type.min.js b/katex/contrib/mathtex-script-type.min.js new file mode 100644 index 0000000..5cc5fe3 --- /dev/null +++ b/katex/contrib/mathtex-script-type.min.js @@ -0,0 +1 @@ +!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],t);else{var r="object"==typeof exports?t(require("katex")):t(e.katex);for(var n in r)("object"==typeof exports?exports:e)[n]=r[n]}}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={974:function(t){t.exports=e}},r={};function n(e){var o=r[e];if(void 0!==o)return o.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,n),i.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o,i,a,u={};return o=n(974),i=n.n(o),a=document.body.getElementsByTagName("script"),(a=Array.prototype.slice.call(a)).forEach((function(e){if(!e.type||!e.type.match(/math\/tex/i))return-1;var t=null!=e.type.match(/mode\s*=\s*display(;|\s|\n|$)/),r=document.createElement(t?"div":"span");r.setAttribute("class",t?"equation":"inline-equation");try{i().render(e.text,r,{displayMode:t})}catch(t){r.textContent=e.text}e.parentNode.replaceChild(r,e)})),u=u.default}()})); \ No newline at end of file diff --git a/katex/contrib/mathtex-script-type.mjs b/katex/contrib/mathtex-script-type.mjs new file mode 100644 index 0000000..1083b92 --- /dev/null +++ b/katex/contrib/mathtex-script-type.mjs @@ -0,0 +1,24 @@ +import katex from '../katex.mjs'; + +var scripts = document.body.getElementsByTagName("script"); +scripts = Array.prototype.slice.call(scripts); +scripts.forEach(function (script) { + if (!script.type || !script.type.match(/math\/tex/i)) { + return -1; + } + + var display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null; + var katexElement = document.createElement(display ? "div" : "span"); + katexElement.setAttribute("class", display ? "equation" : "inline-equation"); + + try { + katex.render(script.text, katexElement, { + displayMode: display + }); + } catch (err) { + //console.error(err); linter doesn't like this + katexElement.textContent = script.text; + } + + script.parentNode.replaceChild(katexElement, script); +}); diff --git a/katex/contrib/mhchem.js b/katex/contrib/mhchem.js new file mode 100644 index 0000000..3726bfa --- /dev/null +++ b/katex/contrib/mhchem.js @@ -0,0 +1,3216 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("katex")); + else if(typeof define === 'function' && define.amd) + define(["katex"], factory); + else { + var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__974__) { +return /******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 974: +/***/ (function(module) { + +module.exports = __WEBPACK_EXTERNAL_MODULE__974__; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(974); +/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); +/* eslint-disable */ + +/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ + +/* vim: set ts=2 et sw=2 tw=80: */ + +/************************************************************* + * + * KaTeX mhchem.js + * + * This file implements a KaTeX version of mhchem version 3.3.0. + * It is adapted from MathJax/extensions/TeX/mhchem.js + * It differs from the MathJax version as follows: + * 1. The interface is changed so that it can be called from KaTeX, not MathJax. + * 2. \rlap and \llap are replaced with \mathrlap and \mathllap. + * 3. Four lines of code are edited in order to use \raisebox instead of \raise. + * 4. The reaction arrow code is simplified. All reaction arrows are rendered + * using KaTeX extensible arrows instead of building non-extensible arrows. + * 5. \tripledash vertical alignment is slightly adjusted. + * + * This code, as other KaTeX code, is released under the MIT license. + * + * /************************************************************* + * + * MathJax/extensions/TeX/mhchem.js + * + * Implements the \ce command for handling chemical formulas + * from the mhchem LaTeX package. + * + * --------------------------------------------------------------------- + * + * Copyright (c) 2011-2015 The MathJax Consortium + * Copyright (c) 2015-2018 Martin Hensel + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// +// Coding Style +// - use '' for identifiers that can by minified/uglified +// - use "" for strings that need to stay untouched +// version: "3.3.0" for MathJax and KaTeX +// Add \ce, \pu, and \tripledash to the KaTeX macros. +katex__WEBPACK_IMPORTED_MODULE_0___default().__defineMacro("\\ce", function (context) { + return chemParse(context.consumeArgs(1)[0], "ce"); +}); + +katex__WEBPACK_IMPORTED_MODULE_0___default().__defineMacro("\\pu", function (context) { + return chemParse(context.consumeArgs(1)[0], "pu"); +}); // Needed for \bond for the ~ forms +// Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not +// a mathematical minus, U+2212. So we need that extra 0.56. + + +katex__WEBPACK_IMPORTED_MODULE_0___default().__defineMacro("\\tripledash", "{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu" + "\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}"); + + // +// This is the main function for handing the \ce and \pu commands. +// It takes the argument to \ce or \pu and returns the corresponding TeX string. +// + +var chemParse = function chemParse(tokens, stateMachine) { + // Recreate the argument string from KaTeX's array of tokens. + var str = ""; + var expectedLoc = tokens[tokens.length - 1].loc.start; + + for (var i = tokens.length - 1; i >= 0; i--) { + if (tokens[i].loc.start > expectedLoc) { + // context.consumeArgs has eaten a space. + str += " "; + expectedLoc = tokens[i].loc.start; + } + + str += tokens[i].text; + expectedLoc += tokens[i].text.length; + } + + var tex = texify.go(mhchemParser.go(str, stateMachine)); + return tex; +}; // +// Core parser for mhchem syntax (recursive) +// + +/** @type {MhchemParser} */ + + +var mhchemParser = { + // + // Parses mchem \ce syntax + // + // Call like + // go("H2O"); + // + go: function go(input, stateMachine) { + if (!input) { + return []; + } + + if (stateMachine === undefined) { + stateMachine = 'ce'; + } + + var state = '0'; // + // String buffers for parsing: + // + // buffer.a == amount + // buffer.o == element + // buffer.b == left-side superscript + // buffer.p == left-side subscript + // buffer.q == right-side subscript + // buffer.d == right-side superscript + // + // buffer.r == arrow + // buffer.rdt == arrow, script above, type + // buffer.rd == arrow, script above, content + // buffer.rqt == arrow, script below, type + // buffer.rq == arrow, script below, content + // + // buffer.text_ + // buffer.rm + // etc. + // + // buffer.parenthesisLevel == int, starting at 0 + // buffer.sb == bool, space before + // buffer.beginsWithBond == bool + // + // These letters are also used as state names. + // + // Other states: + // 0 == begin of main part (arrow/operator unlikely) + // 1 == next entity + // 2 == next entity (arrow/operator unlikely) + // 3 == next atom + // c == macro + // + + /** @type {Buffer} */ + + var buffer = {}; + buffer['parenthesisLevel'] = 0; + input = input.replace(/\n/g, " "); + input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-"); + input = input.replace(/[\u2026]/g, "..."); // + // Looks through mhchemParser.transitions, to execute a matching action + // (recursive) + // + + var lastInput; + var watchdog = 10; + /** @type {ParserOutput[]} */ + + var output = []; + + while (true) { + if (lastInput !== input) { + watchdog = 10; + lastInput = input; + } else { + watchdog--; + } // + // Find actions in transition table + // + + + var machine = mhchemParser.stateMachines[stateMachine]; + var t = machine.transitions[state] || machine.transitions['*']; + + iterateTransitions: for (var i = 0; i < t.length; i++) { + var matches = mhchemParser.patterns.match_(t[i].pattern, input); + + if (matches) { + // + // Execute actions + // + var task = t[i].task; + + for (var iA = 0; iA < task.action_.length; iA++) { + var o; // + // Find and execute action + // + + if (machine.actions[task.action_[iA].type_]) { + o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option); + } else if (mhchemParser.actions[task.action_[iA].type_]) { + o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option); + } else { + throw ["MhchemBugA", "mhchem bug A. Please report. (" + task.action_[iA].type_ + ")"]; // Trying to use non-existing action + } // + // Add output + // + + + mhchemParser.concatArray(output, o); + } // + // Set next state, + // Shorten input, + // Continue with next character + // (= apply only one transition per position) + // + + + state = task.nextState || state; + + if (input.length > 0) { + if (!task.revisit) { + input = matches.remainder; + } + + if (!task.toContinue) { + break iterateTransitions; + } + } else { + return output; + } + } + } // + // Prevent infinite loop + // + + + if (watchdog <= 0) { + throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character + } + } + }, + concatArray: function concatArray(a, b) { + if (b) { + if (Array.isArray(b)) { + for (var iB = 0; iB < b.length; iB++) { + a.push(b[iB]); + } + } else { + a.push(b); + } + } + }, + patterns: { + // + // Matching patterns + // either regexps or function that return null or {match_:"a", remainder:"bc"} + // + patterns: { + // property names must not look like integers ("2") for correct property traversal order, later on + 'empty': /^$/, + 'else': /^./, + 'else2': /^./, + 'space': /^\s/, + 'space A': /^\s(?=[A-Z\\$])/, + 'space$': /^\s$/, + 'a-z': /^[a-z]/, + 'x': /^x/, + 'x$': /^x$/, + 'i$': /^i$/, + 'letters': /^(?:[a-zA-Z\u03B1-\u03C9\u0391-\u03A9?@]|(?:\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))))+/, + '\\greek': /^\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))/, + 'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/, + '$one lowercase latin letter$ $': /^\$(?:([a-z])(?:$|[^a-zA-Z]))\$$/, + 'one lowercase greek letter $': /^(?:\$?[\u03B1-\u03C9]\$?|\$?\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\s*\$?)(?:\s+|\{\}|(?![a-zA-Z]))$/, + 'digits': /^[0-9]+/, + '-9.,9': /^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/, + '-9.,9 no missing 0': /^[+\-]?[0-9]+(?:[.,][0-9]+)?/, + '(-)(9.,9)(e)(99)': function e99(input) { + var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))?(\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))\))?(?:([eE]|\s*(\*|x|\\times|\u00D7)\s*10\^)([+\-]?[0-9]+|\{[+\-]?[0-9]+\}))?/); + + if (m && m[0]) { + return { + match_: m.splice(1), + remainder: input.substr(m[0].length) + }; + } + + return null; + }, + '(-)(9)^(-9)': function _(input) { + var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/); + + if (m && m[0]) { + return { + match_: m.splice(1), + remainder: input.substr(m[0].length) + }; + } + + return null; + }, + 'state of aggregation $': function stateOfAggregation$(input) { + // ... or crystal system + var a = mhchemParser.patterns.findObserveGroups(input, "", /^\([a-z]{1,3}(?=[\),])/, ")", ""); // (aq), (aq,$\infty$), (aq, sat) + + if (a && a.remainder.match(/^($|[\s,;\)\]\}])/)) { + return a; + } // AND end of 'phrase' + + + var m = input.match(/^(?:\((?:\\ca\s?)?\$[amothc]\$\))/); // OR crystal system ($o$) (\ca$c$) + + if (m) { + return { + match_: m[0], + remainder: input.substr(m[0].length) + }; + } + + return null; + }, + '_{(state of aggregation)}$': /^_\{(\([a-z]{1,3}\))\}/, + '{[(': /^(?:\\\{|\[|\()/, + ')]}': /^(?:\)|\]|\\\})/, + ', ': /^[,;]\s*/, + ',': /^[,;]/, + '.': /^[.]/, + '. ': /^([.\u22C5\u00B7\u2022])\s*/, + '...': /^\.\.\.(?=$|[^.])/, + '* ': /^([*])\s*/, + '^{(...)}': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "^{", "", "", "}"); + }, + '^($...$)': function $$(input) { + return mhchemParser.patterns.findObserveGroups(input, "^", "$", "$", ""); + }, + '^a': /^\^([0-9]+|[^\\_])/, + '^\\x{}{}': function x(input) { + return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); + }, + '^\\x{}': function x(input) { + return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", ""); + }, + '^\\x': /^\^(\\[a-zA-Z]+)\s*/, + '^(-1)': /^\^(-?\d+)/, + '\'': /^'/, + '_{(...)}': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "_{", "", "", "}"); + }, + '_($...$)': function _$$(input) { + return mhchemParser.patterns.findObserveGroups(input, "_", "$", "$", ""); + }, + '_9': /^_([+\-]?[0-9]+|[^\\])/, + '_\\x{}{}': function _X(input) { + return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); + }, + '_\\x{}': function _X(input) { + return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", ""); + }, + '_\\x': /^_(\\[a-zA-Z]+)\s*/, + '^_': /^(?:\^(?=_)|\_(?=\^)|[\^_]$)/, + '{}': /^\{\}/, + '{...}': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "", "{", "}", ""); + }, + '{(...)}': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "{", "", "", "}"); + }, + '$...$': function $$(input) { + return mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); + }, + '${(...)}$': function $$(input) { + return mhchemParser.patterns.findObserveGroups(input, "${", "", "", "}$"); + }, + '$(...)$': function $$(input) { + return mhchemParser.patterns.findObserveGroups(input, "$", "", "", "$"); + }, + '=<>': /^[=<>]/, + '#': /^[#\u2261]/, + '+': /^\+/, + '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/, + // -space -, -; -] -/ -$ -state-of-aggregation + '-9': /^-(?=[0-9])/, + '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/, + '-': /^-/, + 'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/, + 'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/, + 'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/, + '\\bond{(...)}': function bond(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}"); + }, + '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/, + 'CMT': /^[CMT](?=\[)/, + '[(...)]': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]"); + }, + '1st-level escape': /^(&|\\\\|\\hline)\s*/, + '\\,': /^(?:\\[,\ ;:])/, + // \\x - but output no space before + '\\x{}{}': function x(input) { + return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); + }, + '\\x{}': function x(input) { + return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", ""); + }, + '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/, + '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/, + 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, + // only those with numbers in front, because the others will be formatted correctly anyway + 'others': /^[\/~|]/, + '\\frac{(...)}': function frac(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}"); + }, + '\\overset{(...)}': function overset(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}"); + }, + "\\underset{(...)}": function underset(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}"); + }, + "\\underbrace{(...)}": function underbrace(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}"); + }, + '\\color{(...)}0': function color0(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}"); + }, + '\\color{(...)}{(...)}1': function color1(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}"); + }, + '\\color(...){(...)}2': function color2(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}"); + }, + '\\ce{(...)}': function ce(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}"); + }, + 'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, + 'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, + // 0 could be oxidation or charge + 'roman numeral': /^[IVX]+/, + '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/, + 'amount': function amount(input) { + var match; // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing + + match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/); + + if (match) { + return { + match_: match[0], + remainder: input.substr(match[0].length) + }; + } + + var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); + + if (a) { + // e.g. $2n-1$, $-$ + match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/); + + if (match) { + return { + match_: match[0], + remainder: input.substr(match[0].length) + }; + } + } + + return null; + }, + 'amount2': function amount2(input) { + return this['amount'](input); + }, + '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/, + 'formula$': function formula$(input) { + if (input.match(/^\([a-z]+\)$/)) { + return null; + } // state of aggregation = no formula + + + var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/); + + if (match) { + return { + match_: match[0], + remainder: input.substr(match[0].length) + }; + } + + return null; + }, + 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/, + '/': /^\s*(\/)\s*/, + '//': /^\s*(\/\/)\s*/, + '*': /^\s*[*.]\s*/ + }, + findObserveGroups: function findObserveGroups(input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) { + /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */ + var _match = function _match(input, pattern) { + if (typeof pattern === "string") { + if (input.indexOf(pattern) !== 0) { + return null; + } + + return pattern; + } else { + var match = input.match(pattern); + + if (!match) { + return null; + } + + return match[0]; + } + }; + /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */ + + + var _findObserveGroups = function _findObserveGroups(input, i, endChars) { + var braces = 0; + + while (i < input.length) { + var a = input.charAt(i); + + var match = _match(input.substr(i), endChars); + + if (match !== null && braces === 0) { + return { + endMatchBegin: i, + endMatchEnd: i + match.length + }; + } else if (a === "{") { + braces++; + } else if (a === "}") { + if (braces === 0) { + throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"]; + } else { + braces--; + } + } + + i++; + } + + if (braces > 0) { + return null; + } + + return null; + }; + + var match = _match(input, begExcl); + + if (match === null) { + return null; + } + + input = input.substr(match.length); + match = _match(input, begIncl); + + if (match === null) { + return null; + } + + var e = _findObserveGroups(input, match.length, endIncl || endExcl); + + if (e === null) { + return null; + } + + var match1 = input.substring(0, endIncl ? e.endMatchEnd : e.endMatchBegin); + + if (!(beg2Excl || beg2Incl)) { + return { + match_: match1, + remainder: input.substr(e.endMatchEnd) + }; + } else { + var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl); + + if (group2 === null) { + return null; + } + /** @type {string[]} */ + + + var matchRet = [match1, group2.match_]; + return { + match_: combine ? matchRet.join("") : matchRet, + remainder: group2.remainder + }; + } + }, + // + // Matching function + // e.g. match("a", input) will look for the regexp called "a" and see if it matches + // returns null or {match_:"a", remainder:"bc"} + // + match_: function match_(m, input) { + var pattern = mhchemParser.patterns.patterns[m]; + + if (pattern === undefined) { + throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern + } else if (typeof pattern === "function") { + return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser + } else { + // RegExp + var match = input.match(pattern); + + if (match) { + var mm; + + if (match[2]) { + mm = [match[1], match[2]]; + } else if (match[1]) { + mm = match[1]; + } else { + mm = match[0]; + } + + return { + match_: mm, + remainder: input.substr(match[0].length) + }; + } + + return null; + } + } + }, + // + // Generic state machine actions + // + actions: { + 'a=': function a(buffer, m) { + buffer.a = (buffer.a || "") + m; + }, + 'b=': function b(buffer, m) { + buffer.b = (buffer.b || "") + m; + }, + 'p=': function p(buffer, m) { + buffer.p = (buffer.p || "") + m; + }, + 'o=': function o(buffer, m) { + buffer.o = (buffer.o || "") + m; + }, + 'q=': function q(buffer, m) { + buffer.q = (buffer.q || "") + m; + }, + 'd=': function d(buffer, m) { + buffer.d = (buffer.d || "") + m; + }, + 'rm=': function rm(buffer, m) { + buffer.rm = (buffer.rm || "") + m; + }, + 'text=': function text(buffer, m) { + buffer.text_ = (buffer.text_ || "") + m; + }, + 'insert': function insert(buffer, m, a) { + return { + type_: a + }; + }, + 'insert+p1': function insertP1(buffer, m, a) { + return { + type_: a, + p1: m + }; + }, + 'insert+p1+p2': function insertP1P2(buffer, m, a) { + return { + type_: a, + p1: m[0], + p2: m[1] + }; + }, + 'copy': function copy(buffer, m) { + return m; + }, + 'rm': function rm(buffer, m) { + return { + type_: 'rm', + p1: m || "" + }; + }, + 'text': function text(buffer, m) { + return mhchemParser.go(m, 'text'); + }, + '{text}': function text(buffer, m) { + var ret = ["{"]; + mhchemParser.concatArray(ret, mhchemParser.go(m, 'text')); + ret.push("}"); + return ret; + }, + 'tex-math': function texMath(buffer, m) { + return mhchemParser.go(m, 'tex-math'); + }, + 'tex-math tight': function texMathTight(buffer, m) { + return mhchemParser.go(m, 'tex-math tight'); + }, + 'bond': function bond(buffer, m, k) { + return { + type_: 'bond', + kind_: k || m + }; + }, + 'color0-output': function color0Output(buffer, m) { + return { + type_: 'color0', + color: m[0] + }; + }, + 'ce': function ce(buffer, m) { + return mhchemParser.go(m); + }, + '1/2': function _(buffer, m) { + /** @type {ParserOutput[]} */ + var ret = []; + + if (m.match(/^[+\-]/)) { + ret.push(m.substr(0, 1)); + m = m.substr(1); + } + + var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/); + n[1] = n[1].replace(/\$/g, ""); + ret.push({ + type_: 'frac', + p1: n[1], + p2: n[2] + }); + + if (n[3]) { + n[3] = n[3].replace(/\$/g, ""); + ret.push({ + type_: 'tex-math', + p1: n[3] + }); + } + + return ret; + }, + '9,9': function _(buffer, m) { + return mhchemParser.go(m, '9,9'); + } + }, + // + // createTransitions + // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] } + // with expansion of 'a|b' to 'a' and 'b' (at 2 places) + // + createTransitions: function createTransitions(o) { + var pattern, state; + /** @type {string[]} */ + + var stateArray; + var i; // + // 1. Collect all states + // + + /** @type {Transitions} */ + + var transitions = {}; + + for (pattern in o) { + for (state in o[pattern]) { + stateArray = state.split("|"); + o[pattern][state].stateArray = stateArray; + + for (i = 0; i < stateArray.length; i++) { + transitions[stateArray[i]] = []; + } + } + } // + // 2. Fill states + // + + + for (pattern in o) { + for (state in o[pattern]) { + stateArray = o[pattern][state].stateArray || []; + + for (i = 0; i < stateArray.length; i++) { + // + // 2a. Normalize actions into array: 'text=' ==> [{type_:'text='}] + // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).) + // + + /** @type {any} */ + var p = o[pattern][state]; + + if (p.action_) { + p.action_ = [].concat(p.action_); + + for (var k = 0; k < p.action_.length; k++) { + if (typeof p.action_[k] === "string") { + p.action_[k] = { + type_: p.action_[k] + }; + } + } + } else { + p.action_ = []; + } // + // 2.b Multi-insert + // + + + var patternArray = pattern.split("|"); + + for (var j = 0; j < patternArray.length; j++) { + if (stateArray[i] === '*') { + // insert into all + for (var t in transitions) { + transitions[t].push({ + pattern: patternArray[j], + task: p + }); + } + } else { + transitions[stateArray[i]].push({ + pattern: patternArray[j], + task: p + }); + } + } + } + } + } + + return transitions; + }, + stateMachines: {} +}; // +// Definition of state machines +// + +mhchemParser.stateMachines = { + // + // \ce state machines + // + //#region ce + 'ce': { + // main parser + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + 'else': { + '0|1|2': { + action_: 'beginsWithBond=false', + revisit: true, + toContinue: true + } + }, + 'oxidation$': { + '0': { + action_: 'oxidation-output' + } + }, + 'CMT': { + 'r': { + action_: 'rdt=', + nextState: 'rt' + }, + 'rd': { + action_: 'rqt=', + nextState: 'rdt' + } + }, + 'arrowUpDown': { + '0|1|2|as': { + action_: ['sb=false', 'output', 'operator'], + nextState: '1' + } + }, + 'uprightEntities': { + '0|1|2': { + action_: ['o=', 'output'], + nextState: '1' + } + }, + 'orbital': { + '0|1|2|3': { + action_: 'o=', + nextState: 'o' + } + }, + '->': { + '0|1|2|3': { + action_: 'r=', + nextState: 'r' + }, + 'a|as': { + action_: ['output', 'r='], + nextState: 'r' + }, + '*': { + action_: ['output', 'r='], + nextState: 'r' + } + }, + '+': { + 'o': { + action_: 'd= kv', + nextState: 'd' + }, + 'd|D': { + action_: 'd=', + nextState: 'd' + }, + 'q': { + action_: 'd=', + nextState: 'qd' + }, + 'qd|qD': { + action_: 'd=', + nextState: 'qd' + }, + 'dq': { + action_: ['output', 'd='], + nextState: 'd' + }, + '3': { + action_: ['sb=false', 'output', 'operator'], + nextState: '0' + } + }, + 'amount': { + '0|2': { + action_: 'a=', + nextState: 'a' + } + }, + 'pm-operator': { + '0|1|2|a|as': { + action_: ['sb=false', 'output', { + type_: 'operator', + option: '\\pm' + }], + nextState: '0' + } + }, + 'operator': { + '0|1|2|a|as': { + action_: ['sb=false', 'output', 'operator'], + nextState: '0' + } + }, + '-$': { + 'o|q': { + action_: ['charge or bond', 'output'], + nextState: 'qd' + }, + 'd': { + action_: 'd=', + nextState: 'd' + }, + 'D': { + action_: ['output', { + type_: 'bond', + option: "-" + }], + nextState: '3' + }, + 'q': { + action_: 'd=', + nextState: 'qd' + }, + 'qd': { + action_: 'd=', + nextState: 'qd' + }, + 'qD|dq': { + action_: ['output', { + type_: 'bond', + option: "-" + }], + nextState: '3' + } + }, + '-9': { + '3|o': { + action_: ['output', { + type_: 'insert', + option: 'hyphen' + }], + nextState: '3' + } + }, + '- orbital overlap': { + 'o': { + action_: ['output', { + type_: 'insert', + option: 'hyphen' + }], + nextState: '2' + }, + 'd': { + action_: ['output', { + type_: 'insert', + option: 'hyphen' + }], + nextState: '2' + } + }, + '-': { + '0|1|2': { + action_: [{ + type_: 'output', + option: 1 + }, 'beginsWithBond=true', { + type_: 'bond', + option: "-" + }], + nextState: '3' + }, + '3': { + action_: { + type_: 'bond', + option: "-" + } + }, + 'a': { + action_: ['output', { + type_: 'insert', + option: 'hyphen' + }], + nextState: '2' + }, + 'as': { + action_: [{ + type_: 'output', + option: 2 + }, { + type_: 'bond', + option: "-" + }], + nextState: '3' + }, + 'b': { + action_: 'b=' + }, + 'o': { + action_: { + type_: '- after o/d', + option: false + }, + nextState: '2' + }, + 'q': { + action_: { + type_: '- after o/d', + option: false + }, + nextState: '2' + }, + 'd|qd|dq': { + action_: { + type_: '- after o/d', + option: true + }, + nextState: '2' + }, + 'D|qD|p': { + action_: ['output', { + type_: 'bond', + option: "-" + }], + nextState: '3' + } + }, + 'amount2': { + '1|3': { + action_: 'a=', + nextState: 'a' + } + }, + 'letters': { + '0|1|2|3|a|as|b|p|bp|o': { + action_: 'o=', + nextState: 'o' + }, + 'q|dq': { + action_: ['output', 'o='], + nextState: 'o' + }, + 'd|D|qd|qD': { + action_: 'o after d', + nextState: 'o' + } + }, + 'digits': { + 'o': { + action_: 'q=', + nextState: 'q' + }, + 'd|D': { + action_: 'q=', + nextState: 'dq' + }, + 'q': { + action_: ['output', 'o='], + nextState: 'o' + }, + 'a': { + action_: 'o=', + nextState: 'o' + } + }, + 'space A': { + 'b|p|bp': {} + }, + 'space': { + 'a': { + nextState: 'as' + }, + '0': { + action_: 'sb=false' + }, + '1|2': { + action_: 'sb=true' + }, + 'r|rt|rd|rdt|rdq': { + action_: 'output', + nextState: '0' + }, + '*': { + action_: ['output', 'sb=true'], + nextState: '1' + } + }, + '1st-level escape': { + '1|2': { + action_: ['output', { + type_: 'insert+p1', + option: '1st-level escape' + }] + }, + '*': { + action_: ['output', { + type_: 'insert+p1', + option: '1st-level escape' + }], + nextState: '0' + } + }, + '[(...)]': { + 'r|rt': { + action_: 'rd=', + nextState: 'rd' + }, + 'rd|rdt': { + action_: 'rq=', + nextState: 'rdq' + } + }, + '...': { + 'o|d|D|dq|qd|qD': { + action_: ['output', { + type_: 'bond', + option: "..." + }], + nextState: '3' + }, + '*': { + action_: [{ + type_: 'output', + option: 1 + }, { + type_: 'insert', + option: 'ellipsis' + }], + nextState: '1' + } + }, + '. |* ': { + '*': { + action_: ['output', { + type_: 'insert', + option: 'addition compound' + }], + nextState: '1' + } + }, + 'state of aggregation $': { + '*': { + action_: ['output', 'state of aggregation'], + nextState: '1' + } + }, + '{[(': { + 'a|as|o': { + action_: ['o=', 'output', 'parenthesisLevel++'], + nextState: '2' + }, + '0|1|2|3': { + action_: ['o=', 'output', 'parenthesisLevel++'], + nextState: '2' + }, + '*': { + action_: ['output', 'o=', 'output', 'parenthesisLevel++'], + nextState: '2' + } + }, + ')]}': { + '0|1|2|3|b|p|bp|o': { + action_: ['o=', 'parenthesisLevel--'], + nextState: 'o' + }, + 'a|as|d|D|q|qd|qD|dq': { + action_: ['output', 'o=', 'parenthesisLevel--'], + nextState: 'o' + } + }, + ', ': { + '*': { + action_: ['output', 'comma'], + nextState: '0' + } + }, + '^_': { + // ^ and _ without a sensible argument + '*': {} + }, + '^{(...)}|^($...$)': { + '0|1|2|as': { + action_: 'b=', + nextState: 'b' + }, + 'p': { + action_: 'b=', + nextState: 'bp' + }, + '3|o': { + action_: 'd= kv', + nextState: 'D' + }, + 'q': { + action_: 'd=', + nextState: 'qD' + }, + 'd|D|qd|qD|dq': { + action_: ['output', 'd='], + nextState: 'D' + } + }, + '^a|^\\x{}{}|^\\x{}|^\\x|\'': { + '0|1|2|as': { + action_: 'b=', + nextState: 'b' + }, + 'p': { + action_: 'b=', + nextState: 'bp' + }, + '3|o': { + action_: 'd= kv', + nextState: 'd' + }, + 'q': { + action_: 'd=', + nextState: 'qd' + }, + 'd|qd|D|qD': { + action_: 'd=' + }, + 'dq': { + action_: ['output', 'd='], + nextState: 'd' + } + }, + '_{(state of aggregation)}$': { + 'd|D|q|qd|qD|dq': { + action_: ['output', 'q='], + nextState: 'q' + } + }, + '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': { + '0|1|2|as': { + action_: 'p=', + nextState: 'p' + }, + 'b': { + action_: 'p=', + nextState: 'bp' + }, + '3|o': { + action_: 'q=', + nextState: 'q' + }, + 'd|D': { + action_: 'q=', + nextState: 'dq' + }, + 'q|qd|qD|dq': { + action_: ['output', 'q='], + nextState: 'q' + } + }, + '=<>': { + '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { + action_: [{ + type_: 'output', + option: 2 + }, 'bond'], + nextState: '3' + } + }, + '#': { + '0|1|2|3|a|as|o': { + action_: [{ + type_: 'output', + option: 2 + }, { + type_: 'bond', + option: "#" + }], + nextState: '3' + } + }, + '{}': { + '*': { + action_: { + type_: 'output', + option: 1 + }, + nextState: '1' + } + }, + '{...}': { + '0|1|2|3|a|as|b|p|bp': { + action_: 'o=', + nextState: 'o' + }, + 'o|d|D|q|qd|qD|dq': { + action_: ['output', 'o='], + nextState: 'o' + } + }, + '$...$': { + 'a': { + action_: 'a=' + }, + // 2$n$ + '0|1|2|3|as|b|p|bp|o': { + action_: 'o=', + nextState: 'o' + }, + // not 'amount' + 'as|o': { + action_: 'o=' + }, + 'q|d|D|qd|qD|dq': { + action_: ['output', 'o='], + nextState: 'o' + } + }, + '\\bond{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'bond'], + nextState: "3" + } + }, + '\\frac{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 1 + }, 'frac-output'], + nextState: '3' + } + }, + '\\overset{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'overset-output'], + nextState: '3' + } + }, + "\\underset{(...)}": { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'underset-output'], + nextState: '3' + } + }, + "\\underbrace{(...)}": { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'underbrace-output'], + nextState: '3' + } + }, + '\\color{(...)}{(...)}1|\\color(...){(...)}2': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'color-output'], + nextState: '3' + } + }, + '\\color{(...)}0': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'color0-output'] + } + }, + '\\ce{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'ce'], + nextState: '3' + } + }, + '\\,': { + '*': { + action_: [{ + type_: 'output', + option: 1 + }, 'copy'], + nextState: '1' + } + }, + '\\x{}{}|\\x{}|\\x': { + '0|1|2|3|a|as|b|p|bp|o|c0': { + action_: ['o=', 'output'], + nextState: '3' + }, + '*': { + action_: ['output', 'o=', 'output'], + nextState: '3' + } + }, + 'others': { + '*': { + action_: [{ + type_: 'output', + option: 1 + }, 'copy'], + nextState: '3' + } + }, + 'else2': { + 'a': { + action_: 'a to o', + nextState: 'o', + revisit: true + }, + 'as': { + action_: ['output', 'sb=true'], + nextState: '1', + revisit: true + }, + 'r|rt|rd|rdt|rdq': { + action_: ['output'], + nextState: '0', + revisit: true + }, + '*': { + action_: ['output', 'copy'], + nextState: '3' + } + } + }), + actions: { + 'o after d': function oAfterD(buffer, m) { + var ret; + + if ((buffer.d || "").match(/^[0-9]+$/)) { + var tmp = buffer.d; + buffer.d = undefined; + ret = this['output'](buffer); + buffer.b = tmp; + } else { + ret = this['output'](buffer); + } + + mhchemParser.actions['o='](buffer, m); + return ret; + }, + 'd= kv': function dKv(buffer, m) { + buffer.d = m; + buffer.dType = 'kv'; + }, + 'charge or bond': function chargeOrBond(buffer, m) { + if (buffer['beginsWithBond']) { + /** @type {ParserOutput[]} */ + var ret = []; + mhchemParser.concatArray(ret, this['output'](buffer)); + mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); + return ret; + } else { + buffer.d = m; + } + }, + '- after o/d': function afterOD(buffer, m, isAfterD) { + var c1 = mhchemParser.patterns.match_('orbital', buffer.o || ""); + var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || ""); + var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || ""); + var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || ""); + var hyphenFollows = m === "-" && (c1 && c1.remainder === "" || c2 || c3 || c4); + + if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) { + buffer.o = '$' + buffer.o + '$'; + } + /** @type {ParserOutput[]} */ + + + var ret = []; + + if (hyphenFollows) { + mhchemParser.concatArray(ret, this['output'](buffer)); + ret.push({ + type_: 'hyphen' + }); + } else { + c1 = mhchemParser.patterns.match_('digits', buffer.d || ""); + + if (isAfterD && c1 && c1.remainder === '') { + mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m)); + mhchemParser.concatArray(ret, this['output'](buffer)); + } else { + mhchemParser.concatArray(ret, this['output'](buffer)); + mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); + } + } + + return ret; + }, + 'a to o': function aToO(buffer) { + buffer.o = buffer.a; + buffer.a = undefined; + }, + 'sb=true': function sbTrue(buffer) { + buffer.sb = true; + }, + 'sb=false': function sbFalse(buffer) { + buffer.sb = false; + }, + 'beginsWithBond=true': function beginsWithBondTrue(buffer) { + buffer['beginsWithBond'] = true; + }, + 'beginsWithBond=false': function beginsWithBondFalse(buffer) { + buffer['beginsWithBond'] = false; + }, + 'parenthesisLevel++': function parenthesisLevel(buffer) { + buffer['parenthesisLevel']++; + }, + 'parenthesisLevel--': function parenthesisLevel(buffer) { + buffer['parenthesisLevel']--; + }, + 'state of aggregation': function stateOfAggregation(buffer, m) { + return { + type_: 'state of aggregation', + p1: mhchemParser.go(m, 'o') + }; + }, + 'comma': function comma(buffer, m) { + var a = m.replace(/\s*$/, ''); + var withSpace = a !== m; + + if (withSpace && buffer['parenthesisLevel'] === 0) { + return { + type_: 'comma enumeration L', + p1: a + }; + } else { + return { + type_: 'comma enumeration M', + p1: a + }; + } + }, + 'output': function output(buffer, m, entityFollows) { + // entityFollows: + // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb) + // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1) + // 2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as) + + /** @type {ParserOutput | ParserOutput[]} */ + var ret; + + if (!buffer.r) { + ret = []; + + if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {//ret = []; + } else { + if (buffer.sb) { + ret.push({ + type_: 'entitySkip' + }); + } + + if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows !== 2) { + buffer.o = buffer.a; + buffer.a = undefined; + } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) { + buffer.o = buffer.a; + buffer.d = buffer.b; + buffer.q = buffer.p; + buffer.a = buffer.b = buffer.p = undefined; + } else { + if (buffer.o && buffer.dType === 'kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) { + buffer.dType = 'oxidation'; + } else if (buffer.o && buffer.dType === 'kv' && !buffer.q) { + buffer.dType = undefined; + } + } + + ret.push({ + type_: 'chemfive', + a: mhchemParser.go(buffer.a, 'a'), + b: mhchemParser.go(buffer.b, 'bd'), + p: mhchemParser.go(buffer.p, 'pq'), + o: mhchemParser.go(buffer.o, 'o'), + q: mhchemParser.go(buffer.q, 'pq'), + d: mhchemParser.go(buffer.d, buffer.dType === 'oxidation' ? 'oxidation' : 'bd'), + dType: buffer.dType + }); + } + } else { + // r + + /** @type {ParserOutput[]} */ + var rd; + + if (buffer.rdt === 'M') { + rd = mhchemParser.go(buffer.rd, 'tex-math'); + } else if (buffer.rdt === 'T') { + rd = [{ + type_: 'text', + p1: buffer.rd || "" + }]; + } else { + rd = mhchemParser.go(buffer.rd); + } + /** @type {ParserOutput[]} */ + + + var rq; + + if (buffer.rqt === 'M') { + rq = mhchemParser.go(buffer.rq, 'tex-math'); + } else if (buffer.rqt === 'T') { + rq = [{ + type_: 'text', + p1: buffer.rq || "" + }]; + } else { + rq = mhchemParser.go(buffer.rq); + } + + ret = { + type_: 'arrow', + r: buffer.r, + rd: rd, + rq: rq + }; + } + + for (var p in buffer) { + if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') { + delete buffer[p]; + } + } + + return ret; + }, + 'oxidation-output': function oxidationOutput(buffer, m) { + var ret = ["{"]; + mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation')); + ret.push("}"); + return ret; + }, + 'frac-output': function fracOutput(buffer, m) { + return { + type_: 'frac-ce', + p1: mhchemParser.go(m[0]), + p2: mhchemParser.go(m[1]) + }; + }, + 'overset-output': function oversetOutput(buffer, m) { + return { + type_: 'overset', + p1: mhchemParser.go(m[0]), + p2: mhchemParser.go(m[1]) + }; + }, + 'underset-output': function undersetOutput(buffer, m) { + return { + type_: 'underset', + p1: mhchemParser.go(m[0]), + p2: mhchemParser.go(m[1]) + }; + }, + 'underbrace-output': function underbraceOutput(buffer, m) { + return { + type_: 'underbrace', + p1: mhchemParser.go(m[0]), + p2: mhchemParser.go(m[1]) + }; + }, + 'color-output': function colorOutput(buffer, m) { + return { + type_: 'color', + color1: m[0], + color2: mhchemParser.go(m[1]) + }; + }, + 'r=': function r(buffer, m) { + buffer.r = m; + }, + 'rdt=': function rdt(buffer, m) { + buffer.rdt = m; + }, + 'rd=': function rd(buffer, m) { + buffer.rd = m; + }, + 'rqt=': function rqt(buffer, m) { + buffer.rqt = m; + }, + 'rq=': function rq(buffer, m) { + buffer.rq = m; + }, + 'operator': function operator(buffer, m, p1) { + return { + type_: 'operator', + kind_: p1 || m + }; + } + } + }, + 'a': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + '1/2$': { + '0': { + action_: '1/2' + } + }, + 'else': { + '0': { + nextState: '1', + revisit: true + } + }, + '$(...)$': { + '*': { + action_: 'tex-math tight', + nextState: '1' + } + }, + ',': { + '*': { + action_: { + type_: 'insert', + option: 'commaDecimal' + } + } + }, + 'else2': { + '*': { + action_: 'copy' + } + } + }), + actions: {} + }, + 'o': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + '1/2$': { + '0': { + action_: '1/2' + } + }, + 'else': { + '0': { + nextState: '1', + revisit: true + } + }, + 'letters': { + '*': { + action_: 'rm' + } + }, + '\\ca': { + '*': { + action_: { + type_: 'insert', + option: 'circa' + } + } + }, + '\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'copy' + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + '{(...)}': { + '*': { + action_: '{text}' + } + }, + 'else2': { + '*': { + action_: 'copy' + } + } + }), + actions: {} + }, + 'text': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + '{...}': { + '*': { + action_: 'text=' + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + '\\greek': { + '*': { + action_: ['output', 'rm'] + } + }, + '\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: ['output', 'copy'] + } + }, + 'else': { + '*': { + action_: 'text=' + } + } + }), + actions: { + 'output': function output(buffer) { + if (buffer.text_) { + /** @type {ParserOutput} */ + var ret = { + type_: 'text', + p1: buffer.text_ + }; + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + } + }, + 'pq': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + 'state of aggregation $': { + '*': { + action_: 'state of aggregation' + } + }, + 'i$': { + '0': { + nextState: '!f', + revisit: true + } + }, + '(KV letters),': { + '0': { + action_: 'rm', + nextState: '0' + } + }, + 'formula$': { + '0': { + nextState: 'f', + revisit: true + } + }, + '1/2$': { + '0': { + action_: '1/2' + } + }, + 'else': { + '0': { + nextState: '!f', + revisit: true + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + '{(...)}': { + '*': { + action_: 'text' + } + }, + 'a-z': { + 'f': { + action_: 'tex-math' + } + }, + 'letters': { + '*': { + action_: 'rm' + } + }, + '-9.,9': { + '*': { + action_: '9,9' + } + }, + ',': { + '*': { + action_: { + type_: 'insert+p1', + option: 'comma enumeration S' + } + } + }, + '\\color{(...)}{(...)}1|\\color(...){(...)}2': { + '*': { + action_: 'color-output' + } + }, + '\\color{(...)}0': { + '*': { + action_: 'color0-output' + } + }, + '\\ce{(...)}': { + '*': { + action_: 'ce' + } + }, + '\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'copy' + } + }, + 'else2': { + '*': { + action_: 'copy' + } + } + }), + actions: { + 'state of aggregation': function stateOfAggregation(buffer, m) { + return { + type_: 'state of aggregation subscript', + p1: mhchemParser.go(m, 'o') + }; + }, + 'color-output': function colorOutput(buffer, m) { + return { + type_: 'color', + color1: m[0], + color2: mhchemParser.go(m[1], 'pq') + }; + } + } + }, + 'bd': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + 'x$': { + '0': { + nextState: '!f', + revisit: true + } + }, + 'formula$': { + '0': { + nextState: 'f', + revisit: true + } + }, + 'else': { + '0': { + nextState: '!f', + revisit: true + } + }, + '-9.,9 no missing 0': { + '*': { + action_: '9,9' + } + }, + '.': { + '*': { + action_: { + type_: 'insert', + option: 'electron dot' + } + } + }, + 'a-z': { + 'f': { + action_: 'tex-math' + } + }, + 'x': { + '*': { + action_: { + type_: 'insert', + option: 'KV x' + } + } + }, + 'letters': { + '*': { + action_: 'rm' + } + }, + '\'': { + '*': { + action_: { + type_: 'insert', + option: 'prime' + } + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + '{(...)}': { + '*': { + action_: 'text' + } + }, + '\\color{(...)}{(...)}1|\\color(...){(...)}2': { + '*': { + action_: 'color-output' + } + }, + '\\color{(...)}0': { + '*': { + action_: 'color0-output' + } + }, + '\\ce{(...)}': { + '*': { + action_: 'ce' + } + }, + '\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'copy' + } + }, + 'else2': { + '*': { + action_: 'copy' + } + } + }), + actions: { + 'color-output': function colorOutput(buffer, m) { + return { + type_: 'color', + color1: m[0], + color2: mhchemParser.go(m[1], 'bd') + }; + } + } + }, + 'oxidation': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + 'roman numeral': { + '*': { + action_: 'roman-numeral' + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + 'else': { + '*': { + action_: 'copy' + } + } + }), + actions: { + 'roman-numeral': function romanNumeral(buffer, m) { + return { + type_: 'roman numeral', + p1: m || "" + }; + } + } + }, + 'tex-math': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + '\\ce{(...)}': { + '*': { + action_: ['output', 'ce'] + } + }, + '{...}|\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'o=' + } + }, + 'else': { + '*': { + action_: 'o=' + } + } + }), + actions: { + 'output': function output(buffer) { + if (buffer.o) { + /** @type {ParserOutput} */ + var ret = { + type_: 'tex-math', + p1: buffer.o + }; + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + } + }, + 'tex-math tight': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + '\\ce{(...)}': { + '*': { + action_: ['output', 'ce'] + } + }, + '{...}|\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'o=' + } + }, + '-|+': { + '*': { + action_: 'tight operator' + } + }, + 'else': { + '*': { + action_: 'o=' + } + } + }), + actions: { + 'tight operator': function tightOperator(buffer, m) { + buffer.o = (buffer.o || "") + "{" + m + "}"; + }, + 'output': function output(buffer) { + if (buffer.o) { + /** @type {ParserOutput} */ + var ret = { + type_: 'tex-math', + p1: buffer.o + }; + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + } + }, + '9,9': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + ',': { + '*': { + action_: 'comma' + } + }, + 'else': { + '*': { + action_: 'copy' + } + } + }), + actions: { + 'comma': function comma() { + return { + type_: 'commaDecimal' + }; + } + } + }, + //#endregion + // + // \pu state machines + // + //#region pu + 'pu': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + 'space$': { + '*': { + action_: ['output', 'space'] + } + }, + '{[(|)]}': { + '0|a': { + action_: 'copy' + } + }, + '(-)(9)^(-9)': { + '0': { + action_: 'number^', + nextState: 'a' + } + }, + '(-)(9.,9)(e)(99)': { + '0': { + action_: 'enumber', + nextState: 'a' + } + }, + 'space': { + '0|a': {} + }, + 'pm-operator': { + '0|a': { + action_: { + type_: 'operator', + option: '\\pm' + }, + nextState: '0' + } + }, + 'operator': { + '0|a': { + action_: 'copy', + nextState: '0' + } + }, + '//': { + 'd': { + action_: 'o=', + nextState: '/' + } + }, + '/': { + 'd': { + action_: 'o=', + nextState: '/' + } + }, + '{...}|else': { + '0|d': { + action_: 'd=', + nextState: 'd' + }, + 'a': { + action_: ['space', 'd='], + nextState: 'd' + }, + '/|q': { + action_: 'q=', + nextState: 'q' + } + } + }), + actions: { + 'enumber': function enumber(buffer, m) { + /** @type {ParserOutput[]} */ + var ret = []; + + if (m[0] === "+-" || m[0] === "+/-") { + ret.push("\\pm "); + } else if (m[0]) { + ret.push(m[0]); + } + + if (m[1]) { + mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); + + if (m[2]) { + if (m[2].match(/[,.]/)) { + mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9')); + } else { + ret.push(m[2]); + } + } + + m[3] = m[4] || m[3]; + + if (m[3]) { + m[3] = m[3].trim(); + + if (m[3] === "e" || m[3].substr(0, 1) === "*") { + ret.push({ + type_: 'cdot' + }); + } else { + ret.push({ + type_: 'times' + }); + } + } + } + + if (m[3]) { + ret.push("10^{" + m[5] + "}"); + } + + return ret; + }, + 'number^': function number(buffer, m) { + /** @type {ParserOutput[]} */ + var ret = []; + + if (m[0] === "+-" || m[0] === "+/-") { + ret.push("\\pm "); + } else if (m[0]) { + ret.push(m[0]); + } + + mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); + ret.push("^{" + m[2] + "}"); + return ret; + }, + 'operator': function operator(buffer, m, p1) { + return { + type_: 'operator', + kind_: p1 || m + }; + }, + 'space': function space() { + return { + type_: 'pu-space-1' + }; + }, + 'output': function output(buffer) { + /** @type {ParserOutput | ParserOutput[]} */ + var ret; + var md = mhchemParser.patterns.match_('{(...)}', buffer.d || ""); + + if (md && md.remainder === '') { + buffer.d = md.match_; + } + + var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || ""); + + if (mq && mq.remainder === '') { + buffer.q = mq.match_; + } + + if (buffer.d) { + buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); + buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); + } + + if (buffer.q) { + // fraction + buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); + buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); + var b5 = { + d: mhchemParser.go(buffer.d, 'pu'), + q: mhchemParser.go(buffer.q, 'pu') + }; + + if (buffer.o === '//') { + ret = { + type_: 'pu-frac', + p1: b5.d, + p2: b5.q + }; + } else { + ret = b5.d; + + if (b5.d.length > 1 || b5.q.length > 1) { + ret.push({ + type_: ' / ' + }); + } else { + ret.push({ + type_: '/' + }); + } + + mhchemParser.concatArray(ret, b5.q); + } + } else { + // no fraction + ret = mhchemParser.go(buffer.d, 'pu-2'); + } + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + }, + 'pu-2': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + '*': { + '*': { + action_: ['output', 'cdot'], + nextState: '0' + } + }, + '\\x': { + '*': { + action_: 'rm=' + } + }, + 'space': { + '*': { + action_: ['output', 'space'], + nextState: '0' + } + }, + '^{(...)}|^(-1)': { + '1': { + action_: '^(-1)' + } + }, + '-9.,9': { + '0': { + action_: 'rm=', + nextState: '0' + }, + '1': { + action_: '^(-1)', + nextState: '0' + } + }, + '{...}|else': { + '*': { + action_: 'rm=', + nextState: '1' + } + } + }), + actions: { + 'cdot': function cdot() { + return { + type_: 'tight cdot' + }; + }, + '^(-1)': function _(buffer, m) { + buffer.rm += "^{" + m + "}"; + }, + 'space': function space() { + return { + type_: 'pu-space-2' + }; + }, + 'output': function output(buffer) { + /** @type {ParserOutput | ParserOutput[]} */ + var ret = []; + + if (buffer.rm) { + var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || ""); + + if (mrm && mrm.remainder === '') { + ret = mhchemParser.go(mrm.match_, 'pu'); + } else { + ret = { + type_: 'rm', + p1: buffer.rm + }; + } + } + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + }, + 'pu-9,9': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '0': { + action_: 'output-0' + }, + 'o': { + action_: 'output-o' + } + }, + ',': { + '0': { + action_: ['output-0', 'comma'], + nextState: 'o' + } + }, + '.': { + '0': { + action_: ['output-0', 'copy'], + nextState: 'o' + } + }, + 'else': { + '*': { + action_: 'text=' + } + } + }), + actions: { + 'comma': function comma() { + return { + type_: 'commaDecimal' + }; + }, + 'output-0': function output0(buffer) { + /** @type {ParserOutput[]} */ + var ret = []; + buffer.text_ = buffer.text_ || ""; + + if (buffer.text_.length > 4) { + var a = buffer.text_.length % 3; + + if (a === 0) { + a = 3; + } + + for (var i = buffer.text_.length - 3; i > 0; i -= 3) { + ret.push(buffer.text_.substr(i, 3)); + ret.push({ + type_: '1000 separator' + }); + } + + ret.push(buffer.text_.substr(0, a)); + ret.reverse(); + } else { + ret.push(buffer.text_); + } + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + }, + 'output-o': function outputO(buffer) { + /** @type {ParserOutput[]} */ + var ret = []; + buffer.text_ = buffer.text_ || ""; + + if (buffer.text_.length > 4) { + var a = buffer.text_.length - 3; + + for (var i = 0; i < a; i += 3) { + ret.push(buffer.text_.substr(i, 3)); + ret.push({ + type_: '1000 separator' + }); + } + + ret.push(buffer.text_.substr(i)); + } else { + ret.push(buffer.text_); + } + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + } //#endregion + +}; // +// texify: Take MhchemParser output and convert it to TeX +// + +/** @type {Texify} */ + +var texify = { + go: function go(input, isInner) { + // (recursive, max 4 levels) + if (!input) { + return ""; + } + + var res = ""; + var cee = false; + + for (var i = 0; i < input.length; i++) { + var inputi = input[i]; + + if (typeof inputi === "string") { + res += inputi; + } else { + res += texify._go2(inputi); + + if (inputi.type_ === '1st-level escape') { + cee = true; + } + } + } + + if (!isInner && !cee && res) { + res = "{" + res + "}"; + } + + return res; + }, + _goInner: function _goInner(input) { + if (!input) { + return input; + } + + return texify.go(input, true); + }, + _go2: function _go2(buf) { + /** @type {undefined | string} */ + var res; + + switch (buf.type_) { + case 'chemfive': + res = ""; + var b5 = { + a: texify._goInner(buf.a), + b: texify._goInner(buf.b), + p: texify._goInner(buf.p), + o: texify._goInner(buf.o), + q: texify._goInner(buf.q), + d: texify._goInner(buf.d) + }; // + // a + // + + if (b5.a) { + if (b5.a.match(/^[+\-]/)) { + b5.a = "{" + b5.a + "}"; + } + + res += b5.a + "\\,"; + } // + // b and p + // + + + if (b5.b || b5.p) { + res += "{\\vphantom{X}}"; + res += "^{\\hphantom{" + (b5.b || "") + "}}_{\\hphantom{" + (b5.p || "") + "}}"; + res += "{\\vphantom{X}}"; + res += "^{\\smash[t]{\\vphantom{2}}\\mathllap{" + (b5.b || "") + "}}"; + res += "_{\\vphantom{2}\\mathllap{\\smash[t]{" + (b5.p || "") + "}}}"; + } // + // o + // + + + if (b5.o) { + if (b5.o.match(/^[+\-]/)) { + b5.o = "{" + b5.o + "}"; + } + + res += b5.o; + } // + // q and d + // + + + if (buf.dType === 'kv') { + if (b5.d || b5.q) { + res += "{\\vphantom{X}}"; + } + + if (b5.d) { + res += "^{" + b5.d + "}"; + } + + if (b5.q) { + res += "_{\\smash[t]{" + b5.q + "}}"; + } + } else if (buf.dType === 'oxidation') { + if (b5.d) { + res += "{\\vphantom{X}}"; + res += "^{" + b5.d + "}"; + } + + if (b5.q) { + res += "{\\vphantom{X}}"; + res += "_{\\smash[t]{" + b5.q + "}}"; + } + } else { + if (b5.q) { + res += "{\\vphantom{X}}"; + res += "_{\\smash[t]{" + b5.q + "}}"; + } + + if (b5.d) { + res += "{\\vphantom{X}}"; + res += "^{" + b5.d + "}"; + } + } + + break; + + case 'rm': + res = "\\mathrm{" + buf.p1 + "}"; + break; + + case 'text': + if (buf.p1.match(/[\^_]/)) { + buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}"); + res = "\\mathrm{" + buf.p1 + "}"; + } else { + res = "\\text{" + buf.p1 + "}"; + } + + break; + + case 'roman numeral': + res = "\\mathrm{" + buf.p1 + "}"; + break; + + case 'state of aggregation': + res = "\\mskip2mu " + texify._goInner(buf.p1); + break; + + case 'state of aggregation subscript': + res = "\\mskip1mu " + texify._goInner(buf.p1); + break; + + case 'bond': + res = texify._getBond(buf.kind_); + + if (!res) { + throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"]; + } + + break; + + case 'frac': + var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}"; + res = "\\mathchoice{\\textstyle" + c + "}{" + c + "}{" + c + "}{" + c + "}"; + break; + + case 'pu-frac': + var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; + res = "\\mathchoice{\\textstyle" + d + "}{" + d + "}{" + d + "}{" + d + "}"; + break; + + case 'tex-math': + res = buf.p1 + " "; + break; + + case 'frac-ce': + res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; + break; + + case 'overset': + res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; + break; + + case 'underset': + res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; + break; + + case 'underbrace': + res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}"; + break; + + case 'color': + res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}"; + break; + + case 'color0': + res = "\\color{" + buf.color + "}"; + break; + + case 'arrow': + var b6 = { + rd: texify._goInner(buf.rd), + rq: texify._goInner(buf.rq) + }; + + var arrow = "\\x" + texify._getArrow(buf.r); + + if (b6.rq) { + arrow += "[{" + b6.rq + "}]"; + } + + if (b6.rd) { + arrow += "{" + b6.rd + "}"; + } else { + arrow += "{}"; + } + + res = arrow; + break; + + case 'operator': + res = texify._getOperator(buf.kind_); + break; + + case '1st-level escape': + res = buf.p1 + " "; // &, \\\\, \\hlin + + break; + + case 'space': + res = " "; + break; + + case 'entitySkip': + res = "~"; + break; + + case 'pu-space-1': + res = "~"; + break; + + case 'pu-space-2': + res = "\\mkern3mu "; + break; + + case '1000 separator': + res = "\\mkern2mu "; + break; + + case 'commaDecimal': + res = "{,}"; + break; + + case 'comma enumeration L': + res = "{" + buf.p1 + "}\\mkern6mu "; + break; + + case 'comma enumeration M': + res = "{" + buf.p1 + "}\\mkern3mu "; + break; + + case 'comma enumeration S': + res = "{" + buf.p1 + "}\\mkern1mu "; + break; + + case 'hyphen': + res = "\\text{-}"; + break; + + case 'addition compound': + res = "\\,{\\cdot}\\,"; + break; + + case 'electron dot': + res = "\\mkern1mu \\bullet\\mkern1mu "; + break; + + case 'KV x': + res = "{\\times}"; + break; + + case 'prime': + res = "\\prime "; + break; + + case 'cdot': + res = "\\cdot "; + break; + + case 'tight cdot': + res = "\\mkern1mu{\\cdot}\\mkern1mu "; + break; + + case 'times': + res = "\\times "; + break; + + case 'circa': + res = "{\\sim}"; + break; + + case '^': + res = "uparrow"; + break; + + case 'v': + res = "downarrow"; + break; + + case 'ellipsis': + res = "\\ldots "; + break; + + case '/': + res = "/"; + break; + + case ' / ': + res = "\\,/\\,"; + break; + + default: + assertNever(buf); + throw ["MhchemBugT", "mhchem bug T. Please report."]; + // Missing texify rule or unknown MhchemParser output + } + + assertString(res); + return res; + }, + _getArrow: function _getArrow(a) { + switch (a) { + case "->": + return "rightarrow"; + + case "\u2192": + return "rightarrow"; + + case "\u27F6": + return "rightarrow"; + + case "<-": + return "leftarrow"; + + case "<->": + return "leftrightarrow"; + + case "<-->": + return "rightleftarrows"; + + case "<=>": + return "rightleftharpoons"; + + case "\u21CC": + return "rightleftharpoons"; + + case "<=>>": + return "rightequilibrium"; + + case "<<=>": + return "leftequilibrium"; + + default: + assertNever(a); + throw ["MhchemBugT", "mhchem bug T. Please report."]; + } + }, + _getBond: function _getBond(a) { + switch (a) { + case "-": + return "{-}"; + + case "1": + return "{-}"; + + case "=": + return "{=}"; + + case "2": + return "{=}"; + + case "#": + return "{\\equiv}"; + + case "3": + return "{\\equiv}"; + + case "~": + return "{\\tripledash}"; + + case "~-": + return "{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}"; + + case "~=": + return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}"; + + case "~--": + return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}"; + + case "-~-": + return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}"; + + case "...": + return "{{\\cdot}{\\cdot}{\\cdot}}"; + + case "....": + return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}"; + + case "->": + return "{\\rightarrow}"; + + case "<-": + return "{\\leftarrow}"; + + case "<": + return "{<}"; + + case ">": + return "{>}"; + + default: + assertNever(a); + throw ["MhchemBugT", "mhchem bug T. Please report."]; + } + }, + _getOperator: function _getOperator(a) { + switch (a) { + case "+": + return " {}+{} "; + + case "-": + return " {}-{} "; + + case "=": + return " {}={} "; + + case "<": + return " {}<{} "; + + case ">": + return " {}>{} "; + + case "<<": + return " {}\\ll{} "; + + case ">>": + return " {}\\gg{} "; + + case "\\pm": + return " {}\\pm{} "; + + case "\\approx": + return " {}\\approx{} "; + + case "$\\approx$": + return " {}\\approx{} "; + + case "v": + return " \\downarrow{} "; + + case "(v)": + return " \\downarrow{} "; + + case "^": + return " \\uparrow{} "; + + case "(^)": + return " \\uparrow{} "; + + default: + assertNever(a); + throw ["MhchemBugT", "mhchem bug T. Please report."]; + } + } +}; // +// Helpers for code anaylsis +// Will show type error at calling position +// + +/** @param {number} a */ + +function assertNever(a) {} +/** @param {string} a */ + + +function assertString(a) {} +}(); +__webpack_exports__ = __webpack_exports__.default; +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/katex/contrib/mhchem.min.js b/katex/contrib/mhchem.min.js new file mode 100644 index 0000000..f097ebb --- /dev/null +++ b/katex/contrib/mhchem.min.js @@ -0,0 +1 @@ +!function(t,e){if("object"==typeof exports&&"object"==typeof module)module.exports=e(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],e);else{var n="object"==typeof exports?e(require("katex")):e(t.katex);for(var o in n)("object"==typeof exports?exports:t)[o]=n[o]}}("undefined"!=typeof self?self:this,(function(t){return function(){"use strict";var e={974:function(e){e.exports=t}},n={};function o(t){var a=n[t];if(void 0!==a)return a.exports;var r=n[t]={exports:{}};return e[t](r,r.exports,o),r.exports}o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,{a:e}),e},o.d=function(t,e){for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)};var a={};return function(){var t=o(974),e=o.n(t);e().__defineMacro("\\ce",(function(t){return n(t.consumeArgs(1)[0],"ce")})),e().__defineMacro("\\pu",(function(t){return n(t.consumeArgs(1)[0],"pu")})),e().__defineMacro("\\tripledash","{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}");var n=function(t,e){for(var n="",o=t[t.length-1].loc.start,i=t.length-1;i>=0;i--)t[i].loc.start>o&&(n+=" ",o=t[i].loc.start),n+=t[i].text,o+=t[i].text.length;return r.go(a.go(n,e))},a={go:function(t,e){if(!t)return[];void 0===e&&(e="ce");var n,o="0",r={};r.parenthesisLevel=0,t=(t=(t=t.replace(/\n/g," ")).replace(/[\u2212\u2013\u2014\u2010]/g,"-")).replace(/[\u2026]/g,"...");for(var i=10,c=[];;){n!==t?(i=10,n=t):i--;var u=a.stateMachines[e],p=u.transitions[o]||u.transitions["*"];t:for(var s=0;s0))return c;if(d.revisit||(t=_.remainder),!d.toContinue)break t}}if(i<=0)throw["MhchemBugU","mhchem bug U. Please report."]}},concatArray:function(t,e){if(e)if(Array.isArray(e))for(var n=0;n":/^[=<>]/,"#":/^[#\u2261]/,"+":/^\+/,"-$":/^-(?=[\s_},;\]/]|$|\([a-z]+\))/,"-9":/^-(?=[0-9])/,"- orbital overlap":/^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/,"-":/^-/,"pm-operator":/^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,operator:/^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,arrowUpDown:/^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,"\\bond{(...)}":function(t){return a.patterns.findObserveGroups(t,"\\bond{","","","}")},"->":/^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,CMT:/^[CMT](?=\[)/,"[(...)]":function(t){return a.patterns.findObserveGroups(t,"[","","","]")},"1st-level escape":/^(&|\\\\|\\hline)\s*/,"\\,":/^(?:\\[,\ ;:])/,"\\x{}{}":function(t){return a.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","","","{","}","",!0)},"\\x{}":function(t){return a.patterns.findObserveGroups(t,"",/^\\[a-zA-Z]+\{/,"}","")},"\\ca":/^\\ca(?:\s+|(?![a-zA-Z]))/,"\\x":/^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/,orbital:/^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,others:/^[\/~|]/,"\\frac{(...)}":function(t){return a.patterns.findObserveGroups(t,"\\frac{","","","}","{","","","}")},"\\overset{(...)}":function(t){return a.patterns.findObserveGroups(t,"\\overset{","","","}","{","","","}")},"\\underset{(...)}":function(t){return a.patterns.findObserveGroups(t,"\\underset{","","","}","{","","","}")},"\\underbrace{(...)}":function(t){return a.patterns.findObserveGroups(t,"\\underbrace{","","","}_","{","","","}")},"\\color{(...)}0":function(t){return a.patterns.findObserveGroups(t,"\\color{","","","}")},"\\color{(...)}{(...)}1":function(t){return a.patterns.findObserveGroups(t,"\\color{","","","}","{","","","}")},"\\color(...){(...)}2":function(t){return a.patterns.findObserveGroups(t,"\\color","\\","",/^(?=\{)/,"{","","","}")},"\\ce{(...)}":function(t){return a.patterns.findObserveGroups(t,"\\ce{","","","}")},oxidation$:/^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"d-oxidation$":/^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,"roman numeral":/^[IVX]+/,"1/2$":/^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,amount:function(t){var e;if(e=t.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/))return{match_:e[0],remainder:t.substr(e[0].length)};var n=a.patterns.findObserveGroups(t,"","$","$","");return n&&(e=n.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/))?{match_:e[0],remainder:t.substr(e[0].length)}:null},amount2:function(t){return this.amount(t)},"(KV letters),":/^(?:[A-Z][a-z]{0,2}|i)(?=,)/,formula$:function(t){if(t.match(/^\([a-z]+\)$/))return null;var e=t.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/);return e?{match_:e[0],remainder:t.substr(e[0].length)}:null},uprightEntities:/^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,"/":/^\s*(\/)\s*/,"//":/^\s*(\/\/)\s*/,"*":/^\s*[*.]\s*/},findObserveGroups:function(t,e,n,o,a,r,i,c,u,p){var s=function(t,e){if("string"==typeof e)return 0!==t.indexOf(e)?null:e;var n=t.match(e);return n?n[0]:null},_=s(t,e);if(null===_)return null;if(t=t.substr(_.length),null===(_=s(t,n)))return null;var d=function(t,e,n){for(var o=0;e":{"0|1|2|3":{action_:"r=",nextState:"r"},"a|as":{action_:["output","r="],nextState:"r"},"*":{action_:["output","r="],nextState:"r"}},"+":{o:{action_:"d= kv",nextState:"d"},"d|D":{action_:"d=",nextState:"d"},q:{action_:"d=",nextState:"qd"},"qd|qD":{action_:"d=",nextState:"qd"},dq:{action_:["output","d="],nextState:"d"},3:{action_:["sb=false","output","operator"],nextState:"0"}},amount:{"0|2":{action_:"a=",nextState:"a"}},"pm-operator":{"0|1|2|a|as":{action_:["sb=false","output",{type_:"operator",option:"\\pm"}],nextState:"0"}},operator:{"0|1|2|a|as":{action_:["sb=false","output","operator"],nextState:"0"}},"-$":{"o|q":{action_:["charge or bond","output"],nextState:"qd"},d:{action_:"d=",nextState:"d"},D:{action_:["output",{type_:"bond",option:"-"}],nextState:"3"},q:{action_:"d=",nextState:"qd"},qd:{action_:"d=",nextState:"qd"},"qD|dq":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},"-9":{"3|o":{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"3"}},"- orbital overlap":{o:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},d:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"}},"-":{"0|1|2":{action_:[{type_:"output",option:1},"beginsWithBond=true",{type_:"bond",option:"-"}],nextState:"3"},3:{action_:{type_:"bond",option:"-"}},a:{action_:["output",{type_:"insert",option:"hyphen"}],nextState:"2"},as:{action_:[{type_:"output",option:2},{type_:"bond",option:"-"}],nextState:"3"},b:{action_:"b="},o:{action_:{type_:"- after o/d",option:!1},nextState:"2"},q:{action_:{type_:"- after o/d",option:!1},nextState:"2"},"d|qd|dq":{action_:{type_:"- after o/d",option:!0},nextState:"2"},"D|qD|p":{action_:["output",{type_:"bond",option:"-"}],nextState:"3"}},amount2:{"1|3":{action_:"a=",nextState:"a"}},letters:{"0|1|2|3|a|as|b|p|bp|o":{action_:"o=",nextState:"o"},"q|dq":{action_:["output","o="],nextState:"o"},"d|D|qd|qD":{action_:"o after d",nextState:"o"}},digits:{o:{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},q:{action_:["output","o="],nextState:"o"},a:{action_:"o=",nextState:"o"}},"space A":{"b|p|bp":{}},space:{a:{nextState:"as"},0:{action_:"sb=false"},"1|2":{action_:"sb=true"},"r|rt|rd|rdt|rdq":{action_:"output",nextState:"0"},"*":{action_:["output","sb=true"],nextState:"1"}},"1st-level escape":{"1|2":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}]},"*":{action_:["output",{type_:"insert+p1",option:"1st-level escape"}],nextState:"0"}},"[(...)]":{"r|rt":{action_:"rd=",nextState:"rd"},"rd|rdt":{action_:"rq=",nextState:"rdq"}},"...":{"o|d|D|dq|qd|qD":{action_:["output",{type_:"bond",option:"..."}],nextState:"3"},"*":{action_:[{type_:"output",option:1},{type_:"insert",option:"ellipsis"}],nextState:"1"}},". |* ":{"*":{action_:["output",{type_:"insert",option:"addition compound"}],nextState:"1"}},"state of aggregation $":{"*":{action_:["output","state of aggregation"],nextState:"1"}},"{[(":{"a|as|o":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"0|1|2|3":{action_:["o=","output","parenthesisLevel++"],nextState:"2"},"*":{action_:["output","o=","output","parenthesisLevel++"],nextState:"2"}},")]}":{"0|1|2|3|b|p|bp|o":{action_:["o=","parenthesisLevel--"],nextState:"o"},"a|as|d|D|q|qd|qD|dq":{action_:["output","o=","parenthesisLevel--"],nextState:"o"}},", ":{"*":{action_:["output","comma"],nextState:"0"}},"^_":{"*":{}},"^{(...)}|^($...$)":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"D"},q:{action_:"d=",nextState:"qD"},"d|D|qd|qD|dq":{action_:["output","d="],nextState:"D"}},"^a|^\\x{}{}|^\\x{}|^\\x|'":{"0|1|2|as":{action_:"b=",nextState:"b"},p:{action_:"b=",nextState:"bp"},"3|o":{action_:"d= kv",nextState:"d"},q:{action_:"d=",nextState:"qd"},"d|qd|D|qD":{action_:"d="},dq:{action_:["output","d="],nextState:"d"}},"_{(state of aggregation)}$":{"d|D|q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x":{"0|1|2|as":{action_:"p=",nextState:"p"},b:{action_:"p=",nextState:"bp"},"3|o":{action_:"q=",nextState:"q"},"d|D":{action_:"q=",nextState:"dq"},"q|qd|qD|dq":{action_:["output","q="],nextState:"q"}},"=<>":{"0|1|2|3|a|as|o|q|d|D|qd|qD|dq":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"#":{"0|1|2|3|a|as|o":{action_:[{type_:"output",option:2},{type_:"bond",option:"#"}],nextState:"3"}},"{}":{"*":{action_:{type_:"output",option:1},nextState:"1"}},"{...}":{"0|1|2|3|a|as|b|p|bp":{action_:"o=",nextState:"o"},"o|d|D|q|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"$...$":{a:{action_:"a="},"0|1|2|3|as|b|p|bp|o":{action_:"o=",nextState:"o"},"as|o":{action_:"o="},"q|d|D|qd|qD|dq":{action_:["output","o="],nextState:"o"}},"\\bond{(...)}":{"*":{action_:[{type_:"output",option:2},"bond"],nextState:"3"}},"\\frac{(...)}":{"*":{action_:[{type_:"output",option:1},"frac-output"],nextState:"3"}},"\\overset{(...)}":{"*":{action_:[{type_:"output",option:2},"overset-output"],nextState:"3"}},"\\underset{(...)}":{"*":{action_:[{type_:"output",option:2},"underset-output"],nextState:"3"}},"\\underbrace{(...)}":{"*":{action_:[{type_:"output",option:2},"underbrace-output"],nextState:"3"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:[{type_:"output",option:2},"color-output"],nextState:"3"}},"\\color{(...)}0":{"*":{action_:[{type_:"output",option:2},"color0-output"]}},"\\ce{(...)}":{"*":{action_:[{type_:"output",option:2},"ce"],nextState:"3"}},"\\,":{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"1"}},"\\x{}{}|\\x{}|\\x":{"0|1|2|3|a|as|b|p|bp|o|c0":{action_:["o=","output"],nextState:"3"},"*":{action_:["output","o=","output"],nextState:"3"}},others:{"*":{action_:[{type_:"output",option:1},"copy"],nextState:"3"}},else2:{a:{action_:"a to o",nextState:"o",revisit:!0},as:{action_:["output","sb=true"],nextState:"1",revisit:!0},"r|rt|rd|rdt|rdq":{action_:["output"],nextState:"0",revisit:!0},"*":{action_:["output","copy"],nextState:"3"}}}),actions:{"o after d":function(t,e){var n;if((t.d||"").match(/^[0-9]+$/)){var o=t.d;t.d=void 0,n=this.output(t),t.b=o}else n=this.output(t);return a.actions["o="](t,e),n},"d= kv":function(t,e){t.d=e,t.dType="kv"},"charge or bond":function(t,e){if(t.beginsWithBond){var n=[];return a.concatArray(n,this.output(t)),a.concatArray(n,a.actions.bond(t,e,"-")),n}t.d=e},"- after o/d":function(t,e,n){var o=a.patterns.match_("orbital",t.o||""),r=a.patterns.match_("one lowercase greek letter $",t.o||""),i=a.patterns.match_("one lowercase latin letter $",t.o||""),c=a.patterns.match_("$one lowercase latin letter$ $",t.o||""),u="-"===e&&(o&&""===o.remainder||r||i||c);!u||t.a||t.b||t.p||t.d||t.q||o||!i||(t.o="$"+t.o+"$");var p=[];return u?(a.concatArray(p,this.output(t)),p.push({type_:"hyphen"})):(o=a.patterns.match_("digits",t.d||""),n&&o&&""===o.remainder?(a.concatArray(p,a.actions["d="](t,e)),a.concatArray(p,this.output(t))):(a.concatArray(p,this.output(t)),a.concatArray(p,a.actions.bond(t,e,"-")))),p},"a to o":function(t){t.o=t.a,t.a=void 0},"sb=true":function(t){t.sb=!0},"sb=false":function(t){t.sb=!1},"beginsWithBond=true":function(t){t.beginsWithBond=!0},"beginsWithBond=false":function(t){t.beginsWithBond=!1},"parenthesisLevel++":function(t){t.parenthesisLevel++},"parenthesisLevel--":function(t){t.parenthesisLevel--},"state of aggregation":function(t,e){return{type_:"state of aggregation",p1:a.go(e,"o")}},comma:function(t,e){var n=e.replace(/\s*$/,"");return n!==e&&0===t.parenthesisLevel?{type_:"comma enumeration L",p1:n}:{type_:"comma enumeration M",p1:n}},output:function(t,e,n){var o,r,i;t.r?(r="M"===t.rdt?a.go(t.rd,"tex-math"):"T"===t.rdt?[{type_:"text",p1:t.rd||""}]:a.go(t.rd),i="M"===t.rqt?a.go(t.rq,"tex-math"):"T"===t.rqt?[{type_:"text",p1:t.rq||""}]:a.go(t.rq),o={type_:"arrow",r:t.r,rd:r,rq:i}):(o=[],(t.a||t.b||t.p||t.o||t.q||t.d||n)&&(t.sb&&o.push({type_:"entitySkip"}),t.o||t.q||t.d||t.b||t.p||2===n?t.o||t.q||t.d||!t.b&&!t.p?t.o&&"kv"===t.dType&&a.patterns.match_("d-oxidation$",t.d||"")?t.dType="oxidation":t.o&&"kv"===t.dType&&!t.q&&(t.dType=void 0):(t.o=t.a,t.d=t.b,t.q=t.p,t.a=t.b=t.p=void 0):(t.o=t.a,t.a=void 0),o.push({type_:"chemfive",a:a.go(t.a,"a"),b:a.go(t.b,"bd"),p:a.go(t.p,"pq"),o:a.go(t.o,"o"),q:a.go(t.q,"pq"),d:a.go(t.d,"oxidation"===t.dType?"oxidation":"bd"),dType:t.dType})));for(var c in t)"parenthesisLevel"!==c&&"beginsWithBond"!==c&&delete t[c];return o},"oxidation-output":function(t,e){var n=["{"];return a.concatArray(n,a.go(e,"oxidation")),n.push("}"),n},"frac-output":function(t,e){return{type_:"frac-ce",p1:a.go(e[0]),p2:a.go(e[1])}},"overset-output":function(t,e){return{type_:"overset",p1:a.go(e[0]),p2:a.go(e[1])}},"underset-output":function(t,e){return{type_:"underset",p1:a.go(e[0]),p2:a.go(e[1])}},"underbrace-output":function(t,e){return{type_:"underbrace",p1:a.go(e[0]),p2:a.go(e[1])}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:a.go(e[1])}},"r=":function(t,e){t.r=e},"rdt=":function(t,e){t.rdt=e},"rd=":function(t,e){t.rd=e},"rqt=":function(t,e){t.rqt=e},"rq=":function(t,e){t.rq=e},operator:function(t,e,n){return{type_:"operator",kind_:n||e}}}},a:{transitions:a.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},"$(...)$":{"*":{action_:"tex-math tight",nextState:"1"}},",":{"*":{action_:{type_:"insert",option:"commaDecimal"}}},else2:{"*":{action_:"copy"}}}),actions:{}},o:{transitions:a.createTransitions({empty:{"*":{}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"1",revisit:!0}},letters:{"*":{action_:"rm"}},"\\ca":{"*":{action_:{type_:"insert",option:"circa"}}},"\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"{text}"}},else2:{"*":{action_:"copy"}}}),actions:{}},text:{transitions:a.createTransitions({empty:{"*":{action_:"output"}},"{...}":{"*":{action_:"text="}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"\\greek":{"*":{action_:["output","rm"]}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:["output","copy"]}},else:{"*":{action_:"text="}}}),actions:{output:function(t){if(t.text_){var e={type_:"text",p1:t.text_};for(var n in t)delete t[n];return e}}}},pq:{transitions:a.createTransitions({empty:{"*":{}},"state of aggregation $":{"*":{action_:"state of aggregation"}},i$:{0:{nextState:"!f",revisit:!0}},"(KV letters),":{0:{action_:"rm",nextState:"0"}},formula$:{0:{nextState:"f",revisit:!0}},"1/2$":{0:{action_:"1/2"}},else:{0:{nextState:"!f",revisit:!0}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"a-z":{f:{action_:"tex-math"}},letters:{"*":{action_:"rm"}},"-9.,9":{"*":{action_:"9,9"}},",":{"*":{action_:{type_:"insert+p1",option:"comma enumeration S"}}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"state of aggregation":function(t,e){return{type_:"state of aggregation subscript",p1:a.go(e,"o")}},"color-output":function(t,e){return{type_:"color",color1:e[0],color2:a.go(e[1],"pq")}}}},bd:{transitions:a.createTransitions({empty:{"*":{}},x$:{0:{nextState:"!f",revisit:!0}},formula$:{0:{nextState:"f",revisit:!0}},else:{0:{nextState:"!f",revisit:!0}},"-9.,9 no missing 0":{"*":{action_:"9,9"}},".":{"*":{action_:{type_:"insert",option:"electron dot"}}},"a-z":{f:{action_:"tex-math"}},x:{"*":{action_:{type_:"insert",option:"KV x"}}},letters:{"*":{action_:"rm"}},"'":{"*":{action_:{type_:"insert",option:"prime"}}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},"{(...)}":{"*":{action_:"text"}},"\\color{(...)}{(...)}1|\\color(...){(...)}2":{"*":{action_:"color-output"}},"\\color{(...)}0":{"*":{action_:"color0-output"}},"\\ce{(...)}":{"*":{action_:"ce"}},"\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"copy"}},else2:{"*":{action_:"copy"}}}),actions:{"color-output":function(t,e){return{type_:"color",color1:e[0],color2:a.go(e[1],"bd")}}}},oxidation:{transitions:a.createTransitions({empty:{"*":{}},"roman numeral":{"*":{action_:"roman-numeral"}},"${(...)}$|$(...)$":{"*":{action_:"tex-math"}},else:{"*":{action_:"copy"}}}),actions:{"roman-numeral":function(t,e){return{type_:"roman numeral",p1:e||""}}}},"tex-math":{transitions:a.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},else:{"*":{action_:"o="}}}),actions:{output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var n in t)delete t[n];return e}}}},"tex-math tight":{transitions:a.createTransitions({empty:{"*":{action_:"output"}},"\\ce{(...)}":{"*":{action_:["output","ce"]}},"{...}|\\,|\\x{}{}|\\x{}|\\x":{"*":{action_:"o="}},"-|+":{"*":{action_:"tight operator"}},else:{"*":{action_:"o="}}}),actions:{"tight operator":function(t,e){t.o=(t.o||"")+"{"+e+"}"},output:function(t){if(t.o){var e={type_:"tex-math",p1:t.o};for(var n in t)delete t[n];return e}}}},"9,9":{transitions:a.createTransitions({empty:{"*":{}},",":{"*":{action_:"comma"}},else:{"*":{action_:"copy"}}}),actions:{comma:function(){return{type_:"commaDecimal"}}}},pu:{transitions:a.createTransitions({empty:{"*":{action_:"output"}},space$:{"*":{action_:["output","space"]}},"{[(|)]}":{"0|a":{action_:"copy"}},"(-)(9)^(-9)":{0:{action_:"number^",nextState:"a"}},"(-)(9.,9)(e)(99)":{0:{action_:"enumber",nextState:"a"}},space:{"0|a":{}},"pm-operator":{"0|a":{action_:{type_:"operator",option:"\\pm"},nextState:"0"}},operator:{"0|a":{action_:"copy",nextState:"0"}},"//":{d:{action_:"o=",nextState:"/"}},"/":{d:{action_:"o=",nextState:"/"}},"{...}|else":{"0|d":{action_:"d=",nextState:"d"},a:{action_:["space","d="],nextState:"d"},"/|q":{action_:"q=",nextState:"q"}}}),actions:{enumber:function(t,e){var n=[];return"+-"===e[0]||"+/-"===e[0]?n.push("\\pm "):e[0]&&n.push(e[0]),e[1]&&(a.concatArray(n,a.go(e[1],"pu-9,9")),e[2]&&(e[2].match(/[,.]/)?a.concatArray(n,a.go(e[2],"pu-9,9")):n.push(e[2])),e[3]=e[4]||e[3],e[3]&&(e[3]=e[3].trim(),"e"===e[3]||"*"===e[3].substr(0,1)?n.push({type_:"cdot"}):n.push({type_:"times"}))),e[3]&&n.push("10^{"+e[5]+"}"),n},"number^":function(t,e){var n=[];return"+-"===e[0]||"+/-"===e[0]?n.push("\\pm "):e[0]&&n.push(e[0]),a.concatArray(n,a.go(e[1],"pu-9,9")),n.push("^{"+e[2]+"}"),n},operator:function(t,e,n){return{type_:"operator",kind_:n||e}},space:function(){return{type_:"pu-space-1"}},output:function(t){var e,n=a.patterns.match_("{(...)}",t.d||"");n&&""===n.remainder&&(t.d=n.match_);var o=a.patterns.match_("{(...)}",t.q||"");if(o&&""===o.remainder&&(t.q=o.match_),t.d&&(t.d=t.d.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.d=t.d.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F")),t.q){t.q=t.q.replace(/\u00B0C|\^oC|\^{o}C/g,"{}^{\\circ}C"),t.q=t.q.replace(/\u00B0F|\^oF|\^{o}F/g,"{}^{\\circ}F");var r={d:a.go(t.d,"pu"),q:a.go(t.q,"pu")};"//"===t.o?e={type_:"pu-frac",p1:r.d,p2:r.q}:(e=r.d,r.d.length>1||r.q.length>1?e.push({type_:" / "}):e.push({type_:"/"}),a.concatArray(e,r.q))}else e=a.go(t.d,"pu-2");for(var i in t)delete t[i];return e}}},"pu-2":{transitions:a.createTransitions({empty:{"*":{action_:"output"}},"*":{"*":{action_:["output","cdot"],nextState:"0"}},"\\x":{"*":{action_:"rm="}},space:{"*":{action_:["output","space"],nextState:"0"}},"^{(...)}|^(-1)":{1:{action_:"^(-1)"}},"-9.,9":{0:{action_:"rm=",nextState:"0"},1:{action_:"^(-1)",nextState:"0"}},"{...}|else":{"*":{action_:"rm=",nextState:"1"}}}),actions:{cdot:function(){return{type_:"tight cdot"}},"^(-1)":function(t,e){t.rm+="^{"+e+"}"},space:function(){return{type_:"pu-space-2"}},output:function(t){var e=[];if(t.rm){var n=a.patterns.match_("{(...)}",t.rm||"");e=n&&""===n.remainder?a.go(n.match_,"pu"):{type_:"rm",p1:t.rm}}for(var o in t)delete t[o];return e}}},"pu-9,9":{transitions:a.createTransitions({empty:{0:{action_:"output-0"},o:{action_:"output-o"}},",":{0:{action_:["output-0","comma"],nextState:"o"}},".":{0:{action_:["output-0","copy"],nextState:"o"}},else:{"*":{action_:"text="}}}),actions:{comma:function(){return{type_:"commaDecimal"}},"output-0":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){var n=t.text_.length%3;0===n&&(n=3);for(var o=t.text_.length-3;o>0;o-=3)e.push(t.text_.substr(o,3)),e.push({type_:"1000 separator"});e.push(t.text_.substr(0,n)),e.reverse()}else e.push(t.text_);for(var a in t)delete t[a];return e},"output-o":function(t){var e=[];if(t.text_=t.text_||"",t.text_.length>4){for(var n=t.text_.length-3,o=0;o":case"\u2192":case"\u27f6":return"rightarrow";case"<-":return"leftarrow";case"<->":return"leftrightarrow";case"<--\x3e":return"rightleftarrows";case"<=>":case"\u21cc":return"rightleftharpoons";case"<=>>":return"rightequilibrium";case"<<=>":return"leftequilibrium";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getBond:function(t){switch(t){case"-":case"1":return"{-}";case"=":case"2":return"{=}";case"#":case"3":return"{\\equiv}";case"~":return"{\\tripledash}";case"~-":return"{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}";case"~=":case"~--":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}";case"-~-":return"{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}";case"...":return"{{\\cdot}{\\cdot}{\\cdot}}";case"....":return"{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}";case"->":return"{\\rightarrow}";case"<-":return"{\\leftarrow}";case"<":return"{<}";case">":return"{>}";default:throw["MhchemBugT","mhchem bug T. Please report."]}},_getOperator:function(t){switch(t){case"+":return" {}+{} ";case"-":return" {}-{} ";case"=":return" {}={} ";case"<":return" {}<{} ";case">":return" {}>{} ";case"<<":return" {}\\ll{} ";case">>":return" {}\\gg{} ";case"\\pm":return" {}\\pm{} ";case"\\approx":case"$\\approx$":return" {}\\approx{} ";case"v":case"(v)":return" \\downarrow{} ";case"^":case"(^)":return" \\uparrow{} ";default:throw["MhchemBugT","mhchem bug T. Please report."]}}}}(),a=a.default}()})); \ No newline at end of file diff --git a/katex/contrib/mhchem.mjs b/katex/contrib/mhchem.mjs new file mode 100644 index 0000000..55511ad --- /dev/null +++ b/katex/contrib/mhchem.mjs @@ -0,0 +1,3109 @@ +import katex from '../katex.mjs'; + +/* eslint-disable */ + +/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ + +/* vim: set ts=2 et sw=2 tw=80: */ + +/************************************************************* + * + * KaTeX mhchem.js + * + * This file implements a KaTeX version of mhchem version 3.3.0. + * It is adapted from MathJax/extensions/TeX/mhchem.js + * It differs from the MathJax version as follows: + * 1. The interface is changed so that it can be called from KaTeX, not MathJax. + * 2. \rlap and \llap are replaced with \mathrlap and \mathllap. + * 3. Four lines of code are edited in order to use \raisebox instead of \raise. + * 4. The reaction arrow code is simplified. All reaction arrows are rendered + * using KaTeX extensible arrows instead of building non-extensible arrows. + * 5. \tripledash vertical alignment is slightly adjusted. + * + * This code, as other KaTeX code, is released under the MIT license. + * + * /************************************************************* + * + * MathJax/extensions/TeX/mhchem.js + * + * Implements the \ce command for handling chemical formulas + * from the mhchem LaTeX package. + * + * --------------------------------------------------------------------- + * + * Copyright (c) 2011-2015 The MathJax Consortium + * Copyright (c) 2015-2018 Martin Hensel + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// +// Coding Style +// - use '' for identifiers that can by minified/uglified +// - use "" for strings that need to stay untouched +// version: "3.3.0" for MathJax and KaTeX +// Add \ce, \pu, and \tripledash to the KaTeX macros. +katex.__defineMacro("\\ce", function (context) { + return chemParse(context.consumeArgs(1)[0], "ce"); +}); + +katex.__defineMacro("\\pu", function (context) { + return chemParse(context.consumeArgs(1)[0], "pu"); +}); // Needed for \bond for the ~ forms +// Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not +// a mathematical minus, U+2212. So we need that extra 0.56. + + +katex.__defineMacro("\\tripledash", "{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu" + "\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}"); +// This is the main function for handing the \ce and \pu commands. +// It takes the argument to \ce or \pu and returns the corresponding TeX string. +// + +var chemParse = function chemParse(tokens, stateMachine) { + // Recreate the argument string from KaTeX's array of tokens. + var str = ""; + var expectedLoc = tokens[tokens.length - 1].loc.start; + + for (var i = tokens.length - 1; i >= 0; i--) { + if (tokens[i].loc.start > expectedLoc) { + // context.consumeArgs has eaten a space. + str += " "; + expectedLoc = tokens[i].loc.start; + } + + str += tokens[i].text; + expectedLoc += tokens[i].text.length; + } + + var tex = texify.go(mhchemParser.go(str, stateMachine)); + return tex; +}; // +// Core parser for mhchem syntax (recursive) +// + +/** @type {MhchemParser} */ + + +var mhchemParser = { + // + // Parses mchem \ce syntax + // + // Call like + // go("H2O"); + // + go: function go(input, stateMachine) { + if (!input) { + return []; + } + + if (stateMachine === undefined) { + stateMachine = 'ce'; + } + + var state = '0'; // + // String buffers for parsing: + // + // buffer.a == amount + // buffer.o == element + // buffer.b == left-side superscript + // buffer.p == left-side subscript + // buffer.q == right-side subscript + // buffer.d == right-side superscript + // + // buffer.r == arrow + // buffer.rdt == arrow, script above, type + // buffer.rd == arrow, script above, content + // buffer.rqt == arrow, script below, type + // buffer.rq == arrow, script below, content + // + // buffer.text_ + // buffer.rm + // etc. + // + // buffer.parenthesisLevel == int, starting at 0 + // buffer.sb == bool, space before + // buffer.beginsWithBond == bool + // + // These letters are also used as state names. + // + // Other states: + // 0 == begin of main part (arrow/operator unlikely) + // 1 == next entity + // 2 == next entity (arrow/operator unlikely) + // 3 == next atom + // c == macro + // + + /** @type {Buffer} */ + + var buffer = {}; + buffer['parenthesisLevel'] = 0; + input = input.replace(/\n/g, " "); + input = input.replace(/[\u2212\u2013\u2014\u2010]/g, "-"); + input = input.replace(/[\u2026]/g, "..."); // + // Looks through mhchemParser.transitions, to execute a matching action + // (recursive) + // + + var lastInput; + var watchdog = 10; + /** @type {ParserOutput[]} */ + + var output = []; + + while (true) { + if (lastInput !== input) { + watchdog = 10; + lastInput = input; + } else { + watchdog--; + } // + // Find actions in transition table + // + + + var machine = mhchemParser.stateMachines[stateMachine]; + var t = machine.transitions[state] || machine.transitions['*']; + + iterateTransitions: for (var i = 0; i < t.length; i++) { + var matches = mhchemParser.patterns.match_(t[i].pattern, input); + + if (matches) { + // + // Execute actions + // + var task = t[i].task; + + for (var iA = 0; iA < task.action_.length; iA++) { + var o; // + // Find and execute action + // + + if (machine.actions[task.action_[iA].type_]) { + o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option); + } else if (mhchemParser.actions[task.action_[iA].type_]) { + o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option); + } else { + throw ["MhchemBugA", "mhchem bug A. Please report. (" + task.action_[iA].type_ + ")"]; // Trying to use non-existing action + } // + // Add output + // + + + mhchemParser.concatArray(output, o); + } // + // Set next state, + // Shorten input, + // Continue with next character + // (= apply only one transition per position) + // + + + state = task.nextState || state; + + if (input.length > 0) { + if (!task.revisit) { + input = matches.remainder; + } + + if (!task.toContinue) { + break iterateTransitions; + } + } else { + return output; + } + } + } // + // Prevent infinite loop + // + + + if (watchdog <= 0) { + throw ["MhchemBugU", "mhchem bug U. Please report."]; // Unexpected character + } + } + }, + concatArray: function concatArray(a, b) { + if (b) { + if (Array.isArray(b)) { + for (var iB = 0; iB < b.length; iB++) { + a.push(b[iB]); + } + } else { + a.push(b); + } + } + }, + patterns: { + // + // Matching patterns + // either regexps or function that return null or {match_:"a", remainder:"bc"} + // + patterns: { + // property names must not look like integers ("2") for correct property traversal order, later on + 'empty': /^$/, + 'else': /^./, + 'else2': /^./, + 'space': /^\s/, + 'space A': /^\s(?=[A-Z\\$])/, + 'space$': /^\s$/, + 'a-z': /^[a-z]/, + 'x': /^x/, + 'x$': /^x$/, + 'i$': /^i$/, + 'letters': /^(?:[a-zA-Z\u03B1-\u03C9\u0391-\u03A9?@]|(?:\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))))+/, + '\\greek': /^\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\s+|\{\}|(?![a-zA-Z]))/, + 'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/, + '$one lowercase latin letter$ $': /^\$(?:([a-z])(?:$|[^a-zA-Z]))\$$/, + 'one lowercase greek letter $': /^(?:\$?[\u03B1-\u03C9]\$?|\$?\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\s*\$?)(?:\s+|\{\}|(?![a-zA-Z]))$/, + 'digits': /^[0-9]+/, + '-9.,9': /^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/, + '-9.,9 no missing 0': /^[+\-]?[0-9]+(?:[.,][0-9]+)?/, + '(-)(9.,9)(e)(99)': function e99(input) { + var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))?(\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))\))?(?:([eE]|\s*(\*|x|\\times|\u00D7)\s*10\^)([+\-]?[0-9]+|\{[+\-]?[0-9]+\}))?/); + + if (m && m[0]) { + return { + match_: m.splice(1), + remainder: input.substr(m[0].length) + }; + } + + return null; + }, + '(-)(9)^(-9)': function _(input) { + var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/); + + if (m && m[0]) { + return { + match_: m.splice(1), + remainder: input.substr(m[0].length) + }; + } + + return null; + }, + 'state of aggregation $': function stateOfAggregation$(input) { + // ... or crystal system + var a = mhchemParser.patterns.findObserveGroups(input, "", /^\([a-z]{1,3}(?=[\),])/, ")", ""); // (aq), (aq,$\infty$), (aq, sat) + + if (a && a.remainder.match(/^($|[\s,;\)\]\}])/)) { + return a; + } // AND end of 'phrase' + + + var m = input.match(/^(?:\((?:\\ca\s?)?\$[amothc]\$\))/); // OR crystal system ($o$) (\ca$c$) + + if (m) { + return { + match_: m[0], + remainder: input.substr(m[0].length) + }; + } + + return null; + }, + '_{(state of aggregation)}$': /^_\{(\([a-z]{1,3}\))\}/, + '{[(': /^(?:\\\{|\[|\()/, + ')]}': /^(?:\)|\]|\\\})/, + ', ': /^[,;]\s*/, + ',': /^[,;]/, + '.': /^[.]/, + '. ': /^([.\u22C5\u00B7\u2022])\s*/, + '...': /^\.\.\.(?=$|[^.])/, + '* ': /^([*])\s*/, + '^{(...)}': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "^{", "", "", "}"); + }, + '^($...$)': function $$(input) { + return mhchemParser.patterns.findObserveGroups(input, "^", "$", "$", ""); + }, + '^a': /^\^([0-9]+|[^\\_])/, + '^\\x{}{}': function x(input) { + return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); + }, + '^\\x{}': function x(input) { + return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", ""); + }, + '^\\x': /^\^(\\[a-zA-Z]+)\s*/, + '^(-1)': /^\^(-?\d+)/, + '\'': /^'/, + '_{(...)}': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "_{", "", "", "}"); + }, + '_($...$)': function _$$(input) { + return mhchemParser.patterns.findObserveGroups(input, "_", "$", "$", ""); + }, + '_9': /^_([+\-]?[0-9]+|[^\\])/, + '_\\x{}{}': function _X(input) { + return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); + }, + '_\\x{}': function _X(input) { + return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", ""); + }, + '_\\x': /^_(\\[a-zA-Z]+)\s*/, + '^_': /^(?:\^(?=_)|\_(?=\^)|[\^_]$)/, + '{}': /^\{\}/, + '{...}': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "", "{", "}", ""); + }, + '{(...)}': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "{", "", "", "}"); + }, + '$...$': function $$(input) { + return mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); + }, + '${(...)}$': function $$(input) { + return mhchemParser.patterns.findObserveGroups(input, "${", "", "", "}$"); + }, + '$(...)$': function $$(input) { + return mhchemParser.patterns.findObserveGroups(input, "$", "", "", "$"); + }, + '=<>': /^[=<>]/, + '#': /^[#\u2261]/, + '+': /^\+/, + '-$': /^-(?=[\s_},;\]/]|$|\([a-z]+\))/, + // -space -, -; -] -/ -$ -state-of-aggregation + '-9': /^-(?=[0-9])/, + '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\s,;\)\]\}]))/, + '-': /^-/, + 'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/, + 'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/, + 'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/, + '\\bond{(...)}': function bond(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}"); + }, + '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/, + 'CMT': /^[CMT](?=\[)/, + '[(...)]': function _(input) { + return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]"); + }, + '1st-level escape': /^(&|\\\\|\\hline)\s*/, + '\\,': /^(?:\\[,\ ;:])/, + // \\x - but output no space before + '\\x{}{}': function x(input) { + return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); + }, + '\\x{}': function x(input) { + return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", ""); + }, + '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/, + '\\x': /^(?:\\[a-zA-Z]+\s*|\\[_&{}%])/, + 'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, + // only those with numbers in front, because the others will be formatted correctly anyway + 'others': /^[\/~|]/, + '\\frac{(...)}': function frac(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}"); + }, + '\\overset{(...)}': function overset(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}"); + }, + '\\underset{(...)}': function underset(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}"); + }, + '\\underbrace{(...)}': function underbrace(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}"); + }, + '\\color{(...)}0': function color0(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}"); + }, + '\\color{(...)}{(...)}1': function color1(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}"); + }, + '\\color(...){(...)}2': function color2(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}"); + }, + '\\ce{(...)}': function ce(input) { + return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}"); + }, + 'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, + 'd-oxidation$': /^(?:[+-]?\s?[IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, + // 0 could be oxidation or charge + 'roman numeral': /^[IVX]+/, + '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/, + 'amount': function amount(input) { + var match; // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing + + match = input.match(/^(?:(?:(?:\([+\-]?[0-9]+\/[0-9]+\)|[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+|[+\-]?[0-9]+[.,][0-9]+|[+\-]?\.[0-9]+|[+\-]?[0-9]+)(?:[a-z](?=\s*[A-Z]))?)|[+\-]?[a-z](?=\s*[A-Z])|\+(?!\s))/); + + if (match) { + return { + match_: match[0], + remainder: input.substr(match[0].length) + }; + } + + var a = mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); + + if (a) { + // e.g. $2n-1$, $-$ + match = a.match_.match(/^\$(?:\(?[+\-]?(?:[0-9]*[a-z]?[+\-])?[0-9]*[a-z](?:[+\-][0-9]*[a-z]?)?\)?|\+|-)\$$/); + + if (match) { + return { + match_: match[0], + remainder: input.substr(match[0].length) + }; + } + } + + return null; + }, + 'amount2': function amount2(input) { + return this['amount'](input); + }, + '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/, + 'formula$': function formula$(input) { + if (input.match(/^\([a-z]+\)$/)) { + return null; + } // state of aggregation = no formula + + + var match = input.match(/^(?:[a-z]|(?:[0-9\ \+\-\,\.\(\)]+[a-z])+[0-9\ \+\-\,\.\(\)]*|(?:[a-z][0-9\ \+\-\,\.\(\)]+)+[a-z]?)$/); + + if (match) { + return { + match_: match[0], + remainder: input.substr(match[0].length) + }; + } + + return null; + }, + 'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/, + '/': /^\s*(\/)\s*/, + '//': /^\s*(\/\/)\s*/, + '*': /^\s*[*.]\s*/ + }, + findObserveGroups: function findObserveGroups(input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) { + /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */ + var _match = function _match(input, pattern) { + if (typeof pattern === "string") { + if (input.indexOf(pattern) !== 0) { + return null; + } + + return pattern; + } else { + var match = input.match(pattern); + + if (!match) { + return null; + } + + return match[0]; + } + }; + /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */ + + + var _findObserveGroups = function _findObserveGroups(input, i, endChars) { + var braces = 0; + + while (i < input.length) { + var a = input.charAt(i); + + var match = _match(input.substr(i), endChars); + + if (match !== null && braces === 0) { + return { + endMatchBegin: i, + endMatchEnd: i + match.length + }; + } else if (a === "{") { + braces++; + } else if (a === "}") { + if (braces === 0) { + throw ["ExtraCloseMissingOpen", "Extra close brace or missing open brace"]; + } else { + braces--; + } + } + + i++; + } + + if (braces > 0) { + return null; + } + + return null; + }; + + var match = _match(input, begExcl); + + if (match === null) { + return null; + } + + input = input.substr(match.length); + match = _match(input, begIncl); + + if (match === null) { + return null; + } + + var e = _findObserveGroups(input, match.length, endIncl || endExcl); + + if (e === null) { + return null; + } + + var match1 = input.substring(0, endIncl ? e.endMatchEnd : e.endMatchBegin); + + if (!(beg2Excl || beg2Incl)) { + return { + match_: match1, + remainder: input.substr(e.endMatchEnd) + }; + } else { + var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl); + + if (group2 === null) { + return null; + } + /** @type {string[]} */ + + + var matchRet = [match1, group2.match_]; + return { + match_: combine ? matchRet.join("") : matchRet, + remainder: group2.remainder + }; + } + }, + // + // Matching function + // e.g. match("a", input) will look for the regexp called "a" and see if it matches + // returns null or {match_:"a", remainder:"bc"} + // + match_: function match_(m, input) { + var pattern = mhchemParser.patterns.patterns[m]; + + if (pattern === undefined) { + throw ["MhchemBugP", "mhchem bug P. Please report. (" + m + ")"]; // Trying to use non-existing pattern + } else if (typeof pattern === "function") { + return mhchemParser.patterns.patterns[m](input); // cannot use cached var pattern here, because some pattern functions need this===mhchemParser + } else { + // RegExp + var match = input.match(pattern); + + if (match) { + var mm; + + if (match[2]) { + mm = [match[1], match[2]]; + } else if (match[1]) { + mm = match[1]; + } else { + mm = match[0]; + } + + return { + match_: mm, + remainder: input.substr(match[0].length) + }; + } + + return null; + } + } + }, + // + // Generic state machine actions + // + actions: { + 'a=': function a(buffer, m) { + buffer.a = (buffer.a || "") + m; + }, + 'b=': function b(buffer, m) { + buffer.b = (buffer.b || "") + m; + }, + 'p=': function p(buffer, m) { + buffer.p = (buffer.p || "") + m; + }, + 'o=': function o(buffer, m) { + buffer.o = (buffer.o || "") + m; + }, + 'q=': function q(buffer, m) { + buffer.q = (buffer.q || "") + m; + }, + 'd=': function d(buffer, m) { + buffer.d = (buffer.d || "") + m; + }, + 'rm=': function rm(buffer, m) { + buffer.rm = (buffer.rm || "") + m; + }, + 'text=': function text(buffer, m) { + buffer.text_ = (buffer.text_ || "") + m; + }, + 'insert': function insert(buffer, m, a) { + return { + type_: a + }; + }, + 'insert+p1': function insertP1(buffer, m, a) { + return { + type_: a, + p1: m + }; + }, + 'insert+p1+p2': function insertP1P2(buffer, m, a) { + return { + type_: a, + p1: m[0], + p2: m[1] + }; + }, + 'copy': function copy(buffer, m) { + return m; + }, + 'rm': function rm(buffer, m) { + return { + type_: 'rm', + p1: m || "" + }; + }, + 'text': function text(buffer, m) { + return mhchemParser.go(m, 'text'); + }, + '{text}': function text(buffer, m) { + var ret = ["{"]; + mhchemParser.concatArray(ret, mhchemParser.go(m, 'text')); + ret.push("}"); + return ret; + }, + 'tex-math': function texMath(buffer, m) { + return mhchemParser.go(m, 'tex-math'); + }, + 'tex-math tight': function texMathTight(buffer, m) { + return mhchemParser.go(m, 'tex-math tight'); + }, + 'bond': function bond(buffer, m, k) { + return { + type_: 'bond', + kind_: k || m + }; + }, + 'color0-output': function color0Output(buffer, m) { + return { + type_: 'color0', + color: m[0] + }; + }, + 'ce': function ce(buffer, m) { + return mhchemParser.go(m); + }, + '1/2': function _(buffer, m) { + /** @type {ParserOutput[]} */ + var ret = []; + + if (m.match(/^[+\-]/)) { + ret.push(m.substr(0, 1)); + m = m.substr(1); + } + + var n = m.match(/^([0-9]+|\$[a-z]\$|[a-z])\/([0-9]+)(\$[a-z]\$|[a-z])?$/); + n[1] = n[1].replace(/\$/g, ""); + ret.push({ + type_: 'frac', + p1: n[1], + p2: n[2] + }); + + if (n[3]) { + n[3] = n[3].replace(/\$/g, ""); + ret.push({ + type_: 'tex-math', + p1: n[3] + }); + } + + return ret; + }, + '9,9': function _(buffer, m) { + return mhchemParser.go(m, '9,9'); + } + }, + // + // createTransitions + // convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] } + // with expansion of 'a|b' to 'a' and 'b' (at 2 places) + // + createTransitions: function createTransitions(o) { + var pattern, state; + /** @type {string[]} */ + + var stateArray; + var i; // + // 1. Collect all states + // + + /** @type {Transitions} */ + + var transitions = {}; + + for (pattern in o) { + for (state in o[pattern]) { + stateArray = state.split("|"); + o[pattern][state].stateArray = stateArray; + + for (i = 0; i < stateArray.length; i++) { + transitions[stateArray[i]] = []; + } + } + } // + // 2. Fill states + // + + + for (pattern in o) { + for (state in o[pattern]) { + stateArray = o[pattern][state].stateArray || []; + + for (i = 0; i < stateArray.length; i++) { + // + // 2a. Normalize actions into array: 'text=' ==> [{type_:'text='}] + // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).) + // + + /** @type {any} */ + var p = o[pattern][state]; + + if (p.action_) { + p.action_ = [].concat(p.action_); + + for (var k = 0; k < p.action_.length; k++) { + if (typeof p.action_[k] === "string") { + p.action_[k] = { + type_: p.action_[k] + }; + } + } + } else { + p.action_ = []; + } // + // 2.b Multi-insert + // + + + var patternArray = pattern.split("|"); + + for (var j = 0; j < patternArray.length; j++) { + if (stateArray[i] === '*') { + // insert into all + for (var t in transitions) { + transitions[t].push({ + pattern: patternArray[j], + task: p + }); + } + } else { + transitions[stateArray[i]].push({ + pattern: patternArray[j], + task: p + }); + } + } + } + } + } + + return transitions; + }, + stateMachines: {} +}; // +// Definition of state machines +// + +mhchemParser.stateMachines = { + // + // \ce state machines + // + //#region ce + 'ce': { + // main parser + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + 'else': { + '0|1|2': { + action_: 'beginsWithBond=false', + revisit: true, + toContinue: true + } + }, + 'oxidation$': { + '0': { + action_: 'oxidation-output' + } + }, + 'CMT': { + 'r': { + action_: 'rdt=', + nextState: 'rt' + }, + 'rd': { + action_: 'rqt=', + nextState: 'rdt' + } + }, + 'arrowUpDown': { + '0|1|2|as': { + action_: ['sb=false', 'output', 'operator'], + nextState: '1' + } + }, + 'uprightEntities': { + '0|1|2': { + action_: ['o=', 'output'], + nextState: '1' + } + }, + 'orbital': { + '0|1|2|3': { + action_: 'o=', + nextState: 'o' + } + }, + '->': { + '0|1|2|3': { + action_: 'r=', + nextState: 'r' + }, + 'a|as': { + action_: ['output', 'r='], + nextState: 'r' + }, + '*': { + action_: ['output', 'r='], + nextState: 'r' + } + }, + '+': { + 'o': { + action_: 'd= kv', + nextState: 'd' + }, + 'd|D': { + action_: 'd=', + nextState: 'd' + }, + 'q': { + action_: 'd=', + nextState: 'qd' + }, + 'qd|qD': { + action_: 'd=', + nextState: 'qd' + }, + 'dq': { + action_: ['output', 'd='], + nextState: 'd' + }, + '3': { + action_: ['sb=false', 'output', 'operator'], + nextState: '0' + } + }, + 'amount': { + '0|2': { + action_: 'a=', + nextState: 'a' + } + }, + 'pm-operator': { + '0|1|2|a|as': { + action_: ['sb=false', 'output', { + type_: 'operator', + option: '\\pm' + }], + nextState: '0' + } + }, + 'operator': { + '0|1|2|a|as': { + action_: ['sb=false', 'output', 'operator'], + nextState: '0' + } + }, + '-$': { + 'o|q': { + action_: ['charge or bond', 'output'], + nextState: 'qd' + }, + 'd': { + action_: 'd=', + nextState: 'd' + }, + 'D': { + action_: ['output', { + type_: 'bond', + option: "-" + }], + nextState: '3' + }, + 'q': { + action_: 'd=', + nextState: 'qd' + }, + 'qd': { + action_: 'd=', + nextState: 'qd' + }, + 'qD|dq': { + action_: ['output', { + type_: 'bond', + option: "-" + }], + nextState: '3' + } + }, + '-9': { + '3|o': { + action_: ['output', { + type_: 'insert', + option: 'hyphen' + }], + nextState: '3' + } + }, + '- orbital overlap': { + 'o': { + action_: ['output', { + type_: 'insert', + option: 'hyphen' + }], + nextState: '2' + }, + 'd': { + action_: ['output', { + type_: 'insert', + option: 'hyphen' + }], + nextState: '2' + } + }, + '-': { + '0|1|2': { + action_: [{ + type_: 'output', + option: 1 + }, 'beginsWithBond=true', { + type_: 'bond', + option: "-" + }], + nextState: '3' + }, + '3': { + action_: { + type_: 'bond', + option: "-" + } + }, + 'a': { + action_: ['output', { + type_: 'insert', + option: 'hyphen' + }], + nextState: '2' + }, + 'as': { + action_: [{ + type_: 'output', + option: 2 + }, { + type_: 'bond', + option: "-" + }], + nextState: '3' + }, + 'b': { + action_: 'b=' + }, + 'o': { + action_: { + type_: '- after o/d', + option: false + }, + nextState: '2' + }, + 'q': { + action_: { + type_: '- after o/d', + option: false + }, + nextState: '2' + }, + 'd|qd|dq': { + action_: { + type_: '- after o/d', + option: true + }, + nextState: '2' + }, + 'D|qD|p': { + action_: ['output', { + type_: 'bond', + option: "-" + }], + nextState: '3' + } + }, + 'amount2': { + '1|3': { + action_: 'a=', + nextState: 'a' + } + }, + 'letters': { + '0|1|2|3|a|as|b|p|bp|o': { + action_: 'o=', + nextState: 'o' + }, + 'q|dq': { + action_: ['output', 'o='], + nextState: 'o' + }, + 'd|D|qd|qD': { + action_: 'o after d', + nextState: 'o' + } + }, + 'digits': { + 'o': { + action_: 'q=', + nextState: 'q' + }, + 'd|D': { + action_: 'q=', + nextState: 'dq' + }, + 'q': { + action_: ['output', 'o='], + nextState: 'o' + }, + 'a': { + action_: 'o=', + nextState: 'o' + } + }, + 'space A': { + 'b|p|bp': {} + }, + 'space': { + 'a': { + nextState: 'as' + }, + '0': { + action_: 'sb=false' + }, + '1|2': { + action_: 'sb=true' + }, + 'r|rt|rd|rdt|rdq': { + action_: 'output', + nextState: '0' + }, + '*': { + action_: ['output', 'sb=true'], + nextState: '1' + } + }, + '1st-level escape': { + '1|2': { + action_: ['output', { + type_: 'insert+p1', + option: '1st-level escape' + }] + }, + '*': { + action_: ['output', { + type_: 'insert+p1', + option: '1st-level escape' + }], + nextState: '0' + } + }, + '[(...)]': { + 'r|rt': { + action_: 'rd=', + nextState: 'rd' + }, + 'rd|rdt': { + action_: 'rq=', + nextState: 'rdq' + } + }, + '...': { + 'o|d|D|dq|qd|qD': { + action_: ['output', { + type_: 'bond', + option: "..." + }], + nextState: '3' + }, + '*': { + action_: [{ + type_: 'output', + option: 1 + }, { + type_: 'insert', + option: 'ellipsis' + }], + nextState: '1' + } + }, + '. |* ': { + '*': { + action_: ['output', { + type_: 'insert', + option: 'addition compound' + }], + nextState: '1' + } + }, + 'state of aggregation $': { + '*': { + action_: ['output', 'state of aggregation'], + nextState: '1' + } + }, + '{[(': { + 'a|as|o': { + action_: ['o=', 'output', 'parenthesisLevel++'], + nextState: '2' + }, + '0|1|2|3': { + action_: ['o=', 'output', 'parenthesisLevel++'], + nextState: '2' + }, + '*': { + action_: ['output', 'o=', 'output', 'parenthesisLevel++'], + nextState: '2' + } + }, + ')]}': { + '0|1|2|3|b|p|bp|o': { + action_: ['o=', 'parenthesisLevel--'], + nextState: 'o' + }, + 'a|as|d|D|q|qd|qD|dq': { + action_: ['output', 'o=', 'parenthesisLevel--'], + nextState: 'o' + } + }, + ', ': { + '*': { + action_: ['output', 'comma'], + nextState: '0' + } + }, + '^_': { + // ^ and _ without a sensible argument + '*': {} + }, + '^{(...)}|^($...$)': { + '0|1|2|as': { + action_: 'b=', + nextState: 'b' + }, + 'p': { + action_: 'b=', + nextState: 'bp' + }, + '3|o': { + action_: 'd= kv', + nextState: 'D' + }, + 'q': { + action_: 'd=', + nextState: 'qD' + }, + 'd|D|qd|qD|dq': { + action_: ['output', 'd='], + nextState: 'D' + } + }, + '^a|^\\x{}{}|^\\x{}|^\\x|\'': { + '0|1|2|as': { + action_: 'b=', + nextState: 'b' + }, + 'p': { + action_: 'b=', + nextState: 'bp' + }, + '3|o': { + action_: 'd= kv', + nextState: 'd' + }, + 'q': { + action_: 'd=', + nextState: 'qd' + }, + 'd|qd|D|qD': { + action_: 'd=' + }, + 'dq': { + action_: ['output', 'd='], + nextState: 'd' + } + }, + '_{(state of aggregation)}$': { + 'd|D|q|qd|qD|dq': { + action_: ['output', 'q='], + nextState: 'q' + } + }, + '_{(...)}|_($...$)|_9|_\\x{}{}|_\\x{}|_\\x': { + '0|1|2|as': { + action_: 'p=', + nextState: 'p' + }, + 'b': { + action_: 'p=', + nextState: 'bp' + }, + '3|o': { + action_: 'q=', + nextState: 'q' + }, + 'd|D': { + action_: 'q=', + nextState: 'dq' + }, + 'q|qd|qD|dq': { + action_: ['output', 'q='], + nextState: 'q' + } + }, + '=<>': { + '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { + action_: [{ + type_: 'output', + option: 2 + }, 'bond'], + nextState: '3' + } + }, + '#': { + '0|1|2|3|a|as|o': { + action_: [{ + type_: 'output', + option: 2 + }, { + type_: 'bond', + option: "#" + }], + nextState: '3' + } + }, + '{}': { + '*': { + action_: { + type_: 'output', + option: 1 + }, + nextState: '1' + } + }, + '{...}': { + '0|1|2|3|a|as|b|p|bp': { + action_: 'o=', + nextState: 'o' + }, + 'o|d|D|q|qd|qD|dq': { + action_: ['output', 'o='], + nextState: 'o' + } + }, + '$...$': { + 'a': { + action_: 'a=' + }, + // 2$n$ + '0|1|2|3|as|b|p|bp|o': { + action_: 'o=', + nextState: 'o' + }, + // not 'amount' + 'as|o': { + action_: 'o=' + }, + 'q|d|D|qd|qD|dq': { + action_: ['output', 'o='], + nextState: 'o' + } + }, + '\\bond{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'bond'], + nextState: "3" + } + }, + '\\frac{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 1 + }, 'frac-output'], + nextState: '3' + } + }, + '\\overset{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'overset-output'], + nextState: '3' + } + }, + '\\underset{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'underset-output'], + nextState: '3' + } + }, + '\\underbrace{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'underbrace-output'], + nextState: '3' + } + }, + '\\color{(...)}{(...)}1|\\color(...){(...)}2': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'color-output'], + nextState: '3' + } + }, + '\\color{(...)}0': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'color0-output'] + } + }, + '\\ce{(...)}': { + '*': { + action_: [{ + type_: 'output', + option: 2 + }, 'ce'], + nextState: '3' + } + }, + '\\,': { + '*': { + action_: [{ + type_: 'output', + option: 1 + }, 'copy'], + nextState: '1' + } + }, + '\\x{}{}|\\x{}|\\x': { + '0|1|2|3|a|as|b|p|bp|o|c0': { + action_: ['o=', 'output'], + nextState: '3' + }, + '*': { + action_: ['output', 'o=', 'output'], + nextState: '3' + } + }, + 'others': { + '*': { + action_: [{ + type_: 'output', + option: 1 + }, 'copy'], + nextState: '3' + } + }, + 'else2': { + 'a': { + action_: 'a to o', + nextState: 'o', + revisit: true + }, + 'as': { + action_: ['output', 'sb=true'], + nextState: '1', + revisit: true + }, + 'r|rt|rd|rdt|rdq': { + action_: ['output'], + nextState: '0', + revisit: true + }, + '*': { + action_: ['output', 'copy'], + nextState: '3' + } + } + }), + actions: { + 'o after d': function oAfterD(buffer, m) { + var ret; + + if ((buffer.d || "").match(/^[0-9]+$/)) { + var tmp = buffer.d; + buffer.d = undefined; + ret = this['output'](buffer); + buffer.b = tmp; + } else { + ret = this['output'](buffer); + } + + mhchemParser.actions['o='](buffer, m); + return ret; + }, + 'd= kv': function dKv(buffer, m) { + buffer.d = m; + buffer.dType = 'kv'; + }, + 'charge or bond': function chargeOrBond(buffer, m) { + if (buffer['beginsWithBond']) { + /** @type {ParserOutput[]} */ + var ret = []; + mhchemParser.concatArray(ret, this['output'](buffer)); + mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); + return ret; + } else { + buffer.d = m; + } + }, + '- after o/d': function afterOD(buffer, m, isAfterD) { + var c1 = mhchemParser.patterns.match_('orbital', buffer.o || ""); + var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || ""); + var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || ""); + var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || ""); + var hyphenFollows = m === "-" && (c1 && c1.remainder === "" || c2 || c3 || c4); + + if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) { + buffer.o = '$' + buffer.o + '$'; + } + /** @type {ParserOutput[]} */ + + + var ret = []; + + if (hyphenFollows) { + mhchemParser.concatArray(ret, this['output'](buffer)); + ret.push({ + type_: 'hyphen' + }); + } else { + c1 = mhchemParser.patterns.match_('digits', buffer.d || ""); + + if (isAfterD && c1 && c1.remainder === '') { + mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m)); + mhchemParser.concatArray(ret, this['output'](buffer)); + } else { + mhchemParser.concatArray(ret, this['output'](buffer)); + mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, "-")); + } + } + + return ret; + }, + 'a to o': function aToO(buffer) { + buffer.o = buffer.a; + buffer.a = undefined; + }, + 'sb=true': function sbTrue(buffer) { + buffer.sb = true; + }, + 'sb=false': function sbFalse(buffer) { + buffer.sb = false; + }, + 'beginsWithBond=true': function beginsWithBondTrue(buffer) { + buffer['beginsWithBond'] = true; + }, + 'beginsWithBond=false': function beginsWithBondFalse(buffer) { + buffer['beginsWithBond'] = false; + }, + 'parenthesisLevel++': function parenthesisLevel(buffer) { + buffer['parenthesisLevel']++; + }, + 'parenthesisLevel--': function parenthesisLevel(buffer) { + buffer['parenthesisLevel']--; + }, + 'state of aggregation': function stateOfAggregation(buffer, m) { + return { + type_: 'state of aggregation', + p1: mhchemParser.go(m, 'o') + }; + }, + 'comma': function comma(buffer, m) { + var a = m.replace(/\s*$/, ''); + var withSpace = a !== m; + + if (withSpace && buffer['parenthesisLevel'] === 0) { + return { + type_: 'comma enumeration L', + p1: a + }; + } else { + return { + type_: 'comma enumeration M', + p1: a + }; + } + }, + 'output': function output(buffer, m, entityFollows) { + // entityFollows: + // undefined = if we have nothing else to output, also ignore the just read space (buffer.sb) + // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1) + // 2 = 1 + the entity can have an amount, so output a\, instead of converting it to o (can only apply to states a|as) + + /** @type {ParserOutput | ParserOutput[]} */ + var ret; + + if (!buffer.r) { + ret = []; + + if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) ; else { + if (buffer.sb) { + ret.push({ + type_: 'entitySkip' + }); + } + + if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows !== 2) { + buffer.o = buffer.a; + buffer.a = undefined; + } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) { + buffer.o = buffer.a; + buffer.d = buffer.b; + buffer.q = buffer.p; + buffer.a = buffer.b = buffer.p = undefined; + } else { + if (buffer.o && buffer.dType === 'kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || "")) { + buffer.dType = 'oxidation'; + } else if (buffer.o && buffer.dType === 'kv' && !buffer.q) { + buffer.dType = undefined; + } + } + + ret.push({ + type_: 'chemfive', + a: mhchemParser.go(buffer.a, 'a'), + b: mhchemParser.go(buffer.b, 'bd'), + p: mhchemParser.go(buffer.p, 'pq'), + o: mhchemParser.go(buffer.o, 'o'), + q: mhchemParser.go(buffer.q, 'pq'), + d: mhchemParser.go(buffer.d, buffer.dType === 'oxidation' ? 'oxidation' : 'bd'), + dType: buffer.dType + }); + } + } else { + // r + + /** @type {ParserOutput[]} */ + var rd; + + if (buffer.rdt === 'M') { + rd = mhchemParser.go(buffer.rd, 'tex-math'); + } else if (buffer.rdt === 'T') { + rd = [{ + type_: 'text', + p1: buffer.rd || "" + }]; + } else { + rd = mhchemParser.go(buffer.rd); + } + /** @type {ParserOutput[]} */ + + + var rq; + + if (buffer.rqt === 'M') { + rq = mhchemParser.go(buffer.rq, 'tex-math'); + } else if (buffer.rqt === 'T') { + rq = [{ + type_: 'text', + p1: buffer.rq || "" + }]; + } else { + rq = mhchemParser.go(buffer.rq); + } + + ret = { + type_: 'arrow', + r: buffer.r, + rd: rd, + rq: rq + }; + } + + for (var p in buffer) { + if (p !== 'parenthesisLevel' && p !== 'beginsWithBond') { + delete buffer[p]; + } + } + + return ret; + }, + 'oxidation-output': function oxidationOutput(buffer, m) { + var ret = ["{"]; + mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation')); + ret.push("}"); + return ret; + }, + 'frac-output': function fracOutput(buffer, m) { + return { + type_: 'frac-ce', + p1: mhchemParser.go(m[0]), + p2: mhchemParser.go(m[1]) + }; + }, + 'overset-output': function oversetOutput(buffer, m) { + return { + type_: 'overset', + p1: mhchemParser.go(m[0]), + p2: mhchemParser.go(m[1]) + }; + }, + 'underset-output': function undersetOutput(buffer, m) { + return { + type_: 'underset', + p1: mhchemParser.go(m[0]), + p2: mhchemParser.go(m[1]) + }; + }, + 'underbrace-output': function underbraceOutput(buffer, m) { + return { + type_: 'underbrace', + p1: mhchemParser.go(m[0]), + p2: mhchemParser.go(m[1]) + }; + }, + 'color-output': function colorOutput(buffer, m) { + return { + type_: 'color', + color1: m[0], + color2: mhchemParser.go(m[1]) + }; + }, + 'r=': function r(buffer, m) { + buffer.r = m; + }, + 'rdt=': function rdt(buffer, m) { + buffer.rdt = m; + }, + 'rd=': function rd(buffer, m) { + buffer.rd = m; + }, + 'rqt=': function rqt(buffer, m) { + buffer.rqt = m; + }, + 'rq=': function rq(buffer, m) { + buffer.rq = m; + }, + 'operator': function operator(buffer, m, p1) { + return { + type_: 'operator', + kind_: p1 || m + }; + } + } + }, + 'a': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + '1/2$': { + '0': { + action_: '1/2' + } + }, + 'else': { + '0': { + nextState: '1', + revisit: true + } + }, + '$(...)$': { + '*': { + action_: 'tex-math tight', + nextState: '1' + } + }, + ',': { + '*': { + action_: { + type_: 'insert', + option: 'commaDecimal' + } + } + }, + 'else2': { + '*': { + action_: 'copy' + } + } + }), + actions: {} + }, + 'o': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + '1/2$': { + '0': { + action_: '1/2' + } + }, + 'else': { + '0': { + nextState: '1', + revisit: true + } + }, + 'letters': { + '*': { + action_: 'rm' + } + }, + '\\ca': { + '*': { + action_: { + type_: 'insert', + option: 'circa' + } + } + }, + '\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'copy' + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + '{(...)}': { + '*': { + action_: '{text}' + } + }, + 'else2': { + '*': { + action_: 'copy' + } + } + }), + actions: {} + }, + 'text': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + '{...}': { + '*': { + action_: 'text=' + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + '\\greek': { + '*': { + action_: ['output', 'rm'] + } + }, + '\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: ['output', 'copy'] + } + }, + 'else': { + '*': { + action_: 'text=' + } + } + }), + actions: { + 'output': function output(buffer) { + if (buffer.text_) { + /** @type {ParserOutput} */ + var ret = { + type_: 'text', + p1: buffer.text_ + }; + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + } + }, + 'pq': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + 'state of aggregation $': { + '*': { + action_: 'state of aggregation' + } + }, + 'i$': { + '0': { + nextState: '!f', + revisit: true + } + }, + '(KV letters),': { + '0': { + action_: 'rm', + nextState: '0' + } + }, + 'formula$': { + '0': { + nextState: 'f', + revisit: true + } + }, + '1/2$': { + '0': { + action_: '1/2' + } + }, + 'else': { + '0': { + nextState: '!f', + revisit: true + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + '{(...)}': { + '*': { + action_: 'text' + } + }, + 'a-z': { + 'f': { + action_: 'tex-math' + } + }, + 'letters': { + '*': { + action_: 'rm' + } + }, + '-9.,9': { + '*': { + action_: '9,9' + } + }, + ',': { + '*': { + action_: { + type_: 'insert+p1', + option: 'comma enumeration S' + } + } + }, + '\\color{(...)}{(...)}1|\\color(...){(...)}2': { + '*': { + action_: 'color-output' + } + }, + '\\color{(...)}0': { + '*': { + action_: 'color0-output' + } + }, + '\\ce{(...)}': { + '*': { + action_: 'ce' + } + }, + '\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'copy' + } + }, + 'else2': { + '*': { + action_: 'copy' + } + } + }), + actions: { + 'state of aggregation': function stateOfAggregation(buffer, m) { + return { + type_: 'state of aggregation subscript', + p1: mhchemParser.go(m, 'o') + }; + }, + 'color-output': function colorOutput(buffer, m) { + return { + type_: 'color', + color1: m[0], + color2: mhchemParser.go(m[1], 'pq') + }; + } + } + }, + 'bd': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + 'x$': { + '0': { + nextState: '!f', + revisit: true + } + }, + 'formula$': { + '0': { + nextState: 'f', + revisit: true + } + }, + 'else': { + '0': { + nextState: '!f', + revisit: true + } + }, + '-9.,9 no missing 0': { + '*': { + action_: '9,9' + } + }, + '.': { + '*': { + action_: { + type_: 'insert', + option: 'electron dot' + } + } + }, + 'a-z': { + 'f': { + action_: 'tex-math' + } + }, + 'x': { + '*': { + action_: { + type_: 'insert', + option: 'KV x' + } + } + }, + 'letters': { + '*': { + action_: 'rm' + } + }, + '\'': { + '*': { + action_: { + type_: 'insert', + option: 'prime' + } + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + '{(...)}': { + '*': { + action_: 'text' + } + }, + '\\color{(...)}{(...)}1|\\color(...){(...)}2': { + '*': { + action_: 'color-output' + } + }, + '\\color{(...)}0': { + '*': { + action_: 'color0-output' + } + }, + '\\ce{(...)}': { + '*': { + action_: 'ce' + } + }, + '\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'copy' + } + }, + 'else2': { + '*': { + action_: 'copy' + } + } + }), + actions: { + 'color-output': function colorOutput(buffer, m) { + return { + type_: 'color', + color1: m[0], + color2: mhchemParser.go(m[1], 'bd') + }; + } + } + }, + 'oxidation': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + 'roman numeral': { + '*': { + action_: 'roman-numeral' + } + }, + '${(...)}$|$(...)$': { + '*': { + action_: 'tex-math' + } + }, + 'else': { + '*': { + action_: 'copy' + } + } + }), + actions: { + 'roman-numeral': function romanNumeral(buffer, m) { + return { + type_: 'roman numeral', + p1: m || "" + }; + } + } + }, + 'tex-math': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + '\\ce{(...)}': { + '*': { + action_: ['output', 'ce'] + } + }, + '{...}|\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'o=' + } + }, + 'else': { + '*': { + action_: 'o=' + } + } + }), + actions: { + 'output': function output(buffer) { + if (buffer.o) { + /** @type {ParserOutput} */ + var ret = { + type_: 'tex-math', + p1: buffer.o + }; + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + } + }, + 'tex-math tight': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + '\\ce{(...)}': { + '*': { + action_: ['output', 'ce'] + } + }, + '{...}|\\,|\\x{}{}|\\x{}|\\x': { + '*': { + action_: 'o=' + } + }, + '-|+': { + '*': { + action_: 'tight operator' + } + }, + 'else': { + '*': { + action_: 'o=' + } + } + }), + actions: { + 'tight operator': function tightOperator(buffer, m) { + buffer.o = (buffer.o || "") + "{" + m + "}"; + }, + 'output': function output(buffer) { + if (buffer.o) { + /** @type {ParserOutput} */ + var ret = { + type_: 'tex-math', + p1: buffer.o + }; + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + } + }, + '9,9': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': {} + }, + ',': { + '*': { + action_: 'comma' + } + }, + 'else': { + '*': { + action_: 'copy' + } + } + }), + actions: { + 'comma': function comma() { + return { + type_: 'commaDecimal' + }; + } + } + }, + //#endregion + // + // \pu state machines + // + //#region pu + 'pu': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + 'space$': { + '*': { + action_: ['output', 'space'] + } + }, + '{[(|)]}': { + '0|a': { + action_: 'copy' + } + }, + '(-)(9)^(-9)': { + '0': { + action_: 'number^', + nextState: 'a' + } + }, + '(-)(9.,9)(e)(99)': { + '0': { + action_: 'enumber', + nextState: 'a' + } + }, + 'space': { + '0|a': {} + }, + 'pm-operator': { + '0|a': { + action_: { + type_: 'operator', + option: '\\pm' + }, + nextState: '0' + } + }, + 'operator': { + '0|a': { + action_: 'copy', + nextState: '0' + } + }, + '//': { + 'd': { + action_: 'o=', + nextState: '/' + } + }, + '/': { + 'd': { + action_: 'o=', + nextState: '/' + } + }, + '{...}|else': { + '0|d': { + action_: 'd=', + nextState: 'd' + }, + 'a': { + action_: ['space', 'd='], + nextState: 'd' + }, + '/|q': { + action_: 'q=', + nextState: 'q' + } + } + }), + actions: { + 'enumber': function enumber(buffer, m) { + /** @type {ParserOutput[]} */ + var ret = []; + + if (m[0] === "+-" || m[0] === "+/-") { + ret.push("\\pm "); + } else if (m[0]) { + ret.push(m[0]); + } + + if (m[1]) { + mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); + + if (m[2]) { + if (m[2].match(/[,.]/)) { + mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9')); + } else { + ret.push(m[2]); + } + } + + m[3] = m[4] || m[3]; + + if (m[3]) { + m[3] = m[3].trim(); + + if (m[3] === "e" || m[3].substr(0, 1) === "*") { + ret.push({ + type_: 'cdot' + }); + } else { + ret.push({ + type_: 'times' + }); + } + } + } + + if (m[3]) { + ret.push("10^{" + m[5] + "}"); + } + + return ret; + }, + 'number^': function number(buffer, m) { + /** @type {ParserOutput[]} */ + var ret = []; + + if (m[0] === "+-" || m[0] === "+/-") { + ret.push("\\pm "); + } else if (m[0]) { + ret.push(m[0]); + } + + mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9')); + ret.push("^{" + m[2] + "}"); + return ret; + }, + 'operator': function operator(buffer, m, p1) { + return { + type_: 'operator', + kind_: p1 || m + }; + }, + 'space': function space() { + return { + type_: 'pu-space-1' + }; + }, + 'output': function output(buffer) { + /** @type {ParserOutput | ParserOutput[]} */ + var ret; + var md = mhchemParser.patterns.match_('{(...)}', buffer.d || ""); + + if (md && md.remainder === '') { + buffer.d = md.match_; + } + + var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || ""); + + if (mq && mq.remainder === '') { + buffer.q = mq.match_; + } + + if (buffer.d) { + buffer.d = buffer.d.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); + buffer.d = buffer.d.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); + } + + if (buffer.q) { + // fraction + buffer.q = buffer.q.replace(/\u00B0C|\^oC|\^{o}C/g, "{}^{\\circ}C"); + buffer.q = buffer.q.replace(/\u00B0F|\^oF|\^{o}F/g, "{}^{\\circ}F"); + var b5 = { + d: mhchemParser.go(buffer.d, 'pu'), + q: mhchemParser.go(buffer.q, 'pu') + }; + + if (buffer.o === '//') { + ret = { + type_: 'pu-frac', + p1: b5.d, + p2: b5.q + }; + } else { + ret = b5.d; + + if (b5.d.length > 1 || b5.q.length > 1) { + ret.push({ + type_: ' / ' + }); + } else { + ret.push({ + type_: '/' + }); + } + + mhchemParser.concatArray(ret, b5.q); + } + } else { + // no fraction + ret = mhchemParser.go(buffer.d, 'pu-2'); + } + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + }, + 'pu-2': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '*': { + action_: 'output' + } + }, + '*': { + '*': { + action_: ['output', 'cdot'], + nextState: '0' + } + }, + '\\x': { + '*': { + action_: 'rm=' + } + }, + 'space': { + '*': { + action_: ['output', 'space'], + nextState: '0' + } + }, + '^{(...)}|^(-1)': { + '1': { + action_: '^(-1)' + } + }, + '-9.,9': { + '0': { + action_: 'rm=', + nextState: '0' + }, + '1': { + action_: '^(-1)', + nextState: '0' + } + }, + '{...}|else': { + '*': { + action_: 'rm=', + nextState: '1' + } + } + }), + actions: { + 'cdot': function cdot() { + return { + type_: 'tight cdot' + }; + }, + '^(-1)': function _(buffer, m) { + buffer.rm += "^{" + m + "}"; + }, + 'space': function space() { + return { + type_: 'pu-space-2' + }; + }, + 'output': function output(buffer) { + /** @type {ParserOutput | ParserOutput[]} */ + var ret = []; + + if (buffer.rm) { + var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || ""); + + if (mrm && mrm.remainder === '') { + ret = mhchemParser.go(mrm.match_, 'pu'); + } else { + ret = { + type_: 'rm', + p1: buffer.rm + }; + } + } + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + }, + 'pu-9,9': { + transitions: mhchemParser.createTransitions({ + 'empty': { + '0': { + action_: 'output-0' + }, + 'o': { + action_: 'output-o' + } + }, + ',': { + '0': { + action_: ['output-0', 'comma'], + nextState: 'o' + } + }, + '.': { + '0': { + action_: ['output-0', 'copy'], + nextState: 'o' + } + }, + 'else': { + '*': { + action_: 'text=' + } + } + }), + actions: { + 'comma': function comma() { + return { + type_: 'commaDecimal' + }; + }, + 'output-0': function output0(buffer) { + /** @type {ParserOutput[]} */ + var ret = []; + buffer.text_ = buffer.text_ || ""; + + if (buffer.text_.length > 4) { + var a = buffer.text_.length % 3; + + if (a === 0) { + a = 3; + } + + for (var i = buffer.text_.length - 3; i > 0; i -= 3) { + ret.push(buffer.text_.substr(i, 3)); + ret.push({ + type_: '1000 separator' + }); + } + + ret.push(buffer.text_.substr(0, a)); + ret.reverse(); + } else { + ret.push(buffer.text_); + } + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + }, + 'output-o': function outputO(buffer) { + /** @type {ParserOutput[]} */ + var ret = []; + buffer.text_ = buffer.text_ || ""; + + if (buffer.text_.length > 4) { + var a = buffer.text_.length - 3; + + for (var i = 0; i < a; i += 3) { + ret.push(buffer.text_.substr(i, 3)); + ret.push({ + type_: '1000 separator' + }); + } + + ret.push(buffer.text_.substr(i)); + } else { + ret.push(buffer.text_); + } + + for (var p in buffer) { + delete buffer[p]; + } + + return ret; + } + } + } //#endregion + +}; // +// texify: Take MhchemParser output and convert it to TeX +// + +/** @type {Texify} */ + +var texify = { + go: function go(input, isInner) { + // (recursive, max 4 levels) + if (!input) { + return ""; + } + + var res = ""; + var cee = false; + + for (var i = 0; i < input.length; i++) { + var inputi = input[i]; + + if (typeof inputi === "string") { + res += inputi; + } else { + res += texify._go2(inputi); + + if (inputi.type_ === '1st-level escape') { + cee = true; + } + } + } + + if (!isInner && !cee && res) { + res = "{" + res + "}"; + } + + return res; + }, + _goInner: function _goInner(input) { + if (!input) { + return input; + } + + return texify.go(input, true); + }, + _go2: function _go2(buf) { + /** @type {undefined | string} */ + var res; + + switch (buf.type_) { + case 'chemfive': + res = ""; + var b5 = { + a: texify._goInner(buf.a), + b: texify._goInner(buf.b), + p: texify._goInner(buf.p), + o: texify._goInner(buf.o), + q: texify._goInner(buf.q), + d: texify._goInner(buf.d) + }; // + // a + // + + if (b5.a) { + if (b5.a.match(/^[+\-]/)) { + b5.a = "{" + b5.a + "}"; + } + + res += b5.a + "\\,"; + } // + // b and p + // + + + if (b5.b || b5.p) { + res += "{\\vphantom{X}}"; + res += "^{\\hphantom{" + (b5.b || "") + "}}_{\\hphantom{" + (b5.p || "") + "}}"; + res += "{\\vphantom{X}}"; + res += "^{\\smash[t]{\\vphantom{2}}\\mathllap{" + (b5.b || "") + "}}"; + res += "_{\\vphantom{2}\\mathllap{\\smash[t]{" + (b5.p || "") + "}}}"; + } // + // o + // + + + if (b5.o) { + if (b5.o.match(/^[+\-]/)) { + b5.o = "{" + b5.o + "}"; + } + + res += b5.o; + } // + // q and d + // + + + if (buf.dType === 'kv') { + if (b5.d || b5.q) { + res += "{\\vphantom{X}}"; + } + + if (b5.d) { + res += "^{" + b5.d + "}"; + } + + if (b5.q) { + res += "_{\\smash[t]{" + b5.q + "}}"; + } + } else if (buf.dType === 'oxidation') { + if (b5.d) { + res += "{\\vphantom{X}}"; + res += "^{" + b5.d + "}"; + } + + if (b5.q) { + res += "{\\vphantom{X}}"; + res += "_{\\smash[t]{" + b5.q + "}}"; + } + } else { + if (b5.q) { + res += "{\\vphantom{X}}"; + res += "_{\\smash[t]{" + b5.q + "}}"; + } + + if (b5.d) { + res += "{\\vphantom{X}}"; + res += "^{" + b5.d + "}"; + } + } + + break; + + case 'rm': + res = "\\mathrm{" + buf.p1 + "}"; + break; + + case 'text': + if (buf.p1.match(/[\^_]/)) { + buf.p1 = buf.p1.replace(" ", "~").replace("-", "\\text{-}"); + res = "\\mathrm{" + buf.p1 + "}"; + } else { + res = "\\text{" + buf.p1 + "}"; + } + + break; + + case 'roman numeral': + res = "\\mathrm{" + buf.p1 + "}"; + break; + + case 'state of aggregation': + res = "\\mskip2mu " + texify._goInner(buf.p1); + break; + + case 'state of aggregation subscript': + res = "\\mskip1mu " + texify._goInner(buf.p1); + break; + + case 'bond': + res = texify._getBond(buf.kind_); + + if (!res) { + throw ["MhchemErrorBond", "mhchem Error. Unknown bond type (" + buf.kind_ + ")"]; + } + + break; + + case 'frac': + var c = "\\frac{" + buf.p1 + "}{" + buf.p2 + "}"; + res = "\\mathchoice{\\textstyle" + c + "}{" + c + "}{" + c + "}{" + c + "}"; + break; + + case 'pu-frac': + var d = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; + res = "\\mathchoice{\\textstyle" + d + "}{" + d + "}{" + d + "}{" + d + "}"; + break; + + case 'tex-math': + res = buf.p1 + " "; + break; + + case 'frac-ce': + res = "\\frac{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; + break; + + case 'overset': + res = "\\overset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; + break; + + case 'underset': + res = "\\underset{" + texify._goInner(buf.p1) + "}{" + texify._goInner(buf.p2) + "}"; + break; + + case 'underbrace': + res = "\\underbrace{" + texify._goInner(buf.p1) + "}_{" + texify._goInner(buf.p2) + "}"; + break; + + case 'color': + res = "{\\color{" + buf.color1 + "}{" + texify._goInner(buf.color2) + "}}"; + break; + + case 'color0': + res = "\\color{" + buf.color + "}"; + break; + + case 'arrow': + var b6 = { + rd: texify._goInner(buf.rd), + rq: texify._goInner(buf.rq) + }; + + var arrow = "\\x" + texify._getArrow(buf.r); + + if (b6.rq) { + arrow += "[{" + b6.rq + "}]"; + } + + if (b6.rd) { + arrow += "{" + b6.rd + "}"; + } else { + arrow += "{}"; + } + + res = arrow; + break; + + case 'operator': + res = texify._getOperator(buf.kind_); + break; + + case '1st-level escape': + res = buf.p1 + " "; // &, \\\\, \\hlin + + break; + + case 'space': + res = " "; + break; + + case 'entitySkip': + res = "~"; + break; + + case 'pu-space-1': + res = "~"; + break; + + case 'pu-space-2': + res = "\\mkern3mu "; + break; + + case '1000 separator': + res = "\\mkern2mu "; + break; + + case 'commaDecimal': + res = "{,}"; + break; + + case 'comma enumeration L': + res = "{" + buf.p1 + "}\\mkern6mu "; + break; + + case 'comma enumeration M': + res = "{" + buf.p1 + "}\\mkern3mu "; + break; + + case 'comma enumeration S': + res = "{" + buf.p1 + "}\\mkern1mu "; + break; + + case 'hyphen': + res = "\\text{-}"; + break; + + case 'addition compound': + res = "\\,{\\cdot}\\,"; + break; + + case 'electron dot': + res = "\\mkern1mu \\bullet\\mkern1mu "; + break; + + case 'KV x': + res = "{\\times}"; + break; + + case 'prime': + res = "\\prime "; + break; + + case 'cdot': + res = "\\cdot "; + break; + + case 'tight cdot': + res = "\\mkern1mu{\\cdot}\\mkern1mu "; + break; + + case 'times': + res = "\\times "; + break; + + case 'circa': + res = "{\\sim}"; + break; + + case '^': + res = "uparrow"; + break; + + case 'v': + res = "downarrow"; + break; + + case 'ellipsis': + res = "\\ldots "; + break; + + case '/': + res = "/"; + break; + + case ' / ': + res = "\\,/\\,"; + break; + + default: + throw ["MhchemBugT", "mhchem bug T. Please report."]; + // Missing texify rule or unknown MhchemParser output + } + return res; + }, + _getArrow: function _getArrow(a) { + switch (a) { + case "->": + return "rightarrow"; + + case "\u2192": + return "rightarrow"; + + case "\u27F6": + return "rightarrow"; + + case "<-": + return "leftarrow"; + + case "<->": + return "leftrightarrow"; + + case "<-->": + return "rightleftarrows"; + + case "<=>": + return "rightleftharpoons"; + + case "\u21CC": + return "rightleftharpoons"; + + case "<=>>": + return "rightequilibrium"; + + case "<<=>": + return "leftequilibrium"; + + default: + throw ["MhchemBugT", "mhchem bug T. Please report."]; + } + }, + _getBond: function _getBond(a) { + switch (a) { + case "-": + return "{-}"; + + case "1": + return "{-}"; + + case "=": + return "{=}"; + + case "2": + return "{=}"; + + case "#": + return "{\\equiv}"; + + case "3": + return "{\\equiv}"; + + case "~": + return "{\\tripledash}"; + + case "~-": + return "{\\mathrlap{\\raisebox{-.1em}{$-$}}\\raisebox{.1em}{$\\tripledash$}}"; + + case "~=": + return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}"; + + case "~--": + return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$\\tripledash$}}-}"; + + case "-~-": + return "{\\mathrlap{\\raisebox{-.2em}{$-$}}\\mathrlap{\\raisebox{.2em}{$-$}}\\tripledash}"; + + case "...": + return "{{\\cdot}{\\cdot}{\\cdot}}"; + + case "....": + return "{{\\cdot}{\\cdot}{\\cdot}{\\cdot}}"; + + case "->": + return "{\\rightarrow}"; + + case "<-": + return "{\\leftarrow}"; + + case "<": + return "{<}"; + + case ">": + return "{>}"; + + default: + throw ["MhchemBugT", "mhchem bug T. Please report."]; + } + }, + _getOperator: function _getOperator(a) { + switch (a) { + case "+": + return " {}+{} "; + + case "-": + return " {}-{} "; + + case "=": + return " {}={} "; + + case "<": + return " {}<{} "; + + case ">": + return " {}>{} "; + + case "<<": + return " {}\\ll{} "; + + case ">>": + return " {}\\gg{} "; + + case "\\pm": + return " {}\\pm{} "; + + case "\\approx": + return " {}\\approx{} "; + + case "$\\approx$": + return " {}\\approx{} "; + + case "v": + return " \\downarrow{} "; + + case "(v)": + return " \\downarrow{} "; + + case "^": + return " \\uparrow{} "; + + case "(^)": + return " \\uparrow{} "; + + default: + throw ["MhchemBugT", "mhchem bug T. Please report."]; + } + } +}; // diff --git a/katex/contrib/render-a11y-string.js b/katex/contrib/render-a11y-string.js new file mode 100644 index 0000000..2b73aa7 --- /dev/null +++ b/katex/contrib/render-a11y-string.js @@ -0,0 +1,875 @@ +(function webpackUniversalModuleDefinition(root, factory) { + if(typeof exports === 'object' && typeof module === 'object') + module.exports = factory(require("katex")); + else if(typeof define === 'function' && define.amd) + define(["katex"], factory); + else { + var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]); + for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; + } +})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__974__) { +return /******/ (function() { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 974: +/***/ (function(module) { + +module.exports = __WEBPACK_EXTERNAL_MODULE__974__; + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ !function() { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function() { return module['default']; } : +/******/ function() { return module; }; +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ !function() { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = function(exports, definition) { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ }(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ !function() { +/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } +/******/ }(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +!function() { +/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(974); +/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); +/** + * renderA11yString returns a readable string. + * + * In some cases the string will have the proper semantic math + * meaning,: + * renderA11yString("\\frac{1}{2}"") + * -> "start fraction, 1, divided by, 2, end fraction" + * + * However, other cases do not: + * renderA11yString("f(x) = x^2") + * -> "f, left parenthesis, x, right parenthesis, equals, x, squared" + * + * The commas in the string aim to increase ease of understanding + * when read by a screenreader. + */ +// NOTE: since we're importing types here these files won't actually be +// included in the build. +// $FlowIgnore: we import the types directly anyways + +var stringMap = { + "(": "left parenthesis", + ")": "right parenthesis", + "[": "open bracket", + "]": "close bracket", + "\\{": "left brace", + "\\}": "right brace", + "\\lvert": "open vertical bar", + "\\rvert": "close vertical bar", + "|": "vertical bar", + "\\uparrow": "up arrow", + "\\Uparrow": "up arrow", + "\\downarrow": "down arrow", + "\\Downarrow": "down arrow", + "\\updownarrow": "up down arrow", + "\\leftarrow": "left arrow", + "\\Leftarrow": "left arrow", + "\\rightarrow": "right arrow", + "\\Rightarrow": "right arrow", + "\\langle": "open angle", + "\\rangle": "close angle", + "\\lfloor": "open floor", + "\\rfloor": "close floor", + "\\int": "integral", + "\\intop": "integral", + "\\lim": "limit", + "\\ln": "natural log", + "\\log": "log", + "\\sin": "sine", + "\\cos": "cosine", + "\\tan": "tangent", + "\\cot": "cotangent", + "\\sum": "sum", + "/": "slash", + ",": "comma", + ".": "point", + "-": "negative", + "+": "plus", + "~": "tilde", + ":": "colon", + "?": "question mark", + "'": "apostrophe", + "\\%": "percent", + " ": "space", + "\\ ": "space", + "\\$": "dollar sign", + "\\angle": "angle", + "\\degree": "degree", + "\\circ": "circle", + "\\vec": "vector", + "\\triangle": "triangle", + "\\pi": "pi", + "\\prime": "prime", + "\\infty": "infinity", + "\\alpha": "alpha", + "\\beta": "beta", + "\\gamma": "gamma", + "\\omega": "omega", + "\\theta": "theta", + "\\sigma": "sigma", + "\\lambda": "lambda", + "\\tau": "tau", + "\\Delta": "delta", + "\\delta": "delta", + "\\mu": "mu", + "\\rho": "rho", + "\\nabla": "del", + "\\ell": "ell", + "\\ldots": "dots", + // TODO: add entries for all accents + "\\hat": "hat", + "\\acute": "acute" +}; +var powerMap = { + "prime": "prime", + "degree": "degrees", + "circle": "degrees", + "2": "squared", + "3": "cubed" +}; +var openMap = { + "|": "open vertical bar", + ".": "" +}; +var closeMap = { + "|": "close vertical bar", + ".": "" +}; +var binMap = { + "+": "plus", + "-": "minus", + "\\pm": "plus minus", + "\\cdot": "dot", + "*": "times", + "/": "divided by", + "\\times": "times", + "\\div": "divided by", + "\\circ": "circle", + "\\bullet": "bullet" +}; +var relMap = { + "=": "equals", + "\\approx": "approximately equals", + "≠": "does not equal", + "\\geq": "is greater than or equal to", + "\\ge": "is greater than or equal to", + "\\leq": "is less than or equal to", + "\\le": "is less than or equal to", + ">": "is greater than", + "<": "is less than", + "\\leftarrow": "left arrow", + "\\Leftarrow": "left arrow", + "\\rightarrow": "right arrow", + "\\Rightarrow": "right arrow", + ":": "colon" +}; +var accentUnderMap = { + "\\underleftarrow": "left arrow", + "\\underrightarrow": "right arrow", + "\\underleftrightarrow": "left-right arrow", + "\\undergroup": "group", + "\\underlinesegment": "line segment", + "\\utilde": "tilde" +}; + +var buildString = function buildString(str, type, a11yStrings) { + if (!str) { + return; + } + + var ret; + + if (type === "open") { + ret = str in openMap ? openMap[str] : stringMap[str] || str; + } else if (type === "close") { + ret = str in closeMap ? closeMap[str] : stringMap[str] || str; + } else if (type === "bin") { + ret = binMap[str] || str; + } else if (type === "rel") { + ret = relMap[str] || str; + } else { + ret = stringMap[str] || str; + } // If the text to add is a number and there is already a string + // in the list and the last string is a number then we should + // combine them into a single number + + + if (/^\d+$/.test(ret) && a11yStrings.length > 0 && // TODO(kevinb): check that the last item in a11yStrings is a string + // I think we might be able to drop the nested arrays, which would make + // this easier to type + // $FlowFixMe + /^\d+$/.test(a11yStrings[a11yStrings.length - 1])) { + a11yStrings[a11yStrings.length - 1] += ret; + } else if (ret) { + a11yStrings.push(ret); + } +}; + +var buildRegion = function buildRegion(a11yStrings, callback) { + var regionStrings = []; + a11yStrings.push(regionStrings); + callback(regionStrings); +}; + +var handleObject = function handleObject(tree, a11yStrings, atomType) { + // Everything else is assumed to be an object... + switch (tree.type) { + case "accent": + { + buildRegion(a11yStrings, function (a11yStrings) { + buildA11yStrings(tree.base, a11yStrings, atomType); + a11yStrings.push("with"); + buildString(tree.label, "normal", a11yStrings); + a11yStrings.push("on top"); + }); + break; + } + + case "accentUnder": + { + buildRegion(a11yStrings, function (a11yStrings) { + buildA11yStrings(tree.base, a11yStrings, atomType); + a11yStrings.push("with"); + buildString(accentUnderMap[tree.label], "normal", a11yStrings); + a11yStrings.push("underneath"); + }); + break; + } + + case "accent-token": + { + // Used internally by accent symbols. + break; + } + + case "atom": + { + var text = tree.text; + + switch (tree.family) { + case "bin": + { + buildString(text, "bin", a11yStrings); + break; + } + + case "close": + { + buildString(text, "close", a11yStrings); + break; + } + // TODO(kevinb): figure out what should be done for inner + + case "inner": + { + buildString(tree.text, "inner", a11yStrings); + break; + } + + case "open": + { + buildString(text, "open", a11yStrings); + break; + } + + case "punct": + { + buildString(text, "punct", a11yStrings); + break; + } + + case "rel": + { + buildString(text, "rel", a11yStrings); + break; + } + + default: + { + tree.family; + throw new Error("\"" + tree.family + "\" is not a valid atom type"); + } + } + + break; + } + + case "color": + { + var color = tree.color.replace(/katex-/, ""); + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start color " + color); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end color " + color); + }); + break; + } + + case "color-token": + { + // Used by \color, \colorbox, and \fcolorbox but not directly rendered. + // It's a leaf node and has no children so just break. + break; + } + + case "delimsizing": + { + if (tree.delim && tree.delim !== ".") { + buildString(tree.delim, "normal", a11yStrings); + } + + break; + } + + case "genfrac": + { + buildRegion(a11yStrings, function (regionStrings) { + // genfrac can have unbalanced delimiters + var leftDelim = tree.leftDelim, + rightDelim = tree.rightDelim; // NOTE: Not sure if this is a safe assumption + // hasBarLine true -> fraction, false -> binomial + + if (tree.hasBarLine) { + regionStrings.push("start fraction"); + leftDelim && buildString(leftDelim, "open", regionStrings); + buildA11yStrings(tree.numer, regionStrings, atomType); + regionStrings.push("divided by"); + buildA11yStrings(tree.denom, regionStrings, atomType); + rightDelim && buildString(rightDelim, "close", regionStrings); + regionStrings.push("end fraction"); + } else { + regionStrings.push("start binomial"); + leftDelim && buildString(leftDelim, "open", regionStrings); + buildA11yStrings(tree.numer, regionStrings, atomType); + regionStrings.push("over"); + buildA11yStrings(tree.denom, regionStrings, atomType); + rightDelim && buildString(rightDelim, "close", regionStrings); + regionStrings.push("end binomial"); + } + }); + break; + } + + case "hbox": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "kern": + { + // No op: we don't attempt to present kerning information + // to the screen reader. + break; + } + + case "leftright": + { + buildRegion(a11yStrings, function (regionStrings) { + buildString(tree.left, "open", regionStrings); + buildA11yStrings(tree.body, regionStrings, atomType); + buildString(tree.right, "close", regionStrings); + }); + break; + } + + case "leftright-right": + { + // TODO: double check that this is a no-op + break; + } + + case "lap": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "mathord": + { + buildString(tree.text, "normal", a11yStrings); + break; + } + + case "op": + { + var body = tree.body, + name = tree.name; + + if (body) { + buildA11yStrings(body, a11yStrings, atomType); + } else if (name) { + buildString(name, "normal", a11yStrings); + } + + break; + } + + case "op-token": + { + // Used internally by operator symbols. + buildString(tree.text, atomType, a11yStrings); + break; + } + + case "ordgroup": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "overline": + { + buildRegion(a11yStrings, function (a11yStrings) { + a11yStrings.push("start overline"); + buildA11yStrings(tree.body, a11yStrings, atomType); + a11yStrings.push("end overline"); + }); + break; + } + + case "phantom": + { + a11yStrings.push("empty space"); + break; + } + + case "raisebox": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "rule": + { + a11yStrings.push("rectangle"); + break; + } + + case "sizing": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "spacing": + { + a11yStrings.push("space"); + break; + } + + case "styling": + { + // We ignore the styling and just pass through the contents + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "sqrt": + { + buildRegion(a11yStrings, function (regionStrings) { + var body = tree.body, + index = tree.index; + + if (index) { + var indexString = flatten(buildA11yStrings(index, [], atomType)).join(","); + + if (indexString === "3") { + regionStrings.push("cube root of"); + buildA11yStrings(body, regionStrings, atomType); + regionStrings.push("end cube root"); + return; + } + + regionStrings.push("root"); + regionStrings.push("start index"); + buildA11yStrings(index, regionStrings, atomType); + regionStrings.push("end index"); + return; + } + + regionStrings.push("square root of"); + buildA11yStrings(body, regionStrings, atomType); + regionStrings.push("end square root"); + }); + break; + } + + case "supsub": + { + var base = tree.base, + sub = tree.sub, + sup = tree.sup; + var isLog = false; + + if (base) { + buildA11yStrings(base, a11yStrings, atomType); + isLog = base.type === "op" && base.name === "\\log"; + } + + if (sub) { + var regionName = isLog ? "base" : "subscript"; + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start " + regionName); + buildA11yStrings(sub, regionStrings, atomType); + regionStrings.push("end " + regionName); + }); + } + + if (sup) { + buildRegion(a11yStrings, function (regionStrings) { + var supString = flatten(buildA11yStrings(sup, [], atomType)).join(","); + + if (supString in powerMap) { + regionStrings.push(powerMap[supString]); + return; + } + + regionStrings.push("start superscript"); + buildA11yStrings(sup, regionStrings, atomType); + regionStrings.push("end superscript"); + }); + } + + break; + } + + case "text": + { + // TODO: handle other fonts + if (tree.font === "\\textbf") { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start bold text"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end bold text"); + }); + break; + } + + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start text"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end text"); + }); + break; + } + + case "textord": + { + buildString(tree.text, atomType, a11yStrings); + break; + } + + case "smash": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "enclose": + { + // TODO: create a map for these. + // TODO: differentiate between a body with a single atom, e.g. + // "cancel a" instead of "start cancel, a, end cancel" + if (/cancel/.test(tree.label)) { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start cancel"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end cancel"); + }); + break; + } else if (/box/.test(tree.label)) { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start box"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end box"); + }); + break; + } else if (/sout/.test(tree.label)) { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start strikeout"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end strikeout"); + }); + break; + } else if (/phase/.test(tree.label)) { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start phase angle"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end phase angle"); + }); + break; + } + + throw new Error("KaTeX-a11y: enclose node with " + tree.label + " not supported yet"); + } + + case "vcenter": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "vphantom": + { + throw new Error("KaTeX-a11y: vphantom not implemented yet"); + } + + case "hphantom": + { + throw new Error("KaTeX-a11y: hphantom not implemented yet"); + } + + case "operatorname": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "array": + { + throw new Error("KaTeX-a11y: array not implemented yet"); + } + + case "raw": + { + throw new Error("KaTeX-a11y: raw not implemented yet"); + } + + case "size": + { + // Although there are nodes of type "size" in the parse tree, they have + // no semantic meaning and should be ignored. + break; + } + + case "url": + { + throw new Error("KaTeX-a11y: url not implemented yet"); + } + + case "tag": + { + throw new Error("KaTeX-a11y: tag not implemented yet"); + } + + case "verb": + { + buildString("start verbatim", "normal", a11yStrings); + buildString(tree.body, "normal", a11yStrings); + buildString("end verbatim", "normal", a11yStrings); + break; + } + + case "environment": + { + throw new Error("KaTeX-a11y: environment not implemented yet"); + } + + case "horizBrace": + { + buildString("start " + tree.label.slice(1), "normal", a11yStrings); + buildA11yStrings(tree.base, a11yStrings, atomType); + buildString("end " + tree.label.slice(1), "normal", a11yStrings); + break; + } + + case "infix": + { + // All infix nodes are replace with other nodes. + break; + } + + case "includegraphics": + { + throw new Error("KaTeX-a11y: includegraphics not implemented yet"); + } + + case "font": + { + // TODO: callout the start/end of specific fonts + // TODO: map \BBb{N} to "the naturals" or something like that + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "href": + { + throw new Error("KaTeX-a11y: href not implemented yet"); + } + + case "cr": + { + // This is used by environments. + throw new Error("KaTeX-a11y: cr not implemented yet"); + } + + case "underline": + { + buildRegion(a11yStrings, function (a11yStrings) { + a11yStrings.push("start underline"); + buildA11yStrings(tree.body, a11yStrings, atomType); + a11yStrings.push("end underline"); + }); + break; + } + + case "xArrow": + { + throw new Error("KaTeX-a11y: xArrow not implemented yet"); + } + + case "cdlabel": + { + throw new Error("KaTeX-a11y: cdlabel not implemented yet"); + } + + case "cdlabelparent": + { + throw new Error("KaTeX-a11y: cdlabelparent not implemented yet"); + } + + case "mclass": + { + // \neq and \ne are macros so we let "htmlmathml" render the mathmal + // side of things and extract the text from that. + var _atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass + + + buildA11yStrings(tree.body, a11yStrings, _atomType); + break; + } + + case "mathchoice": + { + // TODO: track which which style we're using, e.g. dispaly, text, etc. + // default to text style if even that may not be the correct style + buildA11yStrings(tree.text, a11yStrings, atomType); + break; + } + + case "htmlmathml": + { + buildA11yStrings(tree.mathml, a11yStrings, atomType); + break; + } + + case "middle": + { + buildString(tree.delim, atomType, a11yStrings); + break; + } + + case "internal": + { + // internal nodes are never included in the parse tree + break; + } + + case "html": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + default: + tree.type; + throw new Error("KaTeX a11y un-recognized type: " + tree.type); + } +}; + +var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) { + if (a11yStrings === void 0) { + a11yStrings = []; + } + + if (tree instanceof Array) { + for (var i = 0; i < tree.length; i++) { + buildA11yStrings(tree[i], a11yStrings, atomType); + } + } else { + handleObject(tree, a11yStrings, atomType); + } + + return a11yStrings; +}; + +var flatten = function flatten(array) { + var result = []; + array.forEach(function (item) { + if (item instanceof Array) { + result = result.concat(flatten(item)); + } else { + result.push(item); + } + }); + return result; +}; + +var renderA11yString = function renderA11yString(text, settings) { + var tree = katex__WEBPACK_IMPORTED_MODULE_0___default().__parse(text, settings); + + var a11yStrings = buildA11yStrings(tree, [], "normal"); + return flatten(a11yStrings).join(", "); +}; + +/* harmony default export */ __webpack_exports__["default"] = (renderA11yString); +}(); +__webpack_exports__ = __webpack_exports__.default; +/******/ return __webpack_exports__; +/******/ })() +; +}); \ No newline at end of file diff --git a/katex/contrib/render-a11y-string.min.js b/katex/contrib/render-a11y-string.min.js new file mode 100644 index 0000000..838a4c2 --- /dev/null +++ b/katex/contrib/render-a11y-string.min.js @@ -0,0 +1 @@ +!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("katex"));else if("function"==typeof define&&define.amd)define(["katex"],r);else{var a="object"==typeof exports?r(require("katex")):r(e.katex);for(var t in a)("object"==typeof exports?exports:e)[t]=a[t]}}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var r={974:function(r){r.exports=e}},a={};function t(e){var o=a[e];if(void 0!==o)return o.exports;var n=a[e]={exports:{}};return r[e](n,n.exports,t),n.exports}t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,{a:r}),r},t.d=function(e,r){for(var a in r)t.o(r,a)&&!t.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:r[a]})},t.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)};var o,n,s,i,l,c,u,p,d,b,h,m,f,y,w={};return o=t(974),n=t.n(o),s={"(":"left parenthesis",")":"right parenthesis","[":"open bracket","]":"close bracket","\\{":"left brace","\\}":"right brace","\\lvert":"open vertical bar","\\rvert":"close vertical bar","|":"vertical bar","\\uparrow":"up arrow","\\Uparrow":"up arrow","\\downarrow":"down arrow","\\Downarrow":"down arrow","\\updownarrow":"up down arrow","\\leftarrow":"left arrow","\\Leftarrow":"left arrow","\\rightarrow":"right arrow","\\Rightarrow":"right arrow","\\langle":"open angle","\\rangle":"close angle","\\lfloor":"open floor","\\rfloor":"close floor","\\int":"integral","\\intop":"integral","\\lim":"limit","\\ln":"natural log","\\log":"log","\\sin":"sine","\\cos":"cosine","\\tan":"tangent","\\cot":"cotangent","\\sum":"sum","/":"slash",",":"comma",".":"point","-":"negative","+":"plus","~":"tilde",":":"colon","?":"question mark","'":"apostrophe","\\%":"percent"," ":"space","\\ ":"space","\\$":"dollar sign","\\angle":"angle","\\degree":"degree","\\circ":"circle","\\vec":"vector","\\triangle":"triangle","\\pi":"pi","\\prime":"prime","\\infty":"infinity","\\alpha":"alpha","\\beta":"beta","\\gamma":"gamma","\\omega":"omega","\\theta":"theta","\\sigma":"sigma","\\lambda":"lambda","\\tau":"tau","\\Delta":"delta","\\delta":"delta","\\mu":"mu","\\rho":"rho","\\nabla":"del","\\ell":"ell","\\ldots":"dots","\\hat":"hat","\\acute":"acute"},i={prime:"prime",degree:"degrees",circle:"degrees",2:"squared",3:"cubed"},l={"|":"open vertical bar",".":""},c={"|":"close vertical bar",".":""},u={"+":"plus","-":"minus","\\pm":"plus minus","\\cdot":"dot","*":"times","/":"divided by","\\times":"times","\\div":"divided by","\\circ":"circle","\\bullet":"bullet"},p={"=":"equals","\\approx":"approximately equals","\u2260":"does not equal","\\geq":"is greater than or equal to","\\ge":"is greater than or equal to","\\leq":"is less than or equal to","\\le":"is less than or equal to",">":"is greater than","<":"is less than","\\leftarrow":"left arrow","\\Leftarrow":"left arrow","\\rightarrow":"right arrow","\\Rightarrow":"right arrow",":":"colon"},d={"\\underleftarrow":"left arrow","\\underrightarrow":"right arrow","\\underleftrightarrow":"left-right arrow","\\undergroup":"group","\\underlinesegment":"line segment","\\utilde":"tilde"},b=function(e,r,a){var t;e&&(/^\d+$/.test(t="open"===r?e in l?l[e]:s[e]||e:"close"===r?e in c?c[e]:s[e]||e:"bin"===r?u[e]||e:"rel"===r?p[e]||e:s[e]||e)&&a.length>0&&/^\d+$/.test(a[a.length-1])?a[a.length-1]+=t:t&&a.push(t))},h=function(e,r){var a=[];e.push(a),r(a)},m=function(e,r,a){switch(e.type){case"accent":h(r,(function(r){f(e.base,r,a),r.push("with"),b(e.label,"normal",r),r.push("on top")}));break;case"accentUnder":h(r,(function(r){f(e.base,r,a),r.push("with"),b(d[e.label],"normal",r),r.push("underneath")}));break;case"accent-token":break;case"atom":var t=e.text;switch(e.family){case"bin":b(t,"bin",r);break;case"close":b(t,"close",r);break;case"inner":b(e.text,"inner",r);break;case"open":b(t,"open",r);break;case"punct":b(t,"punct",r);break;case"rel":b(t,"rel",r);break;default:throw e.family,new Error('"'+e.family+'" is not a valid atom type')}break;case"color":var o=e.color.replace(/katex-/,"");h(r,(function(r){r.push("start color "+o),f(e.body,r,a),r.push("end color "+o)}));break;case"color-token":break;case"delimsizing":e.delim&&"."!==e.delim&&b(e.delim,"normal",r);break;case"genfrac":h(r,(function(r){var t=e.leftDelim,o=e.rightDelim;e.hasBarLine?(r.push("start fraction"),t&&b(t,"open",r),f(e.numer,r,a),r.push("divided by"),f(e.denom,r,a),o&&b(o,"close",r),r.push("end fraction")):(r.push("start binomial"),t&&b(t,"open",r),f(e.numer,r,a),r.push("over"),f(e.denom,r,a),o&&b(o,"close",r),r.push("end binomial"))}));break;case"hbox":f(e.body,r,a);break;case"kern":break;case"leftright":h(r,(function(r){b(e.left,"open",r),f(e.body,r,a),b(e.right,"close",r)}));break;case"leftright-right":break;case"lap":f(e.body,r,a);break;case"mathord":b(e.text,"normal",r);break;case"op":var n=e.body,s=e.name;n?f(n,r,a):s&&b(s,"normal",r);break;case"op-token":b(e.text,a,r);break;case"ordgroup":f(e.body,r,a);break;case"overline":h(r,(function(r){r.push("start overline"),f(e.body,r,a),r.push("end overline")}));break;case"phantom":r.push("empty space");break;case"raisebox":f(e.body,r,a);break;case"rule":r.push("rectangle");break;case"sizing":f(e.body,r,a);break;case"spacing":r.push("space");break;case"styling":f(e.body,r,a);break;case"sqrt":h(r,(function(r){var t=e.body,o=e.index;if(o)return"3"===y(f(o,[],a)).join(",")?(r.push("cube root of"),f(t,r,a),void r.push("end cube root")):(r.push("root"),r.push("start index"),f(o,r,a),void r.push("end index"));r.push("square root of"),f(t,r,a),r.push("end square root")}));break;case"supsub":var l=e.base,c=e.sub,u=e.sup,p=!1;if(l&&(f(l,r,a),p="op"===l.type&&"\\log"===l.name),c){var m=p?"base":"subscript";h(r,(function(e){e.push("start "+m),f(c,e,a),e.push("end "+m)}))}u&&h(r,(function(e){var r=y(f(u,[],a)).join(",");r in i?e.push(i[r]):(e.push("start superscript"),f(u,e,a),e.push("end superscript"))}));break;case"text":if("\\textbf"===e.font){h(r,(function(r){r.push("start bold text"),f(e.body,r,a),r.push("end bold text")}));break}h(r,(function(r){r.push("start text"),f(e.body,r,a),r.push("end text")}));break;case"textord":b(e.text,a,r);break;case"smash":f(e.body,r,a);break;case"enclose":if(/cancel/.test(e.label)){h(r,(function(r){r.push("start cancel"),f(e.body,r,a),r.push("end cancel")}));break}if(/box/.test(e.label)){h(r,(function(r){r.push("start box"),f(e.body,r,a),r.push("end box")}));break}if(/sout/.test(e.label)){h(r,(function(r){r.push("start strikeout"),f(e.body,r,a),r.push("end strikeout")}));break}if(/phase/.test(e.label)){h(r,(function(r){r.push("start phase angle"),f(e.body,r,a),r.push("end phase angle")}));break}throw new Error("KaTeX-a11y: enclose node with "+e.label+" not supported yet");case"vcenter":f(e.body,r,a);break;case"vphantom":throw new Error("KaTeX-a11y: vphantom not implemented yet");case"hphantom":throw new Error("KaTeX-a11y: hphantom not implemented yet");case"operatorname":f(e.body,r,a);break;case"array":throw new Error("KaTeX-a11y: array not implemented yet");case"raw":throw new Error("KaTeX-a11y: raw not implemented yet");case"size":break;case"url":throw new Error("KaTeX-a11y: url not implemented yet");case"tag":throw new Error("KaTeX-a11y: tag not implemented yet");case"verb":b("start verbatim","normal",r),b(e.body,"normal",r),b("end verbatim","normal",r);break;case"environment":throw new Error("KaTeX-a11y: environment not implemented yet");case"horizBrace":b("start "+e.label.slice(1),"normal",r),f(e.base,r,a),b("end "+e.label.slice(1),"normal",r);break;case"infix":break;case"includegraphics":throw new Error("KaTeX-a11y: includegraphics not implemented yet");case"font":f(e.body,r,a);break;case"href":throw new Error("KaTeX-a11y: href not implemented yet");case"cr":throw new Error("KaTeX-a11y: cr not implemented yet");case"underline":h(r,(function(r){r.push("start underline"),f(e.body,r,a),r.push("end underline")}));break;case"xArrow":throw new Error("KaTeX-a11y: xArrow not implemented yet");case"cdlabel":throw new Error("KaTeX-a11y: cdlabel not implemented yet");case"cdlabelparent":throw new Error("KaTeX-a11y: cdlabelparent not implemented yet");case"mclass":var w=e.mclass.slice(1);f(e.body,r,w);break;case"mathchoice":f(e.text,r,a);break;case"htmlmathml":f(e.mathml,r,a);break;case"middle":b(e.delim,a,r);break;case"internal":break;case"html":f(e.body,r,a);break;default:throw e.type,new Error("KaTeX a11y un-recognized type: "+e.type)}},f=function e(r,a,t){if(void 0===a&&(a=[]),r instanceof Array)for(var o=0;o "start fraction, 1, divided by, 2, end fraction" + * + * However, other cases do not: + * renderA11yString("f(x) = x^2") + * -> "f, left parenthesis, x, right parenthesis, equals, x, squared" + * + * The commas in the string aim to increase ease of understanding + * when read by a screenreader. + */ +var stringMap = { + "(": "left parenthesis", + ")": "right parenthesis", + "[": "open bracket", + "]": "close bracket", + "\\{": "left brace", + "\\}": "right brace", + "\\lvert": "open vertical bar", + "\\rvert": "close vertical bar", + "|": "vertical bar", + "\\uparrow": "up arrow", + "\\Uparrow": "up arrow", + "\\downarrow": "down arrow", + "\\Downarrow": "down arrow", + "\\updownarrow": "up down arrow", + "\\leftarrow": "left arrow", + "\\Leftarrow": "left arrow", + "\\rightarrow": "right arrow", + "\\Rightarrow": "right arrow", + "\\langle": "open angle", + "\\rangle": "close angle", + "\\lfloor": "open floor", + "\\rfloor": "close floor", + "\\int": "integral", + "\\intop": "integral", + "\\lim": "limit", + "\\ln": "natural log", + "\\log": "log", + "\\sin": "sine", + "\\cos": "cosine", + "\\tan": "tangent", + "\\cot": "cotangent", + "\\sum": "sum", + "/": "slash", + ",": "comma", + ".": "point", + "-": "negative", + "+": "plus", + "~": "tilde", + ":": "colon", + "?": "question mark", + "'": "apostrophe", + "\\%": "percent", + " ": "space", + "\\ ": "space", + "\\$": "dollar sign", + "\\angle": "angle", + "\\degree": "degree", + "\\circ": "circle", + "\\vec": "vector", + "\\triangle": "triangle", + "\\pi": "pi", + "\\prime": "prime", + "\\infty": "infinity", + "\\alpha": "alpha", + "\\beta": "beta", + "\\gamma": "gamma", + "\\omega": "omega", + "\\theta": "theta", + "\\sigma": "sigma", + "\\lambda": "lambda", + "\\tau": "tau", + "\\Delta": "delta", + "\\delta": "delta", + "\\mu": "mu", + "\\rho": "rho", + "\\nabla": "del", + "\\ell": "ell", + "\\ldots": "dots", + // TODO: add entries for all accents + "\\hat": "hat", + "\\acute": "acute" +}; +var powerMap = { + "prime": "prime", + "degree": "degrees", + "circle": "degrees", + "2": "squared", + "3": "cubed" +}; +var openMap = { + "|": "open vertical bar", + ".": "" +}; +var closeMap = { + "|": "close vertical bar", + ".": "" +}; +var binMap = { + "+": "plus", + "-": "minus", + "\\pm": "plus minus", + "\\cdot": "dot", + "*": "times", + "/": "divided by", + "\\times": "times", + "\\div": "divided by", + "\\circ": "circle", + "\\bullet": "bullet" +}; +var relMap = { + "=": "equals", + "\\approx": "approximately equals", + "≠": "does not equal", + "\\geq": "is greater than or equal to", + "\\ge": "is greater than or equal to", + "\\leq": "is less than or equal to", + "\\le": "is less than or equal to", + ">": "is greater than", + "<": "is less than", + "\\leftarrow": "left arrow", + "\\Leftarrow": "left arrow", + "\\rightarrow": "right arrow", + "\\Rightarrow": "right arrow", + ":": "colon" +}; +var accentUnderMap = { + "\\underleftarrow": "left arrow", + "\\underrightarrow": "right arrow", + "\\underleftrightarrow": "left-right arrow", + "\\undergroup": "group", + "\\underlinesegment": "line segment", + "\\utilde": "tilde" +}; + +var buildString = (str, type, a11yStrings) => { + if (!str) { + return; + } + + var ret; + + if (type === "open") { + ret = str in openMap ? openMap[str] : stringMap[str] || str; + } else if (type === "close") { + ret = str in closeMap ? closeMap[str] : stringMap[str] || str; + } else if (type === "bin") { + ret = binMap[str] || str; + } else if (type === "rel") { + ret = relMap[str] || str; + } else { + ret = stringMap[str] || str; + } // If the text to add is a number and there is already a string + // in the list and the last string is a number then we should + // combine them into a single number + + + if (/^\d+$/.test(ret) && a11yStrings.length > 0 && // TODO(kevinb): check that the last item in a11yStrings is a string + // I think we might be able to drop the nested arrays, which would make + // this easier to type + // $FlowFixMe + /^\d+$/.test(a11yStrings[a11yStrings.length - 1])) { + a11yStrings[a11yStrings.length - 1] += ret; + } else if (ret) { + a11yStrings.push(ret); + } +}; + +var buildRegion = (a11yStrings, callback) => { + var regionStrings = []; + a11yStrings.push(regionStrings); + callback(regionStrings); +}; + +var handleObject = (tree, a11yStrings, atomType) => { + // Everything else is assumed to be an object... + switch (tree.type) { + case "accent": + { + buildRegion(a11yStrings, a11yStrings => { + buildA11yStrings(tree.base, a11yStrings, atomType); + a11yStrings.push("with"); + buildString(tree.label, "normal", a11yStrings); + a11yStrings.push("on top"); + }); + break; + } + + case "accentUnder": + { + buildRegion(a11yStrings, a11yStrings => { + buildA11yStrings(tree.base, a11yStrings, atomType); + a11yStrings.push("with"); + buildString(accentUnderMap[tree.label], "normal", a11yStrings); + a11yStrings.push("underneath"); + }); + break; + } + + case "accent-token": + { + // Used internally by accent symbols. + break; + } + + case "atom": + { + var { + text + } = tree; + + switch (tree.family) { + case "bin": + { + buildString(text, "bin", a11yStrings); + break; + } + + case "close": + { + buildString(text, "close", a11yStrings); + break; + } + // TODO(kevinb): figure out what should be done for inner + + case "inner": + { + buildString(tree.text, "inner", a11yStrings); + break; + } + + case "open": + { + buildString(text, "open", a11yStrings); + break; + } + + case "punct": + { + buildString(text, "punct", a11yStrings); + break; + } + + case "rel": + { + buildString(text, "rel", a11yStrings); + break; + } + + default: + { + tree.family; + throw new Error("\"" + tree.family + "\" is not a valid atom type"); + } + } + + break; + } + + case "color": + { + var color = tree.color.replace(/katex-/, ""); + buildRegion(a11yStrings, regionStrings => { + regionStrings.push("start color " + color); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end color " + color); + }); + break; + } + + case "color-token": + { + // Used by \color, \colorbox, and \fcolorbox but not directly rendered. + // It's a leaf node and has no children so just break. + break; + } + + case "delimsizing": + { + if (tree.delim && tree.delim !== ".") { + buildString(tree.delim, "normal", a11yStrings); + } + + break; + } + + case "genfrac": + { + buildRegion(a11yStrings, regionStrings => { + // genfrac can have unbalanced delimiters + var { + leftDelim, + rightDelim + } = tree; // NOTE: Not sure if this is a safe assumption + // hasBarLine true -> fraction, false -> binomial + + if (tree.hasBarLine) { + regionStrings.push("start fraction"); + leftDelim && buildString(leftDelim, "open", regionStrings); + buildA11yStrings(tree.numer, regionStrings, atomType); + regionStrings.push("divided by"); + buildA11yStrings(tree.denom, regionStrings, atomType); + rightDelim && buildString(rightDelim, "close", regionStrings); + regionStrings.push("end fraction"); + } else { + regionStrings.push("start binomial"); + leftDelim && buildString(leftDelim, "open", regionStrings); + buildA11yStrings(tree.numer, regionStrings, atomType); + regionStrings.push("over"); + buildA11yStrings(tree.denom, regionStrings, atomType); + rightDelim && buildString(rightDelim, "close", regionStrings); + regionStrings.push("end binomial"); + } + }); + break; + } + + case "hbox": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "kern": + { + // No op: we don't attempt to present kerning information + // to the screen reader. + break; + } + + case "leftright": + { + buildRegion(a11yStrings, regionStrings => { + buildString(tree.left, "open", regionStrings); + buildA11yStrings(tree.body, regionStrings, atomType); + buildString(tree.right, "close", regionStrings); + }); + break; + } + + case "leftright-right": + { + // TODO: double check that this is a no-op + break; + } + + case "lap": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "mathord": + { + buildString(tree.text, "normal", a11yStrings); + break; + } + + case "op": + { + var { + body, + name + } = tree; + + if (body) { + buildA11yStrings(body, a11yStrings, atomType); + } else if (name) { + buildString(name, "normal", a11yStrings); + } + + break; + } + + case "op-token": + { + // Used internally by operator symbols. + buildString(tree.text, atomType, a11yStrings); + break; + } + + case "ordgroup": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "overline": + { + buildRegion(a11yStrings, function (a11yStrings) { + a11yStrings.push("start overline"); + buildA11yStrings(tree.body, a11yStrings, atomType); + a11yStrings.push("end overline"); + }); + break; + } + + case "phantom": + { + a11yStrings.push("empty space"); + break; + } + + case "raisebox": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "rule": + { + a11yStrings.push("rectangle"); + break; + } + + case "sizing": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "spacing": + { + a11yStrings.push("space"); + break; + } + + case "styling": + { + // We ignore the styling and just pass through the contents + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "sqrt": + { + buildRegion(a11yStrings, regionStrings => { + var { + body, + index + } = tree; + + if (index) { + var indexString = flatten(buildA11yStrings(index, [], atomType)).join(","); + + if (indexString === "3") { + regionStrings.push("cube root of"); + buildA11yStrings(body, regionStrings, atomType); + regionStrings.push("end cube root"); + return; + } + + regionStrings.push("root"); + regionStrings.push("start index"); + buildA11yStrings(index, regionStrings, atomType); + regionStrings.push("end index"); + return; + } + + regionStrings.push("square root of"); + buildA11yStrings(body, regionStrings, atomType); + regionStrings.push("end square root"); + }); + break; + } + + case "supsub": + { + var { + base, + sub, + sup + } = tree; + var isLog = false; + + if (base) { + buildA11yStrings(base, a11yStrings, atomType); + isLog = base.type === "op" && base.name === "\\log"; + } + + if (sub) { + var regionName = isLog ? "base" : "subscript"; + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start " + regionName); + buildA11yStrings(sub, regionStrings, atomType); + regionStrings.push("end " + regionName); + }); + } + + if (sup) { + buildRegion(a11yStrings, function (regionStrings) { + var supString = flatten(buildA11yStrings(sup, [], atomType)).join(","); + + if (supString in powerMap) { + regionStrings.push(powerMap[supString]); + return; + } + + regionStrings.push("start superscript"); + buildA11yStrings(sup, regionStrings, atomType); + regionStrings.push("end superscript"); + }); + } + + break; + } + + case "text": + { + // TODO: handle other fonts + if (tree.font === "\\textbf") { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start bold text"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end bold text"); + }); + break; + } + + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start text"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end text"); + }); + break; + } + + case "textord": + { + buildString(tree.text, atomType, a11yStrings); + break; + } + + case "smash": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "enclose": + { + // TODO: create a map for these. + // TODO: differentiate between a body with a single atom, e.g. + // "cancel a" instead of "start cancel, a, end cancel" + if (/cancel/.test(tree.label)) { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start cancel"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end cancel"); + }); + break; + } else if (/box/.test(tree.label)) { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start box"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end box"); + }); + break; + } else if (/sout/.test(tree.label)) { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start strikeout"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end strikeout"); + }); + break; + } else if (/phase/.test(tree.label)) { + buildRegion(a11yStrings, function (regionStrings) { + regionStrings.push("start phase angle"); + buildA11yStrings(tree.body, regionStrings, atomType); + regionStrings.push("end phase angle"); + }); + break; + } + + throw new Error("KaTeX-a11y: enclose node with " + tree.label + " not supported yet"); + } + + case "vcenter": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "vphantom": + { + throw new Error("KaTeX-a11y: vphantom not implemented yet"); + } + + case "hphantom": + { + throw new Error("KaTeX-a11y: hphantom not implemented yet"); + } + + case "operatorname": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "array": + { + throw new Error("KaTeX-a11y: array not implemented yet"); + } + + case "raw": + { + throw new Error("KaTeX-a11y: raw not implemented yet"); + } + + case "size": + { + // Although there are nodes of type "size" in the parse tree, they have + // no semantic meaning and should be ignored. + break; + } + + case "url": + { + throw new Error("KaTeX-a11y: url not implemented yet"); + } + + case "tag": + { + throw new Error("KaTeX-a11y: tag not implemented yet"); + } + + case "verb": + { + buildString("start verbatim", "normal", a11yStrings); + buildString(tree.body, "normal", a11yStrings); + buildString("end verbatim", "normal", a11yStrings); + break; + } + + case "environment": + { + throw new Error("KaTeX-a11y: environment not implemented yet"); + } + + case "horizBrace": + { + buildString("start " + tree.label.slice(1), "normal", a11yStrings); + buildA11yStrings(tree.base, a11yStrings, atomType); + buildString("end " + tree.label.slice(1), "normal", a11yStrings); + break; + } + + case "infix": + { + // All infix nodes are replace with other nodes. + break; + } + + case "includegraphics": + { + throw new Error("KaTeX-a11y: includegraphics not implemented yet"); + } + + case "font": + { + // TODO: callout the start/end of specific fonts + // TODO: map \BBb{N} to "the naturals" or something like that + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + case "href": + { + throw new Error("KaTeX-a11y: href not implemented yet"); + } + + case "cr": + { + // This is used by environments. + throw new Error("KaTeX-a11y: cr not implemented yet"); + } + + case "underline": + { + buildRegion(a11yStrings, function (a11yStrings) { + a11yStrings.push("start underline"); + buildA11yStrings(tree.body, a11yStrings, atomType); + a11yStrings.push("end underline"); + }); + break; + } + + case "xArrow": + { + throw new Error("KaTeX-a11y: xArrow not implemented yet"); + } + + case "cdlabel": + { + throw new Error("KaTeX-a11y: cdlabel not implemented yet"); + } + + case "cdlabelparent": + { + throw new Error("KaTeX-a11y: cdlabelparent not implemented yet"); + } + + case "mclass": + { + // \neq and \ne are macros so we let "htmlmathml" render the mathmal + // side of things and extract the text from that. + var _atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass + + + buildA11yStrings(tree.body, a11yStrings, _atomType); + break; + } + + case "mathchoice": + { + // TODO: track which which style we're using, e.g. dispaly, text, etc. + // default to text style if even that may not be the correct style + buildA11yStrings(tree.text, a11yStrings, atomType); + break; + } + + case "htmlmathml": + { + buildA11yStrings(tree.mathml, a11yStrings, atomType); + break; + } + + case "middle": + { + buildString(tree.delim, atomType, a11yStrings); + break; + } + + case "internal": + { + // internal nodes are never included in the parse tree + break; + } + + case "html": + { + buildA11yStrings(tree.body, a11yStrings, atomType); + break; + } + + default: + tree.type; + throw new Error("KaTeX a11y un-recognized type: " + tree.type); + } +}; + +var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) { + if (a11yStrings === void 0) { + a11yStrings = []; + } + + if (tree instanceof Array) { + for (var i = 0; i < tree.length; i++) { + buildA11yStrings(tree[i], a11yStrings, atomType); + } + } else { + handleObject(tree, a11yStrings, atomType); + } + + return a11yStrings; +}; + +var flatten = function flatten(array) { + var result = []; + array.forEach(function (item) { + if (item instanceof Array) { + result = result.concat(flatten(item)); + } else { + result.push(item); + } + }); + return result; +}; + +var renderA11yString = function renderA11yString(text, settings) { + var tree = katex.__parse(text, settings); + + var a11yStrings = buildA11yStrings(tree, [], "normal"); + return flatten(a11yStrings).join(", "); +}; + +export default renderA11yString; diff --git a/katex/fonts/KaTeX_AMS-Regular.ttf b/katex/fonts/KaTeX_AMS-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..aff53337c1ac796363ec1c8153c717cfa6b133ba GIT binary patch literal 70948 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 Q0Y5`u0RRC20ssF1599qWVgLXD literal 0 HcmV?d00001 diff --git a/katex/fonts/KaTeX_AMS-Regular.woff2 b/katex/fonts/KaTeX_AMS-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e0a9e4d068f70732708daf655ac797750fe5e2df GIT binary patch literal 31272 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�VBo4@7k7TlY|&j7=@%M!JR4`lE;-hE5$mr}i> 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 literal 0 HcmV?d00001 diff --git a/katex/fonts/KaTeX_Caligraphic-Bold.ttf b/katex/fonts/KaTeX_Caligraphic-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..17f601df44db7b0e3ffcd98c48db8cb5287cc527 GIT binary patch literal 15424 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