* reorg validator economics * overview cleanup * terminology * terminology formatting * katex for docusaurus * adjusted staking yield writeup * more reorg * move section header * rm unlinked mds * add new mds * Update docs/src/inflation/terminology.md Co-authored-by: Dan Albert <dan@solana.com> * Update docs/src/inflation/terminology.md Co-authored-by: Dan Albert <dan@solana.com> * Update docs/src/inflation/terminology.md Co-authored-by: Dan Albert <dan@solana.com> * Update docs/src/inflation/terminology.md Co-authored-by: Dan Albert <dan@solana.com> * Update docs/src/inflation/terminology.md Co-authored-by: Dan Albert <dan@solana.com> * Update docs/src/transaction_fees.md Co-authored-by: Dan Albert <dan@solana.com> * addressing Dans comments in #14868 * incorporating pr commits * trailing whitespaces * more trailing whitespaces * remove services link and add plot * add plots Co-authored-by: Dan Albert <dan@solana.com>
		
			
				
	
	
		
			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"];
 | |
| }); |