forked from sheetjs/docs.sheetjs.com
		
	summary
This commit is contained in:
		
							parent
							
								
									d6abde0e8e
								
							
						
					
					
						commit
						9698f15b32
					
				
							
								
								
									
										728
									
								
								docz/docs/03-demos/01-math/01-summary.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										728
									
								
								docz/docs/03-demos/01-math/01-summary.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,728 @@ | ||||
| --- | ||||
| title: Summary Statistics | ||||
| sidebar_label: Summary Statistics | ||||
| pagination_prev: demos/index | ||||
| pagination_next: demos/frontend/index | ||||
| --- | ||||
| 
 | ||||
| import current from '/version.js'; | ||||
| import Tabs from '@theme/Tabs'; | ||||
| import TabItem from '@theme/TabItem'; | ||||
| import CodeBlock from '@theme/CodeBlock'; | ||||
| 
 | ||||
| export const bs = ({borderStyle:"none", background:"none", textAlign:"left" }); | ||||
| 
 | ||||
| Summary statistics help people quickly understand datasets and make informed | ||||
| decisions. Many interesting datasets are stored in spreadsheet files. | ||||
| 
 | ||||
| [SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing | ||||
| data from spreadsheets. | ||||
| 
 | ||||
| This demo uses SheetJS to process data in spreadsheets. We'll explore how to | ||||
| extract spreadsheet data and how to compute simple summary statistics. This | ||||
| demo will focus on two general data representations: | ||||
| 
 | ||||
| - ["Arrays of Objects"](#arrays-of-objects) simplifies processing by translating | ||||
|   from the SheetJS data model to a more idiomatic data structure. | ||||
| - ["Dense Worksheets"](#dense-worksheets) directly analyzes SheetJS worksheets. | ||||
| 
 | ||||
| :::tip pass | ||||
| 
 | ||||
| The [Import Tutorial](/docs/getting-started/examples/import) is a guided example | ||||
| of extracting data from a workbook. It is strongly recommended to review the | ||||
| tutorial first. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::note Tested Deployments | ||||
| 
 | ||||
| This browser demo was tested in the following environments: | ||||
| 
 | ||||
| | Browser     | Date       | | ||||
| |:------------|:-----------| | ||||
| | Chrome 119  | 2024-01-06 | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ## Data Representations | ||||
| 
 | ||||
| Many worksheets include one header row followed by a number of data rows. Each | ||||
| row is an "observation" and each column is a "variable". | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| The "Array of Objects" explanations use more idiomatic JavaScript patterns. It | ||||
| is suitable for smaller datasets. | ||||
| 
 | ||||
| The "Dense Worksheets" approach is more performant, but the code patterns are | ||||
| reminiscent of C. The low-level approach is only encouraged when the traditional | ||||
| patterns are prohibitively slow. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Arrays of Objects | ||||
| 
 | ||||
| The idiomatic JavaScript representation of the dataset is an array of objects. | ||||
| Variable names are typically taken from the first row. Those names are used as | ||||
| keys in each observation. | ||||
| 
 | ||||
| <table><thead><tr><th>Spreadsheet</th><th>JS Data</th></tr></thead><tbody><tr><td> | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| </td><td> | ||||
| 
 | ||||
| ```js | ||||
| [ | ||||
|   { Name: "Bill Clinton", Index: 42 }, | ||||
|   { Name: "GeorgeW Bush", Index: 43 }, | ||||
|   { Name: "Barack Obama", Index: 44 }, | ||||
|   { Name: "Donald Trump", Index: 45 }, | ||||
|   { Name: "Joseph Biden", Index: 46 } | ||||
| ] | ||||
| ``` | ||||
| 
 | ||||
| </td></tr></tbody></table> | ||||
| 
 | ||||
| The SheetJS `sheet_to_json` method[^1] can generate arrays of objects from a | ||||
| worksheet object. For example, the following snippet fetches a test file and | ||||
| creates an array of arrays from the first sheet: | ||||
| 
 | ||||
| ```js | ||||
| const url = "https://docs.sheetjs.com/typedarray/iris.xlsx"; | ||||
| 
 | ||||
| /* fetch file and pull file data into an ArrayBuffer */ | ||||
| const file = await (await fetch(url)).arrayBuffer(); | ||||
| 
 | ||||
| /* parse workbook */ | ||||
| const workbook = XLSX.read(file, {dense: true}); | ||||
| 
 | ||||
| /* first worksheet */ | ||||
| const first_sheet = workbook.Sheets[workbook.SheetNames[0]]; | ||||
| 
 | ||||
| /* generate array of arrays */ | ||||
| // highlight-next-line | ||||
| const aoo = XLSX.utils.sheet_to_json(first_sheet); | ||||
| ``` | ||||
| 
 | ||||
| ### Dense Worksheets | ||||
| 
 | ||||
| SheetJS "dense" worksheets[^2] store cells in an array of arrays. The SheetJS | ||||
| `read` method[^3] accepts a special `dense` option to create dense worksheets. | ||||
| 
 | ||||
| The following example fetches a file: | ||||
| 
 | ||||
| ```js | ||||
| /* fetch file and pull file data into an ArrayBuffer */ | ||||
| const url = "https://docs.sheetjs.com/typedarray/iris.xlsx"; | ||||
| const file = await (await fetch(url)).arrayBuffer(); | ||||
| 
 | ||||
| /* parse workbook */ | ||||
| // highlight-next-line | ||||
| const workbook = XLSX.read(file, {dense: true}); | ||||
| 
 | ||||
| /* first worksheet */ | ||||
| const first_dense_sheet = workbook.Sheets[workbook.SheetNames[0]]; | ||||
| ``` | ||||
| 
 | ||||
| The `"!data"` property of a dense worksheet is an array of arrays of cell | ||||
| objects[^4]. Cell objects include attributes including data type and value. | ||||
| 
 | ||||
| ## Analyzing Variables | ||||
| 
 | ||||
| Individual variables can be extracted by looping through the array of objects | ||||
| and accessing specific keys. For example, using the Iris dataset: | ||||
| 
 | ||||
|  | ||||
| 
 | ||||
| <Tabs groupId="style"> | ||||
|   <TabItem name="aoo" value="Array of Objects"> | ||||
| 
 | ||||
| The following snippet shows the first entry in the array of objects: | ||||
| 
 | ||||
| ```js | ||||
| { | ||||
|   "sepal length": 5.1, | ||||
|   "sepal width": 3.5, | ||||
|   "petal length": 1.4, | ||||
|   "petal width": 0.2, | ||||
|   "class ": "Iris-setosa" | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| The values for the `sepal length` variable can be extracted by indexing each | ||||
| object. The following snippet prints the sepal lengths: | ||||
| 
 | ||||
| ```js | ||||
| for(let i = 0; i < aoo.length; ++i) { | ||||
|   const row = aoo[i]; | ||||
|   const sepal_length = row["sepal length"]; | ||||
|   console.log(sepal_length); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSAoOExtractColumn() { | ||||
|   const [col, setCol] = React.useState([]); | ||||
| 
 | ||||
|   React.useEffect(() => { (async() => { | ||||
|     const ab = await (await fetch("/typedarray/iris.xlsx")).arrayBuffer(); | ||||
|     const wb = XLSX.read(ab, {dense: true}); | ||||
|     const aoo = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); | ||||
|     /* store first 5 sepal lengths in an array */ | ||||
|     const col = []; | ||||
|     for(let i = 0; i < aoo.length; ++i) { | ||||
|       const row = aoo[i]; | ||||
|       const sepal_length = row["sepal length"]; | ||||
|       col.push(sepal_length); if(col.length >= 5) break; | ||||
|     } | ||||
|     setCol(col); | ||||
|   })(); }, []); | ||||
| 
 | ||||
|   return ( <> | ||||
|   <b>First 5 Sepal Length Values</b><br/> | ||||
|   <table><tbody> | ||||
|     {col.map(sw => (<tr><td>{sw}</td></tr>))} | ||||
|   </tbody></table> | ||||
|   </> | ||||
|   ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
|   </TabItem> | ||||
|   <TabItem name="ws" value="Dense Worksheet"> | ||||
| 
 | ||||
| The column for the `sepal length` variable can be determined by testing the cell | ||||
| values in the first row. | ||||
| 
 | ||||
| **Finding the column index for the variable** | ||||
| 
 | ||||
| The first row of cells will be the first row in the `"!data"` array: | ||||
| 
 | ||||
| ```js | ||||
| const first_row = first_dense_sheet["!data"][0]; | ||||
| ``` | ||||
| 
 | ||||
| When looping over the cells in the first row, the cell must be tested in the | ||||
| following order: | ||||
| 
 | ||||
| - confirm the cell object exists (entry is not null) | ||||
| - cell is a text cell (the `t` property will be `"s"`[^5]) | ||||
| - cell value (`v` property[^6]) matches `"sepal length"` | ||||
| 
 | ||||
| ```js | ||||
| let C = -1; | ||||
| for(let i = 0; i < first_row.length; ++i) { | ||||
|   let cell = first_row[i]; | ||||
|   /* confirm cell exists */ | ||||
|   if(!cell) continue; | ||||
|   /* confirm cell is a text cell */ | ||||
|   if(cell.t != "s") continue; | ||||
|   /* compare the text */ | ||||
|   if(cell.v.localeCompare("sepal length") != 0) continue; | ||||
|   /* save column index */ | ||||
|   C = i; break; | ||||
| } | ||||
| /* throw an error if the column cannot be found */ | ||||
| if(C == -1) throw new Error(`"sepal length" column cannot be found! `); | ||||
| ``` | ||||
| 
 | ||||
| **Finding the values for the variable** | ||||
| 
 | ||||
| After finding the column index, the rest of the rows can be scanned. This time, | ||||
| the cell type will be `"n"`[^7] (numeric). The following snippet prints values: | ||||
| 
 | ||||
| ```js | ||||
| const number_of_rows = first_dense_sheet["!data"].length; | ||||
| for(let R = 1; R < number_of_rows; ++R) { | ||||
|   /* confirm row exists */ | ||||
|   let row = first_dense_sheet["!data"][R]; | ||||
|   if(!row) continue; | ||||
|   /* confirm cell exists */ | ||||
|   let cell = row[C]; | ||||
|   if(!cell) continue; | ||||
|   /* confirm cell is a numeric cell */ | ||||
|   if(cell.t != "n") continue; | ||||
|   /* print raw value */ | ||||
|   console.log(cell.v); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| **Live Demo** | ||||
| 
 | ||||
| The following snippet prints the sepal lengths: | ||||
| 
 | ||||
| ```js | ||||
| for(let i = 0; i < aoo.length; ++i) { | ||||
|   const row = aoo[i]; | ||||
|   const sepal_length = row["sepal length"]; | ||||
|   console.log(sepal_length); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSDensExtractColumn() { | ||||
|   const [msg, setMsg] = React.useState(""); | ||||
|   const [col, setCol] = React.useState([]); | ||||
| 
 | ||||
|   React.useEffect(() => { (async() => { | ||||
|     const ab = await (await fetch("/typedarray/iris.xlsx")).arrayBuffer(); | ||||
|     const wb = XLSX.read(ab, {dense: true}); | ||||
|     /* first worksheet */ | ||||
|     const first_dense_sheet = wb.Sheets[wb.SheetNames[0]]; | ||||
| 
 | ||||
|     /* find column index */ | ||||
|     const first_row = first_dense_sheet["!data"][0]; | ||||
|     let C = -1; | ||||
|     for(let i = 0; i < first_row.length; ++i) { | ||||
|       let cell = first_row[i]; | ||||
|       /* confirm cell exists */ | ||||
|       if(!cell) continue; | ||||
|       /* confirm cell is a text cell */ | ||||
|       if(cell.t != "s") continue; | ||||
|       /* compare the text */ | ||||
|       if(cell.v.localeCompare("sepal length") != 0) continue; | ||||
|       /* save column index */ | ||||
|       C = i; break; | ||||
|     } | ||||
|     /* throw an error if the column cannot be found */ | ||||
|     if(C == -1) return setMsg(`"sepal length" column cannot be found! `); | ||||
| 
 | ||||
|     /* store first 5 sepal lengths in an array */ | ||||
|     const col = []; | ||||
|     const number_of_rows = first_dense_sheet["!data"].length; | ||||
|     for(let R = 1; R < number_of_rows; ++R) { | ||||
|       /* confirm row exists */ | ||||
|       let row = first_dense_sheet["!data"][R]; | ||||
|       if(!row) continue; | ||||
|       /* confirm cell exists */ | ||||
|       let cell = row[C]; | ||||
|       if(!cell) continue; | ||||
|       /* confirm cell is a numeric cell */ | ||||
|       if(cell.t != "n") continue; | ||||
|       /* add raw value */ | ||||
|       const sepal_length = cell.v; | ||||
|       col.push(sepal_length); if(col.length >= 5) break; | ||||
|     } | ||||
| 
 | ||||
|     setCol(col); | ||||
|     setMsg("First 5 Sepal Length Values"); | ||||
|   })(); }, []); | ||||
| 
 | ||||
|   return ( <><b>{msg}</b><br/><table><tbody> | ||||
|     {col.map(sw => (<tr><td>{sw}</td></tr>))} | ||||
|   </tbody></table></> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| 
 | ||||
| ## Average (Mean) | ||||
| 
 | ||||
| For a given sequence of numbers $x_1\mathellipsis x_{count}$ the mean $M$ is | ||||
| defined as the sum of the elements divided by the count: | ||||
| 
 | ||||
| $$ | ||||
| M[x;count] = \frac{1}{count}\sum_{i=1}^{count} x_i | ||||
| $$ | ||||
| 
 | ||||
| In JavaScript terms, the mean of an array is the sum of the numbers in the array | ||||
| divided by the total number of numeric values. | ||||
| 
 | ||||
| Non-numeric elements and array holes do not affect the sum and do not contribute | ||||
| to the count. Algorithms are expected to explicitly track the count and cannot | ||||
| assume the array `length` property will be the correct count. | ||||
| 
 | ||||
| :::info pass | ||||
| 
 | ||||
| This definition aligns with the spreadsheet `AVERAGE` function. | ||||
| 
 | ||||
| `AVERAGEA` differs from `AVERAGE` in its treatment of string and Boolean values: | ||||
| string values are treated as zeroes and Boolean values map to their coerced | ||||
| numeric equivalent (`true` is `1` and `false` is `0`). | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| :::note JavaScript Ecosystem | ||||
| 
 | ||||
| Some JavaScript libraries implement functions for computing array means. | ||||
| 
 | ||||
| | Library                 | Implementation                                | | ||||
| |:------------------------|:----------------------------------------------| | ||||
| | `jStat`[^8]             | Textbook sum (divide at end)                  | | ||||
| | `simple-statistics`[^9] | Neumaier compensated sum (divide at end)      | | ||||
| | `stdlib.js`[^10]        | Trial mean (`mean`) / van Reeken (`incrmean`) | | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### Textbook Sum | ||||
| 
 | ||||
| The mean of a sequence of values can be calculated by computing the sum and | ||||
| dividing by the count. | ||||
| 
 | ||||
| <Tabs groupId="style"> | ||||
|   <TabItem name="aoo" value="Array of Objects"> | ||||
| 
 | ||||
| The following function accepts an array of objects and a key. | ||||
| 
 | ||||
| ```js | ||||
| function aoa_average_of_key(aoo, key) { | ||||
|   let sum = 0, cnt = 0; | ||||
|   for(let R = 0; R < aoo.length; ++R) { | ||||
|     const row = aoo[R]; | ||||
|     if(typeof row == "undefined") continue; | ||||
| 
 | ||||
|     const field = row[key]; | ||||
|     if(typeof field != "number") continue; | ||||
| 
 | ||||
|     sum += field; ++cnt; | ||||
|   } | ||||
|   return cnt == 0 ? 0 : sum / cnt; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| <details><summary><b>Live Demo</b> (click to show)</summary> | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSAoOAverageKey() { | ||||
|   const [avg, setAvg] = React.useState(NaN); | ||||
| 
 | ||||
|   function aoa_average_of_key(aoo, key) { | ||||
|     let sum = 0, cnt = 0; | ||||
|     for(let R = 0; R < aoo.length; ++R) { | ||||
|       const row = aoo[R]; | ||||
|       if(typeof row == "undefined") continue; | ||||
| 
 | ||||
|       const field = row[key]; | ||||
|       if(typeof field != "number") continue; | ||||
| 
 | ||||
|       sum += field; ++cnt; | ||||
|     } | ||||
|     return cnt == 0 ? 0 : sum / cnt; | ||||
|   } | ||||
| 
 | ||||
|   React.useEffect(() => { (async() => { | ||||
|     const ab = await (await fetch("/typedarray/iris.xlsx")).arrayBuffer(); | ||||
|     const wb = XLSX.read(ab, {dense: true}); | ||||
|     const aoo = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); | ||||
|     setAvg(aoa_average_of_key(aoo, "sepal length")); | ||||
|   })(); }, []); | ||||
| 
 | ||||
|   return ( <b>The average Sepal Length is {avg}</b> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
|   </TabItem> | ||||
|   <TabItem name="ws" value="Dense Worksheet"> | ||||
| 
 | ||||
| The following function accepts a SheetJS worksheet and a column index. | ||||
| 
 | ||||
| ```js | ||||
| function ws_average_of_col(ws, C) { | ||||
|   const data = ws["!data"]; | ||||
|   let sum = 0, cnt = 0; | ||||
|   for(let R = 1; R < data.length; ++R) { | ||||
|     const row = data[R]; | ||||
|     if(typeof row == "undefined") continue; | ||||
| 
 | ||||
|     const field = row[C]; | ||||
|     if(!field || field.t != "n") continue; | ||||
| 
 | ||||
|     sum += field.v; ++cnt; | ||||
|   } | ||||
|   return cnt == 0 ? 0 : sum / cnt; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| <details><summary><b>Live Demo</b> (click to show)</summary> | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSDenseAverageKey() { | ||||
|   const [avg, setAvg] = React.useState(NaN); | ||||
| 
 | ||||
|   function ws_average_of_col(ws, C) { | ||||
|     const data = ws["!data"]; | ||||
|     let sum = 0, cnt = 0; | ||||
|     for(let R = 1; R < data.length; ++R) { | ||||
|       const row = data[R]; | ||||
|       if(typeof row == "undefined") continue; | ||||
| 
 | ||||
|       const field = row[C]; | ||||
|       if(!field || field.t != "n") continue; | ||||
| 
 | ||||
|       sum += field.v; ++cnt; | ||||
|     } | ||||
|     return cnt == 0 ? 0 : sum / cnt; | ||||
|   } | ||||
| 
 | ||||
|   React.useEffect(() => { (async() => { | ||||
|     const ab = await (await fetch("/typedarray/iris.xlsx")).arrayBuffer(); | ||||
|     const wb = XLSX.read(ab, {dense: true}); | ||||
|     const ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| 
 | ||||
|     /* find column index */ | ||||
|     const first_row = ws["!data"][0]; | ||||
|     let C = -1; | ||||
|     for(let i = 0; i < first_row.length; ++i) { | ||||
|       let cell = first_row[i]; | ||||
|       /* confirm cell exists */ | ||||
|       if(!cell) continue; | ||||
|       /* confirm cell is a text cell */ | ||||
|       if(cell.t != "s") continue; | ||||
|       /* compare the text */ | ||||
|       if(cell.v.localeCompare("sepal length") != 0) continue; | ||||
|       /* save column index */ | ||||
|       C = i; break; | ||||
|     } | ||||
| 
 | ||||
|     setAvg(ws_average_of_col(ws, C)); | ||||
|   })(); }, []); | ||||
| 
 | ||||
|   return ( <b>The average Sepal Length is {avg}</b> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| 
 | ||||
| :::caution pass | ||||
| 
 | ||||
| The textbook method suffers from numerical issues when many values of similar | ||||
| magnitude are summed. As the number of elements grows, the absolute value of the | ||||
| sum grows to orders of magnitude larger than the absolute values of the | ||||
| individual values and significant figures are lost. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| ### van Reeken | ||||
| 
 | ||||
| Some of the issues in the textbook approach can be addressed with a differential | ||||
| technique. Instead of computing the whole sum, it is possible to calculate and | ||||
| update an estimate for the mean. | ||||
| 
 | ||||
| The van Reeken array mean can be implemented in one line of JavaScript code: | ||||
| 
 | ||||
| ```js | ||||
| for(var n = 1, mean = 0; n <= x.length; ++n) mean += (x[n-1] - mean)/n; | ||||
| ``` | ||||
| 
 | ||||
| <details><summary><b>Math details</b> (click to show)</summary> | ||||
| 
 | ||||
| Let $M[x;m] = \frac{1}{m}\sum_{i=1}^{m}x_m$ be the mean of the first $m$ elements. Then: | ||||
| 
 | ||||
| <table style={bs}><tbody style={bs}><tr style={bs}><td style={bs}> | ||||
| 
 | ||||
| $M[x;m+1]$ | ||||
| 
 | ||||
| </td><td style={bs}> | ||||
| 
 | ||||
| $= \frac{1}{m+1}\sum_{i=1}^{m+1} x_i$ | ||||
| 
 | ||||
| </td></tr><tr style={bs}><td style={bs}> </td><td style={bs}> | ||||
| 
 | ||||
| $= \frac{1}{m+1}\sum_{i=1}^{m} x_i + \frac{x_{m+1}}{m+1}$ | ||||
| 
 | ||||
| </td></tr><tr style={bs}><td style={bs}> </td><td style={bs}> | ||||
| 
 | ||||
| $= \frac{m}{m+1}(\frac{1}{m}\sum_{i=1}^{m} x_i) + \frac{x_{m+1}}{m+1}$ | ||||
| 
 | ||||
| </td></tr><tr style={bs}><td style={bs}> </td><td style={bs}> | ||||
| 
 | ||||
| $= \frac{m}{m+1}M[x;m] + \frac{x_{m+1}}{m+1}$ | ||||
| 
 | ||||
| </td></tr><tr style={bs}><td style={bs}> </td><td style={bs}> | ||||
| 
 | ||||
| $= (1 - \frac{1}{m+1})M[x;m] + \frac{x_{m+1}}{m+1}$ | ||||
| 
 | ||||
| </td></tr><tr style={bs}><td style={bs}> </td><td style={bs}> | ||||
| 
 | ||||
| $= M[x;m] + \frac{x_{m+1}}{m+1} - \frac{1}{m+1}M[x;m]$ | ||||
| 
 | ||||
| </td></tr><tr style={bs}><td style={bs}> </td><td style={bs}> | ||||
| 
 | ||||
| $= M[x;m] + \frac{1}{m+1}(x_{m+1}-M[x;m])$ | ||||
| 
 | ||||
| </td></tr><tr style={bs}><td style={bs}> | ||||
| 
 | ||||
| $new\_mean$ | ||||
| 
 | ||||
| </td><td style={bs}> | ||||
| 
 | ||||
| $= old\_mean + (x_{m+1}-old\_mean) / (m+1)$ | ||||
| 
 | ||||
| </td></tr></tbody></table> | ||||
| 
 | ||||
| Switching to zero-based indexing, the relation matches the following expression: | ||||
| 
 | ||||
| ```js | ||||
| new_mean = old_mean + (x[m] - old_mean) / (m + 1); | ||||
| ``` | ||||
| 
 | ||||
| This update can be succinctly implemented in JavaScript: | ||||
| 
 | ||||
| ```js | ||||
| mean += (x[m] - mean) / (m + 1); | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
| <Tabs groupId="style"> | ||||
|   <TabItem name="aoo" value="Array of Objects"> | ||||
| 
 | ||||
| The following function accepts an array of objects and a key. | ||||
| 
 | ||||
| ```js | ||||
| function aoa_mean_of_key(aoo, key) { | ||||
|   let mean = 0, cnt = 0; | ||||
|   for(let R = 0; R < aoo.length; ++R) { | ||||
|     const row = aoo[R]; | ||||
|     if(typeof row == "undefined") continue; | ||||
| 
 | ||||
|     const field = row[key]; | ||||
|     if(typeof field != "number") continue; | ||||
| 
 | ||||
|     mean += (field - mean) / ++cnt; | ||||
|   } | ||||
|   return cnt == 0 ? 0 : mean; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| <details><summary><b>Live Demo</b> (click to show)</summary> | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSAoOMeanKey() { | ||||
|   const [avg, setAvg] = React.useState(NaN); | ||||
| 
 | ||||
|   function aoa_mean_of_key(aoo, key) { | ||||
|     let mean = 0, cnt = 0; | ||||
|     for(let R = 0; R < aoo.length; ++R) { | ||||
|       const row = aoo[R]; | ||||
|       if(typeof row == "undefined") continue; | ||||
| 
 | ||||
|       const field = row[key]; | ||||
|       if(typeof field != "number") continue; | ||||
| 
 | ||||
|       mean += (field - mean) / ++cnt; | ||||
|     } | ||||
|     return cnt == 0 ? 0 : mean; | ||||
|   } | ||||
| 
 | ||||
|   React.useEffect(() => { (async() => { | ||||
|     const ab = await (await fetch("/typedarray/iris.xlsx")).arrayBuffer(); | ||||
|     const wb = XLSX.read(ab, {dense: true}); | ||||
|     const aoo = XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]); | ||||
|     setAvg(aoa_mean_of_key(aoo, "sepal length")); | ||||
|   })(); }, []); | ||||
| 
 | ||||
|   return ( <b>The average Sepal Length is {avg}</b> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
|   </TabItem> | ||||
|   <TabItem name="ws" value="Dense Worksheet"> | ||||
| 
 | ||||
| The following function accepts a SheetJS worksheet and a column index. | ||||
| 
 | ||||
| ```js | ||||
| function ws_mean_of_col(ws, C) { | ||||
|   const data = ws["!data"]; | ||||
|   let mean = 0, cnt = 0; | ||||
|   for(let R = 1; R < data.length; ++R) { | ||||
|     const row = data[R]; | ||||
|     if(typeof row == "undefined") continue; | ||||
| 
 | ||||
|     const field = row[C]; | ||||
|     if(!field || field.t != "n") continue; | ||||
| 
 | ||||
|     mean += (field.v - mean) / ++cnt; | ||||
|   } | ||||
|   return cnt == 0 ? 0 : mean; | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| <details><summary><b>Live Demo</b> (click to show)</summary> | ||||
| 
 | ||||
| ```jsx live | ||||
| function SheetJSDenseMeanKey() { | ||||
|   const [avg, setAvg] = React.useState(NaN); | ||||
| 
 | ||||
|   function ws_mean_of_col(ws, C) { | ||||
|     const data = ws["!data"]; | ||||
|     let mean = 0, cnt = 0; | ||||
|     for(let R = 1; R < data.length; ++R) { | ||||
|       const row = data[R]; | ||||
|       if(typeof row == "undefined") continue; | ||||
| 
 | ||||
|       const field = row[C]; | ||||
|       if(!field || field.t != "n") continue; | ||||
| 
 | ||||
|       mean += (field.v - mean) / ++cnt; | ||||
|     } | ||||
|     return cnt == 0 ? 0 : mean; | ||||
|   } | ||||
| 
 | ||||
|   React.useEffect(() => { (async() => { | ||||
|     const ab = await (await fetch("/typedarray/iris.xlsx")).arrayBuffer(); | ||||
|     const wb = XLSX.read(ab, {dense: true}); | ||||
|     const ws = wb.Sheets[wb.SheetNames[0]]; | ||||
| 
 | ||||
|     /* find column index */ | ||||
|     const first_row = ws["!data"][0]; | ||||
|     let C = -1; | ||||
|     for(let i = 0; i < first_row.length; ++i) { | ||||
|       let cell = first_row[i]; | ||||
|       /* confirm cell exists */ | ||||
|       if(!cell) continue; | ||||
|       /* confirm cell is a text cell */ | ||||
|       if(cell.t != "s") continue; | ||||
|       /* compare the text */ | ||||
|       if(cell.v.localeCompare("sepal length") != 0) continue; | ||||
|       /* save column index */ | ||||
|       C = i; break; | ||||
|     } | ||||
| 
 | ||||
|     setAvg(ws_mean_of_col(ws, C)); | ||||
|   })(); }, []); | ||||
| 
 | ||||
|   return ( <b>The average Sepal Length is {avg}</b> ); | ||||
| } | ||||
| ``` | ||||
| 
 | ||||
| </details> | ||||
| 
 | ||||
|   </TabItem> | ||||
| </Tabs> | ||||
| 
 | ||||
| :::note Historical Context | ||||
| 
 | ||||
| This algorithm is generally attributed to Welford[^11]. However, the original | ||||
| paper does not propose this algorithm for calculating the mean! | ||||
| 
 | ||||
| Programmers including Neely[^12] attributed a different algorithm to Welford. | ||||
| van Reeken[^13] reported success with the algorithm presented in this section. | ||||
| 
 | ||||
| Knuth[^14] erroneously attributed this implementation of the mean to Welford. | ||||
| 
 | ||||
| ::: | ||||
| 
 | ||||
| [^1]: See [`sheet_to_json` in "Utilities"](/docs/api/utilities/array#array-output) | ||||
| [^2]: See ["Dense Mode" in "Utilities"](/docs/csf/sheet#dense-mode) | ||||
| [^3]: See [`read` in "Reading Files"](/docs/api/parse-options) | ||||
| [^4]: See ["Dense Mode" in "Utilities"](/docs/csf/sheet#dense-mode) | ||||
| [^5]: See ["Cell Types" in "Cell Objects"](/docs/csf/cell#cell-types) | ||||
| [^6]: See ["Underlying Values" in "Cell Objects"](/docs/csf/cell#underlying-values) | ||||
| [^7]: See ["Cell Types" in "Cell Objects"](/docs/csf/cell#cell-types) | ||||
| [^8]: See [`mean()`](https://jstat.github.io/all.html#mean) in the `jStat` documentation. | ||||
| [^9]: See [`mean`](http://simple-statistics.github.io/docs/#mean) in the `simple-statistics` documentation. | ||||
| [^10]: See [`incrsum`](https://stdlib.io/docs/api/latest/@stdlib/stats/incr/sum) in the `stdlib.js` documentation. | ||||
| [^11]: See "Note on a Method for Calculated Corrected Sums of Squares and Products" in Technometrics Vol 4 No 3 (1962 August). | ||||
| [^12]: See "Comparison of Several Algorithms for Computation of Means, Standard Deviations and Correlation Coefficients" in CACM Vol 9 No 7 (1966 July). | ||||
| [^13]: See "Dealing with Neely's Algorithms" in CACM Vol 11 No 3 (1968 March). | ||||
| [^14]: See "The Art of Computer Programming: Seminumerical Algorithms" Third Edition page 232. | ||||
| @ -378,7 +378,7 @@ func azure functionapp publish FUNCTION_NAME | ||||
| 
 | ||||
| After publishing, the process will print the "Invoke url": | ||||
| 
 | ||||
| ``` | ||||
| ```text pass | ||||
| Functions in sheetjsazure: | ||||
|     SheetJSAzure - [httpTrigger] | ||||
| // highlight-next-line | ||||
|  | ||||
| @ -4,6 +4,9 @@ | ||||
| const lightCodeTheme = require('prism-react-renderer/themes/github'); | ||||
| const darkCodeTheme = require('prism-react-renderer/themes/dracula'); | ||||
| 
 | ||||
| const math = require('remark-math'); | ||||
| const katex = require('rehype-katex'); | ||||
| 
 | ||||
| /** @type {import('@docusaurus/types').Config} */ | ||||
| const config = { | ||||
|   title: 'SheetJS Community Edition', | ||||
| @ -31,6 +34,8 @@ const config = { | ||||
|           sidebarPath: require.resolve('./sidebars.js'), | ||||
|           showLastUpdateTime: true, | ||||
|           editUrl: 'https://git.sheetjs.com/sheetjs/docs.sheetjs.com/src/branch/master/docz', | ||||
|           remarkPlugins: [math], | ||||
|           rehypePlugins: [katex /* , { strict: false } */], | ||||
|         }, | ||||
|         //blog: {
 | ||||
|         //  showReadingTime: true,
 | ||||
| @ -160,6 +165,13 @@ const config = { | ||||
|       async: true | ||||
|     } | ||||
|   ], | ||||
|   stylesheets: [ | ||||
|     { | ||||
|       href: '/katex/katex.min.css', | ||||
|       type: 'text/css', | ||||
|       crossorigin: 'anonymous', | ||||
|     }, | ||||
|   ], | ||||
|   plugins: [ | ||||
|     require.resolve("@cmfcmf/docusaurus-search-local"), | ||||
|     [ '@docusaurus/plugin-client-redirects', { | ||||
|  | ||||
| @ -26,6 +26,8 @@ | ||||
|     "prism-react-renderer": "1.3.5", | ||||
|     "react": "17.0.2", | ||||
|     "react-dom": "17.0.2", | ||||
|     "rehype-katex": "4.0.0", | ||||
|     "remark-math": "3.0.1", | ||||
|     "xlsx": "https://cdn.sheetjs.com/xlsx-0.20.1/xlsx-0.20.1.tgz" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|  | ||||
							
								
								
									
										91
									
								
								docz/static/katex/README.md
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										91
									
								
								docz/static/katex/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,91 @@ | ||||
| # [<img src="https://katex.org/img/katex-logo-black.svg" width="130" alt="KaTeX">](https://katex.org/) | ||||
| [](https://www.npmjs.com/package/katex) | ||||
| [](https://circleci.com/gh/KaTeX/KaTeX) | ||||
| [](https://codecov.io/gh/KaTeX/KaTeX) | ||||
| [](https://gitter.im/KaTeX/KaTeX?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||||
| [](https://dependabot.com) | ||||
| [](https://www.jsdelivr.com/package/npm/katex) | ||||
|  | ||||
| 
 | ||||
| KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web. | ||||
| 
 | ||||
|  * **Fast:** KaTeX renders its math synchronously and doesn't need to reflow the page. See how it compares to a competitor in [this speed test](http://www.intmath.com/cg5/katex-mathjax-comparison.php). | ||||
|  * **Print quality:** KaTeX's layout is based on Donald Knuth's TeX, the gold standard for math typesetting. | ||||
|  * **Self contained:** KaTeX has no dependencies and can easily be bundled with your website resources. | ||||
|  * **Server side rendering:** KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML. | ||||
| 
 | ||||
| KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 11. | ||||
| 
 | ||||
| KaTeX supports much (but not all) of LaTeX and many LaTeX packages. See the [list of supported functions](https://katex.org/docs/supported.html). | ||||
| 
 | ||||
| Try out KaTeX [on the demo page](https://katex.org/#demo)! | ||||
| 
 | ||||
| ## Getting started | ||||
| 
 | ||||
| ### Starter template | ||||
| 
 | ||||
| ```html | ||||
| <!DOCTYPE html> | ||||
| <!-- KaTeX requires the use of the HTML5 doctype. Without it, KaTeX may not render properly --> | ||||
| <html> | ||||
|   <head> | ||||
|     <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css" integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X" crossorigin="anonymous"> | ||||
| 
 | ||||
|     <!-- The loading of KaTeX is deferred to speed up page rendering --> | ||||
|     <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.js" integrity="sha384-g7c+Jr9ZivxKLnZTDUhnkOnsh30B4H0rpLUpJ4jAIKs4fnJI+sEnkvrMWph2EDg4" crossorigin="anonymous"></script> | ||||
| 
 | ||||
|     <!-- To automatically render math in text elements, include the auto-render extension: --> | ||||
|     <script defer src="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/contrib/auto-render.min.js" integrity="sha384-mll67QQFJfxn0IYznZYonOWZ644AWYC+Pt2cHqMaRhXVrursRwvLnLaebdGIlYNa" crossorigin="anonymous" | ||||
|         onload="renderMathInElement(document.body);"></script> | ||||
|   </head> | ||||
|   ... | ||||
| </html> | ||||
| ``` | ||||
| 
 | ||||
| You can also [download KaTeX](https://github.com/KaTeX/KaTeX/releases) and host it yourself. | ||||
| 
 | ||||
| For details on how to configure auto-render extension, refer to [the documentation](https://katex.org/docs/autorender.html). | ||||
| 
 | ||||
| ### API | ||||
| 
 | ||||
| Call `katex.render` to render a TeX expression directly into a DOM element. | ||||
| For example: | ||||
| 
 | ||||
| ```js | ||||
| katex.render("c = \\pm\\sqrt{a^2 + b^2}", element, { | ||||
|     throwOnError: false | ||||
| }); | ||||
| ``` | ||||
| 
 | ||||
| Call `katex.renderToString` to generate an HTML string of the rendered math, | ||||
| e.g., for server-side rendering.  For example: | ||||
| 
 | ||||
| ```js | ||||
| var html = katex.renderToString("c = \\pm\\sqrt{a^2 + b^2}", { | ||||
|     throwOnError: false | ||||
| }); | ||||
| // '<span class="katex">...</span>' | ||||
| ``` | ||||
| 
 | ||||
| Make sure to include the CSS and font files in both cases. | ||||
| If you are doing all rendering on the server, there is no need to include the | ||||
| JavaScript on the client. | ||||
| 
 | ||||
| The examples above use the `throwOnError: false` option, which renders invalid | ||||
| inputs as the TeX source code in red (by default), with the error message as | ||||
| hover text.  For other available options, see the | ||||
| [API documentation](https://katex.org/docs/api.html), | ||||
| [options documentation](https://katex.org/docs/options.html), and | ||||
| [handling errors documentation](https://katex.org/docs/error.html). | ||||
| 
 | ||||
| ## Demo and Documentation | ||||
| 
 | ||||
| Learn more about using KaTeX [on the website](https://katex.org)! | ||||
| 
 | ||||
| ## Contributing | ||||
| 
 | ||||
| See [CONTRIBUTING.md](CONTRIBUTING.md) | ||||
| 
 | ||||
| ## License | ||||
| 
 | ||||
| KaTeX is licensed under the [MIT License](http://opensource.org/licenses/MIT). | ||||
							
								
								
									
										350
									
								
								docz/static/katex/contrib/auto-render.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										350
									
								
								docz/static/katex/contrib/auto-render.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,350 @@ | ||||
| (function webpackUniversalModuleDefinition(root, factory) { | ||||
| 	if(typeof exports === 'object' && typeof module === 'object') | ||||
| 		module.exports = factory(require("katex")); | ||||
| 	else if(typeof define === 'function' && define.amd) | ||||
| 		define(["katex"], factory); | ||||
| 	else if(typeof exports === 'object') | ||||
| 		exports["renderMathInElement"] = factory(require("katex")); | ||||
| 	else | ||||
| 		root["renderMathInElement"] = factory(root["katex"]); | ||||
| })((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) { | ||||
| return /******/ (function(modules) { // webpackBootstrap
 | ||||
| /******/ 	// The module cache
 | ||||
| /******/ 	var installedModules = {}; | ||||
| /******/ | ||||
| /******/ 	// The require function
 | ||||
| /******/ 	function __webpack_require__(moduleId) { | ||||
| /******/ | ||||
| /******/ 		// Check if module is in cache
 | ||||
| /******/ 		if(installedModules[moduleId]) { | ||||
| /******/ 			return installedModules[moduleId].exports; | ||||
| /******/ 		} | ||||
| /******/ 		// Create a new module (and put it into the cache)
 | ||||
| /******/ 		var module = installedModules[moduleId] = { | ||||
| /******/ 			i: moduleId, | ||||
| /******/ 			l: false, | ||||
| /******/ 			exports: {} | ||||
| /******/ 		}; | ||||
| /******/ | ||||
| /******/ 		// Execute the module function
 | ||||
| /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | ||||
| /******/ | ||||
| /******/ 		// Flag the module as loaded
 | ||||
| /******/ 		module.l = true; | ||||
| /******/ | ||||
| /******/ 		// Return the exports of the module
 | ||||
| /******/ 		return module.exports; | ||||
| /******/ 	} | ||||
| /******/ | ||||
| /******/ | ||||
| /******/ 	// expose the modules object (__webpack_modules__)
 | ||||
| /******/ 	__webpack_require__.m = modules; | ||||
| /******/ | ||||
| /******/ 	// expose the module cache
 | ||||
| /******/ 	__webpack_require__.c = installedModules; | ||||
| /******/ | ||||
| /******/ 	// define getter function for harmony exports
 | ||||
| /******/ 	__webpack_require__.d = function(exports, name, getter) { | ||||
| /******/ 		if(!__webpack_require__.o(exports, name)) { | ||||
| /******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter }); | ||||
| /******/ 		} | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// define __esModule on exports
 | ||||
| /******/ 	__webpack_require__.r = function(exports) { | ||||
| /******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { | ||||
| /******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||||
| /******/ 		} | ||||
| /******/ 		Object.defineProperty(exports, '__esModule', { value: true }); | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// create a fake namespace object
 | ||||
| /******/ 	// mode & 1: value is a module id, require it
 | ||||
| /******/ 	// mode & 2: merge all properties of value into the ns
 | ||||
| /******/ 	// mode & 4: return value when already ns object
 | ||||
| /******/ 	// mode & 8|1: behave like require
 | ||||
| /******/ 	__webpack_require__.t = function(value, mode) { | ||||
| /******/ 		if(mode & 1) value = __webpack_require__(value); | ||||
| /******/ 		if(mode & 8) return value; | ||||
| /******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; | ||||
| /******/ 		var ns = Object.create(null); | ||||
| /******/ 		__webpack_require__.r(ns); | ||||
| /******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value }); | ||||
| /******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); | ||||
| /******/ 		return ns; | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// getDefaultExport function for compatibility with non-harmony modules
 | ||||
| /******/ 	__webpack_require__.n = function(module) { | ||||
| /******/ 		var getter = module && module.__esModule ? | ||||
| /******/ 			function getDefault() { return module['default']; } : | ||||
| /******/ 			function getModuleExports() { return module; }; | ||||
| /******/ 		__webpack_require__.d(getter, 'a', getter); | ||||
| /******/ 		return getter; | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// Object.prototype.hasOwnProperty.call
 | ||||
| /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; | ||||
| /******/ | ||||
| /******/ 	// __webpack_public_path__
 | ||||
| /******/ 	__webpack_require__.p = ""; | ||||
| /******/ | ||||
| /******/ | ||||
| /******/ 	// Load entry module and return exports
 | ||||
| /******/ 	return __webpack_require__(__webpack_require__.s = 1); | ||||
| /******/ }) | ||||
| /************************************************************************/ | ||||
| /******/ ([ | ||||
| /* 0 */ | ||||
| /***/ (function(module, exports) { | ||||
| 
 | ||||
| module.exports = __WEBPACK_EXTERNAL_MODULE__0__; | ||||
| 
 | ||||
| /***/ }), | ||||
| /* 1 */ | ||||
| /***/ (function(module, __webpack_exports__, __webpack_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| __webpack_require__.r(__webpack_exports__); | ||||
| 
 | ||||
| // EXTERNAL MODULE: external "katex"
 | ||||
| var external_katex_ = __webpack_require__(0); | ||||
| var external_katex_default = /*#__PURE__*/__webpack_require__.n(external_katex_); | ||||
| 
 | ||||
| // CONCATENATED MODULE: ./contrib/auto-render/splitAtDelimiters.js
 | ||||
| /* eslint no-constant-condition:0 */ | ||||
| var findEndOfMath = function findEndOfMath(delimiter, text, startIndex) { | ||||
|   // Adapted from
 | ||||
|   // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
 | ||||
|   var index = startIndex; | ||||
|   var braceLevel = 0; | ||||
|   var delimLength = delimiter.length; | ||||
| 
 | ||||
|   while (index < text.length) { | ||||
|     var character = text[index]; | ||||
| 
 | ||||
|     if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) { | ||||
|       return index; | ||||
|     } else if (character === "\\") { | ||||
|       index++; | ||||
|     } else if (character === "{") { | ||||
|       braceLevel++; | ||||
|     } else if (character === "}") { | ||||
|       braceLevel--; | ||||
|     } | ||||
| 
 | ||||
|     index++; | ||||
|   } | ||||
| 
 | ||||
|   return -1; | ||||
| }; | ||||
| 
 | ||||
| var splitAtDelimiters = function splitAtDelimiters(startData, leftDelim, rightDelim, display) { | ||||
|   var finalData = []; | ||||
| 
 | ||||
|   for (var i = 0; i < startData.length; i++) { | ||||
|     if (startData[i].type === "text") { | ||||
|       var text = startData[i].data; | ||||
|       var lookingForLeft = true; | ||||
|       var currIndex = 0; | ||||
|       var nextIndex = void 0; | ||||
|       nextIndex = text.indexOf(leftDelim); | ||||
| 
 | ||||
|       if (nextIndex !== -1) { | ||||
|         currIndex = nextIndex; | ||||
|         finalData.push({ | ||||
|           type: "text", | ||||
|           data: text.slice(0, currIndex) | ||||
|         }); | ||||
|         lookingForLeft = false; | ||||
|       } | ||||
| 
 | ||||
|       while (true) { | ||||
|         if (lookingForLeft) { | ||||
|           nextIndex = text.indexOf(leftDelim, currIndex); | ||||
| 
 | ||||
|           if (nextIndex === -1) { | ||||
|             break; | ||||
|           } | ||||
| 
 | ||||
|           finalData.push({ | ||||
|             type: "text", | ||||
|             data: text.slice(currIndex, nextIndex) | ||||
|           }); | ||||
|           currIndex = nextIndex; | ||||
|         } else { | ||||
|           nextIndex = findEndOfMath(rightDelim, text, currIndex + leftDelim.length); | ||||
| 
 | ||||
|           if (nextIndex === -1) { | ||||
|             break; | ||||
|           } | ||||
| 
 | ||||
|           finalData.push({ | ||||
|             type: "math", | ||||
|             data: text.slice(currIndex + leftDelim.length, nextIndex), | ||||
|             rawData: text.slice(currIndex, nextIndex + rightDelim.length), | ||||
|             display: display | ||||
|           }); | ||||
|           currIndex = nextIndex + rightDelim.length; | ||||
|         } | ||||
| 
 | ||||
|         lookingForLeft = !lookingForLeft; | ||||
|       } | ||||
| 
 | ||||
|       finalData.push({ | ||||
|         type: "text", | ||||
|         data: text.slice(currIndex) | ||||
|       }); | ||||
|     } else { | ||||
|       finalData.push(startData[i]); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return finalData; | ||||
| }; | ||||
| 
 | ||||
| /* harmony default export */ var auto_render_splitAtDelimiters = (splitAtDelimiters); | ||||
| // CONCATENATED MODULE: ./contrib/auto-render/auto-render.js
 | ||||
| /* eslint no-console:0 */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| var auto_render_splitWithDelimiters = function splitWithDelimiters(text, delimiters) { | ||||
|   var data = [{ | ||||
|     type: "text", | ||||
|     data: text | ||||
|   }]; | ||||
| 
 | ||||
|   for (var i = 0; i < delimiters.length; i++) { | ||||
|     var delimiter = delimiters[i]; | ||||
|     data = auto_render_splitAtDelimiters(data, delimiter.left, delimiter.right, delimiter.display || false); | ||||
|   } | ||||
| 
 | ||||
|   return data; | ||||
| }; | ||||
| /* Note: optionsCopy is mutated by this method. If it is ever exposed in the | ||||
|  * API, we should copy it before mutating. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| var auto_render_renderMathInText = function renderMathInText(text, optionsCopy) { | ||||
|   var data = auto_render_splitWithDelimiters(text, optionsCopy.delimiters); | ||||
| 
 | ||||
|   if (data.length === 1 && data[0].type === 'text') { | ||||
|     // There is no formula in the text.
 | ||||
|     // Let's return null which means there is no need to replace
 | ||||
|     // the current text node with a new one.
 | ||||
|     return null; | ||||
|   } | ||||
| 
 | ||||
|   var fragment = document.createDocumentFragment(); | ||||
| 
 | ||||
|   for (var i = 0; i < data.length; i++) { | ||||
|     if (data[i].type === "text") { | ||||
|       fragment.appendChild(document.createTextNode(data[i].data)); | ||||
|     } else { | ||||
|       var span = document.createElement("span"); | ||||
|       var math = data[i].data; // Override any display mode defined in the settings with that
 | ||||
|       // defined by the text itself
 | ||||
| 
 | ||||
|       optionsCopy.displayMode = data[i].display; | ||||
| 
 | ||||
|       try { | ||||
|         if (optionsCopy.preProcess) { | ||||
|           math = optionsCopy.preProcess(math); | ||||
|         } | ||||
| 
 | ||||
|         external_katex_default.a.render(math, span, optionsCopy); | ||||
|       } catch (e) { | ||||
|         if (!(e instanceof external_katex_default.a.ParseError)) { | ||||
|           throw e; | ||||
|         } | ||||
| 
 | ||||
|         optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e); | ||||
|         fragment.appendChild(document.createTextNode(data[i].rawData)); | ||||
|         continue; | ||||
|       } | ||||
| 
 | ||||
|       fragment.appendChild(span); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return fragment; | ||||
| }; | ||||
| 
 | ||||
| var renderElem = function renderElem(elem, optionsCopy) { | ||||
|   for (var i = 0; i < elem.childNodes.length; i++) { | ||||
|     var childNode = elem.childNodes[i]; | ||||
| 
 | ||||
|     if (childNode.nodeType === 3) { | ||||
|       // Text node
 | ||||
|       var frag = auto_render_renderMathInText(childNode.textContent, optionsCopy); | ||||
| 
 | ||||
|       if (frag) { | ||||
|         i += frag.childNodes.length - 1; | ||||
|         elem.replaceChild(frag, childNode); | ||||
|       } | ||||
|     } else if (childNode.nodeType === 1) { | ||||
|       (function () { | ||||
|         // Element node
 | ||||
|         var className = ' ' + childNode.className + ' '; | ||||
|         var shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(function (x) { | ||||
|           return className.indexOf(' ' + x + ' ') === -1; | ||||
|         }); | ||||
| 
 | ||||
|         if (shouldRender) { | ||||
|           renderElem(childNode, optionsCopy); | ||||
|         } | ||||
|       })(); | ||||
|     } // Otherwise, it's something else, and ignore it.
 | ||||
| 
 | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| var renderMathInElement = function renderMathInElement(elem, options) { | ||||
|   if (!elem) { | ||||
|     throw new Error("No element provided to render"); | ||||
|   } | ||||
| 
 | ||||
|   var optionsCopy = {}; // Object.assign(optionsCopy, option)
 | ||||
| 
 | ||||
|   for (var option in options) { | ||||
|     if (options.hasOwnProperty(option)) { | ||||
|       optionsCopy[option] = options[option]; | ||||
|     } | ||||
|   } // default options
 | ||||
| 
 | ||||
| 
 | ||||
|   optionsCopy.delimiters = optionsCopy.delimiters || [{ | ||||
|     left: "$$", | ||||
|     right: "$$", | ||||
|     display: true | ||||
|   }, { | ||||
|     left: "\\(", | ||||
|     right: "\\)", | ||||
|     display: false | ||||
|   }, // LaTeX uses $…$, but it ruins the display of normal `$` in text:
 | ||||
|   // {left: "$", right: "$", display: false},
 | ||||
|   //  \[…\] must come last in this array. Otherwise, renderMathInElement
 | ||||
|   //  will search for \[ before it searches for $$ or  \(
 | ||||
|   // That makes it susceptible to finding a \\[0.3em] row delimiter and
 | ||||
|   // treating it as if it were the start of a KaTeX math zone.
 | ||||
|   { | ||||
|     left: "\\[", | ||||
|     right: "\\]", | ||||
|     display: true | ||||
|   }]; | ||||
|   optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code", "option"]; | ||||
|   optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || []; | ||||
|   optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different
 | ||||
|   // math elements within a single call to `renderMathInElement`.
 | ||||
| 
 | ||||
|   optionsCopy.macros = optionsCopy.macros || {}; | ||||
|   renderElem(elem, optionsCopy); | ||||
| }; | ||||
| 
 | ||||
| /* harmony default export */ var auto_render = __webpack_exports__["default"] = (renderMathInElement); | ||||
| 
 | ||||
| /***/ }) | ||||
| /******/ ])["default"]; | ||||
| }); | ||||
							
								
								
									
										1
									
								
								docz/static/katex/contrib/auto-render.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								docz/static/katex/contrib/auto-render.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),a=function(e,t,r){for(var n=r,o=0,a=e.length;n<t.length;){var i=t[n];if(o<=0&&t.slice(n,n+a)===e)return n;"\\"===i?n++:"{"===i?o++:"}"===i&&o--,n++}return-1},i=function(e,t,r,n){for(var o=[],i=0;i<e.length;i++)if("text"===e[i].type){var l=e[i].data,d=!0,s=0,f=void 0;for(-1!==(f=l.indexOf(t))&&(s=f,o.push({type:"text",data:l.slice(0,s)}),d=!1);;){if(d){if(-1===(f=l.indexOf(t,s)))break;o.push({type:"text",data:l.slice(s,f)}),s=f}else{if(-1===(f=a(r,l,s+t.length)))break;o.push({type:"math",data:l.slice(s+t.length,f),rawData:l.slice(s,f+r.length),display:n}),s=f+r.length}d=!d}o.push({type:"text",data:l.slice(s)})}else o.push(e[i]);return o},l=function(e,t){var r=function(e,t){for(var r=[{type:"text",data:e}],n=0;n<t.length;n++){var o=t[n];r=i(r,o.left,o.right,o.display||!1)}return r}(e,t.delimiters);if(1===r.length&&"text"===r[0].type)return null;for(var n=document.createDocumentFragment(),a=0;a<r.length;a++)if("text"===r[a].type)n.appendChild(document.createTextNode(r[a].data));else{var l=document.createElement("span"),d=r[a].data;t.displayMode=r[a].display;try{t.preProcess&&(d=t.preProcess(d)),o.a.render(d,l,t)}catch(e){if(!(e instanceof o.a.ParseError))throw e;t.errorCallback("KaTeX auto-render: Failed to parse `"+r[a].data+"` with ",e),n.appendChild(document.createTextNode(r[a].rawData));continue}n.appendChild(l)}return n};t.default=function(e,t){if(!e)throw new Error("No element provided to render");var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);r.delimiters=r.delimiters||[{left:"$$",right:"$$",display:!0},{left:"\\(",right:"\\)",display:!1},{left:"\\[",right:"\\]",display:!0}],r.ignoredTags=r.ignoredTags||["script","noscript","style","textarea","pre","code","option"],r.ignoredClasses=r.ignoredClasses||[],r.errorCallback=r.errorCallback||console.error,r.macros=r.macros||{},function e(t,r){for(var n=0;n<t.childNodes.length;n++){var o=t.childNodes[n];if(3===o.nodeType){var a=l(o.textContent,r);a&&(n+=a.childNodes.length-1,t.replaceChild(a,o))}else 1===o.nodeType&&function(){var t=" "+o.className+" ";-1===r.ignoredTags.indexOf(o.nodeName.toLowerCase())&&r.ignoredClasses.every(function(e){return-1===t.indexOf(" "+e+" ")})&&e(o,r)}()}}(e,r)}}]).default}); | ||||
							
								
								
									
										226
									
								
								docz/static/katex/contrib/auto-render.mjs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										226
									
								
								docz/static/katex/contrib/auto-render.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,226 @@ | ||||
| import katex from '../katex.mjs'; | ||||
| 
 | ||||
| /* eslint no-constant-condition:0 */ | ||||
| const findEndOfMath = function findEndOfMath(delimiter, text, startIndex) { | ||||
|   // Adapted from
 | ||||
|   // https://github.com/Khan/perseus/blob/master/src/perseus-markdown.jsx
 | ||||
|   let index = startIndex; | ||||
|   let braceLevel = 0; | ||||
|   const delimLength = delimiter.length; | ||||
| 
 | ||||
|   while (index < text.length) { | ||||
|     const character = text[index]; | ||||
| 
 | ||||
|     if (braceLevel <= 0 && text.slice(index, index + delimLength) === delimiter) { | ||||
|       return index; | ||||
|     } else if (character === "\\") { | ||||
|       index++; | ||||
|     } else if (character === "{") { | ||||
|       braceLevel++; | ||||
|     } else if (character === "}") { | ||||
|       braceLevel--; | ||||
|     } | ||||
| 
 | ||||
|     index++; | ||||
|   } | ||||
| 
 | ||||
|   return -1; | ||||
| }; | ||||
| 
 | ||||
| const splitAtDelimiters = function splitAtDelimiters(startData, leftDelim, rightDelim, display) { | ||||
|   const finalData = []; | ||||
| 
 | ||||
|   for (let i = 0; i < startData.length; i++) { | ||||
|     if (startData[i].type === "text") { | ||||
|       const text = startData[i].data; | ||||
|       let lookingForLeft = true; | ||||
|       let currIndex = 0; | ||||
|       let nextIndex; | ||||
|       nextIndex = text.indexOf(leftDelim); | ||||
| 
 | ||||
|       if (nextIndex !== -1) { | ||||
|         currIndex = nextIndex; | ||||
|         finalData.push({ | ||||
|           type: "text", | ||||
|           data: text.slice(0, currIndex) | ||||
|         }); | ||||
|         lookingForLeft = false; | ||||
|       } | ||||
| 
 | ||||
|       while (true) { | ||||
|         if (lookingForLeft) { | ||||
|           nextIndex = text.indexOf(leftDelim, currIndex); | ||||
| 
 | ||||
|           if (nextIndex === -1) { | ||||
|             break; | ||||
|           } | ||||
| 
 | ||||
|           finalData.push({ | ||||
|             type: "text", | ||||
|             data: text.slice(currIndex, nextIndex) | ||||
|           }); | ||||
|           currIndex = nextIndex; | ||||
|         } else { | ||||
|           nextIndex = findEndOfMath(rightDelim, text, currIndex + leftDelim.length); | ||||
| 
 | ||||
|           if (nextIndex === -1) { | ||||
|             break; | ||||
|           } | ||||
| 
 | ||||
|           finalData.push({ | ||||
|             type: "math", | ||||
|             data: text.slice(currIndex + leftDelim.length, nextIndex), | ||||
|             rawData: text.slice(currIndex, nextIndex + rightDelim.length), | ||||
|             display: display | ||||
|           }); | ||||
|           currIndex = nextIndex + rightDelim.length; | ||||
|         } | ||||
| 
 | ||||
|         lookingForLeft = !lookingForLeft; | ||||
|       } | ||||
| 
 | ||||
|       finalData.push({ | ||||
|         type: "text", | ||||
|         data: text.slice(currIndex) | ||||
|       }); | ||||
|     } else { | ||||
|       finalData.push(startData[i]); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return finalData; | ||||
| }; | ||||
| 
 | ||||
| /* eslint no-console:0 */ | ||||
| 
 | ||||
| const splitWithDelimiters = function splitWithDelimiters(text, delimiters) { | ||||
|   let data = [{ | ||||
|     type: "text", | ||||
|     data: text | ||||
|   }]; | ||||
| 
 | ||||
|   for (let i = 0; i < delimiters.length; i++) { | ||||
|     const delimiter = delimiters[i]; | ||||
|     data = splitAtDelimiters(data, delimiter.left, delimiter.right, delimiter.display || false); | ||||
|   } | ||||
| 
 | ||||
|   return data; | ||||
| }; | ||||
| /* Note: optionsCopy is mutated by this method. If it is ever exposed in the | ||||
|  * API, we should copy it before mutating. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| const renderMathInText = function renderMathInText(text, optionsCopy) { | ||||
|   const data = splitWithDelimiters(text, optionsCopy.delimiters); | ||||
| 
 | ||||
|   if (data.length === 1 && data[0].type === 'text') { | ||||
|     // There is no formula in the text.
 | ||||
|     // Let's return null which means there is no need to replace
 | ||||
|     // the current text node with a new one.
 | ||||
|     return null; | ||||
|   } | ||||
| 
 | ||||
|   const fragment = document.createDocumentFragment(); | ||||
| 
 | ||||
|   for (let i = 0; i < data.length; i++) { | ||||
|     if (data[i].type === "text") { | ||||
|       fragment.appendChild(document.createTextNode(data[i].data)); | ||||
|     } else { | ||||
|       const span = document.createElement("span"); | ||||
|       let math = data[i].data; // Override any display mode defined in the settings with that
 | ||||
|       // defined by the text itself
 | ||||
| 
 | ||||
|       optionsCopy.displayMode = data[i].display; | ||||
| 
 | ||||
|       try { | ||||
|         if (optionsCopy.preProcess) { | ||||
|           math = optionsCopy.preProcess(math); | ||||
|         } | ||||
| 
 | ||||
|         katex.render(math, span, optionsCopy); | ||||
|       } catch (e) { | ||||
|         if (!(e instanceof katex.ParseError)) { | ||||
|           throw e; | ||||
|         } | ||||
| 
 | ||||
|         optionsCopy.errorCallback("KaTeX auto-render: Failed to parse `" + data[i].data + "` with ", e); | ||||
|         fragment.appendChild(document.createTextNode(data[i].rawData)); | ||||
|         continue; | ||||
|       } | ||||
| 
 | ||||
|       fragment.appendChild(span); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return fragment; | ||||
| }; | ||||
| 
 | ||||
| const renderElem = function renderElem(elem, optionsCopy) { | ||||
|   for (let i = 0; i < elem.childNodes.length; i++) { | ||||
|     const childNode = elem.childNodes[i]; | ||||
| 
 | ||||
|     if (childNode.nodeType === 3) { | ||||
|       // Text node
 | ||||
|       const frag = renderMathInText(childNode.textContent, optionsCopy); | ||||
| 
 | ||||
|       if (frag) { | ||||
|         i += frag.childNodes.length - 1; | ||||
|         elem.replaceChild(frag, childNode); | ||||
|       } | ||||
|     } else if (childNode.nodeType === 1) { | ||||
|       // Element node
 | ||||
|       const className = ' ' + childNode.className + ' '; | ||||
|       const shouldRender = optionsCopy.ignoredTags.indexOf(childNode.nodeName.toLowerCase()) === -1 && optionsCopy.ignoredClasses.every(x => className.indexOf(' ' + x + ' ') === -1); | ||||
| 
 | ||||
|       if (shouldRender) { | ||||
|         renderElem(childNode, optionsCopy); | ||||
|       } | ||||
|     } // Otherwise, it's something else, and ignore it.
 | ||||
| 
 | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| const renderMathInElement = function renderMathInElement(elem, options) { | ||||
|   if (!elem) { | ||||
|     throw new Error("No element provided to render"); | ||||
|   } | ||||
| 
 | ||||
|   const optionsCopy = {}; // Object.assign(optionsCopy, option)
 | ||||
| 
 | ||||
|   for (const option in options) { | ||||
|     if (options.hasOwnProperty(option)) { | ||||
|       optionsCopy[option] = options[option]; | ||||
|     } | ||||
|   } // default options
 | ||||
| 
 | ||||
| 
 | ||||
|   optionsCopy.delimiters = optionsCopy.delimiters || [{ | ||||
|     left: "$$", | ||||
|     right: "$$", | ||||
|     display: true | ||||
|   }, { | ||||
|     left: "\\(", | ||||
|     right: "\\)", | ||||
|     display: false | ||||
|   }, // LaTeX uses $…$, but it ruins the display of normal `$` in text:
 | ||||
|   // {left: "$", right: "$", display: false},
 | ||||
|   //  \[…\] must come last in this array. Otherwise, renderMathInElement
 | ||||
|   //  will search for \[ before it searches for $$ or  \(
 | ||||
|   // That makes it susceptible to finding a \\[0.3em] row delimiter and
 | ||||
|   // treating it as if it were the start of a KaTeX math zone.
 | ||||
|   { | ||||
|     left: "\\[", | ||||
|     right: "\\]", | ||||
|     display: true | ||||
|   }]; | ||||
|   optionsCopy.ignoredTags = optionsCopy.ignoredTags || ["script", "noscript", "style", "textarea", "pre", "code", "option"]; | ||||
|   optionsCopy.ignoredClasses = optionsCopy.ignoredClasses || []; | ||||
|   optionsCopy.errorCallback = optionsCopy.errorCallback || console.error; // Enable sharing of global macros defined via `\gdef` between different
 | ||||
|   // math elements within a single call to `renderMathInElement`.
 | ||||
| 
 | ||||
|   optionsCopy.macros = optionsCopy.macros || {}; | ||||
|   renderElem(elem, optionsCopy); | ||||
| }; | ||||
| 
 | ||||
| export default renderMathInElement; | ||||
							
								
								
									
										14
									
								
								docz/static/katex/contrib/copy-tex.css
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										14
									
								
								docz/static/katex/contrib/copy-tex.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| /* Force selection of entire .katex/.katex-display blocks, so that we can | ||||
|  * copy/paste the entire source code.  If you omit this CSS, partial | ||||
|  * selections of a formula will work, but will copy the ugly HTML | ||||
|  * representation instead of the LaTeX source code.  (Full selections will | ||||
|  * still produce the LaTeX source code.) | ||||
|  */ | ||||
| .katex, | ||||
| .katex-display { | ||||
|     user-select: all; | ||||
|     -moz-user-select: all; | ||||
|     -webkit-user-select: all; | ||||
|     -ms-user-select: all; | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										213
									
								
								docz/static/katex/contrib/copy-tex.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										213
									
								
								docz/static/katex/contrib/copy-tex.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,213 @@ | ||||
| (function webpackUniversalModuleDefinition(root, factory) { | ||||
| 	if(typeof exports === 'object' && typeof module === 'object') | ||||
| 		module.exports = factory(); | ||||
| 	else if(typeof define === 'function' && define.amd) | ||||
| 		define([], factory); | ||||
| 	else { | ||||
| 		var a = factory(); | ||||
| 		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; | ||||
| 	} | ||||
| })((typeof self !== 'undefined' ? self : this), function() { | ||||
| return /******/ (function(modules) { // webpackBootstrap
 | ||||
| /******/ 	// The module cache
 | ||||
| /******/ 	var installedModules = {}; | ||||
| /******/ | ||||
| /******/ 	// The require function
 | ||||
| /******/ 	function __webpack_require__(moduleId) { | ||||
| /******/ | ||||
| /******/ 		// Check if module is in cache
 | ||||
| /******/ 		if(installedModules[moduleId]) { | ||||
| /******/ 			return installedModules[moduleId].exports; | ||||
| /******/ 		} | ||||
| /******/ 		// Create a new module (and put it into the cache)
 | ||||
| /******/ 		var module = installedModules[moduleId] = { | ||||
| /******/ 			i: moduleId, | ||||
| /******/ 			l: false, | ||||
| /******/ 			exports: {} | ||||
| /******/ 		}; | ||||
| /******/ | ||||
| /******/ 		// Execute the module function
 | ||||
| /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | ||||
| /******/ | ||||
| /******/ 		// Flag the module as loaded
 | ||||
| /******/ 		module.l = true; | ||||
| /******/ | ||||
| /******/ 		// Return the exports of the module
 | ||||
| /******/ 		return module.exports; | ||||
| /******/ 	} | ||||
| /******/ | ||||
| /******/ | ||||
| /******/ 	// expose the modules object (__webpack_modules__)
 | ||||
| /******/ 	__webpack_require__.m = modules; | ||||
| /******/ | ||||
| /******/ 	// expose the module cache
 | ||||
| /******/ 	__webpack_require__.c = installedModules; | ||||
| /******/ | ||||
| /******/ 	// define getter function for harmony exports
 | ||||
| /******/ 	__webpack_require__.d = function(exports, name, getter) { | ||||
| /******/ 		if(!__webpack_require__.o(exports, name)) { | ||||
| /******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter }); | ||||
| /******/ 		} | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// define __esModule on exports
 | ||||
| /******/ 	__webpack_require__.r = function(exports) { | ||||
| /******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { | ||||
| /******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||||
| /******/ 		} | ||||
| /******/ 		Object.defineProperty(exports, '__esModule', { value: true }); | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// create a fake namespace object
 | ||||
| /******/ 	// mode & 1: value is a module id, require it
 | ||||
| /******/ 	// mode & 2: merge all properties of value into the ns
 | ||||
| /******/ 	// mode & 4: return value when already ns object
 | ||||
| /******/ 	// mode & 8|1: behave like require
 | ||||
| /******/ 	__webpack_require__.t = function(value, mode) { | ||||
| /******/ 		if(mode & 1) value = __webpack_require__(value); | ||||
| /******/ 		if(mode & 8) return value; | ||||
| /******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; | ||||
| /******/ 		var ns = Object.create(null); | ||||
| /******/ 		__webpack_require__.r(ns); | ||||
| /******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value }); | ||||
| /******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); | ||||
| /******/ 		return ns; | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// getDefaultExport function for compatibility with non-harmony modules
 | ||||
| /******/ 	__webpack_require__.n = function(module) { | ||||
| /******/ 		var getter = module && module.__esModule ? | ||||
| /******/ 			function getDefault() { return module['default']; } : | ||||
| /******/ 			function getModuleExports() { return module; }; | ||||
| /******/ 		__webpack_require__.d(getter, 'a', getter); | ||||
| /******/ 		return getter; | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// Object.prototype.hasOwnProperty.call
 | ||||
| /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; | ||||
| /******/ | ||||
| /******/ 	// __webpack_public_path__
 | ||||
| /******/ 	__webpack_require__.p = ""; | ||||
| /******/ | ||||
| /******/ | ||||
| /******/ 	// Load entry module and return exports
 | ||||
| /******/ 	return __webpack_require__(__webpack_require__.s = 1); | ||||
| /******/ }) | ||||
| /************************************************************************/ | ||||
| /******/ ([ | ||||
| /* 0 */ | ||||
| /***/ (function(module, exports, __webpack_require__) { | ||||
| 
 | ||||
| // extracted by mini-css-extract-plugin
 | ||||
| 
 | ||||
| /***/ }), | ||||
| /* 1 */ | ||||
| /***/ (function(module, __webpack_exports__, __webpack_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| __webpack_require__.r(__webpack_exports__); | ||||
| 
 | ||||
| // EXTERNAL MODULE: ./contrib/copy-tex/copy-tex.css
 | ||||
| var copy_tex = __webpack_require__(0); | ||||
| 
 | ||||
| // CONCATENATED MODULE: ./contrib/copy-tex/katex2tex.js
 | ||||
| // Set these to how you want inline and display math to be delimited.
 | ||||
| var defaultCopyDelimiters = { | ||||
|   inline: ['$', '$'], | ||||
|   // alternative: ['\(', '\)']
 | ||||
|   display: ['$$', '$$'] // alternative: ['\[', '\]']
 | ||||
| 
 | ||||
| }; // Replace .katex elements with their TeX source (<annotation> element).
 | ||||
| // Modifies fragment in-place.  Useful for writing your own 'copy' handler,
 | ||||
| // as in copy-tex.js.
 | ||||
| 
 | ||||
| var katexReplaceWithTex = function katexReplaceWithTex(fragment, copyDelimiters) { | ||||
|   if (copyDelimiters === void 0) { | ||||
|     copyDelimiters = defaultCopyDelimiters; | ||||
|   } | ||||
| 
 | ||||
|   // Remove .katex-html blocks that are preceded by .katex-mathml blocks
 | ||||
|   // (which will get replaced below).
 | ||||
|   var katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html'); | ||||
| 
 | ||||
|   for (var i = 0; i < katexHtml.length; i++) { | ||||
|     var element = katexHtml[i]; | ||||
| 
 | ||||
|     if (element.remove) { | ||||
|       element.remove(null); | ||||
|     } else { | ||||
|       element.parentNode.removeChild(element); | ||||
|     } | ||||
|   } // Replace .katex-mathml elements with their annotation (TeX source)
 | ||||
|   // descendant, with inline delimiters.
 | ||||
| 
 | ||||
| 
 | ||||
|   var katexMathml = fragment.querySelectorAll('.katex-mathml'); | ||||
| 
 | ||||
|   for (var _i = 0; _i < katexMathml.length; _i++) { | ||||
|     var _element = katexMathml[_i]; | ||||
| 
 | ||||
|     var texSource = _element.querySelector('annotation'); | ||||
| 
 | ||||
|     if (texSource) { | ||||
|       if (_element.replaceWith) { | ||||
|         _element.replaceWith(texSource); | ||||
|       } else { | ||||
|         _element.parentNode.replaceChild(texSource, _element); | ||||
|       } | ||||
| 
 | ||||
|       texSource.innerHTML = copyDelimiters.inline[0] + texSource.innerHTML + copyDelimiters.inline[1]; | ||||
|     } | ||||
|   } // Switch display math to display delimiters.
 | ||||
| 
 | ||||
| 
 | ||||
|   var displays = fragment.querySelectorAll('.katex-display annotation'); | ||||
| 
 | ||||
|   for (var _i2 = 0; _i2 < displays.length; _i2++) { | ||||
|     var _element2 = displays[_i2]; | ||||
|     _element2.innerHTML = copyDelimiters.display[0] + _element2.innerHTML.substr(copyDelimiters.inline[0].length, _element2.innerHTML.length - copyDelimiters.inline[0].length - copyDelimiters.inline[1].length) + copyDelimiters.display[1]; | ||||
|   } | ||||
| 
 | ||||
|   return fragment; | ||||
| }; | ||||
| /* harmony default export */ var katex2tex = (katexReplaceWithTex); | ||||
| // CONCATENATED MODULE: ./contrib/copy-tex/copy-tex.js
 | ||||
|  // Global copy handler to modify behavior on .katex elements.
 | ||||
| 
 | ||||
| document.addEventListener('copy', function (event) { | ||||
|   var selection = window.getSelection(); | ||||
| 
 | ||||
|   if (selection.isCollapsed) { | ||||
|     return; // default action OK if selection is empty
 | ||||
|   } | ||||
| 
 | ||||
|   var fragment = selection.getRangeAt(0).cloneContents(); | ||||
| 
 | ||||
|   if (!fragment.querySelector('.katex-mathml')) { | ||||
|     return; // default action OK if no .katex-mathml elements
 | ||||
|   } // Preserve usual HTML copy/paste behavior.
 | ||||
| 
 | ||||
| 
 | ||||
|   var html = []; | ||||
| 
 | ||||
|   for (var i = 0; i < fragment.childNodes.length; i++) { | ||||
|     html.push(fragment.childNodes[i].outerHTML); | ||||
|   } | ||||
| 
 | ||||
|   event.clipboardData.setData('text/html', html.join('')); // Rewrite plain-text version.
 | ||||
| 
 | ||||
|   event.clipboardData.setData('text/plain', katex2tex(fragment).textContent); // Prevent normal copy handling.
 | ||||
| 
 | ||||
|   event.preventDefault(); | ||||
| }); | ||||
| // CONCATENATED MODULE: ./contrib/copy-tex/copy-tex.webpack.js
 | ||||
| /** | ||||
|  * This is the webpack entry point for KaTeX. As ECMAScript doesn't support | ||||
|  * CSS modules natively, a separate entry point is used. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| /***/ }) | ||||
| /******/ ])["default"]; | ||||
| }); | ||||
							
								
								
									
										1
									
								
								docz/static/katex/contrib/copy-tex.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								docz/static/katex/contrib/copy-tex.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | ||||
| .katex,.katex-display{user-select:all;-moz-user-select:all;-webkit-user-select:all;-ms-user-select:all} | ||||
							
								
								
									
										1
									
								
								docz/static/katex/contrib/copy-tex.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								docz/static/katex/contrib/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(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=1)}([function(e,t,n){},function(e,t,n){"use strict";n.r(t);n(0);var r={inline:["$","$"],display:["$$","$$"]},o=function(e,t){void 0===t&&(t=r);for(var n=e.querySelectorAll(".katex-mathml + .katex-html"),o=0;o<n.length;o++){var l=n[o];l.remove?l.remove(null):l.parentNode.removeChild(l)}for(var i=e.querySelectorAll(".katex-mathml"),a=0;a<i.length;a++){var u=i[a],f=u.querySelector("annotation");f&&(u.replaceWith?u.replaceWith(f):u.parentNode.replaceChild(f,u),f.innerHTML=t.inline[0]+f.innerHTML+t.inline[1])}for(var c=e.querySelectorAll(".katex-display annotation"),d=0;d<c.length;d++){var p=c[d];p.innerHTML=t.display[0]+p.innerHTML.substr(t.inline[0].length,p.innerHTML.length-t.inline[0].length-t.inline[1].length)+t.display[1]}return e};document.addEventListener("copy",function(e){var t=window.getSelection();if(!t.isCollapsed){var n=t.getRangeAt(0).cloneContents();if(n.querySelector(".katex-mathml")){for(var r=[],l=0;l<n.childNodes.length;l++)r.push(n.childNodes[l].outerHTML);e.clipboardData.setData("text/html",r.join("")),e.clipboardData.setData("text/plain",o(n).textContent),e.preventDefault()}}})}]).default}); | ||||
							
								
								
									
										85
									
								
								docz/static/katex/contrib/copy-tex.mjs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										85
									
								
								docz/static/katex/contrib/copy-tex.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,85 @@ | ||||
| // Set these to how you want inline and display math to be delimited.
 | ||||
| const defaultCopyDelimiters = { | ||||
|   inline: ['$', '$'], | ||||
|   // alternative: ['\(', '\)']
 | ||||
|   display: ['$$', '$$'] // alternative: ['\[', '\]']
 | ||||
| 
 | ||||
| }; // Replace .katex elements with their TeX source (<annotation> element).
 | ||||
| // Modifies fragment in-place.  Useful for writing your own 'copy' handler,
 | ||||
| // as in copy-tex.js.
 | ||||
| 
 | ||||
| const katexReplaceWithTex = function katexReplaceWithTex(fragment, copyDelimiters) { | ||||
|   if (copyDelimiters === void 0) { | ||||
|     copyDelimiters = defaultCopyDelimiters; | ||||
|   } | ||||
| 
 | ||||
|   // Remove .katex-html blocks that are preceded by .katex-mathml blocks
 | ||||
|   // (which will get replaced below).
 | ||||
|   const katexHtml = fragment.querySelectorAll('.katex-mathml + .katex-html'); | ||||
| 
 | ||||
|   for (let i = 0; i < katexHtml.length; i++) { | ||||
|     const element = katexHtml[i]; | ||||
| 
 | ||||
|     if (element.remove) { | ||||
|       element.remove(null); | ||||
|     } else { | ||||
|       element.parentNode.removeChild(element); | ||||
|     } | ||||
|   } // Replace .katex-mathml elements with their annotation (TeX source)
 | ||||
|   // descendant, with inline delimiters.
 | ||||
| 
 | ||||
| 
 | ||||
|   const katexMathml = fragment.querySelectorAll('.katex-mathml'); | ||||
| 
 | ||||
|   for (let i = 0; i < katexMathml.length; i++) { | ||||
|     const element = katexMathml[i]; | ||||
|     const texSource = element.querySelector('annotation'); | ||||
| 
 | ||||
|     if (texSource) { | ||||
|       if (element.replaceWith) { | ||||
|         element.replaceWith(texSource); | ||||
|       } else { | ||||
|         element.parentNode.replaceChild(texSource, element); | ||||
|       } | ||||
| 
 | ||||
|       texSource.innerHTML = copyDelimiters.inline[0] + texSource.innerHTML + copyDelimiters.inline[1]; | ||||
|     } | ||||
|   } // Switch display math to display delimiters.
 | ||||
| 
 | ||||
| 
 | ||||
|   const displays = fragment.querySelectorAll('.katex-display annotation'); | ||||
| 
 | ||||
|   for (let i = 0; i < displays.length; i++) { | ||||
|     const element = displays[i]; | ||||
|     element.innerHTML = copyDelimiters.display[0] + element.innerHTML.substr(copyDelimiters.inline[0].length, element.innerHTML.length - copyDelimiters.inline[0].length - copyDelimiters.inline[1].length) + copyDelimiters.display[1]; | ||||
|   } | ||||
| 
 | ||||
|   return fragment; | ||||
| }; | ||||
| 
 | ||||
| document.addEventListener('copy', function (event) { | ||||
|   const selection = window.getSelection(); | ||||
| 
 | ||||
|   if (selection.isCollapsed) { | ||||
|     return; // default action OK if selection is empty
 | ||||
|   } | ||||
| 
 | ||||
|   const fragment = selection.getRangeAt(0).cloneContents(); | ||||
| 
 | ||||
|   if (!fragment.querySelector('.katex-mathml')) { | ||||
|     return; // default action OK if no .katex-mathml elements
 | ||||
|   } // Preserve usual HTML copy/paste behavior.
 | ||||
| 
 | ||||
| 
 | ||||
|   const html = []; | ||||
| 
 | ||||
|   for (let i = 0; i < fragment.childNodes.length; i++) { | ||||
|     html.push(fragment.childNodes[i].outerHTML); | ||||
|   } | ||||
| 
 | ||||
|   event.clipboardData.setData('text/html', html.join('')); // Rewrite plain-text version.
 | ||||
| 
 | ||||
|   event.clipboardData.setData('text/plain', katexReplaceWithTex(fragment).textContent); // Prevent normal copy handling.
 | ||||
| 
 | ||||
|   event.preventDefault(); | ||||
| }); | ||||
							
								
								
									
										137
									
								
								docz/static/katex/contrib/mathtex-script-type.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										137
									
								
								docz/static/katex/contrib/mathtex-script-type.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,137 @@ | ||||
| (function webpackUniversalModuleDefinition(root, factory) { | ||||
| 	if(typeof exports === 'object' && typeof module === 'object') | ||||
| 		module.exports = factory(require("katex")); | ||||
| 	else if(typeof define === 'function' && define.amd) | ||||
| 		define(["katex"], factory); | ||||
| 	else { | ||||
| 		var a = typeof exports === 'object' ? factory(require("katex")) : factory(root["katex"]); | ||||
| 		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; | ||||
| 	} | ||||
| })((typeof self !== 'undefined' ? self : this), function(__WEBPACK_EXTERNAL_MODULE__0__) { | ||||
| return /******/ (function(modules) { // webpackBootstrap
 | ||||
| /******/ 	// The module cache
 | ||||
| /******/ 	var installedModules = {}; | ||||
| /******/ | ||||
| /******/ 	// The require function
 | ||||
| /******/ 	function __webpack_require__(moduleId) { | ||||
| /******/ | ||||
| /******/ 		// Check if module is in cache
 | ||||
| /******/ 		if(installedModules[moduleId]) { | ||||
| /******/ 			return installedModules[moduleId].exports; | ||||
| /******/ 		} | ||||
| /******/ 		// Create a new module (and put it into the cache)
 | ||||
| /******/ 		var module = installedModules[moduleId] = { | ||||
| /******/ 			i: moduleId, | ||||
| /******/ 			l: false, | ||||
| /******/ 			exports: {} | ||||
| /******/ 		}; | ||||
| /******/ | ||||
| /******/ 		// Execute the module function
 | ||||
| /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); | ||||
| /******/ | ||||
| /******/ 		// Flag the module as loaded
 | ||||
| /******/ 		module.l = true; | ||||
| /******/ | ||||
| /******/ 		// Return the exports of the module
 | ||||
| /******/ 		return module.exports; | ||||
| /******/ 	} | ||||
| /******/ | ||||
| /******/ | ||||
| /******/ 	// expose the modules object (__webpack_modules__)
 | ||||
| /******/ 	__webpack_require__.m = modules; | ||||
| /******/ | ||||
| /******/ 	// expose the module cache
 | ||||
| /******/ 	__webpack_require__.c = installedModules; | ||||
| /******/ | ||||
| /******/ 	// define getter function for harmony exports
 | ||||
| /******/ 	__webpack_require__.d = function(exports, name, getter) { | ||||
| /******/ 		if(!__webpack_require__.o(exports, name)) { | ||||
| /******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter }); | ||||
| /******/ 		} | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// define __esModule on exports
 | ||||
| /******/ 	__webpack_require__.r = function(exports) { | ||||
| /******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { | ||||
| /******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); | ||||
| /******/ 		} | ||||
| /******/ 		Object.defineProperty(exports, '__esModule', { value: true }); | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// create a fake namespace object
 | ||||
| /******/ 	// mode & 1: value is a module id, require it
 | ||||
| /******/ 	// mode & 2: merge all properties of value into the ns
 | ||||
| /******/ 	// mode & 4: return value when already ns object
 | ||||
| /******/ 	// mode & 8|1: behave like require
 | ||||
| /******/ 	__webpack_require__.t = function(value, mode) { | ||||
| /******/ 		if(mode & 1) value = __webpack_require__(value); | ||||
| /******/ 		if(mode & 8) return value; | ||||
| /******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; | ||||
| /******/ 		var ns = Object.create(null); | ||||
| /******/ 		__webpack_require__.r(ns); | ||||
| /******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value }); | ||||
| /******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); | ||||
| /******/ 		return ns; | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// getDefaultExport function for compatibility with non-harmony modules
 | ||||
| /******/ 	__webpack_require__.n = function(module) { | ||||
| /******/ 		var getter = module && module.__esModule ? | ||||
| /******/ 			function getDefault() { return module['default']; } : | ||||
| /******/ 			function getModuleExports() { return module; }; | ||||
| /******/ 		__webpack_require__.d(getter, 'a', getter); | ||||
| /******/ 		return getter; | ||||
| /******/ 	}; | ||||
| /******/ | ||||
| /******/ 	// Object.prototype.hasOwnProperty.call
 | ||||
| /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; | ||||
| /******/ | ||||
| /******/ 	// __webpack_public_path__
 | ||||
| /******/ 	__webpack_require__.p = ""; | ||||
| /******/ | ||||
| /******/ | ||||
| /******/ 	// Load entry module and return exports
 | ||||
| /******/ 	return __webpack_require__(__webpack_require__.s = 1); | ||||
| /******/ }) | ||||
| /************************************************************************/ | ||||
| /******/ ([ | ||||
| /* 0 */ | ||||
| /***/ (function(module, exports) { | ||||
| 
 | ||||
| module.exports = __WEBPACK_EXTERNAL_MODULE__0__; | ||||
| 
 | ||||
| /***/ }), | ||||
| /* 1 */ | ||||
| /***/ (function(module, __webpack_exports__, __webpack_require__) { | ||||
| 
 | ||||
| "use strict"; | ||||
| __webpack_require__.r(__webpack_exports__); | ||||
| /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0); | ||||
| /* harmony import */ var katex__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(katex__WEBPACK_IMPORTED_MODULE_0__); | ||||
| 
 | ||||
| var scripts = document.body.getElementsByTagName("script"); | ||||
| scripts = Array.prototype.slice.call(scripts); | ||||
| scripts.forEach(function (script) { | ||||
|   if (!script.type || !script.type.match(/math\/tex/i)) { | ||||
|     return -1; | ||||
|   } | ||||
| 
 | ||||
|   var display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null; | ||||
|   var katexElement = document.createElement(display ? "div" : "span"); | ||||
|   katexElement.setAttribute("class", display ? "equation" : "inline-equation"); | ||||
| 
 | ||||
|   try { | ||||
|     katex__WEBPACK_IMPORTED_MODULE_0___default.a.render(script.text, katexElement, { | ||||
|       displayMode: display | ||||
|     }); | ||||
|   } catch (err) { | ||||
|     //console.error(err); linter doesn't like this
 | ||||
|     katexElement.textContent = script.text; | ||||
|   } | ||||
| 
 | ||||
|   script.parentNode.replaceChild(katexElement, script); | ||||
| }); | ||||
| 
 | ||||
| /***/ }) | ||||
| /******/ ])["default"]; | ||||
| }); | ||||
							
								
								
									
										1
									
								
								docz/static/katex/contrib/mathtex-script-type.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								docz/static/katex/contrib/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(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=1)}([function(t,r){t.exports=e},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n),u=document.body.getElementsByTagName("script");(u=Array.prototype.slice.call(u)).forEach(function(e){if(!e.type||!e.type.match(/math\/tex/i))return-1;var t=null!=e.type.match(/mode\s*=\s*display(;|\s|\n|$)/),r=document.createElement(t?"div":"span");r.setAttribute("class",t?"equation":"inline-equation");try{o.a.render(e.text,r,{displayMode:t})}catch(t){r.textContent=e.text}e.parentNode.replaceChild(r,e)})}]).default}); | ||||
							
								
								
									
										24
									
								
								docz/static/katex/contrib/mathtex-script-type.mjs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								docz/static/katex/contrib/mathtex-script-type.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| import katex from '../katex.mjs'; | ||||
| 
 | ||||
| let scripts = document.body.getElementsByTagName("script"); | ||||
| scripts = Array.prototype.slice.call(scripts); | ||||
| scripts.forEach(function (script) { | ||||
|   if (!script.type || !script.type.match(/math\/tex/i)) { | ||||
|     return -1; | ||||
|   } | ||||
| 
 | ||||
|   const display = script.type.match(/mode\s*=\s*display(;|\s|\n|$)/) != null; | ||||
|   const katexElement = document.createElement(display ? "div" : "span"); | ||||
|   katexElement.setAttribute("class", display ? "equation" : "inline-equation"); | ||||
| 
 | ||||
|   try { | ||||
|     katex.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); | ||||
| }); | ||||
							
								
								
									
										3241
									
								
								docz/static/katex/contrib/mhchem.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3241
									
								
								docz/static/katex/contrib/mhchem.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								docz/static/katex/contrib/mhchem.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								docz/static/katex/contrib/mhchem.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										3109
									
								
								docz/static/katex/contrib/mhchem.mjs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										3109
									
								
								docz/static/katex/contrib/mhchem.mjs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										870
									
								
								docz/static/katex/contrib/render-a11y-string.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										870
									
								
								docz/static/katex/contrib/render-a11y-string.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,870 @@ | ||||
| (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"]; | ||||
| }); | ||||
							
								
								
									
										1
									
								
								docz/static/katex/contrib/render-a11y-string.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								docz/static/katex/contrib/render-a11y-string.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										753
									
								
								docz/static/katex/contrib/render-a11y-string.mjs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										753
									
								
								docz/static/katex/contrib/render-a11y-string.mjs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,753 @@ | ||||
| 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. | ||||
|  */ | ||||
| const 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" | ||||
| }; | ||||
| const powerMap = { | ||||
|   "prime": "prime", | ||||
|   "degree": "degrees", | ||||
|   "circle": "degrees", | ||||
|   "2": "squared", | ||||
|   "3": "cubed" | ||||
| }; | ||||
| const openMap = { | ||||
|   "|": "open vertical bar", | ||||
|   ".": "" | ||||
| }; | ||||
| const closeMap = { | ||||
|   "|": "close vertical bar", | ||||
|   ".": "" | ||||
| }; | ||||
| const binMap = { | ||||
|   "+": "plus", | ||||
|   "-": "minus", | ||||
|   "\\pm": "plus minus", | ||||
|   "\\cdot": "dot", | ||||
|   "*": "times", | ||||
|   "/": "divided by", | ||||
|   "\\times": "times", | ||||
|   "\\div": "divided by", | ||||
|   "\\circ": "circle", | ||||
|   "\\bullet": "bullet" | ||||
| }; | ||||
| const 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" | ||||
| }; | ||||
| const accentUnderMap = { | ||||
|   "\\underleftarrow": "left arrow", | ||||
|   "\\underrightarrow": "right arrow", | ||||
|   "\\underleftrightarrow": "left-right arrow", | ||||
|   "\\undergroup": "group", | ||||
|   "\\underlinesegment": "line segment", | ||||
|   "\\utilde": "tilde" | ||||
| }; | ||||
| 
 | ||||
| const buildString = (str, type, a11yStrings) => { | ||||
|   if (!str) { | ||||
|     return; | ||||
|   } | ||||
| 
 | ||||
|   let 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); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| const buildRegion = (a11yStrings, callback) => { | ||||
|   const regionStrings = []; | ||||
|   a11yStrings.push(regionStrings); | ||||
|   callback(regionStrings); | ||||
| }; | ||||
| 
 | ||||
| const 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": | ||||
|       { | ||||
|         const 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": | ||||
|       { | ||||
|         const 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
 | ||||
|           const 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, 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": | ||||
|       { | ||||
|         const 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, regionStrings => { | ||||
|           const body = tree.body, | ||||
|                 index = tree.index; | ||||
| 
 | ||||
|           if (index) { | ||||
|             const 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": | ||||
|       { | ||||
|         const base = tree.base, | ||||
|               sub = tree.sub, | ||||
|               sup = tree.sup; | ||||
|         let isLog = false; | ||||
| 
 | ||||
|         if (base) { | ||||
|           buildA11yStrings(base, a11yStrings, atomType); | ||||
|           isLog = base.type === "op" && base.name === "\\log"; | ||||
|         } | ||||
| 
 | ||||
|         if (sub) { | ||||
|           const 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) { | ||||
|             const 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.
 | ||||
|         const 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); | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| const buildA11yStrings = function buildA11yStrings(tree, a11yStrings, atomType) { | ||||
|   if (a11yStrings === void 0) { | ||||
|     a11yStrings = []; | ||||
|   } | ||||
| 
 | ||||
|   if (tree instanceof Array) { | ||||
|     for (let i = 0; i < tree.length; i++) { | ||||
|       buildA11yStrings(tree[i], a11yStrings, atomType); | ||||
|     } | ||||
|   } else { | ||||
|     handleObject(tree, a11yStrings, atomType); | ||||
|   } | ||||
| 
 | ||||
|   return a11yStrings; | ||||
| }; | ||||
| 
 | ||||
| const flatten = function flatten(array) { | ||||
|   let result = []; | ||||
|   array.forEach(function (item) { | ||||
|     if (item instanceof Array) { | ||||
|       result = result.concat(flatten(item)); | ||||
|     } else { | ||||
|       result.push(item); | ||||
|     } | ||||
|   }); | ||||
|   return result; | ||||
| }; | ||||
| 
 | ||||
| const renderA11yString = function renderA11yString(text, settings) { | ||||
|   const tree = katex.__parse(text, settings); | ||||
| 
 | ||||
|   const a11yStrings = buildA11yStrings(tree, [], "normal"); | ||||
|   return flatten(a11yStrings).join(", "); | ||||
| }; | ||||
| 
 | ||||
| export default renderA11yString; | ||||
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_AMS-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_AMS-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_AMS-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_AMS-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_AMS-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_AMS-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Bold.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Bold.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Bold.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Caligraphic-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Bold.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Bold.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Bold.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Bold.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Fraktur-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Bold.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Bold.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Bold.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Bold.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-BoldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-BoldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-BoldItalic.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-BoldItalic.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-BoldItalic.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-BoldItalic.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Italic.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Italic.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Italic.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Italic.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Main-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-BoldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-BoldItalic.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-BoldItalic.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-BoldItalic.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-BoldItalic.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-BoldItalic.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-Italic.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-Italic.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-Italic.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Math-Italic.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Bold.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Bold.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Bold.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Bold.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Bold.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Italic.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Italic.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Italic.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Italic.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Italic.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_SansSerif-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Script-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Script-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Script-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Script-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Script-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Script-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size1-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size1-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size1-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size1-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size1-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size1-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size2-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size2-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size2-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size2-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size2-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size2-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size3-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size3-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size3-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size3-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size3-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size3-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size4-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size4-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size4-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size4-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size4-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Size4-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Typewriter-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Typewriter-Regular.ttf
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Typewriter-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Typewriter-Regular.woff
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Typewriter-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										
											BIN
										
									
								
								docz/static/katex/fonts/KaTeX_Typewriter-Regular.woff2
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										1035
									
								
								docz/static/katex/katex.css
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1035
									
								
								docz/static/katex/katex.css
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										17308
									
								
								docz/static/katex/katex.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										17308
									
								
								docz/static/katex/katex.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								docz/static/katex/katex.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								docz/static/katex/katex.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1
									
								
								docz/static/katex/katex.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1
									
								
								docz/static/katex/katex.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										16911
									
								
								docz/static/katex/katex.mjs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										16911
									
								
								docz/static/katex/katex.mjs
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user