mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-10-31 13:01:31 +08:00 
			
		
		
		
	Update Katex from 0.16.0 to 0.16.9
This commit is contained in:
		
							parent
							
								
									e9ece21d20
								
							
						
					
					
						commit
						b17848609b
					
				| @ -1,4 +1,10 @@ | ||||
| # [<img src="https://katex.org/img/katex-logo-black.svg" width="130" alt="KaTeX">](https://katex.org/) | ||||
| <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> | ||||
| 
 | ||||
| [](https://www.npmjs.com/package/katex) | ||||
| [](https://github.com/semantic-release/semantic-release) | ||||
| [](https://github.com/KaTeX/KaTeX/actions?query=workflow%3ACI) | ||||
| @ -31,13 +37,13 @@ Try out KaTeX [on the demo page](https://katex.org/#demo)! | ||||
| <!-- 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.0/dist/katex.min.css" integrity="sha384-Xi8rHCmBmhbuyyhbI88391ZKP2dmfnOl4rT9ZfRI7mLTdk1wblIUnrIq35nqwEvC" crossorigin="anonymous"> | ||||
|     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css" integrity="sha384-n8MVd4RsNIU0tAv4ct0nTaAbDJwPJzDEaqSD1odI+WdtXRGWt2kTvGFasHpSy3SV" crossorigin="anonymous"> | ||||
| 
 | ||||
|     <!-- The loading of KaTeX is deferred to speed up page rendering --> | ||||
|     <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.js" integrity="sha384-X/XCfMm41VSsqRNQgDerQczD69XqmjOOOwYQvr/uuC+j4OPoNhVgjdGFwhvN02Ja" crossorigin="anonymous"></script> | ||||
|     <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js" integrity="sha384-XjKyOOlGwcjNTAIQHIpgOno0Hl1YQqzUOEleOLALmuqehneUG+vnGctmUb0ZY0l8" 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.0/dist/contrib/auto-render.min.js" integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous" | ||||
|     <script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js" integrity="sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05" crossorigin="anonymous" | ||||
|         onload="renderMathInElement(document.body);"></script> | ||||
|   </head> | ||||
|   ... | ||||
|  | ||||
| @ -235,11 +235,33 @@ var renderElem = function renderElem(elem, optionsCopy) { | ||||
| 
 | ||||
|     if (childNode.nodeType === 3) { | ||||
|       // Text node
 | ||||
|       var frag = renderMathInText(childNode.textContent, optionsCopy); | ||||
|       // 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 () { | ||||
|  | ||||
							
								
								
									
										2
									
								
								libraries/katex/auto-render.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								libraries/katex/auto-render.min.js
									
									
									
									
										vendored
									
									
								
							| @ -1 +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={771:function(t){t.exports=e}},r={};function n(e){var a=r[e];if(void 0!==a)return a.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,n),i.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var a={};return function(){n.d(a,{default:function(){return s}});var e=n(771),t=n.n(e),r=function(e,t,r){for(var n=r,a=0,i=e.length;n<t.length;){var o=t[n];if(a<=0&&t.slice(n,n+i)===e)return n;"\\"===o?n++:"{"===o?a++:"}"===o&&a--,n++}return-1},i=/^\\begin{/,o=function(e,t){for(var n,a=[],o=new RegExp("("+t.map((function(e){return e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")})).join("|")+")");-1!==(n=e.search(o));){n>0&&(a.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=i.test(d)?d:e.slice(t[l].left.length,n);a.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&a.push({type:"text",data:e}),a},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var a=document.createDocumentFragment(),i=0;i<n.length;i++)if("text"===n[i].type)a.appendChild(document.createTextNode(n[i].data));else{var l=document.createElement("span"),d=n[i].data;r.displayMode=n[i].display;try{r.preProcess&&(d=r.preProcess(d)),t().render(d,l,r)}catch(e){if(!(e instanceof t().ParseError))throw e;r.errorCallback("KaTeX auto-render: Failed to parse `"+n[i].data+"` with ",e),a.appendChild(document.createTextNode(n[i].rawData));continue}a.appendChild(l)}return a},d=function e(t,r){for(var n=0;n<t.childNodes.length;n++){var a=t.childNodes[n];if(3===a.nodeType){var i=l(a.textContent,r);i&&(n+=i.childNodes.length-1,t.replaceChild(i,a))}else 1===a.nodeType&&function(){var t=" "+a.className+" ";-1===r.ignoredTags.indexOf(a.nodeName.toLowerCase())&&r.ignoredClasses.every((function(e){return-1===t.indexOf(" "+e+" ")}))&&e(a,r)}()}},s=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:"\\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}],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||{},d(e,r)}}(),a=a.default}()})); | ||||
| !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={771:function(t){t.exports=e}},r={};function n(e){var i=r[e];if(void 0!==i)return i.exports;var a=r[e]={exports:{}};return t[e](a,a.exports,n),a.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var i={};return function(){n.d(i,{default:function(){return s}});var e=n(771),t=n.n(e),r=function(e,t,r){for(var n=r,i=0,a=e.length;n<t.length;){var o=t[n];if(i<=0&&t.slice(n,n+a)===e)return n;"\\"===o?n++:"{"===o?i++:"}"===o&&i--,n++}return-1},a=/^\\begin{/,o=function(e,t){for(var n,i=[],o=new RegExp("("+t.map((function(e){return e.left.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")})).join("|")+")");-1!==(n=e.search(o));){n>0&&(i.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=a.test(d)?d:e.slice(t[l].left.length,n);i.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&i.push({type:"text",data:e}),i},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var i=document.createDocumentFragment(),a=0;a<n.length;a++)if("text"===n[a].type)i.appendChild(document.createTextNode(n[a].data));else{var l=document.createElement("span"),d=n[a].data;r.displayMode=n[a].display;try{r.preProcess&&(d=r.preProcess(d)),t().render(d,l,r)}catch(e){if(!(e instanceof t().ParseError))throw e;r.errorCallback("KaTeX auto-render: Failed to parse `"+n[a].data+"` with ",e),i.appendChild(document.createTextNode(n[a].rawData));continue}i.appendChild(l)}return i},d=function e(t,r){for(var n=0;n<t.childNodes.length;n++){var i=t.childNodes[n];if(3===i.nodeType){for(var a=i.textContent,o=i.nextSibling,d=0;o&&o.nodeType===Node.TEXT_NODE;)a+=o.textContent,o=o.nextSibling,d++;var s=l(a,r);if(s){for(var f=0;f<d;f++)i.nextSibling.remove();n+=s.childNodes.length-1,t.replaceChild(s,i)}else n+=d}else 1===i.nodeType&&function(){var t=" "+i.className+" ";-1===r.ignoredTags.indexOf(i.nodeName.toLowerCase())&&r.ignoredClasses.every((function(e){return-1===t.indexOf(" "+e+" ")}))&&e(i,r)}()}},s=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:"\\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}],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||{},d(e,r)}}(),i=i.default}()})); | ||||
| @ -138,11 +138,33 @@ var renderElem = function renderElem(elem, optionsCopy) { | ||||
| 
 | ||||
|     if (childNode.nodeType === 3) { | ||||
|       // Text node
 | ||||
|       var frag = renderMathInText(childNode.textContent, optionsCopy); | ||||
|       // 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 () { | ||||
|  | ||||
							
								
								
									
										130
									
								
								libraries/katex/copy-tex.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										130
									
								
								libraries/katex/copy-tex.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,130 @@ | ||||
| (function webpackUniversalModuleDefinition(root, factory) { | ||||
| 	if(typeof exports === 'object' && typeof module === 'object') | ||||
| 		module.exports = factory(); | ||||
| 	else if(typeof define === 'function' && define.amd) | ||||
| 		define([], factory); | ||||
| 	else { | ||||
| 		var a = factory(); | ||||
| 		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; | ||||
| 	} | ||||
| })((typeof self !== 'undefined' ? self : this), function() { | ||||
| return /******/ (function() { // webpackBootstrap
 | ||||
| /******/ 	"use strict"; | ||||
| var __webpack_exports__ = {}; | ||||
| 
 | ||||
| ;// CONCATENATED MODULE: ./contrib/copy-tex/katex2tex.js
 | ||||
| // Set these to how you want inline and display math to be delimited.
 | ||||
| var defaultCopyDelimiters = { | ||||
|   inline: ['$', '$'], | ||||
|   // alternative: ['\(', '\)']
 | ||||
|   display: ['$$', '$$'] // alternative: ['\[', '\]']
 | ||||
| 
 | ||||
| }; // Replace .katex elements with their TeX source (<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; | ||||
| } | ||||
| /* 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.
 | ||||
|   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, function (el) { | ||||
|     return 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__; | ||||
| /******/ })() | ||||
| ; | ||||
| }); | ||||
							
								
								
									
										1
									
								
								libraries/katex/copy-tex.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								libraries/katex/copy-tex.min.js
									
									
									
									
										vendored
									
									
										Normal 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 r in n)("object"==typeof exports?exports:e)[r]=n[r]}}("undefined"!=typeof self?self:this,(function(){return function(){"use strict";var e={},t={inline:["$","$"],display:["$$","$$"]};var n=function(e,n){void 0===n&&(n=t);for(var r=e.querySelectorAll(".katex-mathml + .katex-html"),a=0;a<r.length;a++){var o=r[a];o.remove?o.remove():o.parentNode&&o.parentNode.removeChild(o)}for(var i=e.querySelectorAll(".katex-mathml"),l=0;l<i.length;l++){var f=i[l],c=f.querySelector("annotation");c&&(f.replaceWith?f.replaceWith(c):f.parentNode&&f.parentNode.replaceChild(c,f),c.innerHTML=n.inline[0]+c.innerHTML+n.inline[1])}for(var d=e.querySelectorAll(".katex-display annotation"),s=0;s<d.length;s++){var p=d[s];p.innerHTML=n.display[0]+p.innerHTML.substr(n.inline[0].length,p.innerHTML.length-n.inline[0].length-n.inline[1].length)+n.display[1]}return e};function r(e){var t=e instanceof Element?e:e.parentElement;return t&&t.closest(".katex")}return document.addEventListener("copy",(function(e){var t=window.getSelection();if(!t.isCollapsed&&e.clipboardData){var a=e.clipboardData,o=t.getRangeAt(0),i=r(o.startContainer);i&&o.setStartBefore(i);var l=r(o.endContainer);l&&o.setEndAfter(l);var f=o.cloneContents();if(f.querySelector(".katex-mathml")){var c=Array.prototype.map.call(f.childNodes,(function(e){return e instanceof Text?e.textContent:e.outerHTML})).join("");a.setData("text/html",c),a.setData("text/plain",n(f).textContent),e.preventDefault()}}})),e=e.default}()})); | ||||
							
								
								
									
										105
									
								
								libraries/katex/copy-tex.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								libraries/katex/copy-tex.mjs
									
									
									
									
									
										Normal 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(); | ||||
| }); | ||||
| @ -127,10 +127,12 @@ | ||||
| } | ||||
| .katex * { | ||||
|   -ms-high-contrast-adjust: none !important; | ||||
| } | ||||
| .katex * { | ||||
|   border-color: currentColor; | ||||
| } | ||||
| .katex .katex-version::after { | ||||
|   content: "0.16.0"; | ||||
|   content: "0.16.9"; | ||||
| } | ||||
| .katex .katex-mathml { | ||||
|   /* Accessibility hack to only show to screen readers | ||||
| @ -209,6 +211,11 @@ | ||||
| .katex .textfrak { | ||||
|   font-family: KaTeX_Fraktur; | ||||
| } | ||||
| .katex .mathboldfrak, | ||||
| .katex .textboldfrak { | ||||
|   font-family: KaTeX_Fraktur; | ||||
|   font-weight: bold; | ||||
| } | ||||
| .katex .mathtt { | ||||
|   font-family: KaTeX_Typewriter; | ||||
| } | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2
									
								
								libraries/katex/katex.min.css
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								libraries/katex/katex.min.css
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										2
									
								
								libraries/katex/katex.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								libraries/katex/katex.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										112
									
								
								libraries/katex/mathtex-script-type.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								libraries/katex/mathtex-script-type.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,112 @@ | ||||
| (function webpackUniversalModuleDefinition(root, factory) { | ||||
| 	if(typeof exports === 'object' && typeof module === 'object') | ||||
| 		module.exports = factory(require("katex")); | ||||
| 	else if(typeof define === 'function' && define.amd) | ||||
| 		define(["katex"], factory); | ||||
| 	else { | ||||
| 		var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]); | ||||
| 		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; | ||||
| 	} | ||||
| })((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__771__) { | ||||
| return /******/ (function() { // webpackBootstrap
 | ||||
| /******/ 	"use strict"; | ||||
| /******/ 	var __webpack_modules__ = ({ | ||||
| 
 | ||||
| /***/ 771: | ||||
| /***/ (function(module) { | ||||
| 
 | ||||
| module.exports = __WEBPACK_EXTERNAL_MODULE__771__; | ||||
| 
 | ||||
| /***/ }) | ||||
| 
 | ||||
| /******/ 	}); | ||||
| /************************************************************************/ | ||||
| /******/ 	// The module cache
 | ||||
| /******/ 	var __webpack_module_cache__ = {}; | ||||
| /******/ 	 | ||||
| /******/ 	// The require function
 | ||||
| /******/ 	function __webpack_require__(moduleId) { | ||||
| /******/ 		// Check if module is in cache
 | ||||
| /******/ 		var cachedModule = __webpack_module_cache__[moduleId]; | ||||
| /******/ 		if (cachedModule !== undefined) { | ||||
| /******/ 			return cachedModule.exports; | ||||
| /******/ 		} | ||||
| /******/ 		// Create a new module (and put it into the cache)
 | ||||
| /******/ 		var module = __webpack_module_cache__[moduleId] = { | ||||
| /******/ 			// no module.id needed
 | ||||
| /******/ 			// no module.loaded needed
 | ||||
| /******/ 			exports: {} | ||||
| /******/ 		}; | ||||
| /******/ 	 | ||||
| /******/ 		// Execute the module function
 | ||||
| /******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__); | ||||
| /******/ 	 | ||||
| /******/ 		// Return the exports of the module
 | ||||
| /******/ 		return module.exports; | ||||
| /******/ 	} | ||||
| /******/ 	 | ||||
| /************************************************************************/ | ||||
| /******/ 	/* webpack/runtime/compat get default export */ | ||||
| /******/ 	!function() { | ||||
| /******/ 		// getDefaultExport function for compatibility with non-harmony modules
 | ||||
| /******/ 		__webpack_require__.n = function(module) { | ||||
| /******/ 			var getter = module && module.__esModule ? | ||||
| /******/ 				function() { return module['default']; } : | ||||
| /******/ 				function() { return module; }; | ||||
| /******/ 			__webpack_require__.d(getter, { a: getter }); | ||||
| /******/ 			return getter; | ||||
| /******/ 		}; | ||||
| /******/ 	}(); | ||||
| /******/ 	 | ||||
| /******/ 	/* webpack/runtime/define property getters */ | ||||
| /******/ 	!function() { | ||||
| /******/ 		// define getter functions for harmony exports
 | ||||
| /******/ 		__webpack_require__.d = function(exports, definition) { | ||||
| /******/ 			for(var key in definition) { | ||||
| /******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { | ||||
| /******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); | ||||
| /******/ 				} | ||||
| /******/ 			} | ||||
| /******/ 		}; | ||||
| /******/ 	}(); | ||||
| /******/ 	 | ||||
| /******/ 	/* webpack/runtime/hasOwnProperty shorthand */ | ||||
| /******/ 	!function() { | ||||
| /******/ 		__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } | ||||
| /******/ 	}(); | ||||
| /******/ 	 | ||||
| /************************************************************************/ | ||||
| var __webpack_exports__ = {}; | ||||
| // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
 | ||||
| !function() { | ||||
| /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(771); | ||||
| /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); | ||||
| 
 | ||||
| var scripts = document.body.getElementsByTagName("script"); | ||||
| scripts = Array.prototype.slice.call(scripts); | ||||
| scripts.forEach(function (script) { | ||||
|   if (!script.type || !script.type.match(/math\/tex/i)) { | ||||
|     return -1; | ||||
|   } | ||||
| 
 | ||||
|   var display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null; | ||||
|   var katexElement = document.createElement(display ? "div" : "span"); | ||||
|   katexElement.setAttribute("class", display ? "equation" : "inline-equation"); | ||||
| 
 | ||||
|   try { | ||||
|     katex__WEBPACK_IMPORTED_MODULE_0___default().render(script.text, katexElement, { | ||||
|       displayMode: display | ||||
|     }); | ||||
|   } catch (err) { | ||||
|     //console.error(err); linter doesn't like this
 | ||||
|     katexElement.textContent = script.text; | ||||
|   } | ||||
| 
 | ||||
|   script.parentNode.replaceChild(katexElement, script); | ||||
| }); | ||||
| }(); | ||||
| __webpack_exports__ = __webpack_exports__["default"]; | ||||
| /******/ 	return __webpack_exports__; | ||||
| /******/ })() | ||||
| ; | ||||
| }); | ||||
							
								
								
									
										1
									
								
								libraries/katex/mathtex-script-type.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								libraries/katex/mathtex-script-type.min.js
									
									
									
									
										vendored
									
									
										Normal 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 r="object"==typeof exports?t(require("katex")):t(e.katex);for(var n in r)("object"==typeof exports?exports:e)[n]=r[n]}}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={771:function(t){t.exports=e}},r={};function n(e){var o=r[e];if(void 0!==o)return o.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,n),i.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var o,i,a,u={};return o=n(771),i=n.n(o),a=document.body.getElementsByTagName("script"),(a=Array.prototype.slice.call(a)).forEach((function(e){if(!e.type||!e.type.match(/math\/tex/i))return-1;var t=null!=e.type.match(/mode\s*=\s*display(;|\s|\n|$)/),r=document.createElement(t?"div":"span");r.setAttribute("class",t?"equation":"inline-equation");try{i().render(e.text,r,{displayMode:t})}catch(t){r.textContent=e.text}e.parentNode.replaceChild(r,e)})),u=u.default}()})); | ||||
							
								
								
									
										24
									
								
								libraries/katex/mathtex-script-type.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								libraries/katex/mathtex-script-type.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| import katex from '../katex.mjs'; | ||||
| 
 | ||||
| var scripts = document.body.getElementsByTagName("script"); | ||||
| scripts = Array.prototype.slice.call(scripts); | ||||
| scripts.forEach(function (script) { | ||||
|   if (!script.type || !script.type.match(/math\/tex/i)) { | ||||
|     return -1; | ||||
|   } | ||||
| 
 | ||||
|   var display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null; | ||||
|   var katexElement = document.createElement(display ? "div" : "span"); | ||||
|   katexElement.setAttribute("class", display ? "equation" : "inline-equation"); | ||||
| 
 | ||||
|   try { | ||||
|     katex.render(script.text, katexElement, { | ||||
|       displayMode: display | ||||
|     }); | ||||
|   } catch (err) { | ||||
|     //console.error(err); linter doesn't like this
 | ||||
|     katexElement.textContent = script.text; | ||||
|   } | ||||
| 
 | ||||
|   script.parentNode.replaceChild(katexElement, script); | ||||
| }); | ||||
| @ -83,7 +83,7 @@ var __webpack_exports__ = {}; | ||||
| /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); | ||||
| /* eslint-disable */ | ||||
| 
 | ||||
| /* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ | ||||
| /* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ | ||||
| 
 | ||||
| /* vim: set ts=2 et sw=2 tw=80: */ | ||||
| 
 | ||||
| @ -3197,7 +3197,7 @@ var texify = { | ||||
|     } | ||||
|   } | ||||
| }; //
 | ||||
| // Helpers for code anaylsis
 | ||||
| // Helpers for code analysis
 | ||||
| // Will show type error at calling position
 | ||||
| //
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										2
									
								
								libraries/katex/mhchem.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								libraries/katex/mhchem.min.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @ -2,7 +2,7 @@ import katex from '../katex.mjs'; | ||||
| 
 | ||||
| /* 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: */ | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										881
									
								
								libraries/katex/render-a11y-string.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										881
									
								
								libraries/katex/render-a11y-string.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,881 @@ | ||||
| (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__771__) { | ||||
| return /******/ (function() { // webpackBootstrap
 | ||||
| /******/ 	"use strict"; | ||||
| /******/ 	var __webpack_modules__ = ({ | ||||
| 
 | ||||
| /***/ 771: | ||||
| /***/ (function(module) { | ||||
| 
 | ||||
| module.exports = __WEBPACK_EXTERNAL_MODULE__771__; | ||||
| 
 | ||||
| /***/ }) | ||||
| 
 | ||||
| /******/ 	}); | ||||
| /************************************************************************/ | ||||
| /******/ 	// The module cache
 | ||||
| /******/ 	var __webpack_module_cache__ = {}; | ||||
| /******/ 	 | ||||
| /******/ 	// The require function
 | ||||
| /******/ 	function __webpack_require__(moduleId) { | ||||
| /******/ 		// Check if module is in cache
 | ||||
| /******/ 		var cachedModule = __webpack_module_cache__[moduleId]; | ||||
| /******/ 		if (cachedModule !== undefined) { | ||||
| /******/ 			return cachedModule.exports; | ||||
| /******/ 		} | ||||
| /******/ 		// Create a new module (and put it into the cache)
 | ||||
| /******/ 		var module = __webpack_module_cache__[moduleId] = { | ||||
| /******/ 			// no module.id needed
 | ||||
| /******/ 			// no module.loaded needed
 | ||||
| /******/ 			exports: {} | ||||
| /******/ 		}; | ||||
| /******/ 	 | ||||
| /******/ 		// Execute the module function
 | ||||
| /******/ 		__webpack_modules__[moduleId](module, module.exports, __webpack_require__); | ||||
| /******/ 	 | ||||
| /******/ 		// Return the exports of the module
 | ||||
| /******/ 		return module.exports; | ||||
| /******/ 	} | ||||
| /******/ 	 | ||||
| /************************************************************************/ | ||||
| /******/ 	/* webpack/runtime/compat get default export */ | ||||
| /******/ 	!function() { | ||||
| /******/ 		// getDefaultExport function for compatibility with non-harmony modules
 | ||||
| /******/ 		__webpack_require__.n = function(module) { | ||||
| /******/ 			var getter = module && module.__esModule ? | ||||
| /******/ 				function() { return module['default']; } : | ||||
| /******/ 				function() { return module; }; | ||||
| /******/ 			__webpack_require__.d(getter, { a: getter }); | ||||
| /******/ 			return getter; | ||||
| /******/ 		}; | ||||
| /******/ 	}(); | ||||
| /******/ 	 | ||||
| /******/ 	/* webpack/runtime/define property getters */ | ||||
| /******/ 	!function() { | ||||
| /******/ 		// define getter functions for harmony exports
 | ||||
| /******/ 		__webpack_require__.d = function(exports, definition) { | ||||
| /******/ 			for(var key in definition) { | ||||
| /******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { | ||||
| /******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); | ||||
| /******/ 				} | ||||
| /******/ 			} | ||||
| /******/ 		}; | ||||
| /******/ 	}(); | ||||
| /******/ 	 | ||||
| /******/ 	/* webpack/runtime/hasOwnProperty shorthand */ | ||||
| /******/ 	!function() { | ||||
| /******/ 		__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } | ||||
| /******/ 	}(); | ||||
| /******/ 	 | ||||
| /************************************************************************/ | ||||
| var __webpack_exports__ = {}; | ||||
| // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
 | ||||
| !function() { | ||||
| /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(771); | ||||
| /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); | ||||
| /** | ||||
|  * renderA11yString returns a readable string. | ||||
|  * | ||||
|  * In some cases the string will have the proper semantic math | ||||
|  * meaning,: | ||||
|  *   renderA11yString("\\frac{1}{2}"") | ||||
|  *   -> "start fraction, 1, divided by, 2, end fraction" | ||||
|  * | ||||
|  * However, other cases do not: | ||||
|  *   renderA11yString("f(x) = x^2") | ||||
|  *   -> "f, left parenthesis, x, right parenthesis, equals, x, squared" | ||||
|  * | ||||
|  * The commas in the string aim to increase ease of understanding | ||||
|  * when read by a screenreader. | ||||
|  */ | ||||
| // NOTE: since we're importing types here these files won't actually be
 | ||||
| // included in the build.
 | ||||
| // $FlowIgnore: we import the types directly anyways
 | ||||
| 
 | ||||
| var stringMap = { | ||||
|   "(": "left parenthesis", | ||||
|   ")": "right parenthesis", | ||||
|   "[": "open bracket", | ||||
|   "]": "close bracket", | ||||
|   "\\{": "left brace", | ||||
|   "\\}": "right brace", | ||||
|   "\\lvert": "open vertical bar", | ||||
|   "\\rvert": "close vertical bar", | ||||
|   "|": "vertical bar", | ||||
|   "\\uparrow": "up arrow", | ||||
|   "\\Uparrow": "up arrow", | ||||
|   "\\downarrow": "down arrow", | ||||
|   "\\Downarrow": "down arrow", | ||||
|   "\\updownarrow": "up down arrow", | ||||
|   "\\leftarrow": "left arrow", | ||||
|   "\\Leftarrow": "left arrow", | ||||
|   "\\rightarrow": "right arrow", | ||||
|   "\\Rightarrow": "right arrow", | ||||
|   "\\langle": "open angle", | ||||
|   "\\rangle": "close angle", | ||||
|   "\\lfloor": "open floor", | ||||
|   "\\rfloor": "close floor", | ||||
|   "\\int": "integral", | ||||
|   "\\intop": "integral", | ||||
|   "\\lim": "limit", | ||||
|   "\\ln": "natural log", | ||||
|   "\\log": "log", | ||||
|   "\\sin": "sine", | ||||
|   "\\cos": "cosine", | ||||
|   "\\tan": "tangent", | ||||
|   "\\cot": "cotangent", | ||||
|   "\\sum": "sum", | ||||
|   "/": "slash", | ||||
|   ",": "comma", | ||||
|   ".": "point", | ||||
|   "-": "negative", | ||||
|   "+": "plus", | ||||
|   "~": "tilde", | ||||
|   ":": "colon", | ||||
|   "?": "question mark", | ||||
|   "'": "apostrophe", | ||||
|   "\\%": "percent", | ||||
|   " ": "space", | ||||
|   "\\ ": "space", | ||||
|   "\\$": "dollar sign", | ||||
|   "\\angle": "angle", | ||||
|   "\\degree": "degree", | ||||
|   "\\circ": "circle", | ||||
|   "\\vec": "vector", | ||||
|   "\\triangle": "triangle", | ||||
|   "\\pi": "pi", | ||||
|   "\\prime": "prime", | ||||
|   "\\infty": "infinity", | ||||
|   "\\alpha": "alpha", | ||||
|   "\\beta": "beta", | ||||
|   "\\gamma": "gamma", | ||||
|   "\\omega": "omega", | ||||
|   "\\theta": "theta", | ||||
|   "\\sigma": "sigma", | ||||
|   "\\lambda": "lambda", | ||||
|   "\\tau": "tau", | ||||
|   "\\Delta": "delta", | ||||
|   "\\delta": "delta", | ||||
|   "\\mu": "mu", | ||||
|   "\\rho": "rho", | ||||
|   "\\nabla": "del", | ||||
|   "\\ell": "ell", | ||||
|   "\\ldots": "dots", | ||||
|   // TODO: add entries for all accents
 | ||||
|   "\\hat": "hat", | ||||
|   "\\acute": "acute" | ||||
| }; | ||||
| var powerMap = { | ||||
|   "prime": "prime", | ||||
|   "degree": "degrees", | ||||
|   "circle": "degrees", | ||||
|   "2": "squared", | ||||
|   "3": "cubed" | ||||
| }; | ||||
| var openMap = { | ||||
|   "|": "open vertical bar", | ||||
|   ".": "" | ||||
| }; | ||||
| var closeMap = { | ||||
|   "|": "close vertical bar", | ||||
|   ".": "" | ||||
| }; | ||||
| var binMap = { | ||||
|   "+": "plus", | ||||
|   "-": "minus", | ||||
|   "\\pm": "plus minus", | ||||
|   "\\cdot": "dot", | ||||
|   "*": "times", | ||||
|   "/": "divided by", | ||||
|   "\\times": "times", | ||||
|   "\\div": "divided by", | ||||
|   "\\circ": "circle", | ||||
|   "\\bullet": "bullet" | ||||
| }; | ||||
| var relMap = { | ||||
|   "=": "equals", | ||||
|   "\\approx": "approximately equals", | ||||
|   "≠": "does not equal", | ||||
|   "\\geq": "is greater than or equal to", | ||||
|   "\\ge": "is greater than or equal to", | ||||
|   "\\leq": "is less than or equal to", | ||||
|   "\\le": "is less than or equal to", | ||||
|   ">": "is greater than", | ||||
|   "<": "is less than", | ||||
|   "\\leftarrow": "left arrow", | ||||
|   "\\Leftarrow": "left arrow", | ||||
|   "\\rightarrow": "right arrow", | ||||
|   "\\Rightarrow": "right arrow", | ||||
|   ":": "colon" | ||||
| }; | ||||
| var accentUnderMap = { | ||||
|   "\\underleftarrow": "left arrow", | ||||
|   "\\underrightarrow": "right arrow", | ||||
|   "\\underleftrightarrow": "left-right arrow", | ||||
|   "\\undergroup": "group", | ||||
|   "\\underlinesegment": "line segment", | ||||
|   "\\utilde": "tilde" | ||||
| }; | ||||
| 
 | ||||
| var buildString = function buildString(str, type, a11yStrings) { | ||||
|   if (!str) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   var ret; | ||||
| 
 | ||||
|   if (type === "open") { | ||||
|     ret = str in openMap ? openMap[str] : stringMap[str] || str; | ||||
|   } else if (type === "close") { | ||||
|     ret = str in closeMap ? closeMap[str] : stringMap[str] || str; | ||||
|   } else if (type === "bin") { | ||||
|     ret = binMap[str] || str; | ||||
|   } else if (type === "rel") { | ||||
|     ret = relMap[str] || str; | ||||
|   } else { | ||||
|     ret = stringMap[str] || str; | ||||
|   } // If the text to add is a number and there is already a string
 | ||||
|   // in the list and the last string is a number then we should
 | ||||
|   // combine them into a single number
 | ||||
| 
 | ||||
| 
 | ||||
|   if (/^\d+$/.test(ret) && a11yStrings.length > 0 && // TODO(kevinb): check that the last item in a11yStrings is a string
 | ||||
|   // I think we might be able to drop the nested arrays, which would make
 | ||||
|   // this easier to type
 | ||||
|   // $FlowFixMe
 | ||||
|   /^\d+$/.test(a11yStrings[a11yStrings.length - 1])) { | ||||
|     a11yStrings[a11yStrings.length - 1] += ret; | ||||
|   } else if (ret) { | ||||
|     a11yStrings.push(ret); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| var buildRegion = function buildRegion(a11yStrings, callback) { | ||||
|   var regionStrings = []; | ||||
|   a11yStrings.push(regionStrings); | ||||
|   callback(regionStrings); | ||||
| }; | ||||
| 
 | ||||
| var handleObject = function handleObject(tree, a11yStrings, atomType) { | ||||
|   // Everything else is assumed to be an object...
 | ||||
|   switch (tree.type) { | ||||
|     case "accent": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (a11yStrings) { | ||||
|           buildA11yStrings(tree.base, a11yStrings, atomType); | ||||
|           a11yStrings.push("with"); | ||||
|           buildString(tree.label, "normal", a11yStrings); | ||||
|           a11yStrings.push("on top"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "accentUnder": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (a11yStrings) { | ||||
|           buildA11yStrings(tree.base, a11yStrings, atomType); | ||||
|           a11yStrings.push("with"); | ||||
|           buildString(accentUnderMap[tree.label], "normal", a11yStrings); | ||||
|           a11yStrings.push("underneath"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "accent-token": | ||||
|       { | ||||
|         // Used internally by accent symbols.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "atom": | ||||
|       { | ||||
|         var text = tree.text; | ||||
| 
 | ||||
|         switch (tree.family) { | ||||
|           case "bin": | ||||
|             { | ||||
|               buildString(text, "bin", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           case "close": | ||||
|             { | ||||
|               buildString(text, "close", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
|           // TODO(kevinb): figure out what should be done for inner
 | ||||
| 
 | ||||
|           case "inner": | ||||
|             { | ||||
|               buildString(tree.text, "inner", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           case "open": | ||||
|             { | ||||
|               buildString(text, "open", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           case "punct": | ||||
|             { | ||||
|               buildString(text, "punct", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           case "rel": | ||||
|             { | ||||
|               buildString(text, "rel", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           default: | ||||
|             { | ||||
|               tree.family; | ||||
|               throw new Error("\"" + tree.family + "\" is not a valid atom type"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "color": | ||||
|       { | ||||
|         var color = tree.color.replace(/katex-/, ""); | ||||
|         buildRegion(a11yStrings, function (regionStrings) { | ||||
|           regionStrings.push("start color " + color); | ||||
|           buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|           regionStrings.push("end color " + color); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "color-token": | ||||
|       { | ||||
|         // Used by \color, \colorbox, and \fcolorbox but not directly rendered.
 | ||||
|         // It's a leaf node and has no children so just break.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "delimsizing": | ||||
|       { | ||||
|         if (tree.delim && tree.delim !== ".") { | ||||
|           buildString(tree.delim, "normal", a11yStrings); | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "genfrac": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (regionStrings) { | ||||
|           // genfrac can have unbalanced delimiters
 | ||||
|           var leftDelim = tree.leftDelim, | ||||
|               rightDelim = tree.rightDelim; // NOTE: Not sure if this is a safe assumption
 | ||||
|           // hasBarLine true -> fraction, false -> binomial
 | ||||
| 
 | ||||
|           if (tree.hasBarLine) { | ||||
|             regionStrings.push("start fraction"); | ||||
|             leftDelim && buildString(leftDelim, "open", regionStrings); | ||||
|             buildA11yStrings(tree.numer, regionStrings, atomType); | ||||
|             regionStrings.push("divided by"); | ||||
|             buildA11yStrings(tree.denom, regionStrings, atomType); | ||||
|             rightDelim && buildString(rightDelim, "close", regionStrings); | ||||
|             regionStrings.push("end fraction"); | ||||
|           } else { | ||||
|             regionStrings.push("start binomial"); | ||||
|             leftDelim && buildString(leftDelim, "open", regionStrings); | ||||
|             buildA11yStrings(tree.numer, regionStrings, atomType); | ||||
|             regionStrings.push("over"); | ||||
|             buildA11yStrings(tree.denom, regionStrings, atomType); | ||||
|             rightDelim && buildString(rightDelim, "close", regionStrings); | ||||
|             regionStrings.push("end binomial"); | ||||
|           } | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "hbox": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "kern": | ||||
|       { | ||||
|         // No op: we don't attempt to present kerning information
 | ||||
|         // to the screen reader.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "leftright": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (regionStrings) { | ||||
|           buildString(tree.left, "open", regionStrings); | ||||
|           buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|           buildString(tree.right, "close", regionStrings); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "leftright-right": | ||||
|       { | ||||
|         // TODO: double check that this is a no-op
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "lap": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "mathord": | ||||
|       { | ||||
|         buildString(tree.text, "normal", a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "op": | ||||
|       { | ||||
|         var body = tree.body, | ||||
|             name = tree.name; | ||||
| 
 | ||||
|         if (body) { | ||||
|           buildA11yStrings(body, a11yStrings, atomType); | ||||
|         } else if (name) { | ||||
|           buildString(name, "normal", a11yStrings); | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "op-token": | ||||
|       { | ||||
|         // Used internally by operator symbols.
 | ||||
|         buildString(tree.text, atomType, a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "ordgroup": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "overline": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (a11yStrings) { | ||||
|           a11yStrings.push("start overline"); | ||||
|           buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|           a11yStrings.push("end overline"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "pmb": | ||||
|       { | ||||
|         a11yStrings.push("bold"); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "phantom": | ||||
|       { | ||||
|         a11yStrings.push("empty space"); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "raisebox": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "rule": | ||||
|       { | ||||
|         a11yStrings.push("rectangle"); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "sizing": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "spacing": | ||||
|       { | ||||
|         a11yStrings.push("space"); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "styling": | ||||
|       { | ||||
|         // We ignore the styling and just pass through the contents
 | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "sqrt": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (regionStrings) { | ||||
|           var body = tree.body, | ||||
|               index = tree.index; | ||||
| 
 | ||||
|           if (index) { | ||||
|             var indexString = flatten(buildA11yStrings(index, [], atomType)).join(","); | ||||
| 
 | ||||
|             if (indexString === "3") { | ||||
|               regionStrings.push("cube root of"); | ||||
|               buildA11yStrings(body, regionStrings, atomType); | ||||
|               regionStrings.push("end cube root"); | ||||
|               return; | ||||
|             } | ||||
| 
 | ||||
|             regionStrings.push("root"); | ||||
|             regionStrings.push("start index"); | ||||
|             buildA11yStrings(index, regionStrings, atomType); | ||||
|             regionStrings.push("end index"); | ||||
|             return; | ||||
|           } | ||||
| 
 | ||||
|           regionStrings.push("square root of"); | ||||
|           buildA11yStrings(body, regionStrings, atomType); | ||||
|           regionStrings.push("end square root"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "supsub": | ||||
|       { | ||||
|         var base = tree.base, | ||||
|             sub = tree.sub, | ||||
|             sup = tree.sup; | ||||
|         var isLog = false; | ||||
| 
 | ||||
|         if (base) { | ||||
|           buildA11yStrings(base, a11yStrings, atomType); | ||||
|           isLog = base.type === "op" && base.name === "\\log"; | ||||
|         } | ||||
| 
 | ||||
|         if (sub) { | ||||
|           var regionName = isLog ? "base" : "subscript"; | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start " + regionName); | ||||
|             buildA11yStrings(sub, regionStrings, atomType); | ||||
|             regionStrings.push("end " + regionName); | ||||
|           }); | ||||
|         } | ||||
| 
 | ||||
|         if (sup) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             var supString = flatten(buildA11yStrings(sup, [], atomType)).join(","); | ||||
| 
 | ||||
|             if (supString in powerMap) { | ||||
|               regionStrings.push(powerMap[supString]); | ||||
|               return; | ||||
|             } | ||||
| 
 | ||||
|             regionStrings.push("start superscript"); | ||||
|             buildA11yStrings(sup, regionStrings, atomType); | ||||
|             regionStrings.push("end superscript"); | ||||
|           }); | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "text": | ||||
|       { | ||||
|         // TODO: handle other fonts
 | ||||
|         if (tree.font === "\\textbf") { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start bold text"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end bold text"); | ||||
|           }); | ||||
|           break; | ||||
|         } | ||||
| 
 | ||||
|         buildRegion(a11yStrings, function (regionStrings) { | ||||
|           regionStrings.push("start text"); | ||||
|           buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|           regionStrings.push("end text"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "textord": | ||||
|       { | ||||
|         buildString(tree.text, atomType, a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "smash": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "enclose": | ||||
|       { | ||||
|         // TODO: create a map for these.
 | ||||
|         // TODO: differentiate between a body with a single atom, e.g.
 | ||||
|         // "cancel a" instead of "start cancel, a, end cancel"
 | ||||
|         if (/cancel/.test(tree.label)) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start cancel"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end cancel"); | ||||
|           }); | ||||
|           break; | ||||
|         } else if (/box/.test(tree.label)) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start box"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end box"); | ||||
|           }); | ||||
|           break; | ||||
|         } else if (/sout/.test(tree.label)) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start strikeout"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end strikeout"); | ||||
|           }); | ||||
|           break; | ||||
|         } else if (/phase/.test(tree.label)) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start phase angle"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end phase angle"); | ||||
|           }); | ||||
|           break; | ||||
|         } | ||||
| 
 | ||||
|         throw new Error("KaTeX-a11y: enclose node with " + tree.label + " not supported yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "vcenter": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "vphantom": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: vphantom not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "hphantom": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: hphantom not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "operatorname": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "array": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: array not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "raw": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: raw not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "size": | ||||
|       { | ||||
|         // Although there are nodes of type "size" in the parse tree, they have
 | ||||
|         // no semantic meaning and should be ignored.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "url": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: url not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "tag": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: tag not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "verb": | ||||
|       { | ||||
|         buildString("start verbatim", "normal", a11yStrings); | ||||
|         buildString(tree.body, "normal", a11yStrings); | ||||
|         buildString("end verbatim", "normal", a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "environment": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: environment not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "horizBrace": | ||||
|       { | ||||
|         buildString("start " + tree.label.slice(1), "normal", a11yStrings); | ||||
|         buildA11yStrings(tree.base, a11yStrings, atomType); | ||||
|         buildString("end " + tree.label.slice(1), "normal", a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "infix": | ||||
|       { | ||||
|         // All infix nodes are replace with other nodes.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "includegraphics": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: includegraphics not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "font": | ||||
|       { | ||||
|         // TODO: callout the start/end of specific fonts
 | ||||
|         // TODO: map \BBb{N} to "the naturals" or something like that
 | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "href": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: href not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "cr": | ||||
|       { | ||||
|         // This is used by environments.
 | ||||
|         throw new Error("KaTeX-a11y: cr not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "underline": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (a11yStrings) { | ||||
|           a11yStrings.push("start underline"); | ||||
|           buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|           a11yStrings.push("end underline"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "xArrow": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: xArrow not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "cdlabel": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: cdlabel not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "cdlabelparent": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: cdlabelparent not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "mclass": | ||||
|       { | ||||
|         // \neq and \ne are macros so we let "htmlmathml" render the mathmal
 | ||||
|         // side of things and extract the text from that.
 | ||||
|         var _atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass
 | ||||
| 
 | ||||
| 
 | ||||
|         buildA11yStrings(tree.body, a11yStrings, _atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "mathchoice": | ||||
|       { | ||||
|         // TODO: track which style we're using, e.g. display, text, etc.
 | ||||
|         // default to text style if even that may not be the correct style
 | ||||
|         buildA11yStrings(tree.text, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "htmlmathml": | ||||
|       { | ||||
|         buildA11yStrings(tree.mathml, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "middle": | ||||
|       { | ||||
|         buildString(tree.delim, atomType, a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "internal": | ||||
|       { | ||||
|         // internal nodes are never included in the parse tree
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "html": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     default: | ||||
|       tree.type; | ||||
|       throw new Error("KaTeX a11y un-recognized type: " + tree.type); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) { | ||||
|   if (a11yStrings === void 0) { | ||||
|     a11yStrings = []; | ||||
|   } | ||||
| 
 | ||||
|   if (tree instanceof Array) { | ||||
|     for (var i = 0; i < tree.length; i++) { | ||||
|       buildA11yStrings(tree[i], a11yStrings, atomType); | ||||
|     } | ||||
|   } else { | ||||
|     handleObject(tree, a11yStrings, atomType); | ||||
|   } | ||||
| 
 | ||||
|   return a11yStrings; | ||||
| }; | ||||
| 
 | ||||
| var flatten = function flatten(array) { | ||||
|   var result = []; | ||||
|   array.forEach(function (item) { | ||||
|     if (item instanceof Array) { | ||||
|       result = result.concat(flatten(item)); | ||||
|     } else { | ||||
|       result.push(item); | ||||
|     } | ||||
|   }); | ||||
|   return result; | ||||
| }; | ||||
| 
 | ||||
| var renderA11yString = function renderA11yString(text, settings) { | ||||
|   var tree = katex__WEBPACK_IMPORTED_MODULE_0___default().__parse(text, settings); | ||||
| 
 | ||||
|   var a11yStrings = buildA11yStrings(tree, [], "normal"); | ||||
|   return flatten(a11yStrings).join(", "); | ||||
| }; | ||||
| 
 | ||||
| /* harmony default export */ __webpack_exports__["default"] = (renderA11yString); | ||||
| }(); | ||||
| __webpack_exports__ = __webpack_exports__["default"]; | ||||
| /******/ 	return __webpack_exports__; | ||||
| /******/ })() | ||||
| ; | ||||
| }); | ||||
							
								
								
									
										1
									
								
								libraries/katex/render-a11y-string.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								libraries/katex/render-a11y-string.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										800
									
								
								libraries/katex/render-a11y-string.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										800
									
								
								libraries/katex/render-a11y-string.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,800 @@ | ||||
| import katex from '../katex.mjs'; | ||||
| 
 | ||||
| /** | ||||
|  * renderA11yString returns a readable string. | ||||
|  * | ||||
|  * In some cases the string will have the proper semantic math | ||||
|  * meaning,: | ||||
|  *   renderA11yString("\\frac{1}{2}"") | ||||
|  *   -> "start fraction, 1, divided by, 2, end fraction" | ||||
|  * | ||||
|  * However, other cases do not: | ||||
|  *   renderA11yString("f(x) = x^2") | ||||
|  *   -> "f, left parenthesis, x, right parenthesis, equals, x, squared" | ||||
|  * | ||||
|  * The commas in the string aim to increase ease of understanding | ||||
|  * when read by a screenreader. | ||||
|  */ | ||||
| var stringMap = { | ||||
|   "(": "left parenthesis", | ||||
|   ")": "right parenthesis", | ||||
|   "[": "open bracket", | ||||
|   "]": "close bracket", | ||||
|   "\\{": "left brace", | ||||
|   "\\}": "right brace", | ||||
|   "\\lvert": "open vertical bar", | ||||
|   "\\rvert": "close vertical bar", | ||||
|   "|": "vertical bar", | ||||
|   "\\uparrow": "up arrow", | ||||
|   "\\Uparrow": "up arrow", | ||||
|   "\\downarrow": "down arrow", | ||||
|   "\\Downarrow": "down arrow", | ||||
|   "\\updownarrow": "up down arrow", | ||||
|   "\\leftarrow": "left arrow", | ||||
|   "\\Leftarrow": "left arrow", | ||||
|   "\\rightarrow": "right arrow", | ||||
|   "\\Rightarrow": "right arrow", | ||||
|   "\\langle": "open angle", | ||||
|   "\\rangle": "close angle", | ||||
|   "\\lfloor": "open floor", | ||||
|   "\\rfloor": "close floor", | ||||
|   "\\int": "integral", | ||||
|   "\\intop": "integral", | ||||
|   "\\lim": "limit", | ||||
|   "\\ln": "natural log", | ||||
|   "\\log": "log", | ||||
|   "\\sin": "sine", | ||||
|   "\\cos": "cosine", | ||||
|   "\\tan": "tangent", | ||||
|   "\\cot": "cotangent", | ||||
|   "\\sum": "sum", | ||||
|   "/": "slash", | ||||
|   ",": "comma", | ||||
|   ".": "point", | ||||
|   "-": "negative", | ||||
|   "+": "plus", | ||||
|   "~": "tilde", | ||||
|   ":": "colon", | ||||
|   "?": "question mark", | ||||
|   "'": "apostrophe", | ||||
|   "\\%": "percent", | ||||
|   " ": "space", | ||||
|   "\\ ": "space", | ||||
|   "\\$": "dollar sign", | ||||
|   "\\angle": "angle", | ||||
|   "\\degree": "degree", | ||||
|   "\\circ": "circle", | ||||
|   "\\vec": "vector", | ||||
|   "\\triangle": "triangle", | ||||
|   "\\pi": "pi", | ||||
|   "\\prime": "prime", | ||||
|   "\\infty": "infinity", | ||||
|   "\\alpha": "alpha", | ||||
|   "\\beta": "beta", | ||||
|   "\\gamma": "gamma", | ||||
|   "\\omega": "omega", | ||||
|   "\\theta": "theta", | ||||
|   "\\sigma": "sigma", | ||||
|   "\\lambda": "lambda", | ||||
|   "\\tau": "tau", | ||||
|   "\\Delta": "delta", | ||||
|   "\\delta": "delta", | ||||
|   "\\mu": "mu", | ||||
|   "\\rho": "rho", | ||||
|   "\\nabla": "del", | ||||
|   "\\ell": "ell", | ||||
|   "\\ldots": "dots", | ||||
|   // TODO: add entries for all accents
 | ||||
|   "\\hat": "hat", | ||||
|   "\\acute": "acute" | ||||
| }; | ||||
| var powerMap = { | ||||
|   "prime": "prime", | ||||
|   "degree": "degrees", | ||||
|   "circle": "degrees", | ||||
|   "2": "squared", | ||||
|   "3": "cubed" | ||||
| }; | ||||
| var openMap = { | ||||
|   "|": "open vertical bar", | ||||
|   ".": "" | ||||
| }; | ||||
| var closeMap = { | ||||
|   "|": "close vertical bar", | ||||
|   ".": "" | ||||
| }; | ||||
| var binMap = { | ||||
|   "+": "plus", | ||||
|   "-": "minus", | ||||
|   "\\pm": "plus minus", | ||||
|   "\\cdot": "dot", | ||||
|   "*": "times", | ||||
|   "/": "divided by", | ||||
|   "\\times": "times", | ||||
|   "\\div": "divided by", | ||||
|   "\\circ": "circle", | ||||
|   "\\bullet": "bullet" | ||||
| }; | ||||
| var relMap = { | ||||
|   "=": "equals", | ||||
|   "\\approx": "approximately equals", | ||||
|   "≠": "does not equal", | ||||
|   "\\geq": "is greater than or equal to", | ||||
|   "\\ge": "is greater than or equal to", | ||||
|   "\\leq": "is less than or equal to", | ||||
|   "\\le": "is less than or equal to", | ||||
|   ">": "is greater than", | ||||
|   "<": "is less than", | ||||
|   "\\leftarrow": "left arrow", | ||||
|   "\\Leftarrow": "left arrow", | ||||
|   "\\rightarrow": "right arrow", | ||||
|   "\\Rightarrow": "right arrow", | ||||
|   ":": "colon" | ||||
| }; | ||||
| var accentUnderMap = { | ||||
|   "\\underleftarrow": "left arrow", | ||||
|   "\\underrightarrow": "right arrow", | ||||
|   "\\underleftrightarrow": "left-right arrow", | ||||
|   "\\undergroup": "group", | ||||
|   "\\underlinesegment": "line segment", | ||||
|   "\\utilde": "tilde" | ||||
| }; | ||||
| 
 | ||||
| var buildString = (str, type, a11yStrings) => { | ||||
|   if (!str) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   var ret; | ||||
| 
 | ||||
|   if (type === "open") { | ||||
|     ret = str in openMap ? openMap[str] : stringMap[str] || str; | ||||
|   } else if (type === "close") { | ||||
|     ret = str in closeMap ? closeMap[str] : stringMap[str] || str; | ||||
|   } else if (type === "bin") { | ||||
|     ret = binMap[str] || str; | ||||
|   } else if (type === "rel") { | ||||
|     ret = relMap[str] || str; | ||||
|   } else { | ||||
|     ret = stringMap[str] || str; | ||||
|   } // If the text to add is a number and there is already a string
 | ||||
|   // in the list and the last string is a number then we should
 | ||||
|   // combine them into a single number
 | ||||
| 
 | ||||
| 
 | ||||
|   if (/^\d+$/.test(ret) && a11yStrings.length > 0 && // TODO(kevinb): check that the last item in a11yStrings is a string
 | ||||
|   // I think we might be able to drop the nested arrays, which would make
 | ||||
|   // this easier to type
 | ||||
|   // $FlowFixMe
 | ||||
|   /^\d+$/.test(a11yStrings[a11yStrings.length - 1])) { | ||||
|     a11yStrings[a11yStrings.length - 1] += ret; | ||||
|   } else if (ret) { | ||||
|     a11yStrings.push(ret); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| var buildRegion = (a11yStrings, callback) => { | ||||
|   var regionStrings = []; | ||||
|   a11yStrings.push(regionStrings); | ||||
|   callback(regionStrings); | ||||
| }; | ||||
| 
 | ||||
| var handleObject = (tree, a11yStrings, atomType) => { | ||||
|   // Everything else is assumed to be an object...
 | ||||
|   switch (tree.type) { | ||||
|     case "accent": | ||||
|       { | ||||
|         buildRegion(a11yStrings, a11yStrings => { | ||||
|           buildA11yStrings(tree.base, a11yStrings, atomType); | ||||
|           a11yStrings.push("with"); | ||||
|           buildString(tree.label, "normal", a11yStrings); | ||||
|           a11yStrings.push("on top"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "accentUnder": | ||||
|       { | ||||
|         buildRegion(a11yStrings, a11yStrings => { | ||||
|           buildA11yStrings(tree.base, a11yStrings, atomType); | ||||
|           a11yStrings.push("with"); | ||||
|           buildString(accentUnderMap[tree.label], "normal", a11yStrings); | ||||
|           a11yStrings.push("underneath"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "accent-token": | ||||
|       { | ||||
|         // Used internally by accent symbols.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "atom": | ||||
|       { | ||||
|         var { | ||||
|           text | ||||
|         } = tree; | ||||
| 
 | ||||
|         switch (tree.family) { | ||||
|           case "bin": | ||||
|             { | ||||
|               buildString(text, "bin", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           case "close": | ||||
|             { | ||||
|               buildString(text, "close", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
|           // TODO(kevinb): figure out what should be done for inner
 | ||||
| 
 | ||||
|           case "inner": | ||||
|             { | ||||
|               buildString(tree.text, "inner", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           case "open": | ||||
|             { | ||||
|               buildString(text, "open", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           case "punct": | ||||
|             { | ||||
|               buildString(text, "punct", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           case "rel": | ||||
|             { | ||||
|               buildString(text, "rel", a11yStrings); | ||||
|               break; | ||||
|             } | ||||
| 
 | ||||
|           default: | ||||
|             { | ||||
|               tree.family; | ||||
|               throw new Error("\"" + tree.family + "\" is not a valid atom type"); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "color": | ||||
|       { | ||||
|         var color = tree.color.replace(/katex-/, ""); | ||||
|         buildRegion(a11yStrings, regionStrings => { | ||||
|           regionStrings.push("start color " + color); | ||||
|           buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|           regionStrings.push("end color " + color); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "color-token": | ||||
|       { | ||||
|         // Used by \color, \colorbox, and \fcolorbox but not directly rendered.
 | ||||
|         // It's a leaf node and has no children so just break.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "delimsizing": | ||||
|       { | ||||
|         if (tree.delim && tree.delim !== ".") { | ||||
|           buildString(tree.delim, "normal", a11yStrings); | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "genfrac": | ||||
|       { | ||||
|         buildRegion(a11yStrings, regionStrings => { | ||||
|           // genfrac can have unbalanced delimiters
 | ||||
|           var { | ||||
|             leftDelim, | ||||
|             rightDelim | ||||
|           } = tree; // NOTE: Not sure if this is a safe assumption
 | ||||
|           // hasBarLine true -> fraction, false -> binomial
 | ||||
| 
 | ||||
|           if (tree.hasBarLine) { | ||||
|             regionStrings.push("start fraction"); | ||||
|             leftDelim && buildString(leftDelim, "open", regionStrings); | ||||
|             buildA11yStrings(tree.numer, regionStrings, atomType); | ||||
|             regionStrings.push("divided by"); | ||||
|             buildA11yStrings(tree.denom, regionStrings, atomType); | ||||
|             rightDelim && buildString(rightDelim, "close", regionStrings); | ||||
|             regionStrings.push("end fraction"); | ||||
|           } else { | ||||
|             regionStrings.push("start binomial"); | ||||
|             leftDelim && buildString(leftDelim, "open", regionStrings); | ||||
|             buildA11yStrings(tree.numer, regionStrings, atomType); | ||||
|             regionStrings.push("over"); | ||||
|             buildA11yStrings(tree.denom, regionStrings, atomType); | ||||
|             rightDelim && buildString(rightDelim, "close", regionStrings); | ||||
|             regionStrings.push("end binomial"); | ||||
|           } | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "hbox": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "kern": | ||||
|       { | ||||
|         // No op: we don't attempt to present kerning information
 | ||||
|         // to the screen reader.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "leftright": | ||||
|       { | ||||
|         buildRegion(a11yStrings, regionStrings => { | ||||
|           buildString(tree.left, "open", regionStrings); | ||||
|           buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|           buildString(tree.right, "close", regionStrings); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "leftright-right": | ||||
|       { | ||||
|         // TODO: double check that this is a no-op
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "lap": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "mathord": | ||||
|       { | ||||
|         buildString(tree.text, "normal", a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "op": | ||||
|       { | ||||
|         var { | ||||
|           body, | ||||
|           name | ||||
|         } = tree; | ||||
| 
 | ||||
|         if (body) { | ||||
|           buildA11yStrings(body, a11yStrings, atomType); | ||||
|         } else if (name) { | ||||
|           buildString(name, "normal", a11yStrings); | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "op-token": | ||||
|       { | ||||
|         // Used internally by operator symbols.
 | ||||
|         buildString(tree.text, atomType, a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "ordgroup": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "overline": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (a11yStrings) { | ||||
|           a11yStrings.push("start overline"); | ||||
|           buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|           a11yStrings.push("end overline"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "pmb": | ||||
|       { | ||||
|         a11yStrings.push("bold"); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "phantom": | ||||
|       { | ||||
|         a11yStrings.push("empty space"); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "raisebox": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "rule": | ||||
|       { | ||||
|         a11yStrings.push("rectangle"); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "sizing": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "spacing": | ||||
|       { | ||||
|         a11yStrings.push("space"); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "styling": | ||||
|       { | ||||
|         // We ignore the styling and just pass through the contents
 | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "sqrt": | ||||
|       { | ||||
|         buildRegion(a11yStrings, regionStrings => { | ||||
|           var { | ||||
|             body, | ||||
|             index | ||||
|           } = tree; | ||||
| 
 | ||||
|           if (index) { | ||||
|             var indexString = flatten(buildA11yStrings(index, [], atomType)).join(","); | ||||
| 
 | ||||
|             if (indexString === "3") { | ||||
|               regionStrings.push("cube root of"); | ||||
|               buildA11yStrings(body, regionStrings, atomType); | ||||
|               regionStrings.push("end cube root"); | ||||
|               return; | ||||
|             } | ||||
| 
 | ||||
|             regionStrings.push("root"); | ||||
|             regionStrings.push("start index"); | ||||
|             buildA11yStrings(index, regionStrings, atomType); | ||||
|             regionStrings.push("end index"); | ||||
|             return; | ||||
|           } | ||||
| 
 | ||||
|           regionStrings.push("square root of"); | ||||
|           buildA11yStrings(body, regionStrings, atomType); | ||||
|           regionStrings.push("end square root"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "supsub": | ||||
|       { | ||||
|         var { | ||||
|           base, | ||||
|           sub, | ||||
|           sup | ||||
|         } = tree; | ||||
|         var isLog = false; | ||||
| 
 | ||||
|         if (base) { | ||||
|           buildA11yStrings(base, a11yStrings, atomType); | ||||
|           isLog = base.type === "op" && base.name === "\\log"; | ||||
|         } | ||||
| 
 | ||||
|         if (sub) { | ||||
|           var regionName = isLog ? "base" : "subscript"; | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start " + regionName); | ||||
|             buildA11yStrings(sub, regionStrings, atomType); | ||||
|             regionStrings.push("end " + regionName); | ||||
|           }); | ||||
|         } | ||||
| 
 | ||||
|         if (sup) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             var supString = flatten(buildA11yStrings(sup, [], atomType)).join(","); | ||||
| 
 | ||||
|             if (supString in powerMap) { | ||||
|               regionStrings.push(powerMap[supString]); | ||||
|               return; | ||||
|             } | ||||
| 
 | ||||
|             regionStrings.push("start superscript"); | ||||
|             buildA11yStrings(sup, regionStrings, atomType); | ||||
|             regionStrings.push("end superscript"); | ||||
|           }); | ||||
|         } | ||||
| 
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "text": | ||||
|       { | ||||
|         // TODO: handle other fonts
 | ||||
|         if (tree.font === "\\textbf") { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start bold text"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end bold text"); | ||||
|           }); | ||||
|           break; | ||||
|         } | ||||
| 
 | ||||
|         buildRegion(a11yStrings, function (regionStrings) { | ||||
|           regionStrings.push("start text"); | ||||
|           buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|           regionStrings.push("end text"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "textord": | ||||
|       { | ||||
|         buildString(tree.text, atomType, a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "smash": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "enclose": | ||||
|       { | ||||
|         // TODO: create a map for these.
 | ||||
|         // TODO: differentiate between a body with a single atom, e.g.
 | ||||
|         // "cancel a" instead of "start cancel, a, end cancel"
 | ||||
|         if (/cancel/.test(tree.label)) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start cancel"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end cancel"); | ||||
|           }); | ||||
|           break; | ||||
|         } else if (/box/.test(tree.label)) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start box"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end box"); | ||||
|           }); | ||||
|           break; | ||||
|         } else if (/sout/.test(tree.label)) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start strikeout"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end strikeout"); | ||||
|           }); | ||||
|           break; | ||||
|         } else if (/phase/.test(tree.label)) { | ||||
|           buildRegion(a11yStrings, function (regionStrings) { | ||||
|             regionStrings.push("start phase angle"); | ||||
|             buildA11yStrings(tree.body, regionStrings, atomType); | ||||
|             regionStrings.push("end phase angle"); | ||||
|           }); | ||||
|           break; | ||||
|         } | ||||
| 
 | ||||
|         throw new Error("KaTeX-a11y: enclose node with " + tree.label + " not supported yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "vcenter": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "vphantom": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: vphantom not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "hphantom": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: hphantom not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "operatorname": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "array": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: array not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "raw": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: raw not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "size": | ||||
|       { | ||||
|         // Although there are nodes of type "size" in the parse tree, they have
 | ||||
|         // no semantic meaning and should be ignored.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "url": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: url not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "tag": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: tag not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "verb": | ||||
|       { | ||||
|         buildString("start verbatim", "normal", a11yStrings); | ||||
|         buildString(tree.body, "normal", a11yStrings); | ||||
|         buildString("end verbatim", "normal", a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "environment": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: environment not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "horizBrace": | ||||
|       { | ||||
|         buildString("start " + tree.label.slice(1), "normal", a11yStrings); | ||||
|         buildA11yStrings(tree.base, a11yStrings, atomType); | ||||
|         buildString("end " + tree.label.slice(1), "normal", a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "infix": | ||||
|       { | ||||
|         // All infix nodes are replace with other nodes.
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "includegraphics": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: includegraphics not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "font": | ||||
|       { | ||||
|         // TODO: callout the start/end of specific fonts
 | ||||
|         // TODO: map \BBb{N} to "the naturals" or something like that
 | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "href": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: href not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "cr": | ||||
|       { | ||||
|         // This is used by environments.
 | ||||
|         throw new Error("KaTeX-a11y: cr not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "underline": | ||||
|       { | ||||
|         buildRegion(a11yStrings, function (a11yStrings) { | ||||
|           a11yStrings.push("start underline"); | ||||
|           buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|           a11yStrings.push("end underline"); | ||||
|         }); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "xArrow": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: xArrow not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "cdlabel": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: cdlabel not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "cdlabelparent": | ||||
|       { | ||||
|         throw new Error("KaTeX-a11y: cdlabelparent not implemented yet"); | ||||
|       } | ||||
| 
 | ||||
|     case "mclass": | ||||
|       { | ||||
|         // \neq and \ne are macros so we let "htmlmathml" render the mathmal
 | ||||
|         // side of things and extract the text from that.
 | ||||
|         var _atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass
 | ||||
| 
 | ||||
| 
 | ||||
|         buildA11yStrings(tree.body, a11yStrings, _atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "mathchoice": | ||||
|       { | ||||
|         // TODO: track which style we're using, e.g. display, text, etc.
 | ||||
|         // default to text style if even that may not be the correct style
 | ||||
|         buildA11yStrings(tree.text, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "htmlmathml": | ||||
|       { | ||||
|         buildA11yStrings(tree.mathml, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "middle": | ||||
|       { | ||||
|         buildString(tree.delim, atomType, a11yStrings); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "internal": | ||||
|       { | ||||
|         // internal nodes are never included in the parse tree
 | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     case "html": | ||||
|       { | ||||
|         buildA11yStrings(tree.body, a11yStrings, atomType); | ||||
|         break; | ||||
|       } | ||||
| 
 | ||||
|     default: | ||||
|       tree.type; | ||||
|       throw new Error("KaTeX a11y un-recognized type: " + tree.type); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) { | ||||
|   if (a11yStrings === void 0) { | ||||
|     a11yStrings = []; | ||||
|   } | ||||
| 
 | ||||
|   if (tree instanceof Array) { | ||||
|     for (var i = 0; i < tree.length; i++) { | ||||
|       buildA11yStrings(tree[i], a11yStrings, atomType); | ||||
|     } | ||||
|   } else { | ||||
|     handleObject(tree, a11yStrings, atomType); | ||||
|   } | ||||
| 
 | ||||
|   return a11yStrings; | ||||
| }; | ||||
| 
 | ||||
| var flatten = function flatten(array) { | ||||
|   var result = []; | ||||
|   array.forEach(function (item) { | ||||
|     if (item instanceof Array) { | ||||
|       result = result.concat(flatten(item)); | ||||
|     } else { | ||||
|       result.push(item); | ||||
|     } | ||||
|   }); | ||||
|   return result; | ||||
| }; | ||||
| 
 | ||||
| var renderA11yString = function renderA11yString(text, settings) { | ||||
|   var tree = katex.__parse(text, settings); | ||||
| 
 | ||||
|   var a11yStrings = buildA11yStrings(tree, [], "normal"); | ||||
|   return flatten(a11yStrings).join(", "); | ||||
| }; | ||||
| 
 | ||||
| export { renderA11yString as default }; | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Luis González
						Luis González