mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 19:49:01 +01: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://www.npmjs.com/package/katex) | ||||||
| [](https://github.com/semantic-release/semantic-release) | [](https://github.com/semantic-release/semantic-release) | ||||||
| [](https://github.com/KaTeX/KaTeX/actions?query=workflow%3ACI) | [](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 --> | <!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly --> | ||||||
| <html> | <html> | ||||||
|   <head> |   <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 --> |     <!-- 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: --> |     <!-- 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> |         onload="renderMathInElement(document.body);"></script> | ||||||
|   </head> |   </head> | ||||||
|   ... |   ... | ||||||
|  | |||||||
| @ -235,11 +235,33 @@ var renderElem = function renderElem(elem, optionsCopy) { | |||||||
| 
 | 
 | ||||||
|     if (childNode.nodeType === 3) { |     if (childNode.nodeType === 3) { | ||||||
|       // Text node
 |       // 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) { |       if (frag) { | ||||||
|  |         // Remove extra text nodes
 | ||||||
|  |         for (var j = 0; j < nSiblings; j++) { | ||||||
|  |           childNode.nextSibling.remove(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         i += frag.childNodes.length - 1; |         i += frag.childNodes.length - 1; | ||||||
|         elem.replaceChild(frag, childNode); |         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) { |     } else if (childNode.nodeType === 1) { | ||||||
|       (function () { |       (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) { |     if (childNode.nodeType === 3) { | ||||||
|       // Text node
 |       // 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) { |       if (frag) { | ||||||
|  |         // Remove extra text nodes
 | ||||||
|  |         for (var j = 0; j < nSiblings; j++) { | ||||||
|  |           childNode.nextSibling.remove(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         i += frag.childNodes.length - 1; |         i += frag.childNodes.length - 1; | ||||||
|         elem.replaceChild(frag, childNode); |         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) { |     } else if (childNode.nodeType === 1) { | ||||||
|       (function () { |       (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 * { | .katex * { | ||||||
|   -ms-high-contrast-adjust: none !important; |   -ms-high-contrast-adjust: none !important; | ||||||
|  | } | ||||||
|  | .katex * { | ||||||
|   border-color: currentColor; |   border-color: currentColor; | ||||||
| } | } | ||||||
| .katex .katex-version::after { | .katex .katex-version::after { | ||||||
|   content: "0.16.0"; |   content: "0.16.9"; | ||||||
| } | } | ||||||
| .katex .katex-mathml { | .katex .katex-mathml { | ||||||
|   /* Accessibility hack to only show to screen readers |   /* Accessibility hack to only show to screen readers | ||||||
| @ -209,6 +211,11 @@ | |||||||
| .katex .textfrak { | .katex .textfrak { | ||||||
|   font-family: KaTeX_Fraktur; |   font-family: KaTeX_Fraktur; | ||||||
| } | } | ||||||
|  | .katex .mathboldfrak, | ||||||
|  | .katex .textboldfrak { | ||||||
|  |   font-family: KaTeX_Fraktur; | ||||||
|  |   font-weight: bold; | ||||||
|  | } | ||||||
| .katex .mathtt { | .katex .mathtt { | ||||||
|   font-family: KaTeX_Typewriter; |   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__); | /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); | ||||||
| /* eslint-disable */ | /* eslint-disable */ | ||||||
| 
 | 
 | ||||||
| /* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ | /* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ | ||||||
| 
 | 
 | ||||||
| /* vim: set ts=2 et sw=2 tw=80: */ | /* vim: set ts=2 et sw=2 tw=80: */ | ||||||
| 
 | 
 | ||||||
| @ -3197,7 +3197,7 @@ var texify = { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| }; //
 | }; //
 | ||||||
| // Helpers for code anaylsis
 | // Helpers for code analysis
 | ||||||
| // Will show type error at calling position
 | // Will show type error at calling position
 | ||||||
| //
 | //
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										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 */ | /* eslint-disable */ | ||||||
| 
 | 
 | ||||||
| /* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ | /* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */ | ||||||
| 
 | 
 | ||||||
| /* vim: set ts=2 et sw=2 tw=80: */ | /* vim: set ts=2 et sw=2 tw=80: */ | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										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