升级内置katex版本到0.16.21

This commit is contained in:
mjsoftware 2025-01-24 14:24:43 +08:00
parent deb324ef6f
commit f4a19f8b08
160 changed files with 13028 additions and 9494 deletions

View File

@ -1 +1 @@
(()=>{let i=!1;const a={initCodeBlock(){var e=$("*:not(figure) > pre > code");0!==e.length&&e.each(function(e){var i=$(this).parent();let t=$(this).attr("class"),n="",a=!1,o=!1;if(null!=t){var r=t.match(/[|<](.*)$/),s=t.match(/:select/);if(r||s){let e=0;s&&(e=s.index,r?r[1].endsWith(s[0])&&(r[1]=r[1].substring(0,r[1].length-s[0].length)):n=t.substring(9,s.index),a=!0),r&&(e=r.index<e?r.index:e,"<"===r[0][0]&&(o=!0),n=r[1]),$(this).attr("class",t.substring(0,e)),n=n||t.substring(9,e)}else n=t.substring(9)}let l=$(this).text().split("\n")||[],d=l.length,c=String(d).length,g=(1===c&&(c=2),"");for(var p=0;p<d;p++)g+=`<li ${a&&/^\s*\|\+\s+/.test(l[p])?'class="code-select"':""}>${String(p+1).padStart(c,0)}</li>`;a&&$(this).text($(this).text().replace(/(^\s*)\|\+\s/gm,"$1"));let h=`codeBlock${e}-`+(new Date).getTime(),u="";o&&(u=" close",$(this).parent().hide());s=`<div><i class="ri-arrow-down-s-line${u}" data-code='#${h}'></i><i class="ri-file-copy-2-line btn-clipboard" title="复制代码" data-clipboard-target='#${h}'></i></div>`;$(this).attr("id",h),i.prepend(`<ul>${g}</ul>`),d>DreamConfig.code_fold_line?i.wrap('<figure class="fold hljs"></figure>').append('<div class="expand-done"><i class="ri-arrow-up-double-line"></i></div>'):i.wrap('<figure class="hljs"></figure>'),i.parent().prepend(`<figcaption>${n}${s}</figcaption>`)})},initLiterature(){$(".literature-content>p:not([class]),.literature-content>mew-hide>p:not([class])").each(function(){0===$(this).children(":not(code,a,strong,em,ins,b,s,br,span.pwd)").length&&$(this).addClass("note")})},initLike(){Utils.initLikeButton(".admire .agree.like","posts")},initHighlighting(){hljs.highlightAll()},initShare(){if(window.DShare){let e=$(".cover-image").css("background-image");e=e&&e.substring(5,e.length-2),DShare.create(".dshare",{image:e,imageSelector:".main-content"})}},initClipboard(){window.clipboard||(window.clipboard=new ClipboardJS(".btn-clipboard"),clipboard.on("error",function(e){e.clearSelection(),Qmsg.error("您的浏览器不支持复制")}),clipboard.on("success",function(){Qmsg.success("复制成功")}))},foldImage(){var e;DreamConfig.img_fold_height&&((e=$(".article .gallery-item>[data-fancybox]>img")).parent().addClass("fold"),e.each(function(){const e=$(this).parent();this.complete?this.scrollHeight>=DreamConfig.img_fold_height?e.append('<div class="expand-done"><i class="ri-arrow-up-double-line"></i></div>'):e.removeClass("fold"):this.onload=function(){this.scrollHeight>=DreamConfig.img_fold_height?e.append('<div class="expand-done"><i class="ri-arrow-up-double-line"></i></div>'):e.removeClass("fold")}}))},initEvent(){var e;i||((e=$("body")).on("click","figure>figcaption .ri-arrow-down-s-line",function(){var e=$(this);e.is(".close")?($(e.attr("data-code")).parent().slideDown(200),e.removeClass("close")):($(e.attr("data-code")).parent().slideUp(200),e.addClass("close"))}),e.on("click","figure > pre > .expand-done",function(){Utils.foldBlock($(this).parent().parent())}),e.on("click",".gallery-item .expand-done",function(e){e.stopPropagation(),Utils.foldBlock($(this).parent())}),Utils.initLikeEvent(".admire .agree.like","posts",e=>e.find("span").find("span")),window.onCommentSuccessEvent=(e,i)=>{var t=encrypt("mew-hide-"+i),n=(n=localStorage.getItem(t))?JSON.parse(decrypt(n)):[],e=String(e.postId);n.includes(e)||(n.push(e),$(`.main-content[data-target='${i}'][data-id='${e}'] mew-hide[hide]`).each(function(){$(this).before(decrypt(this.getAttribute("hide"))),$(this).remove(),commonContext.initGallery(),a.initCodeBlock(),a.initLiterature(),a.initHighlighting(),"true"===this.getAttribute("toc")&&commonContext.initTocAndNotice()}),localStorage.setItem(t,encrypt(JSON.stringify(n))))},i=!0)},initKatex(){var e=$(".main-content");!window.katex&&0!==e.length||(e.find(".katex--inline").each(function(e,i){katex.render(i.innerText,i,{displayMode:!1})}),e.find(".katex--display").each(function(e,i){katex.render(i.innerText,i,{displayMode:!0})}))}};window.postPjax=function(i){0!==$(".main-content").length&&Object.keys(a).forEach(e=>window.pjaxSerialNumber===i&&a[e]())};{const t=["initEvent","initCodeBlock","initLiterature","initLike","foldImage"];Object.keys(a).forEach(e=>!window.pjaxSerialNumber&&t.includes(e)&&a[e]()),document.addEventListener("DOMContentLoaded",function(){Object.keys(a).forEach(e=>!window.pjaxSerialNumber&&!t.includes(e)&&a[e]())})}})(); (()=>{let i=!1;const a={initCodeBlock(){var e=$("*:not(figure) > pre > code");0!==e.length&&e.each(function(e){var i=$(this).parent();let t=$(this).attr("class"),n="",a=!1,o=!1;if(null!=t){var r=t.match(/[|<](.*)$/),s=t.match(/:select/);if(r||s){let e=0;s&&(e=s.index,r?r[1].endsWith(s[0])&&(r[1]=r[1].substring(0,r[1].length-s[0].length)):n=t.substring(9,s.index),a=!0),r&&(e=r.index<e?r.index:e,"<"===r[0][0]&&(o=!0),n=r[1]),$(this).attr("class",t.substring(0,e)),n=n||t.substring(9,e)}else n=t.substring(9)}let l=$(this).text().split("\n")||[],d=l.length-1,c=String(d).length,p=(1===c&&(c=2),"");for(var g=0;g<d;g++)p+=`<li ${a&&/^\s*\|\+\s+/.test(l[g])?'class="code-select"':""}>${String(g+1).padStart(c,0)}</li>`;""!==l[d].trim()&&(p+=`<li ${a&&/^\s*\|\+\s+/.test(l[g])?'class="code-select"':""}>${String(1+d).padStart(c,0)}</li>`),a&&$(this).text($(this).text().replace(/(^\s*)\|\+\s/gm,"$1"));let h=`codeBlock${e}-`+(new Date).getTime(),u="";o&&(u=" close",$(this).parent().hide());s=`<div><i class="ri-arrow-down-s-line${u}" data-code='#${h}'></i><i class="ri-file-copy-2-line btn-clipboard" title="复制代码" data-clipboard-target='#${h}'></i></div>`;$(this).attr("id",h),i.prepend(`<ul>${p}</ul>`),d>DreamConfig.code_fold_line?i.wrap('<figure class="fold hljs"></figure>').append('<div class="expand-done"><i class="ri-arrow-up-double-line"></i></div>'):i.wrap('<figure class="hljs"></figure>'),i.parent().prepend(`<figcaption>${n}${s}</figcaption>`)})},initLiterature(){$(".literature-content>p:not([class]),.literature-content>mew-hide>p:not([class])").each(function(){0===$(this).children(":not(code,a,strong,em,ins,b,s,br,span.pwd)").length&&$(this).addClass("note")})},initLike(){Utils.initLikeButton(".admire .agree.like","posts")},initHighlighting(){hljs.highlightAll()},initShare(){if(window.DShare){let e=$(".cover-image").css("background-image");e=e&&e.substring(5,e.length-2),DShare.create(".dshare",{image:e,imageSelector:".main-content"})}},initClipboard(){window.clipboard||(window.clipboard=new ClipboardJS(".btn-clipboard"),clipboard.on("error",function(e){e.clearSelection(),Qmsg.error("您的浏览器不支持复制")}),clipboard.on("success",function(){Qmsg.success("复制成功")}))},foldImage(){var e;DreamConfig.img_fold_height&&((e=$(".article .gallery-item>[data-fancybox]>img")).parent().addClass("fold"),e.each(function(){const e=$(this).parent();this.complete?this.scrollHeight>=DreamConfig.img_fold_height?e.append('<div class="expand-done"><i class="ri-arrow-up-double-line"></i></div>'):e.removeClass("fold"):this.onload=function(){this.scrollHeight>=DreamConfig.img_fold_height?e.append('<div class="expand-done"><i class="ri-arrow-up-double-line"></i></div>'):e.removeClass("fold")}}))},initEvent(){var e;i||((e=$("body")).on("click","figure>figcaption .ri-arrow-down-s-line",function(){var e=$(this);e.is(".close")?($(e.attr("data-code")).parent().slideDown(200),e.removeClass("close")):($(e.attr("data-code")).parent().slideUp(200),e.addClass("close"))}),e.on("click","figure > pre > .expand-done",function(){Utils.foldBlock($(this).parent().parent())}),e.on("click",".gallery-item .expand-done",function(e){e.stopPropagation(),Utils.foldBlock($(this).parent())}),Utils.initLikeEvent(".admire .agree.like","posts",e=>e.find("span").find("span")),window.onCommentSuccessEvent=(e,i)=>{var t=encrypt("mew-hide-"+i),n=(n=localStorage.getItem(t))?JSON.parse(decrypt(n)):[],e=String(e.postId);n.includes(e)||(n.push(e),$(`.main-content[data-target='${i}'][data-id='${e}'] mew-hide[hide]`).each(function(){$(this).before(decrypt(this.getAttribute("hide"))),$(this).remove(),commonContext.initGallery(),a.initCodeBlock(),a.initLiterature(),a.initHighlighting(),"true"===this.getAttribute("toc")&&commonContext.initTocAndNotice()}),localStorage.setItem(t,encrypt(JSON.stringify(n))))},i=!0)},initKatex(){var e=$(".main-content");!window.katex&&0!==e.length||(e.find(".katex--inline, [math-inline]").each(function(e,i){katex.render(i.innerText,i,{displayMode:!1})}),e.find(".katex--display, [math-display]").each(function(e,i){katex.render(i.innerText,i,{displayMode:!0})}))}};window.postPjax=function(i){0!==$(".main-content").length&&Object.keys(a).forEach(e=>window.pjaxSerialNumber===i&&a[e]())};{const t=["initEvent","initCodeBlock","initLiterature","initLike","foldImage"];Object.keys(a).forEach(e=>!window.pjaxSerialNumber&&t.includes(e)&&a[e]()),document.addEventListener("DOMContentLoaded",function(){Object.keys(a).forEach(e=>!window.pjaxSerialNumber&&!t.includes(e)&&a[e]())})}})();

View File

@ -1,91 +0,0 @@
# [<img src="https://katex.org/img/katex-logo-black.svg" width="130" alt="KaTeX">](https://katex.org/)
[![npm](https://img.shields.io/npm/v/katex.svg)](https://www.npmjs.com/package/katex)
[![CircleCI](https://circleci.com/gh/KaTeX/KaTeX.svg?style=shield)](https://circleci.com/gh/KaTeX/KaTeX)
[![codecov](https://codecov.io/gh/KaTeX/KaTeX/branch/master/graph/badge.svg)](https://codecov.io/gh/KaTeX/KaTeX)
[![Join the chat at https://gitter.im/KaTeX/KaTeX](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/KaTeX/KaTeX?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Dependabot Status](https://api.dependabot.com/badges/status?host=github&repo=KaTeX/KaTeX)](https://dependabot.com)
[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/katex/badge?style=rounded)](https://www.jsdelivr.com/package/npm/katex)
![](https://img.badgesize.io/KaTeX/KaTeX/v0.12.0/dist/katex.min.js?compression=gzip)
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
<!DOCTYPE html>
<!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly -->
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous">
<!-- The loading of KaTeX is deferred to speed up page rendering -->
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script>
<!-- To automatically render math in text elements, include the auto-render extension: -->
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous"
onload="renderMathInElement(document.body);"></script>
</head>
...
</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
});
// '<span class="katex">...</span>'
```
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).

View File

@ -1,350 +0,0 @@
(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 if(typeof exports === 'object')
exports["renderMathInElement"] = factory(require("katex"));
else
root["renderMathInElement"] = factory(root["katex"]);
})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
// EXTERNAL MODULE: external "katex"
var external_katex_ = __webpack_require__(0);
var external_katex_default = /*#__PURE__*/__webpack_require__.n(external_katex_);
// CONCATENATED MODULE: ./contrib/auto-render/splitAtDelimiters.js
/* eslint no-constant-condition:0 */
var findEndOfMath = function findEndOfMath(delimiter, text, startIndex) {
// Adapted from
// https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
var index = startIndex;
var braceLevel = 0;
var delimLength = delimiter.length;
while (index < text.length) {
var character = text[index];
if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {
return index;
} else if (character === "\\") {
index++;
} else if (character === "{") {
braceLevel++;
} else if (character === "}") {
braceLevel--;
}
index++;
}
return -1;
};
var splitAtDelimiters = function splitAtDelimiters(startData, leftDelim, rightDelim, display) {
var finalData = [];
for (var i = 0; i < startData.length; i++) {
if (startData[i].type === "text") {
var text = startData[i].data;
var lookingForLeft = true;
var currIndex = 0;
var nextIndex = void 0;
nextIndex = text.indexOf(leftDelim);
if (nextIndex !== -1) {
currIndex = nextIndex;
finalData.push({
type: "text",
data: text.slice(0, currIndex)
});
lookingForLeft = false;
}
while (true) {
if (lookingForLeft) {
nextIndex = text.indexOf(leftDelim, currIndex);
if (nextIndex === -1) {
break;
}
finalData.push({
type: "text",
data: text.slice(currIndex, nextIndex)
});
currIndex = nextIndex;
} else {
nextIndex = findEndOfMath(rightDelim, text, currIndex + leftDelim.length);
if (nextIndex === -1) {
break;
}
finalData.push({
type: "math",
data: text.slice(currIndex + leftDelim.length, nextIndex),
rawData: text.slice(currIndex, nextIndex + rightDelim.length),
display: display
});
currIndex = nextIndex + rightDelim.length;
}
lookingForLeft = !lookingForLeft;
}
finalData.push({
type: "text",
data: text.slice(currIndex)
});
} else {
finalData.push(startData[i]);
}
}
return finalData;
};
/* harmony default export */ var auto_render_splitAtDelimiters = (splitAtDelimiters);
// CONCATENATED MODULE: ./contrib/auto-render/auto-render.js
/* eslint no-console:0 */
var auto_render_splitWithDelimiters = function splitWithDelimiters(text, delimiters) {
var data = [{
type: "text",
data: text
}];
for (var i = 0; i < delimiters.length; i++) {
var delimiter = delimiters[i];
data = auto_render_splitAtDelimiters(data, delimiter.left, delimiter.right, delimiter.display || false);
}
return data;
};
/* Note: optionsCopy is mutated by this method. If it is ever exposed in the
* API, we should copy it before mutating.
*/
var auto_render_renderMathInText = function renderMathInText(text, optionsCopy) {
var data = auto_render_splitWithDelimiters(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.a.render(math, span, optionsCopy);
} catch (e) {
if (!(e instanceof external_katex_default.a.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 = auto_render_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 last in this array. Otherwise, renderMathInElement
// will search for \[ before it searches for $$ or \(
// That makes it susceptible to finding a \\[0.3em] row delimiter and
// treating it as if it were the start of a KaTeX math zone.
{
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 = __webpack_exports__["default"] = (renderMathInElement);
/***/ })
/******/ ])["default"];
});

View File

@ -1 +0,0 @@
!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(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),a=function(e,t,r){for(var n=r,o=0,a=e.length;n<t.length;){var i=t[n];if(o<=0&&t.slice(n,n+a)===e)return n;"\\"===i?n++:"{"===i?o++:"}"===i&&o--,n++}return-1},i=function(e,t,r,n){for(var o=[],i=0;i<e.length;i++)if("text"===e[i].type){var l=e[i].data,d=!0,s=0,f=void 0;for(-1!==(f=l.indexOf(t))&&(s=f,o.push({type:"text",data:l.slice(0,s)}),d=!1);;){if(d){if(-1===(f=l.indexOf(t,s)))break;o.push({type:"text",data:l.slice(s,f)}),s=f}else{if(-1===(f=a(r,l,s+t.length)))break;o.push({type:"math",data:l.slice(s+t.length,f),rawData:l.slice(s,f+r.length),display:n}),s=f+r.length}d=!d}o.push({type:"text",data:l.slice(s)})}else o.push(e[i]);return o},l=function(e,t){var r=function(e,t){for(var r=[{type:"text",data:e}],n=0;n<t.length;n++){var o=t[n];r=i(r,o.left,o.right,o.display||!1)}return r}(e,t.delimiters);if(1===r.length&&"text"===r[0].type)return null;for(var n=document.createDocumentFragment(),a=0;a<r.length;a++)if("text"===r[a].type)n.appendChild(document.createTextNode(r[a].data));else{var l=document.createElement("span"),d=r[a].data;t.displayMode=r[a].display;try{t.preProcess&&(d=t.preProcess(d)),o.a.render(d,l,t)}catch(e){if(!(e instanceof o.a.ParseError))throw e;t.errorCallback("KaTeX auto-render: Failed to parse `"+r[a].data+"` with ",e),n.appendChild(document.createTextNode(r[a].rawData));continue}n.appendChild(l)}return n};t.default=function(e,t){if(!e)throw new Error("No element provided to render");var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);r.delimiters=r.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code","option"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},function e(t,r){for(var n=0;n<t.childNodes.length;n++){var o=t.childNodes[n];if(3===o.nodeType){var a=l(o.textContent,r);a&&(n+=a.childNodes.length-1,t.replaceChild(a,o))}else 1===o.nodeType&&function(){var t=" "+o.className+" ";-1===r.ignoredTags.indexOf(o.nodeName.toLowerCase())&&r.ignoredClasses.every(function(e){return-1===t.indexOf(" "+e+" ")})&&e(o,r)}()}}(e,r)}}]).default});

View File

@ -1,226 +0,0 @@
import katex from '../katex.mjs';
/* eslint no-constant-condition:0 */
const findEndOfMath = function findEndOfMath(delimiter, text, startIndex) {
// Adapted from
// https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
let index = startIndex;
let braceLevel = 0;
const delimLength = delimiter.length;
while (index < text.length) {
const character = text[index];
if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {
return index;
} else if (character === "\\") {
index++;
} else if (character === "{") {
braceLevel++;
} else if (character === "}") {
braceLevel--;
}
index++;
}
return -1;
};
const splitAtDelimiters = function splitAtDelimiters(startData, leftDelim, rightDelim, display) {
const finalData = [];
for (let i = 0; i < startData.length; i++) {
if (startData[i].type === "text") {
const text = startData[i].data;
let lookingForLeft = true;
let currIndex = 0;
let nextIndex;
nextIndex = text.indexOf(leftDelim);
if (nextIndex !== -1) {
currIndex = nextIndex;
finalData.push({
type: "text",
data: text.slice(0, currIndex)
});
lookingForLeft = false;
}
while (true) {
if (lookingForLeft) {
nextIndex = text.indexOf(leftDelim, currIndex);
if (nextIndex === -1) {
break;
}
finalData.push({
type: "text",
data: text.slice(currIndex, nextIndex)
});
currIndex = nextIndex;
} else {
nextIndex = findEndOfMath(rightDelim, text, currIndex + leftDelim.length);
if (nextIndex === -1) {
break;
}
finalData.push({
type: "math",
data: text.slice(currIndex + leftDelim.length, nextIndex),
rawData: text.slice(currIndex, nextIndex + rightDelim.length),
display: display
});
currIndex = nextIndex + rightDelim.length;
}
lookingForLeft = !lookingForLeft;
}
finalData.push({
type: "text",
data: text.slice(currIndex)
});
} else {
finalData.push(startData[i]);
}
}
return finalData;
};
/* eslint no-console:0 */
const splitWithDelimiters = function splitWithDelimiters(text, delimiters) {
let data = [{
type: "text",
data: text
}];
for (let i = 0; i < delimiters.length; i++) {
const delimiter = delimiters[i];
data = splitAtDelimiters(data, delimiter.left, delimiter.right, delimiter.display || false);
}
return data;
};
/* Note: optionsCopy is mutated by this method. If it is ever exposed in the
* API, we should copy it before mutating.
*/
const renderMathInText = function renderMathInText(text, optionsCopy) {
const data = splitWithDelimiters(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;
}
const fragment = document.createDocumentFragment();
for (let i = 0; i < data.length; i++) {
if (data[i].type === "text") {
fragment.appendChild(document.createTextNode(data[i].data));
} else {
const span = document.createElement("span");
let 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;
};
const renderElem = function renderElem(elem, optionsCopy) {
for (let i = 0; i < elem.childNodes.length; i++) {
const childNode = elem.childNodes[i];
if (childNode.nodeType === 3) {
// Text node
const frag = renderMathInText(childNode.textContent, optionsCopy);
if (frag) {
i += frag.childNodes.length - 1;
elem.replaceChild(frag, childNode);
}
} else if (childNode.nodeType === 1) {
// Element node
const className = ' ' + childNode.className + ' ';
const 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.
}
};
const renderMathInElement = function renderMathInElement(elem, options) {
if (!elem) {
throw new Error("No element provided to render");
}
const optionsCopy = {}; // Object.assign(optionsCopy, option)
for (const 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 last in this array. Otherwise, renderMathInElement
// will search for \[ before it searches for $$ or \(
// That makes it susceptible to finding a \\[0.3em] row delimiter and
// treating it as if it were the start of a KaTeX math zone.
{
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;

View File

@ -1,14 +0,0 @@
/* 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 {
user-select: all;
-moz-user-select: all;
-webkit-user-select: all;
-ms-user-select: all;
}

View File

@ -1,213 +0,0 @@
(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(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports, __webpack_require__) {
// extracted by mini-css-extract-plugin
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
// EXTERNAL MODULE: ./contrib/copy-tex/copy-tex.css
var copy_tex = __webpack_require__(0);
// 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 (<annotation> 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.
*/
/***/ })
/******/ ])["default"];
});

View File

@ -1 +0,0 @@
.katex,.katex-display{user-select:all;-moz-user-select:all;-webkit-user-select:all;-ms-user-select:all}

View File

@ -1 +0,0 @@
!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 r in n)("object"==typeof exports?exports:e)[r]=n[r]}}("undefined"!=typeof self?self:this,function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(0);var r={inline:["$","$"],display:["$$","$$"]},o=function(e,t){void 0===t&&(t=r);for(var n=e.querySelectorAll(".katex-mathml + .katex-html"),o=0;o<n.length;o++){var l=n[o];l.remove?l.remove(null):l.parentNode.removeChild(l)}for(var i=e.querySelectorAll(".katex-mathml"),a=0;a<i.length;a++){var u=i[a],f=u.querySelector("annotation");f&&(u.replaceWith?u.replaceWith(f):u.parentNode.replaceChild(f,u),f.innerHTML=t.inline[0]+f.innerHTML+t.inline[1])}for(var c=e.querySelectorAll(".katex-display annotation"),d=0;d<c.length;d++){var p=c[d];p.innerHTML=t.display[0]+p.innerHTML.substr(t.inline[0].length,p.innerHTML.length-t.inline[0].length-t.inline[1].length)+t.display[1]}return e};document.addEventListener("copy",function(e){var t=window.getSelection();if(!t.isCollapsed){var n=t.getRangeAt(0).cloneContents();if(n.querySelector(".katex-mathml")){for(var r=[],l=0;l<n.childNodes.length;l++)r.push(n.childNodes[l].outerHTML);e.clipboardData.setData("text/html",r.join("")),e.clipboardData.setData("text/plain",o(n).textContent),e.preventDefault()}}})}]).default});

View File

@ -1,85 +0,0 @@
// Set these to how you want inline and display math to be delimited.
const defaultCopyDelimiters = {
inline: ['$', '$'],
// alternative: ['\(', '\)']
display: ['$$', '$$'] // alternative: ['\[', '\]']
}; // Replace .katex elements with their TeX source (<annotation> element).
// Modifies fragment in-place. Useful for writing your own 'copy' handler,
// as in copy-tex.js.
const 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).
const katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html');
for (let i = 0; i < katexHtml.length; i++) {
const 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.
const katexMathml = fragment.querySelectorAll('.katex-mathml');
for (let i = 0; i < katexMathml.length; i++) {
const element = katexMathml[i];
const 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.
const displays = fragment.querySelectorAll('.katex-display annotation');
for (let i = 0; i < displays.length; i++) {
const element = displays[i];
element.innerHTML = copyDelimiters.display[0] + element.innerHTML.substr(copyDelimiters.inline[0].length, element.innerHTML.length - copyDelimiters.inline[0].length - copyDelimiters.inline[1].length) + copyDelimiters.display[1];
}
return fragment;
};
document.addEventListener('copy', function (event) {
const selection = window.getSelection();
if (selection.isCollapsed) {
return; // default action OK if selection is empty
}
const 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.
const html = [];
for (let 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();
});

View File

@ -1,137 +0,0 @@
(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__0__) {
return /******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/
/******/ ([
/* 0 */
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
/* 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.a.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);
});
/***/ })
/******/ ])["default"];
});

View File

@ -1 +0,0 @@
!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(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),u=document.body.getElementsByTagName("script");(u=Array.prototype.slice.call(u)).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{o.a.render(e.text,r,{displayMode:t})}catch(t){r.textContent=e.text}e.parentNode.replaceChild(r,e)})}]).default});

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,125 @@
<h1><a href="https://katex.org/">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://katex.org/img/katex-logo.svg">
<img alt="KaTeX" width=130 src="https://katex.org/img/katex-logo-black.svg">
</picture>
</a></h1>
[![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=main&event=push)](https://github.com/KaTeX/KaTeX/actions?query=workflow%3ACI)
[![codecov](https://codecov.io/gh/KaTeX/KaTeX/branch/main/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)
[![Financial Contributors on Open Collective](https://opencollective.com/katex/all/badge.svg?label=financial+contributors)](https://opencollective.com/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](https://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
<!DOCTYPE html>
<!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly -->
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.css" integrity="sha384-zh0CIslj+VczCZtlzBcjt5ppRcsAmDnRem7ESsYwWwg3m/OaJ2l4x7YBZl9Kxxib" crossorigin="anonymous">
<!-- The loading of KaTeX is deferred to speed up page rendering -->
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/katex.min.js" integrity="sha384-Rma6DA2IPUwhNxmrB/7S3Tno0YY7sFu9WSYMCuulLhIqYSGZ2gKCJWIqhBWqMQfh" crossorigin="anonymous"></script>
<!-- To automatically render math in text elements, include the auto-render extension: -->
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.21/dist/contrib/auto-render.min.js" integrity="sha384-hCXGrW6PitJEwbkoStFjeJxv+fSOOQKOPbJxSfM6G5sWZjAyWhXiTIIAmQqnlLlh" crossorigin="anonymous"
onload="renderMathInElement(document.body);"></script>
</head>
...
</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
});
// '<span class="katex">...</span>'
```
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)!
## Contributors
### Code Contributors
This project exists thanks to all the people who contribute code. If you'd like to help, see [our guide to contributing code](CONTRIBUTING.md).
<a href="https://github.com/KaTeX/KaTeX/graphs/contributors"><img src="https://contributors-svg.opencollective.com/katex/contributors.svg?width=890&button=false" alt="Code contributors" /></a>
### Financial Contributors
Become a financial contributor and help us sustain our community.
#### Individuals
<a href="https://opencollective.com/katex"><img src="https://opencollective.com/katex/individuals.svg?width=890" alt="Contribute on Open Collective"></a>
#### Organizations
Support this project with your organization. Your logo will show up here with a link to your website.
<a href="https://opencollective.com/katex/organization/0/website"><img src="https://opencollective.com/katex/organization/0/avatar.svg" alt="Organization 1"></a>
<a href="https://opencollective.com/katex/organization/1/website"><img src="https://opencollective.com/katex/organization/1/avatar.svg" alt="Organization 2"></a>
<a href="https://opencollective.com/katex/organization/2/website"><img src="https://opencollective.com/katex/organization/2/avatar.svg" alt="Organization 3"></a>
<a href="https://opencollective.com/katex/organization/3/website"><img src="https://opencollective.com/katex/organization/3/avatar.svg" alt="Organization 4"></a>
<a href="https://opencollective.com/katex/organization/4/website"><img src="https://opencollective.com/katex/organization/4/avatar.svg" alt="Organization 5"></a>
<a href="https://opencollective.com/katex/organization/5/website"><img src="https://opencollective.com/katex/organization/5/avatar.svg" alt="Organization 6"></a>
<a href="https://opencollective.com/katex/organization/6/website"><img src="https://opencollective.com/katex/organization/6/avatar.svg" alt="Organization 7"></a>
<a href="https://opencollective.com/katex/organization/7/website"><img src="https://opencollective.com/katex/organization/7/avatar.svg" alt="Organization 8"></a>
<a href="https://opencollective.com/katex/organization/8/website"><img src="https://opencollective.com/katex/organization/8/avatar.svg" alt="Organization 9"></a>
<a href="https://opencollective.com/katex/organization/9/website"><img src="https://opencollective.com/katex/organization/9/avatar.svg" alt="Organization 10"></a>
## License
KaTeX is licensed under the [MIT License](https://opensource.org/licenses/MIT).

View File

@ -0,0 +1,338 @@
(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 if(typeof exports === 'object')
exports["renderMathInElement"] = factory(require("katex"));
else
root["renderMathInElement"] = factory(root["katex"]);
})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__757__) {
return /******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 757:
/***/ (function(module) {
module.exports = __WEBPACK_EXTERNAL_MODULE__757__;
/***/ })
/******/ });
/************************************************************************/
/******/ // 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__ = {};
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
"default": function() { return /* binding */ auto_render; }
});
// EXTERNAL MODULE: external "katex"
var external_katex_ = __webpack_require__(757);
var external_katex_default = /*#__PURE__*/__webpack_require__.n(external_katex_);
;// CONCATENATED MODULE: ./contrib/auto-render/splitAtDelimiters.js
/* eslint no-constant-condition:0 */
const findEndOfMath = function (delimiter, text, startIndex) {
// Adapted from
// https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
let index = startIndex;
let braceLevel = 0;
const delimLength = delimiter.length;
while (index < text.length) {
const character = text[index];
if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {
return index;
} else if (character === "\\") {
index++;
} else if (character === "{") {
braceLevel++;
} else if (character === "}") {
braceLevel--;
}
index++;
}
return -1;
};
const escapeRegex = function (string) {
return string.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
};
const amsRegex = /^\\begin{/;
const splitAtDelimiters = function (text, delimiters) {
let index;
const data = [];
const regexLeft = new RegExp("(" + delimiters.map(x => 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:
const i = delimiters.findIndex(delim => text.startsWith(delim.left));
index = findEndOfMath(delimiters[i].right, text, delimiters[i].left.length);
if (index === -1) {
break;
}
const rawData = text.slice(0, index + delimiters[i].right.length);
const 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;
};
/* 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.
*/
const renderMathInText = function (text, optionsCopy) {
const 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;
}
const fragment = document.createDocumentFragment();
for (let i = 0; i < data.length; i++) {
if (data[i].type === "text") {
fragment.appendChild(document.createTextNode(data[i].data));
} else {
const span = document.createElement("span");
let 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;
};
const renderElem = function (elem, optionsCopy) {
for (let i = 0; i < elem.childNodes.length; i++) {
const childNode = elem.childNodes[i];
if (childNode.nodeType === 3) {
// Text node
// Concatenate all sibling text nodes.
// Webkit browsers split very large text nodes into smaller ones,
// so the delimiters may be split across different nodes.
let textContentConcat = childNode.textContent;
let sibling = childNode.nextSibling;
let nSiblings = 0;
while (sibling && sibling.nodeType === Node.TEXT_NODE) {
textContentConcat += sibling.textContent;
sibling = sibling.nextSibling;
nSiblings++;
}
const frag = renderMathInText(textContentConcat, optionsCopy);
if (frag) {
// Remove extra text nodes
for (let j = 0; j < nSiblings; j++) {
childNode.nextSibling.remove();
}
i += frag.childNodes.length - 1;
elem.replaceChild(frag, childNode);
} else {
// If the concatenated text does not contain math
// the siblings will not either
i += nSiblings;
}
} else if (childNode.nodeType === 1) {
// Element node
const className = ' ' + childNode.className + ' ';
const 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.
}
};
const renderMathInElement = function (elem, options) {
if (!elem) {
throw new Error("No element provided to render");
}
const optionsCopy = {}; // Object.assign(optionsCopy, option)
for (const 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__;
/******/ })()
;
});

View File

@ -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={757:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={};r.d(o,{default:function(){return p}});var i=r(757),a=r.n(i);const l=function(e,t,n){let r=n,o=0;const i=e.length;for(;r<t.length;){const n=t[r];if(o<=0&&t.slice(r,r+i)===e)return r;"\\"===n?r++:"{"===n?o++:"}"===n&&o--,r++}return-1},s=/^\\begin{/;var d=function(e,t){let n;const r=[],o=new RegExp("("+t.map((e=>e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"))).join("|")+")");for(;n=e.search(o),-1!==n;){n>0&&(r.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));const o=t.findIndex((t=>e.startsWith(t.left)));if(n=l(t[o].right,e,t[o].left.length),-1===n)break;const i=e.slice(0,n+t[o].right.length),a=s.test(i)?i:e.slice(t[o].left.length,n);r.push({type:"math",data:a,rawData:i,display:t[o].display}),e=e.slice(n+t[o].right.length)}return""!==e&&r.push({type:"text",data:e}),r};const c=function(e,t){const n=d(e,t.delimiters);if(1===n.length&&"text"===n[0].type)return null;const r=document.createDocumentFragment();for(let e=0;e<n.length;e++)if("text"===n[e].type)r.appendChild(document.createTextNode(n[e].data));else{const o=document.createElement("span");let i=n[e].data;t.displayMode=n[e].display;try{t.preProcess&&(i=t.preProcess(i)),a().render(i,o,t)}catch(o){if(!(o instanceof a().ParseError))throw o;t.errorCallback("KaTeX auto-render: Failed to parse `"+n[e].data+"` with ",o),r.appendChild(document.createTextNode(n[e].rawData));continue}r.appendChild(o)}return r},f=function(e,t){for(let n=0;n<e.childNodes.length;n++){const r=e.childNodes[n];if(3===r.nodeType){let o=r.textContent,i=r.nextSibling,a=0;for(;i&&i.nodeType===Node.TEXT_NODE;)o+=i.textContent,i=i.nextSibling,a++;const l=c(o,t);if(l){for(let e=0;e<a;e++)r.nextSibling.remove();n+=l.childNodes.length-1,e.replaceChild(l,r)}else n+=a}else if(1===r.nodeType){const e=" "+r.className+" ";-1===t.ignoredTags.indexOf(r.nodeName.toLowerCase())&&t.ignoredClasses.every((t=>-1===e.indexOf(" "+t+" ")))&&f(r,t)}}};var p=function(e,t){if(!e)throw new Error("No element provided to render");const n={};for(const e in t)t.hasOwnProperty(e)&&(n[e]=t[e]);n.delimiters=n.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\begin{equation}",right:"\\end{equation}",display:!0},{left:"\\begin{align}",right:"\\end{align}",display:!0},{left:"\\begin{alignat}",right:"\\end{alignat}",display:!0},{left:"\\begin{gather}",right:"\\end{gather}",display:!0},{left:"\\begin{CD}",right:"\\end{CD}",display:!0},{left:"\\[",right:"\\]",display:!0}],n.ignoredTags=n.ignoredTags||["script","noscript","style","textarea","pre","code","option"],n.ignoredClasses=n.ignoredClasses||[],n.errorCallback=n.errorCallback||console.error,n.macros=n.macros||{},f(e,n)};return o=o.default}()}));

View File

@ -0,0 +1,244 @@
import katex from '../katex.mjs';
/* eslint no-constant-condition:0 */
var findEndOfMath = function findEndOfMath(delimiter, text, startIndex) {
// Adapted from
// https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
var index = startIndex;
var braceLevel = 0;
var delimLength = delimiter.length;
while (index < text.length) {
var character = text[index];
if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) {
return index;
} else if (character === "\\") {
index++;
} else if (character === "{") {
braceLevel++;
} else if (character === "}") {
braceLevel--;
}
index++;
}
return -1;
};
var escapeRegex = function escapeRegex(string) {
return string.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
};
var amsRegex = /^\\begin{/;
var splitAtDelimiters = function splitAtDelimiters(text, delimiters) {
var index;
var data = [];
var regexLeft = new RegExp("(" + delimiters.map(x => 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
// Concatenate all sibling text nodes.
// Webkit browsers split very large text nodes into smaller ones,
// so the delimiters may be split across different nodes.
var textContentConcat = childNode.textContent;
var sibling = childNode.nextSibling;
var nSiblings = 0;
while (sibling && sibling.nodeType === Node.TEXT_NODE) {
textContentConcat += sibling.textContent;
sibling = sibling.nextSibling;
nSiblings++;
}
var frag = renderMathInText(textContentConcat, optionsCopy);
if (frag) {
// Remove extra text nodes
for (var j = 0; j < nSiblings; j++) {
childNode.nextSibling.remove();
}
i += frag.childNodes.length - 1;
elem.replaceChild(frag, childNode);
} else {
// If the concatenated text does not contain math
// the siblings will not either
i += nSiblings;
}
} 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 { renderMathInElement as default };

View File

@ -0,0 +1,127 @@
(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.
const defaultCopyDelimiters = {
inline: ['$', '$'],
// alternative: ['\(', '\)']
display: ['$$', '$$'] // alternative: ['\[', '\]']
}; // Replace .katex elements with their TeX source (<annotation> element).
// Modifies fragment in-place. Useful for writing your own 'copy' handler,
// as in copy-tex.js.
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).
const katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html');
for (let i = 0; i < katexHtml.length; i++) {
const element = katexHtml[i];
if (element.remove) {
element.remove();
} else if (element.parentNode) {
element.parentNode.removeChild(element);
}
} // Replace .katex-mathml elements with their annotation (TeX source)
// descendant, with inline delimiters.
const katexMathml = fragment.querySelectorAll('.katex-mathml');
for (let i = 0; i < katexMathml.length; i++) {
const element = katexMathml[i];
const texSource = element.querySelector('annotation');
if (texSource) {
if (element.replaceWith) {
element.replaceWith(texSource);
} else if (element.parentNode) {
element.parentNode.replaceChild(texSource, element);
}
texSource.innerHTML = copyDelimiters.inline[0] + texSource.innerHTML + copyDelimiters.inline[1];
}
} // Switch display math to display delimiters.
const displays = fragment.querySelectorAll('.katex-display annotation');
for (let i = 0; i < displays.length; i++) {
const element = displays[i];
element.innerHTML = copyDelimiters.display[0] + element.innerHTML.substr(copyDelimiters.inline[0].length, element.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
// Return <div class="katex"> element containing node, or null if not found.
function closestKatex(node) {
// If node is a Text Node, for example, go up to containing Element,
// where we can apply the `closest` method.
const element = node instanceof Element ? node : node.parentElement;
return element && element.closest('.katex');
} // Global copy handler to modify behavior on/within .katex elements.
document.addEventListener('copy', function (event) {
const selection = window.getSelection();
if (selection.isCollapsed || !event.clipboardData) {
return; // default action OK if selection is empty or unchangeable
}
const clipboardData = event.clipboardData;
const range = selection.getRangeAt(0); // When start point is within a formula, expand to entire formula.
const startKatex = closestKatex(range.startContainer);
if (startKatex) {
range.setStartBefore(startKatex);
} // Similarly, when end point is within a formula, expand to entire formula.
const endKatex = closestKatex(range.endContainer);
if (endKatex) {
range.setEndAfter(endKatex);
}
const fragment = range.cloneContents();
if (!fragment.querySelector('.katex-mathml')) {
return; // default action OK if no .katex-mathml elements
}
const htmlContents = Array.prototype.map.call(fragment.childNodes, el => el instanceof Text ? el.textContent : el.outerHTML).join(''); // Preserve usual HTML copy/paste behavior.
clipboardData.setData('text/html', htmlContents); // Rewrite plain-text version.
clipboardData.setData('text/plain', katex2tex(fragment).textContent); // Prevent normal copy handling.
event.preventDefault();
});
__webpack_exports__ = __webpack_exports__["default"];
/******/ return __webpack_exports__;
/******/ })()
;
});

View File

@ -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 o in n)("object"==typeof exports?exports:e)[o]=n[o]}}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={};const t={inline:["$","$"],display:["$$","$$"]};var n=function(e,n){void 0===n&&(n=t);const o=e.querySelectorAll(".katex-mathml + .katex-html");for(let e=0;e<o.length;e++){const t=o[e];t.remove?t.remove():t.parentNode&&t.parentNode.removeChild(t)}const r=e.querySelectorAll(".katex-mathml");for(let e=0;e<r.length;e++){const t=r[e],o=t.querySelector("annotation");o&&(t.replaceWith?t.replaceWith(o):t.parentNode&&t.parentNode.replaceChild(o,t),o.innerHTML=n.inline[0]+o.innerHTML+n.inline[1])}const l=e.querySelectorAll(".katex-display annotation");for(let e=0;e<l.length;e++){const t=l[e];t.innerHTML=n.display[0]+t.innerHTML.substr(n.inline[0].length,t.innerHTML.length-n.inline[0].length-n.inline[1].length)+n.display[1]}return e};function o(e){const t=e instanceof Element?e:e.parentElement;return t&&t.closest(".katex")}return document.addEventListener("copy",(function(e){const t=window.getSelection();if(t.isCollapsed||!e.clipboardData)return;const r=e.clipboardData,l=t.getRangeAt(0),i=o(l.startContainer);i&&l.setStartBefore(i);const a=o(l.endContainer);a&&l.setEndAfter(a);const s=l.cloneContents();if(!s.querySelector(".katex-mathml"))return;const c=Array.prototype.map.call(s.childNodes,(e=>e instanceof Text?e.textContent:e.outerHTML)).join("");r.setData("text/html",c),r.setData("text/plain",n(s).textContent),e.preventDefault()})),e=e.default}()}));

View File

@ -0,0 +1,105 @@
// 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 (<annotation> element).
// Modifies fragment in-place. Useful for writing your own 'copy' handler,
// as in copy-tex.js.
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();
} else if (element.parentNode) {
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 if (_element.parentNode) {
_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;
}
function closestKatex(node) {
// If node is a Text Node, for example, go up to containing Element,
// where we can apply the `closest` method.
var element = node instanceof Element ? node : node.parentElement;
return element && element.closest('.katex');
} // Global copy handler to modify behavior on/within .katex elements.
document.addEventListener('copy', function (event) {
var selection = window.getSelection();
if (selection.isCollapsed || !event.clipboardData) {
return; // default action OK if selection is empty or unchangeable
}
var clipboardData = event.clipboardData;
var range = selection.getRangeAt(0); // When start point is within a formula, expand to entire formula.
var startKatex = closestKatex(range.startContainer);
if (startKatex) {
range.setStartBefore(startKatex);
} // Similarly, when end point is within a formula, expand to entire formula.
var endKatex = closestKatex(range.endContainer);
if (endKatex) {
range.setEndAfter(endKatex);
}
var fragment = range.cloneContents();
if (!fragment.querySelector('.katex-mathml')) {
return; // default action OK if no .katex-mathml elements
}
var htmlContents = Array.prototype.map.call(fragment.childNodes, el => el instanceof Text ? el.textContent : el.outerHTML).join(''); // Preserve usual HTML copy/paste behavior.
clipboardData.setData('text/html', htmlContents); // Rewrite plain-text version.
clipboardData.setData('text/plain', katexReplaceWithTex(fragment).textContent); // Prevent normal copy handling.
event.preventDefault();
});

View File

@ -0,0 +1,109 @@
(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__757__) {
return /******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 757:
/***/ (function(module) {
module.exports = __WEBPACK_EXTERNAL_MODULE__757__;
/***/ })
/******/ });
/************************************************************************/
/******/ // 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__ = {};
/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(757);
/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__);
let 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;
}
const display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null;
const 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__;
/******/ })()
;
});

View File

@ -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 n="object"==typeof exports?t(require("katex")):t(e.katex);for(var r in n)("object"==typeof exports?exports:e)[r]=n[r]}}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={757:function(t){t.exports=e}},n={};function r(e){var o=n[e];if(void 0!==o)return o.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,{a:t}),t},r.d=function(e,t){for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o={},i=r(757),a=r.n(i);let u=document.body.getElementsByTagName("script");return u=Array.prototype.slice.call(u),u.forEach((function(e){if(!e.type||!e.type.match(/math\/tex/i))return-1;const t=null!=e.type.match(/mode\s*=\s*display(;|\s|\n|$)/),n=document.createElement(t?"div":"span");n.setAttribute("class",t?"equation":"inline-equation");try{a().render(e.text,n,{displayMode:t})}catch(t){n.textContent=e.text}e.parentNode.replaceChild(n,e)})),o=o.default}()}));

View File

@ -1,14 +1,14 @@
import katex from '../katex.mjs'; import katex from '../katex.mjs';
let scripts = document.body.getElementsByTagName("script"); var scripts = document.body.getElementsByTagName("script");
scripts = Array.prototype.slice.call(scripts); scripts = Array.prototype.slice.call(scripts);
scripts.forEach(function (script) { scripts.forEach(function (script) {
if (!script.type || !script.type.match(/math\/tex/i)) { if (!script.type || !script.type.match(/math\/tex/i)) {
return -1; return -1;
} }
const display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null; var display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null;
const katexElement = document.createElement(display ? "div" : "span"); var katexElement = document.createElement(display ? "div" : "span");
katexElement.setAttribute("class", display ? "equation" : "inline-equation"); katexElement.setAttribute("class", display ? "equation" : "inline-equation");
try { try {

View File

@ -7,110 +7,81 @@
var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]); var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]);
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
} }
})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) { })((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__757__) {
return /******/ (function(modules) { // webpackBootstrap return /******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 757:
/***/ (function(module) {
module.exports = __WEBPACK_EXTERNAL_MODULE__757__;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache /******/ // The module cache
/******/ var installedModules = {}; /******/ var __webpack_module_cache__ = {};
/******/ /******/
/******/ // The require function /******/ // The require function
/******/ function __webpack_require__(moduleId) { /******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache /******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) { /******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ return installedModules[moduleId].exports; /******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ } /******/ }
/******/ // Create a new module (and put it into the cache) /******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = { /******/ var module = __webpack_module_cache__[moduleId] = {
/******/ i: moduleId, /******/ // no module.id needed
/******/ l: false, /******/ // no module.loaded needed
/******/ exports: {} /******/ exports: {}
/******/ }; /******/ };
/******/ /******/
/******/ // Execute the module function /******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/ /******/
/******/ // Return the exports of the module /******/ // Return the exports of the module
/******/ return module.exports; /******/ return module.exports;
/******/ } /******/ }
/******/ /******/
/******/ /************************************************************************/
/******/ // expose the modules object (__webpack_modules__) /******/ /* webpack/runtime/compat get default export */
/******/ __webpack_require__.m = modules; /******/ !function() {
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules /******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) { /******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ? /******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } : /******/ function() { return module['default']; } :
/******/ function getModuleExports() { return module; }; /******/ function() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter); /******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter; /******/ return getter;
/******/ }; /******/ };
/******/ }();
/******/ /******/
/******/ // Object.prototype.hasOwnProperty.call /******/ /* webpack/runtime/define property getters */
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ !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_public_path__ /******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ __webpack_require__.p = ""; /******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/ /******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ var __webpack_exports__ = {};
/* 0 */ /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(757);
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__);
/* eslint-disable */ /* eslint-disable */
/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ /* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */ /* vim: set ts=2 et sw=2 tw=80: */
@ -160,28 +131,28 @@ __webpack_require__.r(__webpack_exports__);
// - use "" for strings that need to stay untouched // - use "" for strings that need to stay untouched
// version: "3.3.0" for MathJax and KaTeX // version: "3.3.0" for MathJax and KaTeX
// Add \ce, \pu, and \tripledash to the KaTeX macros. // Add \ce, \pu, and \tripledash to the KaTeX macros.
katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\ce", function (context) { katex__WEBPACK_IMPORTED_MODULE_0___default().__defineMacro("\\ce", function (context) {
return chemParse(context.consumeArgs(1)[0], "ce"); return chemParse(context.consumeArgs(1)[0], "ce");
}); });
katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\pu", function (context) { katex__WEBPACK_IMPORTED_MODULE_0___default().__defineMacro("\\pu", function (context) {
return chemParse(context.consumeArgs(1)[0], "pu"); return chemParse(context.consumeArgs(1)[0], "pu");
}); // Needed for \bond for the ~ forms }); // Needed for \bond for the ~ forms
// Raise by 2.56mu, not 2mu. We're raising a hyphen-minus, U+002D, not // 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. // a mathematical minus, U+2212. So we need that extra 0.56.
katex__WEBPACK_IMPORTED_MODULE_0___default.a.__defineMacro("\\tripledash", "{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2mu" + "\\tiny\\text{-}\\mkern1mu\\text{-}\\mkern1mu\\text{-}\\mkern2mu$}}"); 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. // 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. // It takes the argument to \ce or \pu and returns the corresponding TeX string.
// //
var chemParse = function chemParse(tokens, stateMachine) { var chemParse = function (tokens, stateMachine) {
// Recreate the argument string from KaTeX's array of tokens. // Recreate the argument string from KaTeX's array of tokens.
var str = ""; var str = "";
var expectedLoc = tokens[tokens.length - 1].loc.start; var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start;
for (var i = tokens.length - 1; i >= 0; i--) { for (var i = tokens.length - 1; i >= 0; i--) {
if (tokens[i].loc.start > expectedLoc) { if (tokens[i].loc.start > expectedLoc) {
@ -210,7 +181,7 @@ var mhchemParser = {
// Call like // Call like
// go("H2O"); // go("H2O");
// //
go: function go(input, stateMachine) { go: function (input, stateMachine) {
if (!input) { if (!input) {
return []; return [];
} }
@ -326,7 +297,7 @@ var mhchemParser = {
} }
if (!task.toContinue) { if (!task.toContinue) {
break; break iterateTransitions;
} }
} else { } else {
return output; return output;
@ -342,7 +313,7 @@ var mhchemParser = {
} }
} }
}, },
concatArray: function concatArray(a, b) { concatArray: function (a, b) {
if (b) { if (b) {
if (Array.isArray(b)) { if (Array.isArray(b)) {
for (var iB = 0; iB < b.length; iB++) { for (var iB = 0; iB < b.length; iB++) {
@ -378,7 +349,7 @@ var mhchemParser = {
'digits': /^[0-9]+/, 'digits': /^[0-9]+/,
'-9.,9': /^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/, '-9.,9': /^[+\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+))/,
'-9.,9 no missing 0': /^[+\-]?[0-9]+(?:[.,][0-9]+)?/, '-9.,9 no missing 0': /^[+\-]?[0-9]+(?:[.,][0-9]+)?/,
'(-)(9.,9)(e)(99)': function e99(input) { '(-)(9.,9)(e)(99)': function (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]+\}))?/); 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]) { if (m && m[0]) {
@ -390,7 +361,7 @@ var mhchemParser = {
return null; return null;
}, },
'(-)(9)^(-9)': function _(input) { '(-)(9)^(-9)': function (input) {
var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/); var m = input.match(/^(\+\-|\+\/\-|\+|\-|\\pm\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\.[0-9]+)?)\^([+\-]?[0-9]+|\{[+\-]?[0-9]+\})/);
if (m && m[0]) { if (m && m[0]) {
@ -402,7 +373,7 @@ var mhchemParser = {
return null; return null;
}, },
'state of aggregation $': function stateOfAggregation$(input) { 'state of aggregation $': function (input) {
// ... or crystal system // ... or crystal system
var a = mhchemParser.patterns.findObserveGroups(input, "", /^\([a-z]{1,3}(?=[\),])/, ")", ""); // (aq), (aq,$\infty$), (aq, sat) var a = mhchemParser.patterns.findObserveGroups(input, "", /^\([a-z]{1,3}(?=[\),])/, ")", ""); // (aq), (aq,$\infty$), (aq, sat)
@ -431,51 +402,51 @@ var mhchemParser = {
'. ': /^([.\u22C5\u00B7\u2022])\s*/, '. ': /^([.\u22C5\u00B7\u2022])\s*/,
'...': /^\.\.\.(?=$|[^.])/, '...': /^\.\.\.(?=$|[^.])/,
'* ': /^([*])\s*/, '* ': /^([*])\s*/,
'^{(...)}': function _(input) { '^{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "^{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "^{", "", "", "}");
}, },
'^($...$)': function $$(input) { '^($...$)': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "^", "$", "$", ""); return mhchemParser.patterns.findObserveGroups(input, "^", "$", "$", "");
}, },
'^a': /^\^([0-9]+|[^\\_])/, '^a': /^\^([0-9]+|[^\\_])/,
'^\\x{}{}': function x(input) { '^\\x{}{}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
}, },
'^\\x{}': function x(input) { '^\\x{}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", ""); return mhchemParser.patterns.findObserveGroups(input, "^", /^\\[a-zA-Z]+\{/, "}", "");
}, },
'^\\x': /^\^(\\[a-zA-Z]+)\s*/, '^\\x': /^\^(\\[a-zA-Z]+)\s*/,
'^(-1)': /^\^(-?\d+)/, '^(-1)': /^\^(-?\d+)/,
'\'': /^'/, '\'': /^'/,
'_{(...)}': function _(input) { '_{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "_{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "_{", "", "", "}");
}, },
'_($...$)': function _$$(input) { '_($...$)': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "_", "$", "$", ""); return mhchemParser.patterns.findObserveGroups(input, "_", "$", "$", "");
}, },
'_9': /^_([+\-]?[0-9]+|[^\\])/, '_9': /^_([+\-]?[0-9]+|[^\\])/,
'_\\x{}{}': function _X(input) { '_\\x{}{}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
}, },
'_\\x{}': function _X(input) { '_\\x{}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", ""); return mhchemParser.patterns.findObserveGroups(input, "_", /^\\[a-zA-Z]+\{/, "}", "");
}, },
'_\\x': /^_(\\[a-zA-Z]+)\s*/, '_\\x': /^_(\\[a-zA-Z]+)\s*/,
'^_': /^(?:\^(?=_)|\_(?=\^)|[\^_]$)/, '^_': /^(?:\^(?=_)|\_(?=\^)|[\^_]$)/,
'{}': /^\{\}/, '{}': /^\{\}/,
'{...}': function _(input) { '{...}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "", "{", "}", ""); return mhchemParser.patterns.findObserveGroups(input, "", "{", "}", "");
}, },
'{(...)}': function _(input) { '{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "{", "", "", "}");
}, },
'$...$': function $$(input) { '$...$': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "", "$", "$", ""); return mhchemParser.patterns.findObserveGroups(input, "", "$", "$", "");
}, },
'${(...)}$': function $$(input) { '${(...)}$': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "${", "", "", "}$"); return mhchemParser.patterns.findObserveGroups(input, "${", "", "", "}$");
}, },
'$(...)$': function $$(input) { '$(...)$': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "$", "", "", "$"); return mhchemParser.patterns.findObserveGroups(input, "$", "", "", "$");
}, },
'=<>': /^[=<>]/, '=<>': /^[=<>]/,
@ -489,21 +460,21 @@ var mhchemParser = {
'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/, 'pm-operator': /^(?:\\pm|\$\\pm\$|\+-|\+\/-)/,
'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/, 'operator': /^(?:\+|(?:[\-=<>]|<<|>>|\\approx|\$\\approx\$)(?=\s|$|-?[0-9]))/,
'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/, 'arrowUpDown': /^(?:v|\(v\)|\^|\(\^\))(?=$|[\s,;\)\]\}])/,
'\\bond{(...)}': function bond(input) { '\\bond{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\bond{", "", "", "}");
}, },
'->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/, '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\u2192\u27F6\u21CC])/,
'CMT': /^[CMT](?=\[)/, 'CMT': /^[CMT](?=\[)/,
'[(...)]': function _(input) { '[(...)]': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]"); return mhchemParser.patterns.findObserveGroups(input, "[", "", "", "]");
}, },
'1st-level escape': /^(&|\\\\|\\hline)\s*/, '1st-level escape': /^(&|\\\\|\\hline)\s*/,
'\\,': /^(?:\\[,\ ;:])/, '\\,': /^(?:\\[,\ ;:])/,
// \\x - but output no space before // \\x - but output no space before
'\\x{}{}': function x(input) { '\\x{}{}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true); return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "", "", "{", "}", "", true);
}, },
'\\x{}': function x(input) { '\\x{}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", ""); return mhchemParser.patterns.findObserveGroups(input, "", /^\\[a-zA-Z]+\{/, "}", "");
}, },
'\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/, '\\ca': /^\\ca(?:\s+|(?![a-zA-Z]))/,
@ -511,28 +482,28 @@ var mhchemParser = {
'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/, '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 // only those with numbers in front, because the others will be formatted correctly anyway
'others': /^[\/~|]/, 'others': /^[\/~|]/,
'\\frac{(...)}': function frac(input) { '\\frac{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\frac{", "", "", "}", "{", "", "", "}");
}, },
'\\overset{(...)}': function overset(input) { '\\overset{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\overset{", "", "", "}", "{", "", "", "}");
}, },
"\\underset{(...)}": function underset(input) { '\\underset{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\underset{", "", "", "}", "{", "", "", "}");
}, },
"\\underbrace{(...)}": function underbrace(input) { '\\underbrace{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\underbrace{", "", "", "}_", "{", "", "", "}");
}, },
'\\color{(...)}0': function color0(input) { '\\color{(...)}0': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}");
}, },
'\\color{(...)}{(...)}1': function color1(input) { '\\color{(...)}{(...)}1': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\color{", "", "", "}", "{", "", "", "}");
}, },
'\\color(...){(...)}2': function color2(input) { '\\color(...){(...)}2': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\color", "\\", "", /^(?=\{)/, "{", "", "", "}");
}, },
'\\ce{(...)}': function ce(input) { '\\ce{(...)}': function (input) {
return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}"); return mhchemParser.patterns.findObserveGroups(input, "\\ce{", "", "", "}");
}, },
'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/, 'oxidation$': /^(?:[+-][IVX]+|\\pm\s*0|\$\\pm\$\s*0)$/,
@ -540,7 +511,7 @@ var mhchemParser = {
// 0 could be oxidation or charge // 0 could be oxidation or charge
'roman numeral': /^[IVX]+/, 'roman numeral': /^[IVX]+/,
'1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/, '1/2$': /^[+\-]?(?:[0-9]+|\$[a-z]\$|[a-z])\/[0-9]+(?:\$[a-z]\$|[a-z])?$/,
'amount': function amount(input) { 'amount': function (input) {
var match; // e.g. 2, 0.5, 1/2, -2, n/2, +; $a$ could be added later in parsing 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))/); 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))/);
@ -568,11 +539,11 @@ var mhchemParser = {
return null; return null;
}, },
'amount2': function amount2(input) { 'amount2': function (input) {
return this['amount'](input); return this['amount'](input);
}, },
'(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/, '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,
'formula$': function formula$(input) { 'formula$': function (input) {
if (input.match(/^\([a-z]+\)$/)) { if (input.match(/^\([a-z]+\)$/)) {
return null; return null;
} // state of aggregation = no formula } // state of aggregation = no formula
@ -594,9 +565,9 @@ var mhchemParser = {
'//': /^\s*(\/\/)\s*/, '//': /^\s*(\/\/)\s*/,
'*': /^\s*[*.]\s*/ '*': /^\s*[*.]\s*/
}, },
findObserveGroups: function findObserveGroups(input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) { findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {
/** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */ /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */
var _match = function _match(input, pattern) { var _match = function (input, pattern) {
if (typeof pattern === "string") { if (typeof pattern === "string") {
if (input.indexOf(pattern) !== 0) { if (input.indexOf(pattern) !== 0) {
return null; return null;
@ -616,7 +587,7 @@ var mhchemParser = {
/** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */ /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */
var _findObserveGroups = function _findObserveGroups(input, i, endChars) { var _findObserveGroups = function (input, i, endChars) {
var braces = 0; var braces = 0;
while (i < input.length) { while (i < input.length) {
@ -696,7 +667,7 @@ var mhchemParser = {
// e.g. match("a", input) will look for the regexp called "a" and see if it matches // e.g. match("a", input) will look for the regexp called "a" and see if it matches
// returns null or {match_:"a", remainder:"bc"} // returns null or {match_:"a", remainder:"bc"}
// //
match_: function match_(m, input) { match_: function (m, input) {
var pattern = mhchemParser.patterns.patterns[m]; var pattern = mhchemParser.patterns.patterns[m];
if (pattern === undefined) { if (pattern === undefined) {
@ -732,88 +703,88 @@ var mhchemParser = {
// Generic state machine actions // Generic state machine actions
// //
actions: { actions: {
'a=': function a(buffer, m) { 'a=': function (buffer, m) {
buffer.a = (buffer.a || "") + m; buffer.a = (buffer.a || "") + m;
}, },
'b=': function b(buffer, m) { 'b=': function (buffer, m) {
buffer.b = (buffer.b || "") + m; buffer.b = (buffer.b || "") + m;
}, },
'p=': function p(buffer, m) { 'p=': function (buffer, m) {
buffer.p = (buffer.p || "") + m; buffer.p = (buffer.p || "") + m;
}, },
'o=': function o(buffer, m) { 'o=': function (buffer, m) {
buffer.o = (buffer.o || "") + m; buffer.o = (buffer.o || "") + m;
}, },
'q=': function q(buffer, m) { 'q=': function (buffer, m) {
buffer.q = (buffer.q || "") + m; buffer.q = (buffer.q || "") + m;
}, },
'd=': function d(buffer, m) { 'd=': function (buffer, m) {
buffer.d = (buffer.d || "") + m; buffer.d = (buffer.d || "") + m;
}, },
'rm=': function rm(buffer, m) { 'rm=': function (buffer, m) {
buffer.rm = (buffer.rm || "") + m; buffer.rm = (buffer.rm || "") + m;
}, },
'text=': function text(buffer, m) { 'text=': function (buffer, m) {
buffer.text_ = (buffer.text_ || "") + m; buffer.text_ = (buffer.text_ || "") + m;
}, },
'insert': function insert(buffer, m, a) { 'insert': function (buffer, m, a) {
return { return {
type_: a type_: a
}; };
}, },
'insert+p1': function insertP1(buffer, m, a) { 'insert+p1': function (buffer, m, a) {
return { return {
type_: a, type_: a,
p1: m p1: m
}; };
}, },
'insert+p1+p2': function insertP1P2(buffer, m, a) { 'insert+p1+p2': function (buffer, m, a) {
return { return {
type_: a, type_: a,
p1: m[0], p1: m[0],
p2: m[1] p2: m[1]
}; };
}, },
'copy': function copy(buffer, m) { 'copy': function (buffer, m) {
return m; return m;
}, },
'rm': function rm(buffer, m) { 'rm': function (buffer, m) {
return { return {
type_: 'rm', type_: 'rm',
p1: m || "" p1: m || ""
}; };
}, },
'text': function text(buffer, m) { 'text': function (buffer, m) {
return mhchemParser.go(m, 'text'); return mhchemParser.go(m, 'text');
}, },
'{text}': function text(buffer, m) { '{text}': function (buffer, m) {
var ret = ["{"]; var ret = ["{"];
mhchemParser.concatArray(ret, mhchemParser.go(m, 'text')); mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));
ret.push("}"); ret.push("}");
return ret; return ret;
}, },
'tex-math': function texMath(buffer, m) { 'tex-math': function (buffer, m) {
return mhchemParser.go(m, 'tex-math'); return mhchemParser.go(m, 'tex-math');
}, },
'tex-math tight': function texMathTight(buffer, m) { 'tex-math tight': function (buffer, m) {
return mhchemParser.go(m, 'tex-math tight'); return mhchemParser.go(m, 'tex-math tight');
}, },
'bond': function bond(buffer, m, k) { 'bond': function (buffer, m, k) {
return { return {
type_: 'bond', type_: 'bond',
kind_: k || m kind_: k || m
}; };
}, },
'color0-output': function color0Output(buffer, m) { 'color0-output': function (buffer, m) {
return { return {
type_: 'color0', type_: 'color0',
color: m[0] color: m[0]
}; };
}, },
'ce': function ce(buffer, m) { 'ce': function (buffer, m) {
return mhchemParser.go(m); return mhchemParser.go(m);
}, },
'1/2': function _(buffer, m) { '1/2': function (buffer, m) {
/** @type {ParserOutput[]} */ /** @type {ParserOutput[]} */
var ret = []; var ret = [];
@ -840,7 +811,7 @@ var mhchemParser = {
return ret; return ret;
}, },
'9,9': function _(buffer, m) { '9,9': function (buffer, m) {
return mhchemParser.go(m, '9,9'); return mhchemParser.go(m, '9,9');
} }
}, },
@ -849,7 +820,7 @@ var mhchemParser = {
// convert { 'letter': { 'state': { action_: 'output' } } } to { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] } // 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) // with expansion of 'a|b' to 'a' and 'b' (at 2 places)
// //
createTransitions: function createTransitions(o) { createTransitions: function (o) {
var pattern, state; var pattern, state;
/** @type {string[]} */ /** @type {string[]} */
@ -1485,7 +1456,7 @@ mhchemParser.stateMachines = {
nextState: '3' nextState: '3'
} }
}, },
"\\underset{(...)}": { '\\underset{(...)}': {
'*': { '*': {
action_: [{ action_: [{
type_: 'output', type_: 'output',
@ -1494,7 +1465,7 @@ mhchemParser.stateMachines = {
nextState: '3' nextState: '3'
} }
}, },
"\\underbrace{(...)}": { '\\underbrace{(...)}': {
'*': { '*': {
action_: [{ action_: [{
type_: 'output', type_: 'output',
@ -1580,7 +1551,7 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'o after d': function oAfterD(buffer, m) { 'o after d': function (buffer, m) {
var ret; var ret;
if ((buffer.d || "").match(/^[0-9]+$/)) { if ((buffer.d || "").match(/^[0-9]+$/)) {
@ -1595,11 +1566,11 @@ mhchemParser.stateMachines = {
mhchemParser.actions['o='](buffer, m); mhchemParser.actions['o='](buffer, m);
return ret; return ret;
}, },
'd= kv': function dKv(buffer, m) { 'd= kv': function (buffer, m) {
buffer.d = m; buffer.d = m;
buffer.dType = 'kv'; buffer.dType = 'kv';
}, },
'charge or bond': function chargeOrBond(buffer, m) { 'charge or bond': function (buffer, m) {
if (buffer['beginsWithBond']) { if (buffer['beginsWithBond']) {
/** @type {ParserOutput[]} */ /** @type {ParserOutput[]} */
var ret = []; var ret = [];
@ -1610,7 +1581,7 @@ mhchemParser.stateMachines = {
buffer.d = m; buffer.d = m;
} }
}, },
'- after o/d': function afterOD(buffer, m, isAfterD) { '- after o/d': function (buffer, m, isAfterD) {
var c1 = mhchemParser.patterns.match_('orbital', buffer.o || ""); var c1 = mhchemParser.patterns.match_('orbital', buffer.o || "");
var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', 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 c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || "");
@ -1644,35 +1615,35 @@ mhchemParser.stateMachines = {
return ret; return ret;
}, },
'a to o': function aToO(buffer) { 'a to o': function (buffer) {
buffer.o = buffer.a; buffer.o = buffer.a;
buffer.a = undefined; buffer.a = undefined;
}, },
'sb=true': function sbTrue(buffer) { 'sb=true': function (buffer) {
buffer.sb = true; buffer.sb = true;
}, },
'sb=false': function sbFalse(buffer) { 'sb=false': function (buffer) {
buffer.sb = false; buffer.sb = false;
}, },
'beginsWithBond=true': function beginsWithBondTrue(buffer) { 'beginsWithBond=true': function (buffer) {
buffer['beginsWithBond'] = true; buffer['beginsWithBond'] = true;
}, },
'beginsWithBond=false': function beginsWithBondFalse(buffer) { 'beginsWithBond=false': function (buffer) {
buffer['beginsWithBond'] = false; buffer['beginsWithBond'] = false;
}, },
'parenthesisLevel++': function parenthesisLevel(buffer) { 'parenthesisLevel++': function (buffer) {
buffer['parenthesisLevel']++; buffer['parenthesisLevel']++;
}, },
'parenthesisLevel--': function parenthesisLevel(buffer) { 'parenthesisLevel--': function (buffer) {
buffer['parenthesisLevel']--; buffer['parenthesisLevel']--;
}, },
'state of aggregation': function stateOfAggregation(buffer, m) { 'state of aggregation': function (buffer, m) {
return { return {
type_: 'state of aggregation', type_: 'state of aggregation',
p1: mhchemParser.go(m, 'o') p1: mhchemParser.go(m, 'o')
}; };
}, },
'comma': function comma(buffer, m) { 'comma': function (buffer, m) {
var a = m.replace(/\s*$/, ''); var a = m.replace(/\s*$/, '');
var withSpace = a !== m; var withSpace = a !== m;
@ -1688,7 +1659,7 @@ mhchemParser.stateMachines = {
}; };
} }
}, },
'output': function output(buffer, m, entityFollows) { 'output': function (buffer, m, entityFollows) {
// entityFollows: // entityFollows:
// undefined = if we have nothing else to output, also ignore the just read space (buffer.sb) // 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) // 1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)
@ -1783,63 +1754,63 @@ mhchemParser.stateMachines = {
return ret; return ret;
}, },
'oxidation-output': function oxidationOutput(buffer, m) { 'oxidation-output': function (buffer, m) {
var ret = ["{"]; var ret = ["{"];
mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation')); mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));
ret.push("}"); ret.push("}");
return ret; return ret;
}, },
'frac-output': function fracOutput(buffer, m) { 'frac-output': function (buffer, m) {
return { return {
type_: 'frac-ce', type_: 'frac-ce',
p1: mhchemParser.go(m[0]), p1: mhchemParser.go(m[0]),
p2: mhchemParser.go(m[1]) p2: mhchemParser.go(m[1])
}; };
}, },
'overset-output': function oversetOutput(buffer, m) { 'overset-output': function (buffer, m) {
return { return {
type_: 'overset', type_: 'overset',
p1: mhchemParser.go(m[0]), p1: mhchemParser.go(m[0]),
p2: mhchemParser.go(m[1]) p2: mhchemParser.go(m[1])
}; };
}, },
'underset-output': function undersetOutput(buffer, m) { 'underset-output': function (buffer, m) {
return { return {
type_: 'underset', type_: 'underset',
p1: mhchemParser.go(m[0]), p1: mhchemParser.go(m[0]),
p2: mhchemParser.go(m[1]) p2: mhchemParser.go(m[1])
}; };
}, },
'underbrace-output': function underbraceOutput(buffer, m) { 'underbrace-output': function (buffer, m) {
return { return {
type_: 'underbrace', type_: 'underbrace',
p1: mhchemParser.go(m[0]), p1: mhchemParser.go(m[0]),
p2: mhchemParser.go(m[1]) p2: mhchemParser.go(m[1])
}; };
}, },
'color-output': function colorOutput(buffer, m) { 'color-output': function (buffer, m) {
return { return {
type_: 'color', type_: 'color',
color1: m[0], color1: m[0],
color2: mhchemParser.go(m[1]) color2: mhchemParser.go(m[1])
}; };
}, },
'r=': function r(buffer, m) { 'r=': function (buffer, m) {
buffer.r = m; buffer.r = m;
}, },
'rdt=': function rdt(buffer, m) { 'rdt=': function (buffer, m) {
buffer.rdt = m; buffer.rdt = m;
}, },
'rd=': function rd(buffer, m) { 'rd=': function (buffer, m) {
buffer.rd = m; buffer.rd = m;
}, },
'rqt=': function rqt(buffer, m) { 'rqt=': function (buffer, m) {
buffer.rqt = m; buffer.rqt = m;
}, },
'rq=': function rq(buffer, m) { 'rq=': function (buffer, m) {
buffer.rq = m; buffer.rq = m;
}, },
'operator': function operator(buffer, m, p1) { 'operator': function (buffer, m, p1) {
return { return {
type_: 'operator', type_: 'operator',
kind_: p1 || m kind_: p1 || m
@ -1971,7 +1942,7 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'output': function output(buffer) { 'output': function (buffer) {
if (buffer.text_) { if (buffer.text_) {
/** @type {ParserOutput} */ /** @type {ParserOutput} */
var ret = { var ret = {
@ -2087,13 +2058,13 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'state of aggregation': function stateOfAggregation(buffer, m) { 'state of aggregation': function (buffer, m) {
return { return {
type_: 'state of aggregation subscript', type_: 'state of aggregation subscript',
p1: mhchemParser.go(m, 'o') p1: mhchemParser.go(m, 'o')
}; };
}, },
'color-output': function colorOutput(buffer, m) { 'color-output': function (buffer, m) {
return { return {
type_: 'color', type_: 'color',
color1: m[0], color1: m[0],
@ -2201,7 +2172,7 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'color-output': function colorOutput(buffer, m) { 'color-output': function (buffer, m) {
return { return {
type_: 'color', type_: 'color',
color1: m[0], color1: m[0],
@ -2232,7 +2203,7 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'roman-numeral': function romanNumeral(buffer, m) { 'roman-numeral': function (buffer, m) {
return { return {
type_: 'roman numeral', type_: 'roman numeral',
p1: m || "" p1: m || ""
@ -2264,7 +2235,7 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'output': function output(buffer) { 'output': function (buffer) {
if (buffer.o) { if (buffer.o) {
/** @type {ParserOutput} */ /** @type {ParserOutput} */
var ret = { var ret = {
@ -2310,10 +2281,10 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'tight operator': function tightOperator(buffer, m) { 'tight operator': function (buffer, m) {
buffer.o = (buffer.o || "") + "{" + m + "}"; buffer.o = (buffer.o || "") + "{" + m + "}";
}, },
'output': function output(buffer) { 'output': function (buffer) {
if (buffer.o) { if (buffer.o) {
/** @type {ParserOutput} */ /** @type {ParserOutput} */
var ret = { var ret = {
@ -2347,7 +2318,7 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'comma': function comma() { 'comma': function () {
return { return {
type_: 'commaDecimal' type_: 'commaDecimal'
}; };
@ -2434,7 +2405,7 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'enumber': function enumber(buffer, m) { 'enumber': function (buffer, m) {
/** @type {ParserOutput[]} */ /** @type {ParserOutput[]} */
var ret = []; var ret = [];
@ -2478,7 +2449,7 @@ mhchemParser.stateMachines = {
return ret; return ret;
}, },
'number^': function number(buffer, m) { 'number^': function (buffer, m) {
/** @type {ParserOutput[]} */ /** @type {ParserOutput[]} */
var ret = []; var ret = [];
@ -2492,18 +2463,18 @@ mhchemParser.stateMachines = {
ret.push("^{" + m[2] + "}"); ret.push("^{" + m[2] + "}");
return ret; return ret;
}, },
'operator': function operator(buffer, m, p1) { 'operator': function (buffer, m, p1) {
return { return {
type_: 'operator', type_: 'operator',
kind_: p1 || m kind_: p1 || m
}; };
}, },
'space': function space() { 'space': function () {
return { return {
type_: 'pu-space-1' type_: 'pu-space-1'
}; };
}, },
'output': function output(buffer) { 'output': function (buffer) {
/** @type {ParserOutput | ParserOutput[]} */ /** @type {ParserOutput | ParserOutput[]} */
var ret; var ret;
var md = mhchemParser.patterns.match_('{(...)}', buffer.d || ""); var md = mhchemParser.patterns.match_('{(...)}', buffer.d || "");
@ -2613,20 +2584,20 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'cdot': function cdot() { 'cdot': function () {
return { return {
type_: 'tight cdot' type_: 'tight cdot'
}; };
}, },
'^(-1)': function _(buffer, m) { '^(-1)': function (buffer, m) {
buffer.rm += "^{" + m + "}"; buffer.rm += "^{" + m + "}";
}, },
'space': function space() { 'space': function () {
return { return {
type_: 'pu-space-2' type_: 'pu-space-2'
}; };
}, },
'output': function output(buffer) { 'output': function (buffer) {
/** @type {ParserOutput | ParserOutput[]} */ /** @type {ParserOutput | ParserOutput[]} */
var ret = []; var ret = [];
@ -2680,12 +2651,12 @@ mhchemParser.stateMachines = {
} }
}), }),
actions: { actions: {
'comma': function comma() { 'comma': function () {
return { return {
type_: 'commaDecimal' type_: 'commaDecimal'
}; };
}, },
'output-0': function output0(buffer) { 'output-0': function (buffer) {
/** @type {ParserOutput[]} */ /** @type {ParserOutput[]} */
var ret = []; var ret = [];
buffer.text_ = buffer.text_ || ""; buffer.text_ = buffer.text_ || "";
@ -2716,7 +2687,7 @@ mhchemParser.stateMachines = {
return ret; return ret;
}, },
'output-o': function outputO(buffer) { 'output-o': function (buffer) {
/** @type {ParserOutput[]} */ /** @type {ParserOutput[]} */
var ret = []; var ret = [];
buffer.text_ = buffer.text_ || ""; buffer.text_ = buffer.text_ || "";
@ -2742,9 +2713,9 @@ mhchemParser.stateMachines = {
return ret; return ret;
} }
}
} //#endregion } //#endregion
}
}; // }; //
// texify: Take MhchemParser output and convert it to TeX // texify: Take MhchemParser output and convert it to TeX
// //
@ -2752,7 +2723,7 @@ mhchemParser.stateMachines = {
/** @type {Texify} */ /** @type {Texify} */
var texify = { var texify = {
go: function go(input, isInner) { go: function (input, isInner) {
// (recursive, max 4 levels) // (recursive, max 4 levels)
if (!input) { if (!input) {
return ""; return "";
@ -2781,14 +2752,14 @@ var texify = {
return res; return res;
}, },
_goInner: function _goInner(input) { _goInner: function (input) {
if (!input) { if (!input) {
return input; return input;
} }
return texify.go(input, true); return texify.go(input, true);
}, },
_go2: function _go2(buf) { _go2: function (buf) {
/** @type {undefined | string} */ /** @type {undefined | string} */
var res; var res;
@ -3079,7 +3050,7 @@ var texify = {
assertString(res); assertString(res);
return res; return res;
}, },
_getArrow: function _getArrow(a) { _getArrow: function (a) {
switch (a) { switch (a) {
case "->": case "->":
return "rightarrow"; return "rightarrow";
@ -3116,7 +3087,7 @@ var texify = {
throw ["MhchemBugT", "mhchem bug T. Please report."]; throw ["MhchemBugT", "mhchem bug T. Please report."];
} }
}, },
_getBond: function _getBond(a) { _getBond: function (a) {
switch (a) { switch (a) {
case "-": case "-":
return "{-}"; return "{-}";
@ -3174,7 +3145,7 @@ var texify = {
throw ["MhchemBugT", "mhchem bug T. Please report."]; throw ["MhchemBugT", "mhchem bug T. Please report."];
} }
}, },
_getOperator: function _getOperator(a) { _getOperator: function (a) {
switch (a) { switch (a) {
case "+": case "+":
return " {}+{} "; return " {}+{} ";
@ -3224,7 +3195,7 @@ var texify = {
} }
} }
}; // }; //
// Helpers for code anaylsis // Helpers for code analysis
// Will show type error at calling position // Will show type error at calling position
// //
@ -3235,7 +3206,8 @@ function assertNever(a) {}
function assertString(a) {} function assertString(a) {}
__webpack_exports__ = __webpack_exports__["default"];
/***/ }) /******/ return __webpack_exports__;
/******/ ])["default"]; /******/ })()
;
}); });

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@ import katex from '../katex.mjs';
/* eslint-disable */ /* eslint-disable */
/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ /* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */ /* vim: set ts=2 et sw=2 tw=80: */
@ -71,7 +71,7 @@ katex.__defineMacro("\\tripledash", "{\\vphantom{-}\\raisebox{2.56mu}{$\\mkern2m
var chemParse = function chemParse(tokens, stateMachine) { var chemParse = function chemParse(tokens, stateMachine) {
// Recreate the argument string from KaTeX's array of tokens. // Recreate the argument string from KaTeX's array of tokens.
var str = ""; var str = "";
var expectedLoc = tokens[tokens.length - 1].loc.start; var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start;
for (var i = tokens.length - 1; i >= 0; i--) { for (var i = tokens.length - 1; i >= 0; i--) {
if (tokens[i].loc.start > expectedLoc) { if (tokens[i].loc.start > expectedLoc) {
@ -216,7 +216,7 @@ var mhchemParser = {
} }
if (!task.toContinue) { if (!task.toContinue) {
break; break iterateTransitions;
} }
} else { } else {
return output; return output;
@ -2631,9 +2631,9 @@ mhchemParser.stateMachines = {
return ret; return ret;
} }
}
} //#endregion } //#endregion
}
}; // }; //
// texify: Take MhchemParser output and convert it to TeX // texify: Take MhchemParser output and convert it to TeX
// //

View File

@ -7,106 +7,77 @@
var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]); var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]);
for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
} }
})((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) { })((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__757__) {
return /******/ (function(modules) { // webpackBootstrap return /******/ (function() { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ 757:
/***/ (function(module) {
module.exports = __WEBPACK_EXTERNAL_MODULE__757__;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache /******/ // The module cache
/******/ var installedModules = {}; /******/ var __webpack_module_cache__ = {};
/******/ /******/
/******/ // The require function /******/ // The require function
/******/ function __webpack_require__(moduleId) { /******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache /******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) { /******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ return installedModules[moduleId].exports; /******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ } /******/ }
/******/ // Create a new module (and put it into the cache) /******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = { /******/ var module = __webpack_module_cache__[moduleId] = {
/******/ i: moduleId, /******/ // no module.id needed
/******/ l: false, /******/ // no module.loaded needed
/******/ exports: {} /******/ exports: {}
/******/ }; /******/ };
/******/ /******/
/******/ // Execute the module function /******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/ /******/
/******/ // Return the exports of the module /******/ // Return the exports of the module
/******/ return module.exports; /******/ return module.exports;
/******/ } /******/ }
/******/ /******/
/******/ /************************************************************************/
/******/ // expose the modules object (__webpack_modules__) /******/ /* webpack/runtime/compat get default export */
/******/ __webpack_require__.m = modules; /******/ !function() {
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules /******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) { /******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ? /******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } : /******/ function() { return module['default']; } :
/******/ function getModuleExports() { return module; }; /******/ function() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter); /******/ __webpack_require__.d(getter, { a: getter });
/******/ return getter; /******/ return getter;
/******/ }; /******/ };
/******/ }();
/******/ /******/
/******/ // Object.prototype.hasOwnProperty.call /******/ /* webpack/runtime/define property getters */
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ !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_public_path__ /******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ __webpack_require__.p = ""; /******/ !function() {
/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }
/******/ }();
/******/ /******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = 1);
/******/ })
/************************************************************************/ /************************************************************************/
/******/ ([ var __webpack_exports__ = {};
/* 0 */ /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(757);
/***/ (function(module, exports) {
module.exports = __WEBPACK_EXTERNAL_MODULE__0__;
/***/ }),
/* 1 */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
/* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__);
/** /**
* renderA11yString returns a readable string. * renderA11yString returns a readable string.
@ -127,7 +98,7 @@ __webpack_require__.r(__webpack_exports__);
// included in the build. // included in the build.
// $FlowIgnore: we import the types directly anyways // $FlowIgnore: we import the types directly anyways
var stringMap = { const stringMap = {
"(": "left parenthesis", "(": "left parenthesis",
")": "right parenthesis", ")": "right parenthesis",
"[": "open bracket", "[": "open bracket",
@ -200,22 +171,22 @@ var stringMap = {
"\\hat": "hat", "\\hat": "hat",
"\\acute": "acute" "\\acute": "acute"
}; };
var powerMap = { const powerMap = {
"prime": "prime", "prime": "prime",
"degree": "degrees", "degree": "degrees",
"circle": "degrees", "circle": "degrees",
"2": "squared", "2": "squared",
"3": "cubed" "3": "cubed"
}; };
var openMap = { const openMap = {
"|": "open vertical bar", "|": "open vertical bar",
".": "" ".": ""
}; };
var closeMap = { const closeMap = {
"|": "close vertical bar", "|": "close vertical bar",
".": "" ".": ""
}; };
var binMap = { const binMap = {
"+": "plus", "+": "plus",
"-": "minus", "-": "minus",
"\\pm": "plus minus", "\\pm": "plus minus",
@ -227,7 +198,7 @@ var binMap = {
"\\circ": "circle", "\\circ": "circle",
"\\bullet": "bullet" "\\bullet": "bullet"
}; };
var relMap = { const relMap = {
"=": "equals", "=": "equals",
"\\approx": "approximately equals", "\\approx": "approximately equals",
"≠": "does not equal", "≠": "does not equal",
@ -243,7 +214,7 @@ var relMap = {
"\\Rightarrow": "right arrow", "\\Rightarrow": "right arrow",
":": "colon" ":": "colon"
}; };
var accentUnderMap = { const accentUnderMap = {
"\\underleftarrow": "left arrow", "\\underleftarrow": "left arrow",
"\\underrightarrow": "right arrow", "\\underrightarrow": "right arrow",
"\\underleftrightarrow": "left-right arrow", "\\underleftrightarrow": "left-right arrow",
@ -252,12 +223,12 @@ var accentUnderMap = {
"\\utilde": "tilde" "\\utilde": "tilde"
}; };
var buildString = function buildString(str, type, a11yStrings) { const buildString = (str, type, a11yStrings) => {
if (!str) { if (!str) {
return; return;
} }
var ret; let ret;
if (type === "open") { if (type === "open") {
ret = str in openMap ? openMap[str] : stringMap[str] || str; ret = str in openMap ? openMap[str] : stringMap[str] || str;
@ -276,7 +247,8 @@ var buildString = function buildString(str, type, a11yStrings) {
if (/^\d+$/.test(ret) && a11yStrings.length > 0 && // TODO(kevinb): check that the last item in a11yStrings is a string 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 // I think we might be able to drop the nested arrays, which would make
// this easier to type - $FlowFixMe // this easier to type
// $FlowFixMe
/^\d+$/.test(a11yStrings[a11yStrings.length - 1])) { /^\d+$/.test(a11yStrings[a11yStrings.length - 1])) {
a11yStrings[a11yStrings.length - 1] += ret; a11yStrings[a11yStrings.length - 1] += ret;
} else if (ret) { } else if (ret) {
@ -284,18 +256,18 @@ var buildString = function buildString(str, type, a11yStrings) {
} }
}; };
var buildRegion = function buildRegion(a11yStrings, callback) { const buildRegion = (a11yStrings, callback) => {
var regionStrings = []; const regionStrings = [];
a11yStrings.push(regionStrings); a11yStrings.push(regionStrings);
callback(regionStrings); callback(regionStrings);
}; };
var handleObject = function handleObject(tree, a11yStrings, atomType) { const handleObject = (tree, a11yStrings, atomType) => {
// Everything else is assumed to be an object... // Everything else is assumed to be an object...
switch (tree.type) { switch (tree.type) {
case "accent": case "accent":
{ {
buildRegion(a11yStrings, function (a11yStrings) { buildRegion(a11yStrings, a11yStrings => {
buildA11yStrings(tree.base, a11yStrings, atomType); buildA11yStrings(tree.base, a11yStrings, atomType);
a11yStrings.push("with"); a11yStrings.push("with");
buildString(tree.label, "normal", a11yStrings); buildString(tree.label, "normal", a11yStrings);
@ -306,7 +278,7 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
case "accentUnder": case "accentUnder":
{ {
buildRegion(a11yStrings, function (a11yStrings) { buildRegion(a11yStrings, a11yStrings => {
buildA11yStrings(tree.base, a11yStrings, atomType); buildA11yStrings(tree.base, a11yStrings, atomType);
a11yStrings.push("with"); a11yStrings.push("with");
buildString(accentUnderMap[tree.label], "normal", a11yStrings); buildString(accentUnderMap[tree.label], "normal", a11yStrings);
@ -323,7 +295,9 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
case "atom": case "atom":
{ {
var text = tree.text; const {
text
} = tree;
switch (tree.family) { switch (tree.family) {
case "bin": case "bin":
@ -375,8 +349,8 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
case "color": case "color":
{ {
var color = tree.color.replace(/katex-/, ""); const color = tree.color.replace(/katex-/, "");
buildRegion(a11yStrings, function (regionStrings) { buildRegion(a11yStrings, regionStrings => {
regionStrings.push("start color " + color); regionStrings.push("start color " + color);
buildA11yStrings(tree.body, regionStrings, atomType); buildA11yStrings(tree.body, regionStrings, atomType);
regionStrings.push("end color " + color); regionStrings.push("end color " + color);
@ -402,10 +376,12 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
case "genfrac": case "genfrac":
{ {
buildRegion(a11yStrings, function (regionStrings) { buildRegion(a11yStrings, regionStrings => {
// genfrac can have unbalanced delimiters // genfrac can have unbalanced delimiters
var leftDelim = tree.leftDelim, const {
rightDelim = tree.rightDelim; // NOTE: Not sure if this is a safe assumption leftDelim,
rightDelim
} = tree; // NOTE: Not sure if this is a safe assumption
// hasBarLine true -> fraction, false -> binomial // hasBarLine true -> fraction, false -> binomial
if (tree.hasBarLine) { if (tree.hasBarLine) {
@ -429,6 +405,12 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
break; break;
} }
case "hbox":
{
buildA11yStrings(tree.body, a11yStrings, atomType);
break;
}
case "kern": case "kern":
{ {
// No op: we don't attempt to present kerning information // No op: we don't attempt to present kerning information
@ -438,7 +420,7 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
case "leftright": case "leftright":
{ {
buildRegion(a11yStrings, function (regionStrings) { buildRegion(a11yStrings, regionStrings => {
buildString(tree.left, "open", regionStrings); buildString(tree.left, "open", regionStrings);
buildA11yStrings(tree.body, regionStrings, atomType); buildA11yStrings(tree.body, regionStrings, atomType);
buildString(tree.right, "close", regionStrings); buildString(tree.right, "close", regionStrings);
@ -466,8 +448,10 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
case "op": case "op":
{ {
var body = tree.body, const {
name = tree.name; body,
name
} = tree;
if (body) { if (body) {
buildA11yStrings(body, a11yStrings, atomType); buildA11yStrings(body, a11yStrings, atomType);
@ -501,6 +485,12 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
break; break;
} }
case "pmb":
{
a11yStrings.push("bold");
break;
}
case "phantom": case "phantom":
{ {
a11yStrings.push("empty space"); a11yStrings.push("empty space");
@ -540,12 +530,14 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
case "sqrt": case "sqrt":
{ {
buildRegion(a11yStrings, function (regionStrings) { buildRegion(a11yStrings, regionStrings => {
var body = tree.body, const {
index = tree.index; body,
index
} = tree;
if (index) { if (index) {
var indexString = flatten(buildA11yStrings(index, [], atomType)).join(","); const indexString = flatten(buildA11yStrings(index, [], atomType)).join(",");
if (indexString === "3") { if (indexString === "3") {
regionStrings.push("cube root of"); regionStrings.push("cube root of");
@ -570,10 +562,12 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
case "supsub": case "supsub":
{ {
var base = tree.base, const {
sub = tree.sub, base,
sup = tree.sup; sub,
var isLog = false; sup
} = tree;
let isLog = false;
if (base) { if (base) {
buildA11yStrings(base, a11yStrings, atomType); buildA11yStrings(base, a11yStrings, atomType);
@ -581,7 +575,7 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
} }
if (sub) { if (sub) {
var regionName = isLog ? "base" : "subscript"; const regionName = isLog ? "base" : "subscript";
buildRegion(a11yStrings, function (regionStrings) { buildRegion(a11yStrings, function (regionStrings) {
regionStrings.push("start " + regionName); regionStrings.push("start " + regionName);
buildA11yStrings(sub, regionStrings, atomType); buildA11yStrings(sub, regionStrings, atomType);
@ -591,7 +585,7 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
if (sup) { if (sup) {
buildRegion(a11yStrings, function (regionStrings) { buildRegion(a11yStrings, function (regionStrings) {
var supString = flatten(buildA11yStrings(sup, [], atomType)).join(","); const supString = flatten(buildA11yStrings(sup, [], atomType)).join(",");
if (supString in powerMap) { if (supString in powerMap) {
regionStrings.push(powerMap[supString]); regionStrings.push(powerMap[supString]);
@ -665,11 +659,24 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
regionStrings.push("end strikeout"); regionStrings.push("end strikeout");
}); });
break; 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"); throw new Error("KaTeX-a11y: enclose node with " + tree.label + " not supported yet");
} }
case "vcenter":
{
buildA11yStrings(tree.body, a11yStrings, atomType);
break;
}
case "vphantom": case "vphantom":
{ {
throw new Error("KaTeX-a11y: vphantom not implemented yet"); throw new Error("KaTeX-a11y: vphantom not implemented yet");
@ -779,20 +786,29 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
throw new Error("KaTeX-a11y: xArrow not implemented yet"); 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": case "mclass":
{ {
// \neq and \ne are macros so we let "htmlmathml" render the mathmal // \neq and \ne are macros so we let "htmlmathml" render the mathmal
// side of things and extract the text from that. // 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 const atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass
buildA11yStrings(tree.body, a11yStrings, atomType);
buildA11yStrings(tree.body, a11yStrings, _atomType);
break; break;
} }
case "mathchoice": case "mathchoice":
{ {
// TODO: track which which style we're using, e.g. dispaly, text, etc. // TODO: track which style we're using, e.g. display, text, etc.
// default to text style if even that may not be the correct style // default to text style if even that may not be the correct style
buildA11yStrings(tree.text, a11yStrings, atomType); buildA11yStrings(tree.text, a11yStrings, atomType);
break; break;
@ -828,13 +844,13 @@ var handleObject = function handleObject(tree, a11yStrings, atomType) {
} }
}; };
var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) { const buildA11yStrings = function (tree, a11yStrings, atomType) {
if (a11yStrings === void 0) { if (a11yStrings === void 0) {
a11yStrings = []; a11yStrings = [];
} }
if (tree instanceof Array) { if (tree instanceof Array) {
for (var i = 0; i < tree.length; i++) { for (let i = 0; i < tree.length; i++) {
buildA11yStrings(tree[i], a11yStrings, atomType); buildA11yStrings(tree[i], a11yStrings, atomType);
} }
} else { } else {
@ -844,8 +860,8 @@ var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) {
return a11yStrings; return a11yStrings;
}; };
var flatten = function flatten(array) { const flatten = function (array) {
var result = []; let result = [];
array.forEach(function (item) { array.forEach(function (item) {
if (item instanceof Array) { if (item instanceof Array) {
result = result.concat(flatten(item)); result = result.concat(flatten(item));
@ -856,15 +872,16 @@ var flatten = function flatten(array) {
return result; return result;
}; };
var renderA11yString = function renderA11yString(text, settings) { const renderA11yString = function (text, settings) {
var tree = katex__WEBPACK_IMPORTED_MODULE_0___default.a.__parse(text, settings); const tree = katex__WEBPACK_IMPORTED_MODULE_0___default().__parse(text, settings);
var a11yStrings = buildA11yStrings(tree, [], "normal"); const a11yStrings = buildA11yStrings(tree, [], "normal");
return flatten(a11yStrings).join(", "); return flatten(a11yStrings).join(", ");
}; };
/* harmony default export */ __webpack_exports__["default"] = (renderA11yString); /* harmony default export */ __webpack_exports__["default"] = (renderA11yString);
__webpack_exports__ = __webpack_exports__["default"];
/***/ }) /******/ return __webpack_exports__;
/******/ ])["default"]; /******/ })()
;
}); });

File diff suppressed because one or more lines are too long

View File

@ -15,7 +15,7 @@ import katex from '../katex.mjs';
* The commas in the string aim to increase ease of understanding * The commas in the string aim to increase ease of understanding
* when read by a screenreader. * when read by a screenreader.
*/ */
const stringMap = { var stringMap = {
"(": "left parenthesis", "(": "left parenthesis",
")": "right parenthesis", ")": "right parenthesis",
"[": "open bracket", "[": "open bracket",
@ -88,22 +88,22 @@ const stringMap = {
"\\hat": "hat", "\\hat": "hat",
"\\acute": "acute" "\\acute": "acute"
}; };
const powerMap = { var powerMap = {
"prime": "prime", "prime": "prime",
"degree": "degrees", "degree": "degrees",
"circle": "degrees", "circle": "degrees",
"2": "squared", "2": "squared",
"3": "cubed" "3": "cubed"
}; };
const openMap = { var openMap = {
"|": "open vertical bar", "|": "open vertical bar",
".": "" ".": ""
}; };
const closeMap = { var closeMap = {
"|": "close vertical bar", "|": "close vertical bar",
".": "" ".": ""
}; };
const binMap = { var binMap = {
"+": "plus", "+": "plus",
"-": "minus", "-": "minus",
"\\pm": "plus minus", "\\pm": "plus minus",
@ -115,7 +115,7 @@ const binMap = {
"\\circ": "circle", "\\circ": "circle",
"\\bullet": "bullet" "\\bullet": "bullet"
}; };
const relMap = { var relMap = {
"=": "equals", "=": "equals",
"\\approx": "approximately equals", "\\approx": "approximately equals",
"≠": "does not equal", "≠": "does not equal",
@ -131,7 +131,7 @@ const relMap = {
"\\Rightarrow": "right arrow", "\\Rightarrow": "right arrow",
":": "colon" ":": "colon"
}; };
const accentUnderMap = { var accentUnderMap = {
"\\underleftarrow": "left arrow", "\\underleftarrow": "left arrow",
"\\underrightarrow": "right arrow", "\\underrightarrow": "right arrow",
"\\underleftrightarrow": "left-right arrow", "\\underleftrightarrow": "left-right arrow",
@ -140,12 +140,12 @@ const accentUnderMap = {
"\\utilde": "tilde" "\\utilde": "tilde"
}; };
const buildString = (str, type, a11yStrings) => { var buildString = (str, type, a11yStrings) => {
if (!str) { if (!str) {
return; return;
} }
let ret; var ret;
if (type === "open") { if (type === "open") {
ret = str in openMap ? openMap[str] : stringMap[str] || str; ret = str in openMap ? openMap[str] : stringMap[str] || str;
@ -164,7 +164,8 @@ const buildString = (str, type, a11yStrings) => {
if (/^\d+$/.test(ret) && a11yStrings.length > 0 && // TODO(kevinb): check that the last item in a11yStrings is a string 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 // I think we might be able to drop the nested arrays, which would make
// this easier to type - $FlowFixMe // this easier to type
// $FlowFixMe
/^\d+$/.test(a11yStrings[a11yStrings.length - 1])) { /^\d+$/.test(a11yStrings[a11yStrings.length - 1])) {
a11yStrings[a11yStrings.length - 1] += ret; a11yStrings[a11yStrings.length - 1] += ret;
} else if (ret) { } else if (ret) {
@ -172,13 +173,13 @@ const buildString = (str, type, a11yStrings) => {
} }
}; };
const buildRegion = (a11yStrings, callback) => { var buildRegion = (a11yStrings, callback) => {
const regionStrings = []; var regionStrings = [];
a11yStrings.push(regionStrings); a11yStrings.push(regionStrings);
callback(regionStrings); callback(regionStrings);
}; };
const handleObject = (tree, a11yStrings, atomType) => { var handleObject = (tree, a11yStrings, atomType) => {
// Everything else is assumed to be an object... // Everything else is assumed to be an object...
switch (tree.type) { switch (tree.type) {
case "accent": case "accent":
@ -211,7 +212,9 @@ const handleObject = (tree, a11yStrings, atomType) => {
case "atom": case "atom":
{ {
const text = tree.text; var {
text
} = tree;
switch (tree.family) { switch (tree.family) {
case "bin": case "bin":
@ -254,7 +257,7 @@ const handleObject = (tree, a11yStrings, atomType) => {
default: default:
{ {
tree.family; tree.family;
throw new Error(`"${tree.family}" is not a valid atom type`); throw new Error("\"" + tree.family + "\" is not a valid atom type");
} }
} }
@ -263,7 +266,7 @@ const handleObject = (tree, a11yStrings, atomType) => {
case "color": case "color":
{ {
const color = tree.color.replace(/katex-/, ""); var color = tree.color.replace(/katex-/, "");
buildRegion(a11yStrings, regionStrings => { buildRegion(a11yStrings, regionStrings => {
regionStrings.push("start color " + color); regionStrings.push("start color " + color);
buildA11yStrings(tree.body, regionStrings, atomType); buildA11yStrings(tree.body, regionStrings, atomType);
@ -292,8 +295,10 @@ const handleObject = (tree, a11yStrings, atomType) => {
{ {
buildRegion(a11yStrings, regionStrings => { buildRegion(a11yStrings, regionStrings => {
// genfrac can have unbalanced delimiters // genfrac can have unbalanced delimiters
const leftDelim = tree.leftDelim, var {
rightDelim = tree.rightDelim; // NOTE: Not sure if this is a safe assumption leftDelim,
rightDelim
} = tree; // NOTE: Not sure if this is a safe assumption
// hasBarLine true -> fraction, false -> binomial // hasBarLine true -> fraction, false -> binomial
if (tree.hasBarLine) { if (tree.hasBarLine) {
@ -317,6 +322,12 @@ const handleObject = (tree, a11yStrings, atomType) => {
break; break;
} }
case "hbox":
{
buildA11yStrings(tree.body, a11yStrings, atomType);
break;
}
case "kern": case "kern":
{ {
// No op: we don't attempt to present kerning information // No op: we don't attempt to present kerning information
@ -354,8 +365,10 @@ const handleObject = (tree, a11yStrings, atomType) => {
case "op": case "op":
{ {
const body = tree.body, var {
name = tree.name; body,
name
} = tree;
if (body) { if (body) {
buildA11yStrings(body, a11yStrings, atomType); buildA11yStrings(body, a11yStrings, atomType);
@ -389,6 +402,12 @@ const handleObject = (tree, a11yStrings, atomType) => {
break; break;
} }
case "pmb":
{
a11yStrings.push("bold");
break;
}
case "phantom": case "phantom":
{ {
a11yStrings.push("empty space"); a11yStrings.push("empty space");
@ -429,11 +448,13 @@ const handleObject = (tree, a11yStrings, atomType) => {
case "sqrt": case "sqrt":
{ {
buildRegion(a11yStrings, regionStrings => { buildRegion(a11yStrings, regionStrings => {
const body = tree.body, var {
index = tree.index; body,
index
} = tree;
if (index) { if (index) {
const indexString = flatten(buildA11yStrings(index, [], atomType)).join(","); var indexString = flatten(buildA11yStrings(index, [], atomType)).join(",");
if (indexString === "3") { if (indexString === "3") {
regionStrings.push("cube root of"); regionStrings.push("cube root of");
@ -458,10 +479,12 @@ const handleObject = (tree, a11yStrings, atomType) => {
case "supsub": case "supsub":
{ {
const base = tree.base, var {
sub = tree.sub, base,
sup = tree.sup; sub,
let isLog = false; sup
} = tree;
var isLog = false;
if (base) { if (base) {
buildA11yStrings(base, a11yStrings, atomType); buildA11yStrings(base, a11yStrings, atomType);
@ -469,17 +492,17 @@ const handleObject = (tree, a11yStrings, atomType) => {
} }
if (sub) { if (sub) {
const regionName = isLog ? "base" : "subscript"; var regionName = isLog ? "base" : "subscript";
buildRegion(a11yStrings, function (regionStrings) { buildRegion(a11yStrings, function (regionStrings) {
regionStrings.push(`start ${regionName}`); regionStrings.push("start " + regionName);
buildA11yStrings(sub, regionStrings, atomType); buildA11yStrings(sub, regionStrings, atomType);
regionStrings.push(`end ${regionName}`); regionStrings.push("end " + regionName);
}); });
} }
if (sup) { if (sup) {
buildRegion(a11yStrings, function (regionStrings) { buildRegion(a11yStrings, function (regionStrings) {
const supString = flatten(buildA11yStrings(sup, [], atomType)).join(","); var supString = flatten(buildA11yStrings(sup, [], atomType)).join(",");
if (supString in powerMap) { if (supString in powerMap) {
regionStrings.push(powerMap[supString]); regionStrings.push(powerMap[supString]);
@ -553,9 +576,22 @@ const handleObject = (tree, a11yStrings, atomType) => {
regionStrings.push("end strikeout"); regionStrings.push("end strikeout");
}); });
break; 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`); throw new Error("KaTeX-a11y: enclose node with " + tree.label + " not supported yet");
}
case "vcenter":
{
buildA11yStrings(tree.body, a11yStrings, atomType);
break;
} }
case "vphantom": case "vphantom":
@ -603,9 +639,9 @@ const handleObject = (tree, a11yStrings, atomType) => {
case "verb": case "verb":
{ {
buildString(`start verbatim`, "normal", a11yStrings); buildString("start verbatim", "normal", a11yStrings);
buildString(tree.body, "normal", a11yStrings); buildString(tree.body, "normal", a11yStrings);
buildString(`end verbatim`, "normal", a11yStrings); buildString("end verbatim", "normal", a11yStrings);
break; break;
} }
@ -616,9 +652,9 @@ const handleObject = (tree, a11yStrings, atomType) => {
case "horizBrace": case "horizBrace":
{ {
buildString(`start ${tree.label.slice(1)}`, "normal", a11yStrings); buildString("start " + tree.label.slice(1), "normal", a11yStrings);
buildA11yStrings(tree.base, a11yStrings, atomType); buildA11yStrings(tree.base, a11yStrings, atomType);
buildString(`end ${tree.label.slice(1)}`, "normal", a11yStrings); buildString("end " + tree.label.slice(1), "normal", a11yStrings);
break; break;
} }
@ -667,19 +703,30 @@ const handleObject = (tree, a11yStrings, atomType) => {
throw new Error("KaTeX-a11y: xArrow not implemented yet"); 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": case "mclass":
{ {
// \neq and \ne are macros so we let "htmlmathml" render the mathmal // \neq and \ne are macros so we let "htmlmathml" render the mathmal
// side of things and extract the text from that. // side of things and extract the text from that.
const atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass var _atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass
buildA11yStrings(tree.body, a11yStrings, atomType);
buildA11yStrings(tree.body, a11yStrings, _atomType);
break; break;
} }
case "mathchoice": case "mathchoice":
{ {
// TODO: track which which style we're using, e.g. dispaly, text, etc. // TODO: track which style we're using, e.g. display, text, etc.
// default to text style if even that may not be the correct style // default to text style if even that may not be the correct style
buildA11yStrings(tree.text, a11yStrings, atomType); buildA11yStrings(tree.text, a11yStrings, atomType);
break; break;
@ -715,13 +762,13 @@ const handleObject = (tree, a11yStrings, atomType) => {
} }
}; };
const buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) { var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) {
if (a11yStrings === void 0) { if (a11yStrings === void 0) {
a11yStrings = []; a11yStrings = [];
} }
if (tree instanceof Array) { if (tree instanceof Array) {
for (let i = 0; i < tree.length; i++) { for (var i = 0; i < tree.length; i++) {
buildA11yStrings(tree[i], a11yStrings, atomType); buildA11yStrings(tree[i], a11yStrings, atomType);
} }
} else { } else {
@ -731,8 +778,8 @@ const buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType)
return a11yStrings; return a11yStrings;
}; };
const flatten = function flatten(array) { var flatten = function flatten(array) {
let result = []; var result = [];
array.forEach(function (item) { array.forEach(function (item) {
if (item instanceof Array) { if (item instanceof Array) {
result = result.concat(flatten(item)); result = result.concat(flatten(item));
@ -743,11 +790,11 @@ const flatten = function flatten(array) {
return result; return result;
}; };
const renderA11yString = function renderA11yString(text, settings) { var renderA11yString = function renderA11yString(text, settings) {
const tree = katex.__parse(text, settings); var tree = katex.__parse(text, settings);
const a11yStrings = buildA11yStrings(tree, [], "normal"); var a11yStrings = buildA11yStrings(tree, [], "normal");
return flatten(a11yStrings).join(", "); return flatten(a11yStrings).join(", ");
}; };
export default renderA11yString; export { renderA11yString as default };

Some files were not shown because too many files have changed in this diff Show More