870 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			870 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|   | (function webpackUniversalModuleDefinition(root, factory) { | ||
|  | 	if(typeof exports === 'object' && typeof module === 'object') | ||
|  | 		module.exports = factory(require("katex")); | ||
|  | 	else if(typeof define === 'function' && define.amd) | ||
|  | 		define(["katex"], factory); | ||
|  | 	else { | ||
|  | 		var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]); | ||
|  | 		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; | ||
|  | 	} | ||
|  | })((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) { | ||
|  | return /******/ (function(modules) { // webpackBootstrap
 | ||
|  | /******/ 	// The module cache
 | ||
|  | /******/ 	var installedModules = {}; | ||
|  | /******/ | ||
|  | /******/ 	// The require function
 | ||
|  | /******/ 	function __webpack_require__(moduleId) { | ||
|  | /******/ | ||
|  | /******/ 		// Check if module is in cache
 | ||
|  | /******/ 		if(installedModules[moduleId]) { | ||
|  | /******/ 			return installedModules[moduleId].exports; | ||
|  | /******/ 		} | ||
|  | /******/ 		// Create a new module (and put it into the cache)
 | ||
|  | /******/ 		var module = installedModules[moduleId] = { | ||
|  | /******/ 			i: moduleId, | ||
|  | /******/ 			l: false, | ||
|  | /******/ 			exports: {} | ||
|  | /******/ 		}; | ||
|  | /******/ | ||
|  | /******/ 		// Execute the module function
 | ||
|  | /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | ||
|  | /******/ | ||
|  | /******/ 		// Flag the module as loaded
 | ||
|  | /******/ 		module.l = true; | ||
|  | /******/ | ||
|  | /******/ 		// Return the exports of the module
 | ||
|  | /******/ 		return module.exports; | ||
|  | /******/ 	} | ||
|  | /******/ | ||
|  | /******/ | ||
|  | /******/ 	// expose the modules object (__webpack_modules__)
 | ||
|  | /******/ 	__webpack_require__.m = modules; | ||
|  | /******/ | ||
|  | /******/ 	// expose the module cache
 | ||
|  | /******/ 	__webpack_require__.c = installedModules; | ||
|  | /******/ | ||
|  | /******/ 	// define getter function for harmony exports
 | ||
|  | /******/ 	__webpack_require__.d = function(exports, name, getter) { | ||
|  | /******/ 		if(!__webpack_require__.o(exports, name)) { | ||
|  | /******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter }); | ||
|  | /******/ 		} | ||
|  | /******/ 	}; | ||
|  | /******/ | ||
|  | /******/ 	// define __esModule on exports
 | ||
|  | /******/ 	__webpack_require__.r = function(exports) { | ||
|  | /******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { | ||
|  | /******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||
|  | /******/ 		} | ||
|  | /******/ 		Object.defineProperty(exports, '__esModule', { value: true }); | ||
|  | /******/ 	}; | ||
|  | /******/ | ||
|  | /******/ 	// create a fake namespace object
 | ||
|  | /******/ 	// mode & 1: value is a module id, require it
 | ||
|  | /******/ 	// mode & 2: merge all properties of value into the ns
 | ||
|  | /******/ 	// mode & 4: return value when already ns object
 | ||
|  | /******/ 	// mode & 8|1: behave like require
 | ||
|  | /******/ 	__webpack_require__.t = function(value, mode) { | ||
|  | /******/ 		if(mode & 1) value = __webpack_require__(value); | ||
|  | /******/ 		if(mode & 8) return value; | ||
|  | /******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; | ||
|  | /******/ 		var ns = Object.create(null); | ||
|  | /******/ 		__webpack_require__.r(ns); | ||
|  | /******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value }); | ||
|  | /******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); | ||
|  | /******/ 		return ns; | ||
|  | /******/ 	}; | ||
|  | /******/ | ||
|  | /******/ 	// getDefaultExport function for compatibility with non-harmony modules
 | ||
|  | /******/ 	__webpack_require__.n = function(module) { | ||
|  | /******/ 		var getter = module && module.__esModule ? | ||
|  | /******/ 			function getDefault() { return module['default']; } : | ||
|  | /******/ 			function getModuleExports() { return module; }; | ||
|  | /******/ 		__webpack_require__.d(getter, 'a', getter); | ||
|  | /******/ 		return getter; | ||
|  | /******/ 	}; | ||
|  | /******/ | ||
|  | /******/ 	// Object.prototype.hasOwnProperty.call
 | ||
|  | /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; | ||
|  | /******/ | ||
|  | /******/ 	// __webpack_public_path__
 | ||
|  | /******/ 	__webpack_require__.p = ""; | ||
|  | /******/ | ||
|  | /******/ | ||
|  | /******/ 	// Load entry module and return exports
 | ||
|  | /******/ 	return __webpack_require__(__webpack_require__.s = 1); | ||
|  | /******/ }) | ||
|  | /************************************************************************/ | ||
|  | /******/ ([ | ||
|  | /* 0 */ | ||
|  | /***/ (function(module, exports) { | ||
|  | 
 | ||
|  | module.exports = __WEBPACK_EXTERNAL_MODULE__0__; | ||
|  | 
 | ||
|  | /***/ }), | ||
|  | /* 1 */ | ||
|  | /***/ (function(module, __webpack_exports__, __webpack_require__) { | ||
|  | 
 | ||
|  | "use strict"; | ||
|  | __webpack_require__.r(__webpack_exports__); | ||
|  | /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0); | ||
|  | /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); | ||
|  | /** | ||
|  |  * 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 "kern": | ||
|  |       { | ||
|  |         // No op: we don't attempt to present kerning information
 | ||
|  |         // to the screen reader.
 | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "leftright": | ||
|  |       { | ||
|  |         buildRegion(a11yStrings, function (regionStrings) { | ||
|  |           buildString(tree.left, "open", regionStrings); | ||
|  |           buildA11yStrings(tree.body, regionStrings, atomType); | ||
|  |           buildString(tree.right, "close", regionStrings); | ||
|  |         }); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "leftright-right": | ||
|  |       { | ||
|  |         // TODO: double check that this is a no-op
 | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "lap": | ||
|  |       { | ||
|  |         buildA11yStrings(tree.body, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "mathord": | ||
|  |       { | ||
|  |         buildString(tree.text, "normal", a11yStrings); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "op": | ||
|  |       { | ||
|  |         var body = tree.body, | ||
|  |             name = tree.name; | ||
|  | 
 | ||
|  |         if (body) { | ||
|  |           buildA11yStrings(body, a11yStrings, atomType); | ||
|  |         } else if (name) { | ||
|  |           buildString(name, "normal", a11yStrings); | ||
|  |         } | ||
|  | 
 | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "op-token": | ||
|  |       { | ||
|  |         // Used internally by operator symbols.
 | ||
|  |         buildString(tree.text, atomType, a11yStrings); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "ordgroup": | ||
|  |       { | ||
|  |         buildA11yStrings(tree.body, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "overline": | ||
|  |       { | ||
|  |         buildRegion(a11yStrings, function (a11yStrings) { | ||
|  |           a11yStrings.push("start overline"); | ||
|  |           buildA11yStrings(tree.body, a11yStrings, atomType); | ||
|  |           a11yStrings.push("end overline"); | ||
|  |         }); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "phantom": | ||
|  |       { | ||
|  |         a11yStrings.push("empty space"); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "raisebox": | ||
|  |       { | ||
|  |         buildA11yStrings(tree.body, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "rule": | ||
|  |       { | ||
|  |         a11yStrings.push("rectangle"); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "sizing": | ||
|  |       { | ||
|  |         buildA11yStrings(tree.body, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "spacing": | ||
|  |       { | ||
|  |         a11yStrings.push("space"); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "styling": | ||
|  |       { | ||
|  |         // We ignore the styling and just pass through the contents
 | ||
|  |         buildA11yStrings(tree.body, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "sqrt": | ||
|  |       { | ||
|  |         buildRegion(a11yStrings, function (regionStrings) { | ||
|  |           var body = tree.body, | ||
|  |               index = tree.index; | ||
|  | 
 | ||
|  |           if (index) { | ||
|  |             var indexString = flatten(buildA11yStrings(index, [], atomType)).join(","); | ||
|  | 
 | ||
|  |             if (indexString === "3") { | ||
|  |               regionStrings.push("cube root of"); | ||
|  |               buildA11yStrings(body, regionStrings, atomType); | ||
|  |               regionStrings.push("end cube root"); | ||
|  |               return; | ||
|  |             } | ||
|  | 
 | ||
|  |             regionStrings.push("root"); | ||
|  |             regionStrings.push("start index"); | ||
|  |             buildA11yStrings(index, regionStrings, atomType); | ||
|  |             regionStrings.push("end index"); | ||
|  |             return; | ||
|  |           } | ||
|  | 
 | ||
|  |           regionStrings.push("square root of"); | ||
|  |           buildA11yStrings(body, regionStrings, atomType); | ||
|  |           regionStrings.push("end square root"); | ||
|  |         }); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "supsub": | ||
|  |       { | ||
|  |         var base = tree.base, | ||
|  |             sub = tree.sub, | ||
|  |             sup = tree.sup; | ||
|  |         var isLog = false; | ||
|  | 
 | ||
|  |         if (base) { | ||
|  |           buildA11yStrings(base, a11yStrings, atomType); | ||
|  |           isLog = base.type === "op" && base.name === "\\log"; | ||
|  |         } | ||
|  | 
 | ||
|  |         if (sub) { | ||
|  |           var regionName = isLog ? "base" : "subscript"; | ||
|  |           buildRegion(a11yStrings, function (regionStrings) { | ||
|  |             regionStrings.push("start " + regionName); | ||
|  |             buildA11yStrings(sub, regionStrings, atomType); | ||
|  |             regionStrings.push("end " + regionName); | ||
|  |           }); | ||
|  |         } | ||
|  | 
 | ||
|  |         if (sup) { | ||
|  |           buildRegion(a11yStrings, function (regionStrings) { | ||
|  |             var supString = flatten(buildA11yStrings(sup, [], atomType)).join(","); | ||
|  | 
 | ||
|  |             if (supString in powerMap) { | ||
|  |               regionStrings.push(powerMap[supString]); | ||
|  |               return; | ||
|  |             } | ||
|  | 
 | ||
|  |             regionStrings.push("start superscript"); | ||
|  |             buildA11yStrings(sup, regionStrings, atomType); | ||
|  |             regionStrings.push("end superscript"); | ||
|  |           }); | ||
|  |         } | ||
|  | 
 | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "text": | ||
|  |       { | ||
|  |         // TODO: handle other fonts
 | ||
|  |         if (tree.font === "\\textbf") { | ||
|  |           buildRegion(a11yStrings, function (regionStrings) { | ||
|  |             regionStrings.push("start bold text"); | ||
|  |             buildA11yStrings(tree.body, regionStrings, atomType); | ||
|  |             regionStrings.push("end bold text"); | ||
|  |           }); | ||
|  |           break; | ||
|  |         } | ||
|  | 
 | ||
|  |         buildRegion(a11yStrings, function (regionStrings) { | ||
|  |           regionStrings.push("start text"); | ||
|  |           buildA11yStrings(tree.body, regionStrings, atomType); | ||
|  |           regionStrings.push("end text"); | ||
|  |         }); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "textord": | ||
|  |       { | ||
|  |         buildString(tree.text, atomType, a11yStrings); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "smash": | ||
|  |       { | ||
|  |         buildA11yStrings(tree.body, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "enclose": | ||
|  |       { | ||
|  |         // TODO: create a map for these.
 | ||
|  |         // TODO: differentiate between a body with a single atom, e.g.
 | ||
|  |         // "cancel a" instead of "start cancel, a, end cancel"
 | ||
|  |         if (/cancel/.test(tree.label)) { | ||
|  |           buildRegion(a11yStrings, function (regionStrings) { | ||
|  |             regionStrings.push("start cancel"); | ||
|  |             buildA11yStrings(tree.body, regionStrings, atomType); | ||
|  |             regionStrings.push("end cancel"); | ||
|  |           }); | ||
|  |           break; | ||
|  |         } else if (/box/.test(tree.label)) { | ||
|  |           buildRegion(a11yStrings, function (regionStrings) { | ||
|  |             regionStrings.push("start box"); | ||
|  |             buildA11yStrings(tree.body, regionStrings, atomType); | ||
|  |             regionStrings.push("end box"); | ||
|  |           }); | ||
|  |           break; | ||
|  |         } else if (/sout/.test(tree.label)) { | ||
|  |           buildRegion(a11yStrings, function (regionStrings) { | ||
|  |             regionStrings.push("start strikeout"); | ||
|  |             buildA11yStrings(tree.body, regionStrings, atomType); | ||
|  |             regionStrings.push("end strikeout"); | ||
|  |           }); | ||
|  |           break; | ||
|  |         } | ||
|  | 
 | ||
|  |         throw new Error("KaTeX-a11y: enclose node with " + tree.label + " not supported yet"); | ||
|  |       } | ||
|  | 
 | ||
|  |     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 "mclass": | ||
|  |       { | ||
|  |         // \neq and \ne are macros so we let "htmlmathml" render the mathmal
 | ||
|  |         // side of things and extract the text from that.
 | ||
|  |         var _atomType = tree.mclass.slice(1); // $FlowFixMe: drop the leading "m" from the values in mclass
 | ||
|  | 
 | ||
|  | 
 | ||
|  |         buildA11yStrings(tree.body, a11yStrings, _atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "mathchoice": | ||
|  |       { | ||
|  |         // TODO: track which which style we're using, e.g. dispaly, text, etc.
 | ||
|  |         // default to text style if even that may not be the correct style
 | ||
|  |         buildA11yStrings(tree.text, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "htmlmathml": | ||
|  |       { | ||
|  |         buildA11yStrings(tree.mathml, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "middle": | ||
|  |       { | ||
|  |         buildString(tree.delim, atomType, a11yStrings); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "internal": | ||
|  |       { | ||
|  |         // internal nodes are never included in the parse tree
 | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     case "html": | ||
|  |       { | ||
|  |         buildA11yStrings(tree.body, a11yStrings, atomType); | ||
|  |         break; | ||
|  |       } | ||
|  | 
 | ||
|  |     default: | ||
|  |       tree.type; | ||
|  |       throw new Error("KaTeX a11y un-recognized type: " + tree.type); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | var buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) { | ||
|  |   if (a11yStrings === void 0) { | ||
|  |     a11yStrings = []; | ||
|  |   } | ||
|  | 
 | ||
|  |   if (tree instanceof Array) { | ||
|  |     for (var i = 0; i < tree.length; i++) { | ||
|  |       buildA11yStrings(tree[i], a11yStrings, atomType); | ||
|  |     } | ||
|  |   } else { | ||
|  |     handleObject(tree, a11yStrings, atomType); | ||
|  |   } | ||
|  | 
 | ||
|  |   return a11yStrings; | ||
|  | }; | ||
|  | 
 | ||
|  | var flatten = function flatten(array) { | ||
|  |   var result = []; | ||
|  |   array.forEach(function (item) { | ||
|  |     if (item instanceof Array) { | ||
|  |       result = result.concat(flatten(item)); | ||
|  |     } else { | ||
|  |       result.push(item); | ||
|  |     } | ||
|  |   }); | ||
|  |   return result; | ||
|  | }; | ||
|  | 
 | ||
|  | var renderA11yString = function renderA11yString(text, settings) { | ||
|  |   var tree = katex__WEBPACK_IMPORTED_MODULE_0___default.a.__parse(text, settings); | ||
|  | 
 | ||
|  |   var a11yStrings = buildA11yStrings(tree, [], "normal"); | ||
|  |   return flatten(a11yStrings).join(", "); | ||
|  | }; | ||
|  | 
 | ||
|  | /* harmony default export */ __webpack_exports__["default"] = (renderA11yString); | ||
|  | 
 | ||
|  | /***/ }) | ||
|  | /******/ ])["default"]; | ||
|  | }); |