@webc.site/math 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,759 @@
1
+ [English](#en) | [中文](#zh)
2
+
3
+ ---
4
+
5
+ <a id="en"></a>
6
+ # @webc.site/math
7
+
8
+ ### The world's smallest and fastest web Markdown formula renderer
9
+
10
+ <a href="https://www.npmjs.com/package/@webc.site/math" target="_blank"><img src="https://raw.githubusercontent.com/webc-site/math/dev/readme/en/svg/badge.npm.svg" alt="npm" /></a>
11
+ &nbsp;&nbsp;
12
+ <a href="https://github.com/webc-site/math" target="_blank"><img src="https://raw.githubusercontent.com/webc-site/math/dev/readme/en/svg/badge.github.svg" alt="github" /></a>
13
+ &nbsp;&nbsp;
14
+ <a href="https://math.webc.site" target="_blank"><img src="https://raw.githubusercontent.com/webc-site/math/dev/readme/en/svg/badge.demo.svg" alt="demo" /></a>
15
+
16
+ The world's smallest and fastest web Markdown formula renderer designed to parse mathematical formulas within Markdown text.
17
+
18
+ - [Usage](#usage)
19
+ - [Features](#features)
20
+ - [Supported Syntax List](#supported-syntax-list)
21
+ - [What is MathML?](#what-is-mathml)
22
+ - [Why Compile TeX Formulas to MathML?](#why-compile-tex-formulas-to-mathml)
23
+ - [Benchmark](#benchmark)
24
+ - [Design & Calling Process](#design--calling-process)
25
+ - [How to Add Syntax Support](#how-to-add-syntax-support)
26
+ - [Tech Stack](#tech-stack)
27
+ - [Directory Structure](#directory-structure)
28
+ - [History & Background](#history--background)
29
+
30
+ ## Usage
31
+
32
+ ### JavaScript Example
33
+
34
+ #### 1. Replace Formulas in Markdown (using `@webc.site/math/md`)
35
+
36
+ Parses Markdown text, automatically identifying and replacing inline/block equations with MathML.
37
+
38
+ ```javascript
39
+ import mdMath from "@webc.site/math/md";
40
+
41
+ const markdown = "Euler's identity: $$e^{i\\pi} + 1 = 0$$";
42
+ const html = mdMath(markdown);
43
+
44
+ console.log(html);
45
+ // Output: Euler's identity: <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>e</mi><mrow><mi>i</mi><mi>π</mi></mrow></msup><mo>+</mo><mn>1</mn><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">e^{i\pi} + 1 = 0</annotation></semantics></math>
46
+ ```
47
+
48
+ #### 2. Render TeX Formulas Directly (using `@webc.site/math`)
49
+
50
+ Compiles TeX formulas directly to MathML. Useful for implementing math rendering plugins for Markdown parsers (e.g., markdown-it, marked).
51
+
52
+ ```javascript
53
+ import mathml from "@webc.site/math";
54
+
55
+ const tex = "e^{i\\pi} + 1 = 0";
56
+ const html = mathml(tex, true); // true for block math, false/empty for inline math
57
+ ```
58
+
59
+ ### CSS & Math Font Configuration
60
+
61
+ For browser mathematical layout engines to present beautifully typeset math equations, we highly recommend using a math font. The **Latin Modern Math** font provided in the `18s` package is recommended (derived from Knuth's classical Computer Modern typeface, with a complete mathematical symbol set and OpenType MATH table support).
62
+
63
+ #### 1. Online Reference (Recommended)
64
+
65
+ You can import the online font directly in your CSS:
66
+
67
+ ```css
68
+ /* Import the bundle (includes Source Han Sans t, monospace c, and math font m) */
69
+ @import url("//registry.npmmirror.com/18s/0.2.24/files/_.css");
70
+ ```
71
+
72
+ Or import the math font `m` only:
73
+
74
+ ```css
75
+ @import url("//registry.npmmirror.com/18s/0.2.24/files/m.css");
76
+ ```
77
+
78
+ #### 2. Local Installation
79
+
80
+ ```bash
81
+ npm install 18s
82
+ ```
83
+
84
+ ##### Import Local Font
85
+
86
+ Depending on your project setup, choose one of the following methods to import the font mappings (Note: do not mix JS and CSS imports in the same file):
87
+
88
+ ###### Method 1: Import in JS/TS Entry File
89
+
90
+ ```javascript
91
+ // Import the bundle (includes Source Han Sans t, monospace c, and math font m)
92
+ import "18s/_.css";
93
+
94
+ // Or import math font m only
95
+ import "18s/m.css";
96
+ ```
97
+
98
+ ###### Method 2: Import in CSS Stylesheet
99
+
100
+ ```css
101
+ /* Import the bundle (includes Source Han Sans t, monospace c, and math font m) */
102
+ @import "18s/_.css";
103
+
104
+ /* Or import math font m only */
105
+ @import "18s/m.css";
106
+ ```
107
+
108
+ #### 3. Configure CSS Style
109
+
110
+ Set the `math` tag to use font family alias `m` (where `t` is Source Han Sans, optimized with font slicing for Chinese characters) in your global CSS styles:
111
+
112
+ ```css
113
+ math {
114
+ /* m is the math font, t is Source Han Sans (optimized with font slicing for Chinese characters to boost loading performance), sans-serif is default fallback */
115
+ font-family: m, t, sans-serif;
116
+ }
117
+ ```
118
+
119
+ ## Features
120
+
121
+ - **Highly Complete Features**: Extracted and compiled thousands of mathematical formulas from KaTeX and MathJax official test suites, passing all test cases successfully (see [extract](https://github.com/webc-site/math/tree/dev/extract) for details).
122
+ - **Robust & Fault-Tolerant**: When parsing Markdown text, syntax errors (such as unclosed `\left`/`\right` or invalid syntax) are caught automatically and gracefully degraded, returning the raw TeX code to prevent application crashes.
123
+ - **Fast Compiler**: Compiles TeX formulas directly to semantic MathML without external parser dependencies.
124
+ - **Markdown Integration**: Automatically parses inline math (`$formula$`) and block math (`$$formula$$`) in Markdown text.
125
+ - **High Performance**: Only 7.78 KB raw size (3.58 KB gzipped), far smaller than KaTeX and MathJax (see size comparison chart below):
126
+
127
+ | Library | Raw Size | Gzip Size | Size Ratio |
128
+ | :---------------------------------------------------------- | :-------: | :-------: | :--------: |
129
+ | [@webc.site/math](https://github.com/webc-site/math) (Ours) | 7.78 KB | 3.58 KB | 1.0 ⭐️ |
130
+ | [KaTeX](https://github.com/KaTeX/KaTeX) | 264.79 KB | 75.15 KB | 21.0 |
131
+ | [MathJax](https://github.com/mathjax/MathJax) | 971.04 KB | 278.39 KB | 77.7 |
132
+
133
+ ![](demo/size.svg)
134
+
135
+ - **Standard Compatibility**: Outputs valid MathML elements supported by modern browser layout engines.
136
+
137
+ ## Supported Syntax List
138
+
139
+ Designed to be extremely lightweight, this library supports the most commonly used math typesetting syntaxes:
140
+
141
+ - **Basic Arithmetic & Symbols**: Numbers, English letters, basic operators (`+`, `-`, `*`, `/`, `=`, `<`, `>`, `(`, `)`, `[`, `]`, `.`). Note that `-` automatically maps to minus sign `\u2212`, `*` maps to asterisk `\u2217`, and `/` is rendered in upright normal font.
142
+ - **Subscripts & Superscripts**:
143
+ - Superscript `^` (e.g., `x^2`)
144
+ - Subscript `_` (e.g., `x_i`)
145
+ - Simultaneous subscripts/superscripts (e.g., `x_i^2` or `x^2_i`)
146
+ - Big operators automatically render limits layout for subscripts and superscripts (e.g., `\sum_{i=1}^n`, `\int_a^b`)
147
+ - **Fractions**: `\frac{numerator}{denominator}` (e.g., `\frac{a}{b}`)
148
+ - **Square Roots**: Square root `\sqrt{x}` and $n$-th root `\sqrt[n]{x}`
149
+ - **Overlines & Bars**: `\overline{x}` and the shorthand `\bar{x}`
150
+ - **Adaptive Delimiters**: `\left` and `\right` structures for autosizing delimiters (e.g., `\left( ... \right)`). Supported delimiters include:
151
+ - Parentheses: `(` and `)`
152
+ - Square brackets: `[` and `]`
153
+ - Curly braces: `\{` and `\}`
154
+ - Angle brackets: `<` (⟨) and `>` (⟩)
155
+ - Vertical bars: `|` or `\|`
156
+ - Null/Empty delimiter: `.` (shows no delimiter on that side, e.g., `\left. \frac{df}{dx} \right| _0`)
157
+ - **Text Mode**: `\text{...}` (e.g., `\text{if }`), extracts literal text inside braces and renders it as MathML `<mtext>` in normal upright font.
158
+ - **Horizontal Spacing**: Supports `\quad` (1em space) and `\qquad` (2em space) horizontal spacing.
159
+ - **Styles, Strikethroughs & Phantom**:
160
+ - Borders: `\boxed{...}` (adds a border around the formula, e.g., `\boxed{x+y}`)
161
+ - Strikethroughs: `\cancel{...}` (crosses out with a diagonal line, e.g., `\cancel{x}`) and `\sout{...}` (crosses out with a horizontal line, e.g., `\sout{y}`)
162
+ - Hiding & Spacing: `\phantom{...}` (renders an invisible placeholder with the same width and height as the argument, e.g., `\phantom{x}`)
163
+ - **Common Functions**: `\sin`, `\cos`, `\tan`, `\cot`, `\sec`, `\csc`, `\log`, `\lg`, `\ln`, `\lim`, `\exp`, `\max`, `\min`, `\sup`, `\inf`, `\det`, `\gcd`, `\arcsin`, `\arccos`, `\arctan`, `\sinh`, `\cosh`, `\tanh`, `\coth`, `\deg`, `\arg`. Note that limit-like operators (`\lim`, `\max`, `\min`, `\sup`, `\inf`) render with limits layout (above/under) for subscripts and superscripts in display/block math mode.
164
+ - **Modulo parentheses**: `\pmod{...}` (generates parenthesized modulo, e.g., `\pmod{m}` renders as $(mod\ m)$)
165
+ - **Greek Letters**:
166
+ - Lowercase: `\alpha` ($\alpha$), `\beta` ($\beta$), `\gamma` ($\gamma$), `\delta` ($\delta$), `\epsilon` ($\epsilon$), `\zeta` ($\zeta$), `\eta` ($\eta$), `\theta` ($\theta$), `\iota` ($\iota$), `\kappa` ($\kappa$), `\lambda` ($\lambda$), `\mu` ($\mu$), `\nu` ($\nu$), `\xi` ($\xi$), `\pi` ($\pi$), `\rho` ($\rho$), `\sigma` ($\sigma$), `\tau` ($\tau$), `\upsilon` ($\upsilon$), `\phi` ($\phi$), `\chi` ($\chi$), `\psi` ($\psi$), `\omega` ($\omega$)
167
+ - Uppercase (rendered upright): `\Delta` ($\Delta$), `\Gamma` ($\Gamma$), `\Theta` ($\Theta$), `\Lambda` ($\Lambda$), `\Xi` ($\Xi$), `\Pi` ($\Pi$), `\Sigma` ($\Sigma$), `\Upsilon` ($\Upsilon$), `\Phi` ($\Phi$), `\Psi` ($\Psi$), `\Omega` ($\Omega$)
168
+ - **Operators & Relations**:
169
+ - `\le` / `\leq` ($\le$), `\ge` / `\geq` ($\ge$), `\ne` / `\neq` ($\ne$)
170
+ - `\cdot` ($\cdot$), `\times` ($\times$), `\pm` ($\pm$), `\mp` ($\mp$), `\div` ($\div$), `\infty` ($\infty$)
171
+ - `\approx` ($\approx$), `\sim` ($\sim$), `\cong` ($\cong$), `\propto` ($\propto$), `\equiv` ($\equiv$), `\perp` ($\perp$), `\parallel` ($\parallel$)
172
+ - **Calculus, Sets & Logic**:
173
+ - Gradient: `\nabla` ($\nabla$), Partial derivative: `\partial` ($\partial$)
174
+ - Logic quantifiers & operations: `\forall` ($\forall$), `\exists` ($\exists$), `\neg` ($\neg$), `\land` ($\land$), `\lor` ($\lor$)
175
+ - Set relations: `\in` ($\in$), `\notin` ($\notin$), `\ni` ($\ni$), `\subset` ($\subset$), `\supset` ($\supset$), `\subseteq` ($\subseteq$), `\supseteq` ($\supseteq$)
176
+ - Set operations: `\cup` ($\cup$), `\cap` ($\cap$), Empty set: `\emptyset` ($\emptyset$)
177
+ - Special variables & constants: `\ell` ($\ell$), `\hbar` ($\hbar$)
178
+ - Big operators: summation `\sum` ($\sum$), integral `\int` ($\int$)
179
+ - **Arrows**:
180
+ - Unidirectional: `\to` / `\rightarrow` ($\rightarrow$), `\leftarrow` / `\gets` ($\leftarrow$), `\Leftarrow` ($\Leftarrow$), `\Rightarrow` ($\Rightarrow$)
181
+ - Bidirectional: `\leftrightarrow` ($\leftrightarrow$), `\Leftrightarrow` ($\Leftrightarrow$)
182
+ - **Ellipses (Dots)**:
183
+ - Baseline dots: `\dots` / `\ldots` ($\dots$)
184
+ - Center dots: `\cdots` ($\cdots$)
185
+ - **Matrices & Multi-line Layouts**:
186
+ - Matrix environments: `matrix`, `pmatrix`, `bmatrix`, `vmatrix`, `Vmatrix` (e.g., `\begin{pmatrix} a & b \\ c & d \end{pmatrix}`)
187
+ - Systems of equations & conditional branches: `cases` (e.g., `\begin{cases} x & x \ge 0 \\ -x & x < 0 \end{cases}`)
188
+ - Monospace grid arrays: `array`
189
+ - Line breaks & alignments: use `\\`, `\\*`, or `\\[width]` (for custom row spacing, e.g. `\\[10px]`) for line breaks, and `&` for column alignments
190
+
191
+ ### Unsupported Syntax (Non-Goals)
192
+
193
+ Currently, the following LaTeX extensions, macro definitions, or custom styling commands are not supported:
194
+
195
+ 1. **Macro Definitions**: `\newcommand`, `\renewcommand`, `\providecommand`, `\gdef`, `\let`, etc.
196
+ 2. **Background Colors & Advanced Borders**: `\colorbox`, `\fcolorbox`, `\cellcolor`, etc. (while `\boxed` is supported).
197
+ 3. **Other Strikethroughs**: `\bcancel`, `\xcancel`, etc. (while `\cancel` and `\sout` are supported).
198
+ 4. **Advanced Layouts & Spacing**: `\hphantom`, `\vphantom`, `\smash`, etc. (while `\phantom` is supported).
199
+ 5. **Chemistry Package Extensions**: Chemical formula macros like `\ce{...}` (mhchem).
200
+ 6. **Verbatim Text**: `\verb`, etc.
201
+ 7. **Advanced Positionings**: `\sideset`, `\prescript`, `\cramped`, `\flatfrac`, etc.
202
+ 8. **Equation Numbering & Custom Tags**: `\tag`, `\newtagform`, `\usetagform`, etc.
203
+ 9. **Arbitrary Operator Limits**: Except for predefined big operators (`\sum`, `\int`) and limit-like operators (`\lim`), using `\limits` on arbitrary commands or structures (e.g., `\operatorname{sn}\limits_{...}`) is not supported.
204
+
205
+ ## Error Handling & Fault Tolerance
206
+
207
+ When parsing Markdown text using `@webc.site/math/md`, if a mathematical formula contains invalid LaTeX syntax (such as an unclosed `\left`), the parser automatically catches the compilation error internally and gracefully falls back to displaying the raw formula text (e.g., `$$x + \left( y$$`). This ensures that a single syntax error in a formula won't throw JavaScript exceptions or crash your application. Therefore, you **do not** need to wrap it in a `try...catch` block when calling this function.
208
+
209
+ Note that calling `@webc.site/math` (the TeX compiler core) directly with invalid LaTeX syntax will throw an array containing an error code (see the internal error codes table below). If you are using the core TeX compiler directly, it is recommended to wrap the call in a `try...catch` block.
210
+
211
+ ### Internal Error Codes
212
+
213
+ The following error codes are used internally during the compilation phase to signal specific syntax issues. These are primarily useful for development, debugging, and testing:
214
+
215
+ | Error Code | Constant | Description | Trigger Example |
216
+ | :--------: | :------------------ | :-------------------------------------------- | :------------------------------------ |
217
+ | `0` | `ERR_EXTRA_END` | Extra or invalid `\end` command | `\end{matrix}` (no matching `\begin`) |
218
+ | `1` | `ERR_MISSING_RIGHT` | `\left` delimiter missing a matching `\right` | `\left( x` |
219
+ | `2` | `ERR_EXTRA_RIGHT` | Extra or invalid `\right` command | `x \right)` (no matching `\left`) |
220
+ | `3` | `ERR_MISSING_BRACE` | Command missing required curly brace `{}` | `\text x` (missing braces) |
221
+
222
+ ## What is MathML?
223
+
224
+ MathML (Mathematical Markup Language) is an XML-based standard for describing mathematical notations and capturing both its structure and content on the web.
225
+
226
+ **Since January 2023** (with the release of Chrome 109 and native Blink engine support), MathML Core has been fully supported natively across all three major web rendering engines (Chromium/Blink, Gecko/Firefox, and WebKit/Safari). This ensures highly efficient and native rendering of mathematical equations across most desktop/mobile devices and modern browser versions without needing heavy client-side JavaScript rendering engines.
227
+
228
+ ### Why Compile TeX Formulas to MathML?
229
+
230
+ While MathML is the native web standard for mathematical typesetting, its XML-based syntax is too verbose for direct human authoring. TeX/LaTeX syntax remains the de facto standard for writing mathematical formulas (e.g., writing `$e^{i\pi} + 1 = 0$` in Markdown).
231
+
232
+ Traditional web math solutions (such as MathJax or KaTeX) require loading hundreds of kilobytes to several megabytes of JS/CSS typesetting engines in the frontend, consuming substantial client-side CPU cycles for DOM mutations and layout calculations.
233
+
234
+ By compiling TeX directly to native MathML using `@webc.site/math`, you get the best of both worlds—especially in **client-side (frontend) rendering** scenarios:
235
+
236
+ #### 1. Extremely Lightweight (~1.8 KB Gzip) & Zero Dependencies
237
+
238
+ Compared to KaTeX (300 KB+) and MathJax (several MBs), `@webc.site/math` has a virtually negligible footprint. It can be bundled directly into any frontend/SPA app without hurting initial page load times.
239
+
240
+ #### 2. Native Browser Layout (No Heavy Client-Side Rendering Engine)
241
+
242
+ Traditional math libraries pack not only a TeX parser but also a heavy client-side layout engine to calculate font metrics, alignment, and spacing, producing massive DOM trees or SVG elements.
243
+ Our compiler acts as a translator that turns TeX into standard MathML tags on the client, leaving all the heavy rendering, typography, and positioning tasks to the browser's native C++ layout engine. This drastically reduces JavaScript execution time.
244
+
245
+ #### 3. Seamless Real-Time Frontend Previews & Low CPU Overhead
246
+
247
+ Because the compilation is purely a fast tag-mapping step and layout is handled natively, CPU usage is minimal. This makes it ideal for **WYSIWYG editors, live markdown previewers, and interactive apps** where formulas need to be rendered dynamically on every keystroke without lag—even on low-end mobile devices.
248
+
249
+ #### 4. Unified Frontend & SSR Capabilities
250
+
251
+ Since the output is standard HTML with MathML elements, the same compiler works seamlessly for dynamic client-side rendering (CSR), server-side rendering (SSR), and static site generation (SSG) alike.
252
+
253
+ ## Benchmark
254
+
255
+ Since KaTeX and MathJax are pure TeX compilers (without Markdown parsing features), to ensure a fair comparison, our benchmark directly compares the TeX compiler core ([@webc.site/math/mathml.js](https://github.com/webc-site/math/blob/dev/src/mathml.js)) against them.
256
+
257
+ ### 1. Size Comparison (Gzipped)
258
+
259
+ | Library | Raw Size | Gzip Size | Size Ratio |
260
+ | :-------------------------------------------- | :-------: | :-------: | :--------: |
261
+ | @webc.site/math (Ours) | 7.78 KB | 3.58 KB | 1.0 ⭐️ |
262
+ | [KaTeX](https://github.com/KaTeX/KaTeX) | 264.79 KB | 75.15 KB | 21.0 |
263
+ | [MathJax](https://github.com/mathjax/MathJax) | 971.04 KB | 278.39 KB | 77.7 |
264
+
265
+ ![](demo/size.svg)
266
+
267
+ ### 2. Compilation Speed (Ops/sec)
268
+
269
+ Based on compiling standard test equations (measured using [sh/benchmark.js](https://github.com/webc-site/math/blob/dev/sh/benchmark.js)):
270
+
271
+ - **@webc.site/math (Ours)**: ~329, 000 ops/s (1.0 ⭐️)
272
+ - **[KaTeX](https://github.com/KaTeX/KaTeX)**: ~92, 000 ops/s (~3.6x slower)
273
+ - **[MathJax](https://github.com/mathjax/MathJax)**: ~6, 700 ops/s (~48.8x slower)
274
+
275
+ ![](demo/speed.svg)
276
+
277
+ ## Design & Calling Process
278
+
279
+ The parser processes input Markdown string, isolates TeX expressions, and translates them to MathML structures.
280
+
281
+ ```mermaid
282
+ graph TD
283
+ A[Input Markdown] --> B{Scanner}
284
+ B -- Markdown Text --> C[Output Buffer]
285
+ B -- TeX Formula --> D[Lexer: Tokenization]
286
+ D --> E[Parser: AST Generation]
287
+ E --> F[Generator: MathML Tag Creation]
288
+ F --> G[Semantic Wrapping]
289
+ G --> H[MathML Output]
290
+ C --> I[Final HTML]
291
+ H --> I
292
+ ```
293
+
294
+ ### Module Flow
295
+
296
+ 1. **Scanner**: Scans the input string to locate delimiters (`$` and `$$`).
297
+ 2. **Lexer**: Tokenizes TeX string into numbers, variables, operations, and control characters.
298
+ 3. **Parser**: Converts tokens into Abstract Syntax Tree (AST) nodes supporting fractions, subscripts, superscripts, and functions.
299
+ 4. **Generator**: Converts AST nodes to standardized XML nodes (`<mi>`, `<mo>`, `<mn>`, `<mfrac>`, `<msup>`, `<msub>`, `<msubsup>`).
300
+
301
+ ## How to Add Syntax Support
302
+
303
+ To add support for a new LaTeX syntax, you need to modify the following four core parts in order:
304
+
305
+ ### 1. Constants
306
+
307
+ Define the corresponding lexical tokens, syntax node types, function names, or symbol mappings:
308
+
309
+ - **Token Type**: Defined in [const/TOK.js](https://github.com/webc-site/math/blob/dev/src/const/TOK.js) (e.g., `export const TOK_MY_CMD = ...` if a new lexical category is required).
310
+ - **AST Node Type**: Defined in [const/TYPE.js](https://github.com/webc-site/math/blob/dev/src/const/TYPE.js) (e.g., `export const TYPE_MY_NODE = ...` specifies the new abstract syntax tree node type).
311
+ - **Environment Delimiters**: If adding a new environment (such as a matrix variant), configure its left and right delimiters in `ENV_DELIMS` inside [mathml.js](https://github.com/webc-site/math/blob/dev/src/mathml.js) (previously `compile.js`).
312
+ - **Symbol Map**: For simple math symbols or commands, map the command name to its corresponding Unicode character in `SYM_MAP` inside [const/SYM.js](https://github.com/webc-site/math/blob/dev/src/const/SYM.js).
313
+ - **Function Names**: Defined in [const/FUNC.js](https://github.com/webc-site/math/blob/dev/src/const/FUNC.js) (under `FUNC_NAMES`).
314
+
315
+ ### 2. Lexer
316
+
317
+ The `lex(str)` function tokenizes the LaTeX input string into a flat token array. It is located in [lex.js](https://github.com/webc-site/math/blob/dev/src/lex.js).
318
+
319
+ - If you introduce new special characters or structures, update the character matching logic in `lex` to recognize and push the corresponding `TOK_*` type and its literal value to the `tokens` array.
320
+
321
+ ### 3. Parser
322
+
323
+ The `parse(tokens, state)` function parses tokens into AST nodes. It is located in [parse.js](https://github.com/webc-site/math/blob/dev/src/parse.js).
324
+
325
+ - **Command Parsing**: Handled in the `TOK_MAP[TOK_CMD]` function inside [parse.js](https://github.com/webc-site/math/blob/dev/src/parse.js). When a command (e.g., `\mycmd`) is matched, consume its arguments (using `read(tokens, state_ref)` or `grab(tokens, state_ref)`) and return an AST node array: `[TYPE_MY_NODE, arg1, arg2]`.
326
+
327
+ ### 4. Renderer
328
+
329
+ The `SHOW_MAP` dictionary converts AST nodes into standard MathML markup strings. It is located in [mathml.js](https://github.com/webc-site/math/blob/dev/src/mathml.js) (previously `compile.js`).
330
+
331
+ - Register a new renderer function: `[TYPE_MY_NODE]: ([_, arg1, arg2]) => nest("mylabel", arg1, arg2)` or `tag("mi", ...)` to format node data into standard MathML tags (e.g., `<mfrac>`, `<msup>`, etc.).
332
+
333
+ ## Tech Stack
334
+
335
+ - **Runtime**: Bun, Node.js
336
+ - **Compilation & Bundling**: SWC (minify), Vite (demo)
337
+ - **Development Tools**: oxlint, oxfmt
338
+
339
+ ## Directory Structure
340
+
341
+ ```
342
+ .
343
+ ├── demo/ # Interactive rendering demo site
344
+ │ ├── const/ # Constants (formulas, languages)
345
+ │ ├── i18n/ # Internationalization translation files
346
+ │ ├── index.js # Demo interaction script
347
+ │ ├── index.pug # Pug HTML template
348
+ │ └── style.styl # Premium layout styling
349
+ ├── extract/ # Classical formula extraction scripts (KaTeX / MathJax test cases)
350
+ ├── lib/ # Compiled production distribution
351
+ │ ├── package.json # Minified package.json for NPM publication
352
+ │ ├── README.md # Automatically synchronized README for publication
353
+ │ ├── mathml.js # Minified distribution JS (TeX compiler)
354
+ │ ├── mathml.js.map # Source map for TeX compiler
355
+ │ ├── md.js # Minified distribution JS (Markdown parser)
356
+ │ └── md.js.map # Source map for Markdown parser
357
+ ├── src/ # Source code
358
+ │ ├── const/ # Constant definitions (types, symbols, functions, etc.)
359
+ │ ├── lex.js # LaTeX formula lexer
360
+ │ ├── parse.js # LaTeX formula parser (AST generator)
361
+ │ ├── mathml.js # TeX-to-MathML compiler
362
+ │ └── md.js # Markdown math formula parser entry point
363
+ ├── sh/ # Shell scripts
364
+ │ ├── benchmark.js # Size comparison benchmark & SVG generation script
365
+ │ └── check.js # Language file validation script
366
+ ├── dev.js # Programmatic Vite development server launcher
367
+ ├── dist.js # Build & distribution helper script (bumps version, compiles templates)
368
+ ├── minify.js # Build minification compiler script
369
+ ├── package.json # Project configuration metadata
370
+ ├── README.md # Synchronized root project documentation
371
+ ├── README.mdt # Markdown template for compiling English, Chinese and About files
372
+ └── test.sh # Formatter, linter, and compiler test runner
373
+ ```
374
+
375
+ ## History & Background
376
+
377
+ Mathematical typesetting on the web has historically relied on heavy libraries like MathJax or KaTeX. These libraries fetch large bundles and execute extensive CSS and layout calculations, causing page loading latencies.
378
+
379
+ MathML (Mathematical Markup Language) was proposed to solve this by providing native browser rendering of mathematical notations. In 2023, the integration of MathML Core into the Blink layout engine completed native MathML support across major web browsers (Chrome, Safari, Firefox).
380
+
381
+ The `18s` project provides a optimized math font `m` (Latin Modern Math, derived from Donald Knuth's Computer Modern typeface). The `@webc.site/math` compiler compiles TeX equations directly to native MathML Core elements, leveraging browser rendering capabilities to eliminate heavyweight runtime rendering dependencies.
382
+
383
+ ---
384
+
385
+ <a id="zh"></a>
386
+ # @webc.site/math
387
+
388
+ ### 全球最小最快的网页 Markdown 公式渲染器
389
+
390
+ <a href="https://www.npmjs.com/package/@webc.site/math" target="_blank"><img src="https://raw.githubusercontent.com/webc-site/math/dev/readme/zh/svg/badge.npm.svg" alt="npm" /></a>
391
+ &nbsp;&nbsp;
392
+ <a href="https://github.com/webc-site/math" target="_blank"><img src="https://raw.githubusercontent.com/webc-site/math/dev/readme/zh/svg/badge.github.svg" alt="github" /></a>
393
+ &nbsp;&nbsp;
394
+ <a href="https://math.webc.site" target="_blank"><img src="https://raw.githubusercontent.com/webc-site/math/dev/readme/zh/svg/badge.demo.svg" alt="demo" /></a>
395
+
396
+ 全球最小最快的网页 Markdown 公式渲染器,用于解析 Markdown 文本中的数学公式。
397
+
398
+ - [使用方法](#使用方法)
399
+ - [功能特性](#功能特性)
400
+ - [支持的语法清单](#支持的语法清单)
401
+ - [什么是 MathML?](#什么是-mathml?)
402
+ - [性能对比](#性能对比)
403
+ - [设计思路与调用流程](#设计思路与调用流程)
404
+ - [如何添加新的语法支持](#如何添加新的语法支持)
405
+ - [技术堆栈](#技术堆栈)
406
+ - [目录结构](#目录结构)
407
+ - [历史背景](#历史背景)
408
+
409
+ ## 使用方法
410
+
411
+ ### JavaScript 示例
412
+
413
+ #### 1. 替换 Markdown 中的公式(使用 `@webc.site/math/md`)
414
+
415
+ 输入 Markdown 文本,自动识别其中的行内/块级公式并替换为 MathML。
416
+
417
+ ```javascript
418
+ import mdMath from "@webc.site/math/md";
419
+
420
+ const markdown = "欧拉恒等式:$$e^{i\\pi} + 1 = 0$$";
421
+ const html = mdMath(markdown);
422
+
423
+ console.log(html);
424
+ // 输出: 欧拉恒等式:<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msup><mi>e</mi><mrow><mi>i</mi><mi>π</mi></mrow></msup><mo>+</mo><mn>1</mn><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">e^{i\pi} + 1 = 0</annotation></semantics></math>
425
+ ```
426
+
427
+ #### 2. 直接渲染 TeX 公式(使用 `@webc.site/math`)
428
+
429
+ 直接将 TeX 公式编译为 MathML。适合配合 Markdown 解析器(如 markdown-it、marked)实现公式渲染插件。
430
+
431
+ ```javascript
432
+ import mathml from "@webc.site/math";
433
+
434
+ const tex = "e^{i\\pi} + 1 = 0";
435
+ const html = mathml(tex, true); // 第二个参数传 true 表示块级公式,传 false 或不传表示行内公式
436
+ ```
437
+
438
+ ### CSS 与数学字体配置
439
+
440
+ 为了使浏览器原生呈现出排版更精美的数学公式,强烈建议配合专门的数学字体使用。这里我们推荐使用 `18s` 包中提供的 **Latin Modern Math** 数学字体(源自高德纳的经典 Computer Modern 字体,包含完整的数学和技术符号集与 OpenType 排版特性映射)。
441
+
442
+ #### 1. 在线引用(推荐)
443
+
444
+ 可以直接在 CSS 中通过 `@import` 引入在线字体:
445
+
446
+ ```css
447
+ /* 引入合并后的字体 CSS(包含思源黑体 t、代码字体 c 及数学字体 m) */
448
+ @import url("//registry.npmmirror.com/18s/0.2.24/files/_.css");
449
+ ```
450
+
451
+ 或者仅按需引入数学字体 `m`:
452
+
453
+ ```css
454
+ @import url("//registry.npmmirror.com/18s/0.2.24/files/m.css");
455
+ ```
456
+
457
+ #### 2. 本地安装字体包
458
+
459
+ ```bash
460
+ npm install 18s
461
+ ```
462
+
463
+ ##### 引入本地字体
464
+
465
+ 根据你的项目,选择以下一种方式引入字体映射关系(注意:请不要把 JS 和 CSS 的引入混在同一个文件中):
466
+
467
+ ###### 方式 1:在项目入口 JS/TS 文件中引入
468
+
469
+ ```javascript
470
+ // 引入合并后的字体 CSS(包含思源黑体 t、代码字体 c 及数学字体 m)
471
+ import "18s/_.css";
472
+
473
+ // 或者仅按需引入数学字体 m
474
+ import "18s/m.css";
475
+ ```
476
+
477
+ ###### 方式 2:在项目入口 CSS 文件中引入
478
+
479
+ ```css
480
+ /* 引入合并后的字体 CSS(包含思源黑体 t、代码字体 c 及数学字体 m) */
481
+ @import "18s/_.css";
482
+
483
+ /* 或者仅按需引入数学字体 m */
484
+ @import "18s/m.css";
485
+ ```
486
+
487
+ #### 3. 配置 CSS 样式
488
+
489
+ 在全局 CSS 样式表中,为 `math` 标签指定数学字体族别名 `m`(其中 `t` 是思源黑体,对中文进行了切片优化):
490
+
491
+ ```css
492
+ math {
493
+ /* m 为数学字体,t 为思源黑体(对中文字符进行了切片优化以提升加载性能),sans-serif 为系统默认无衬线字体 */
494
+ font-family: m, t, sans-serif;
495
+ }
496
+ ```
497
+
498
+ ## 功能特性
499
+
500
+ - **功能完备**:从 KaTeX 和 MathJax 官方测试用例库中抽取了数千个公式进行编译测试,全部通过(测试用例见 [extract](https://github.com/webc-site/math/tree/dev/extract))。
501
+ - **健壮容错**:编译阶段的语法错误(如未闭合的 `\left`/`\right` 或其他非法语法)会被自动捕获并优雅退化,直接返回原始的 TeX 代码而不抛出 JavaScript 异常,防止前端应用崩溃。
502
+ - **快速编译**:直接编译 TeX 公式为语义化 MathML,无外部解析器依赖。
503
+ - **Markdown 集成**:自动解析 Markdown 文本中的行内公式(`$ 公式 $`)和块级公式(`$$ 公式 $$`)。
504
+ - **高性能**:原始体积仅 7.78 KB(Gzip 压缩后 3.58 KB),体积远小于 KaTeX 和 MathJax(见下图体积对比):
505
+
506
+ | 库 | 原始体积 | Gzip 体积 | 尺寸比 |
507
+ | :---------------------------------------------------------- | :-------: | :-------: | :----: |
508
+ | [@webc.site/math](https://github.com/webc-site/math) (本库) | 7.78 KB | 3.58 KB | 1.0 ⭐️ |
509
+ | [KaTeX](https://github.com/KaTeX/KaTeX) | 264.79 KB | 75.15 KB | 21.0 |
510
+ | [MathJax](https://github.com/mathjax/MathJax) | 971.04 KB | 278.39 KB | 77.7 |
511
+
512
+ ![](demo/size.svg)
513
+
514
+ - **标准兼容**:输出现代浏览器排版引擎支持的标准 MathML 元素。
515
+
516
+ ## 支持的语法清单
517
+
518
+ 本库在极简的包体积下,支持了最常用的数学公式排版语法:
519
+
520
+ - **基础算术与符号**:数字、英文字母、基础运算符(`+`, `-`, `*`, `/`, `=`, `<`, `>`, `(`, `)`, `[`, `]`, `.`)。其中 `-` 自动映射为减号 `\u2212`,`*` 映射为星号 `\u2217`,`/` 以直立体呈现。
521
+ - **上下标 (Subscripts & Superscripts)**:
522
+ - 上标 `^`(如 `x^2`)
523
+ - 下标 `_`(如 `x_i`)
524
+ - 同时存在上下标(如 `x_i^2` 或 `x^2_i`)
525
+ - 对于求和与积分等大型运算符,上下标会自动以限位上下标(limits)形式呈现(如 `\sum_{i=1}^n`,`\int_a^b`)
526
+ - **分式 (Fraction)**:`\frac{分子}{分母}`(如 `\frac{a}{b}`)
527
+ - **开根号 (Square Root)**:平方根 `\sqrt{x}` 以及 $n$ 次方根 `\sqrt[n]{x}`
528
+ - **上划线与横线 (Overlines & Bars)**:`\overline{x}` 及简写形式 `\bar{x}`
529
+ - **自适应括号与定界符 (Delimiters)**:`\left` 和 `\right` 结构(如 `\left( ... \right)`)。支持的定界符包括:
530
+ - 圆括号:`(` 和 `)`
531
+ - 方括号:`[` 和 `]`
532
+ - 花括号:`\{` 和 `\}`
533
+ - 尖括号:`<` (⟨) 和 `>` (⟩)
534
+ - 竖线:`|` 或 `\|`
535
+ - 空白定界符:`.`(表示不显示该侧定界符,例如 `\left. \frac{df}{dx} \right| _0`)
536
+ - **文本模式 (Text Mode)**:`\text{...}`(如 `\text{if }`),提取大括号中的字面文本,渲染为 MathML `<mtext>`,以常规直立体呈现。
537
+ - **水平间距 (Horizontal Spacing)**:支持 `\quad`(1em 间距)和 `\qquad`(2em 间距)的空格占位。
538
+ - **样式、删除线与占位隐藏 (Styles, Strikethroughs & Phantom)**:
539
+ - 边框:`\boxed{...}`(在公式周围加上边框,如 `\boxed{x+y}`)
540
+ - 删除线与取消线:`\cancel{...}`(通过斜线划掉,如 `\cancel{x}`)和 `\sout{...}`(通过水平线划掉,如 `\sout{y}`)
541
+ - 隐藏与占位:`\phantom{...}`(生成与输入内容相同宽高的不可见占位空间,如 `\phantom{x}`)
542
+ - **常用数学函数 (Common Functions)**:`\sin`, `\cos`, `\tan`, `\cot`, `\sec`, `\csc`, `\log`, `\lg`, `\ln`, `\lim`, `\exp`, `\max`, `\min`, `\sup`, `\inf`, `\det`, `\gcd`, `\arcsin`, `\arccos`, `\arctan`, `\sinh`, `\cosh`, `\tanh`, `\coth`, `\deg`, `\arg`。其中 `\lim`, `\max`, `\min`, `\sup`, `\inf` 作为极限算子,其上下标定位在行间/块级公式中会自动以 limits 形式显示在算子正下方。
543
+ - **同余括号 (Modulo)**:`\pmod{...}`(生成带括号的同余占位,如 `\pmod{m}` 渲染为 $(mod\ m)$)
544
+ - **希腊字母 (Greek Letters)**:
545
+ - 小写希腊字母:`\alpha` ($\alpha$), `\beta` ($\beta$), `\gamma` ($\gamma$), `\delta` ($\delta$), `\epsilon` ($\epsilon$), `\zeta` ($\zeta$), `\eta` ($\eta$), `\theta` ($\theta$), `\iota` ($\iota$), `\kappa` ($\kappa$), `\lambda` ($\lambda$), `\mu` ($\mu$), `\nu` ($\nu$), `\xi` ($\xi$), `\pi` ($\pi$), `\rho` ($\rho$), `\sigma` ($\sigma$), `\tau` ($\tau$), `\upsilon` ($\upsilon$), `\phi` ($\phi$), `\chi` ($\chi$), `\psi` ($\psi$), `\omega` ($\omega$)
546
+ - 大写希腊字母(以直立体呈现):`\Delta` ($\Delta$), `\Gamma` ($\Gamma$), `\Theta` ($\Theta$), `\Lambda` ($\Lambda$), `\Xi` ($\Xi$), `\Pi` ($\Pi$), `\Sigma` ($\Sigma$), `\Upsilon` ($\Upsilon$), `\Phi` ($\Phi$), `\Psi` ($\Psi$), `\Omega` ($\Omega$)
547
+ - **算术运算符与关系符 (Operators & Relations)**:
548
+ - `\le` / `\leq` ($\le$), `\ge` / `\geq` ($\ge$), `\ne` / `\neq` ($\ne$)
549
+ - `\cdot` ($\cdot$), `\times` ($\times$), `\pm` ($\pm$), `\mp` ($\mp$), `\div` ($\div$), `\infty` ($\infty$)
550
+ - `\approx` ($\approx$), `\sim` ($\sim$), `\cong` ($\cong$), `\propto` ($\propto$), `\equiv` ($\equiv$), `\perp` ($\perp$), `\parallel` ($\parallel$)
551
+ - **微积分、集合与逻辑符号 (Calculus, Sets & Logic)**:
552
+ - 梯度:`\nabla` ($\nabla$),偏微分:`\partial` ($\partial$)
553
+ - 逻辑量词与运算:`\forall` ($\forall$),`\exists` ($\exists$),`\neg` ($\neg$),`\land` ($\land$),`\lor` ($\lor$)
554
+ - 集合关系:`\in` ($\in$),`\notin` ($\notin$),`\ni` ($\ni$),`\subset` ($\subset$),`\supset` ($\supset$),`\subseteq` ($\subseteq$),`\supseteq` ($\supseteq$)
555
+ - 集合运算:`\cup` ($\cup$),`\cap` ($\cap$),空集:`\emptyset` ($\emptyset$)
556
+ - 特殊变量与常量:`\ell` ($\ell$), `\hbar` ($\hbar$)
557
+ - 大型运算符:求和 `\sum` ($\sum$),积分 `\int` ($\int$)
558
+ - **箭头符号 (Arrows)**:
559
+ - 单向箭头:`\to` / `\rightarrow` ($\rightarrow$), `\leftarrow` / `\gets` ($\leftarrow$), `\Leftarrow` ($\Leftarrow$), `\Rightarrow` ($\Rightarrow$)
560
+ - 双向箭头:`\leftrightarrow` ($\leftrightarrow$), `\Leftrightarrow` ($\Leftrightarrow$)
561
+ - **省略号 (Dots)**:
562
+ - 基线省略号:`\dots` / `\ldots` ($\dots$)
563
+ - 居中省略号:`\cdots` ($\cdots$)
564
+ - **矩阵与多行排版 (Matrices & Multi-line Layouts)**:
565
+ - 矩阵环境:`matrix`, `pmatrix`, `bmatrix`, `vmatrix`, `Vmatrix`(如 `\begin{pmatrix} a & b \\ c & d \end{pmatrix}`)
566
+ - 方程组与条件分支:`cases`(如 `\begin{cases} x & x \ge 0 \\ -x & x < 0 \end{cases}`)
567
+ - 通用数组排版:`array`
568
+ - 换行与对齐:使用 `\\`、`\\*` 或 `\\[width]`(如 `\\[10px]`)进行换行,以及使用 `&` 进行列对齐
569
+
570
+ ### 不支持的语法 (非本库设计目标)
571
+
572
+ 目前还不支持以下 LaTeX 扩展、宏定义或样式微调指令:
573
+
574
+ 1. **宏定义命令**:`\newcommand`, `\renewcommand`, `\providecommand`, `\gdef`, `\let` 等。
575
+ 2. **背景色与高级边框**:`\colorbox`, `\fcolorbox`, `\cellcolor` 等(支持 `\boxed`)。
576
+ 3. **其他删除线**:`\bcancel`, `\xcancel` 等(支持 `\cancel` 和 `\sout`)。
577
+ 4. **高级布局与隐藏**:`\hphantom`, `\vphantom`, `\smash` 等(支持 `\phantom`)。
578
+ 5. **化学公式扩展**:化学宏包 `\ce{...}` (mhchem)。
579
+ 6. **代码/文本抄录**:`\verb` 等。
580
+ 7. **高级上/下标定位**:`\sideset`, `\prescript`, `\cramped`, `\flatfrac` 等。
581
+ 8. **公式编号与自定义标签**:`\tag`, `\newtagform`, `\usetagform` 等。
582
+ 9. **任意运算符的限位 (Limits) 强制调整**:除预设的 `\sum`, `\int` 等大型运算符和 `\lim` 等极限算子外,不支持对任意自定义命令或结构使用 `\limits` 强制限位(例如 `\operatorname{sn}\limits_{...}`)。
583
+
584
+ ## 错误处理与容错机制
585
+
586
+ 在使用 `@webc.site/math/md` 解析 Markdown 文本时,如果数学公式中包含非法的 LaTeX 语法(例如未闭合的 `\left`),内部会自动捕获该语法错误,并优雅地退化为显示原始的公式文本(如 `$$x + \left( y$$`),而不会抛出 JavaScript 异常或导致网页/应用渲染崩溃。因此,调用该函数时**无需**使用 `try...catch` 块包裹。
587
+
588
+ 但需要注意的是,如果直接使用 `@webc.site/math` 的默认导出(TeX 编译器核心)来渲染非法的 LaTeX 语法,它会抛出包含错误码的数组(详见下文错误码表)。因此,直接调用 TeX 编译器时建议使用 `try...catch` 进行包裹。
589
+
590
+ ### 内部错误码
591
+
592
+ 在解析器内部编译公式时,可能会产生以下错误码。这些错误码主要在开发或单元测试时用于指示语法错误的具体类型:
593
+
594
+ | 错误码 | 常量名 | 含义 | 触发示例 |
595
+ | :----: | :------------------ | :-------------------------------- | :--------------------------------- |
596
+ | `0` | `ERR_EXTRA_END` | 多余或非法的 `\end` 指令 | `\end{matrix}` (无对应的 `\begin`) |
597
+ | `1` | `ERR_MISSING_RIGHT` | `\left` 定界符缺少配对的 `\right` | `\left( x` |
598
+ | `2` | `ERR_EXTRA_RIGHT` | 多余或非法的 `\right` 指令 | `x \right)` (无对应的 `\left`) |
599
+ | `3` | `ERR_MISSING_BRACE` | 命令缺少必填的大括号参数 | `\text x` (缺少 `{}`) |
600
+
601
+ ## 什么是 MathML?
602
+
603
+ MathML(Mathematical Markup Language,数学标记语言)是一种基于 XML 的标准,用于在 Web 页面中描述数学公式的结构与语义。
604
+
605
+ **自 2023 年 1 月起**(随着 Chrome 109 正式启用对 MathML Core 的原生支持),此特性已被所有主流浏览器渲染引擎(Chromium/Blink、Gecko/Firefox、WebKit/Safari)全面且原生支持,这标志着无需加载任何 JavaScript 排版库,即可在绝大多数桌面端、移动端设备及主流浏览器版本中正常、快速地呈现数学公式。
606
+
607
+ ### 为什么需要 TeX 公式转 MathML?
608
+
609
+ 虽然 MathML 是浏览器原生支持的数学排版标准,但它的 XML 语法极其繁琐,不适合人类直接书写。人类书写数学公式的事实标准是 **TeX/LaTeX** 语法(例如在 Markdown 中书写 `$e^{i\pi} + 1 = 0$`)。
610
+
611
+ 传统的网页公式解决方案(如 MathJax 或 KaTeX)在前端运行,需要加载数以百 KB 甚至数 MB 的 JS/CSS 排版引擎,并消耗大量客户端 CPU 进行复杂的 DOM 重绘与排版计算,非常臃肿。
612
+
613
+ 使用 `@webc.site/math` 将 TeX 编译为 MathML,可以完美解决这些痛点,尤其在**前端渲染(Client-side Rendering)**场景下具有压倒性优势:
614
+
615
+ #### 1. 极致轻量(~1.8 KB Gzip)与零运行依赖
616
+
617
+ 相比于 KaTeX (300 KB+) 和 MathJax (数 MB) 的庞大体积,`@webc.site/math` 极其微小。你可以轻松地将它打包进任何前端/单页应用(SPA)中,几乎不增加首屏加载时间。
618
+
619
+ #### 2. 利用浏览器原生排版,省去前端渲染引擎
620
+
621
+ 传统的公式库不仅是个“解析器”,还包含一整套“前端排版引擎”(用于计算字符宽高、间距,并使用绝对定位生成成百上千个 DOM 节点或 SVG 元素)。而本库只负责在前端将 TeX 代码“翻译”成标准的 MathML 语义标签,具体的排版布局完全交由浏览器底层的 C++ 原生引擎渲染。这极大地解放了浏览器的 JS 线程和主线程。
622
+
623
+ #### 3. 流畅的前端实时预览与极低 CPU 消耗
624
+
625
+ 因为只做简单的标签翻译,且将排版工作外包给了浏览器原生引擎,本库在前端执行速度极快、CPU 开销极低。这使得它非常适合用于**公式编辑器、Markdown 编辑器等实时预览场景**,输入公式时可以做到瞬时无缝渲染,即使在配置较低的移动端设备上也能保持极高的流畅度。
626
+
627
+ #### 4. 前后端通用,统一的技术栈
628
+
629
+ 由于编译输出的是纯 HTML 标准的 MathML 元素,无论是作为前端排版(在浏览器端动态转换并插入 DOM),还是在构建期(SSR/SSG)静态编译为 HTML,都能保持完全一致的高效表现。
630
+
631
+ ## 性能对比
632
+
633
+ 由于 KaTeX 和 MathJax 本身是 TeX 公式编译器(不包含 Markdown 解析功能),为了确保基准测试的公平性,我们使用本库的 TeX 编译器核心([@webc.site/math/mathml.js](https://github.com/webc-site/math/blob/dev/src/mathml.js))直接与它们进行对比。
634
+
635
+ ### 1. 体积对比(Gzip 压缩后)
636
+
637
+ | 库 | 原始体积 | Gzip 体积 | 尺寸比 |
638
+ | :-------------------------------------------- | :-------: | :-------: | :----: |
639
+ | @webc.site/math (本库) | 7.78 KB | 3.58 KB | 1.0 ⭐️ |
640
+ | [KaTeX](https://github.com/KaTeX/KaTeX) | 264.79 KB | 75.15 KB | 21.0 |
641
+ | [MathJax](https://github.com/mathjax/MathJax) | 971.04 KB | 278.39 KB | 77.7 |
642
+
643
+ ![](demo/size.svg)
644
+
645
+ ### 2. 编译速度对比 (Ops/sec)
646
+
647
+ 基于经典公式循环编译测试(使用 [sh/benchmark.js](https://github.com/webc-site/math/blob/dev/sh/benchmark.js) 测得):
648
+
649
+ - **@webc.site/math (本库)**: ~329, 000 ops/s (1.0 ⭐️)
650
+ - **[KaTeX](https://github.com/KaTeX/KaTeX)**: ~92, 000 ops/s (约 3.6x 较慢)
651
+ - **[MathJax](https://github.com/mathjax/MathJax)**: ~6, 700 ops/s (约 48.8x 较慢)
652
+
653
+ ![](demo/speed.svg)
654
+
655
+ ## 设计思路与调用流程
656
+
657
+ 解析器处理输入的 Markdown 字符串,隔离 TeX 表达式,并将其转换为 MathML 结构。
658
+
659
+ ```mermaid
660
+ graph TD
661
+ A[输入 Markdown] --> B{扫描器}
662
+ B -- 普通文本 --> C[输出缓冲区]
663
+ B -- TeX 公式 --> D[词法分析: 生成 Token]
664
+ D --> E[语法分析: 生成 AST]
665
+ E --> F[代码生成: 生成 MathML 标签]
666
+ F --> G[语义包装]
667
+ G --> H[MathML 输出]
668
+ C --> I[最终 HTML]
669
+ H --> I
670
+ ```
671
+
672
+ ### 模块运行流程
673
+
674
+ 1. **扫描器**:扫描输入字符串,定位公式定界符(`$` 和 `$$`)。
675
+ 2. **词法分析**:将 TeX 字符串分解为数字、变量、运算符和控制命令等 Token。
676
+ 3. **语法分析**:将 Token 转换为抽象语法树(AST)节点,支持分式、上下标及预设数学函数。
677
+ 4. **代码生成**:将 AST 节点映射为标准 XML 节点(`<mi>`、`<mo>`、`<mn>`、`<mfrac>`、`<msup>`、`<msub>`、`<msubsup>`)。
678
+
679
+ ## 如何添加新的语法支持
680
+
681
+ 添加新的 LaTeX 语法支持需要按顺序修改以下四个核心部分:
682
+
683
+ ### 1. 常量定义 (Constants)
684
+
685
+ 定义相应的词法 Token、语法节点类型、函数名或符号映射表:
686
+
687
+ - **Token 类型**:在 [const/TOK.js](https://github.com/webc-site/math/blob/dev/src/const/TOK.js) 中定义(如 `export const TOK_MY_CMD = ...`,若需要新的词法分类)。
688
+ - **节点类型 (AST Node Type)**:在 [const/TYPE.js](https://github.com/webc-site/math/blob/dev/src/const/TYPE.js) 中定义(如 `export const TYPE_MY_NODE = ...`,指定新的语法树节点类型)。
689
+ - **环境定界符**:若添加新的环境(如新矩阵或括号类型),需在 [mathml.js](https://github.com/webc-site/math/blob/dev/src/mathml.js)(原 `compile.js`)的 `ENV_DELIMS` 中配置其左右定界符。
690
+ - **符号映射表**:如果是普通数学符号或简单命令,只需在 [const/SYM.js](https://github.com/webc-site/math/blob/dev/src/const/SYM.js) 的 `SYM_MAP` 中将命令名映射为对应的 Unicode 字符。
691
+ - **数学函数名**:在 [const/FUNC.js](https://github.com/webc-site/math/blob/dev/src/const/FUNC.js) 的 `FUNC_NAMES` 集合中定义。
692
+
693
+ ### 2. 词法分析 (Lexer)
694
+
695
+ `lex(str)` 函数负责将 LaTeX 输入字符串切割为 Token 数组。它位于 [lex.js](https://github.com/webc-site/math/blob/dev/src/lex.js)。
696
+
697
+ - 如果引入了新的特殊字符或不同结构,需要更新 `lex` 函数中的字符匹配逻辑,让其识别并向 `tokens` 数组中推送相应的 `TOK_*` 类型和其字面值。
698
+
699
+ ### 3. 语法分析 (Parser)
700
+
701
+ `parse(tokens, state)` 函数负责将 Token 转换为抽象语法树(AST)节点。它位于 [parse.js](https://github.com/webc-site/math/blob/dev/src/parse.js)。
702
+
703
+ - **命令解析**:主要在 [parse.js](https://github.com/webc-site/math/blob/dev/src/parse.js) 的 `TOK_MAP[TOK_CMD]` 函数中处理。当解析到对应的 LaTeX 命令(如 `\mycmd`)时,读取其参数(可使用 `read(tokens, state_ref)` 或 `grab(tokens, state_ref)`),并返回一个表示该节点的数组:`[TYPE_MY_NODE, arg1, arg2]`。
704
+
705
+ ### 4. 代码渲染 (Renderer)
706
+
707
+ `SHOW_MAP` 字典负责将 AST 节点转换为标准的 MathML 标签字符串。它位于 [mathml.js](https://github.com/webc-site/math/blob/dev/src/mathml.js)(原 `compile.js`)。
708
+
709
+ - 注册新的节点渲染函数:`[TYPE_MY_NODE]: ([_, arg1, arg2]) => nest("mylabel", arg1, arg2)` 或 `tag("mi", ...)`,将节点数据格式化为对应的标准 MathML 标记(如 `<mfrac>`、`<msup>` 等)。
710
+
711
+ ## 技术堆栈
712
+
713
+ - **运行环境**:Bun、Node.js
714
+ - **构建与打包**:SWC(代码压缩)、Vite(演示页面)
715
+ - **开发工具**:oxlint、oxfmt
716
+
717
+ ## 目录结构
718
+
719
+ ```
720
+ .
721
+ ├── demo/ # 交互式演示网页
722
+ │ ├── const/ # 常量(预设公式、多语言列表)
723
+ │ ├── i18n/ # 语言翻译配置文件
724
+ │ ├── index.js # 演示页面交互逻辑
725
+ │ ├── index.pug # Pug HTML 模板
726
+ │ └── style.styl # 演示页面配色样式
727
+ ├── extract/ # 经典公式提取脚本(KaTeX / MathJax 测试用例提取)
728
+ ├── lib/ # 编译分发目录
729
+ │ ├── package.json # 精简版 package.json,用于 NPM 发布
730
+ │ ├── README.md # 同步生成的发布版 README
731
+ │ ├── mathml.js # 压缩版 JS (TeX 编译器)
732
+ │ ├── mathml.js.map # 独立 SourceMap
733
+ │ ├── md.js # 压缩版 JS (Markdown 解析器)
734
+ │ └── md.js.map # 独立 SourceMap
735
+ ├── src/ # 源代码目录
736
+ │ ├── const/ # 常量定义(Token 类型、AST 节点类型、符号映射、函数名等)
737
+ │ ├── lex.js # LaTeX 公式词法分析器
738
+ │ ├── parse.js # LaTeX 公式语法分析器(生成 AST)
739
+ │ ├── mathml.js # TeX-to-MathML 编译器
740
+ │ └── md.js # Markdown 数学公式解析入口
741
+ ├── sh/ # 脚本目录
742
+ │ ├── benchmark.js # 体积对比评测与 SVG 生成脚本
743
+ │ └── check.js # 语言文件校验脚本
744
+ ├── dev.js # 启动 Vite 开发服务器脚本
745
+ ├── dist.js # 打包发布辅助脚本(自动递增版本、渲染模板)
746
+ ├── minify.js # 代码打包压缩脚本
747
+ ├── package.json # 项目配置文件
748
+ ├── README.md # 同步生成的根目录项目说明
749
+ ├── README.mdt # 用于合并中英文及介绍文件的 Markdown 模板
750
+ └── test.sh # 格式化、代码检查及测试运行脚本
751
+ ```
752
+
753
+ ## 历史背景
754
+
755
+ 传统的 Web 数学公式渲染多依赖 MathJax 或 KaTeX。这类库体积庞大,需要加载大量 JS 文件并执行复杂的排版计算,容易导致页面渲染出现明显的延迟与白屏。
756
+
757
+ MathML(数学标记语言)规范旨在通过浏览器原生支持渲染数学符号。2023 年,Blink 引擎正式支持 MathML Core 标准,标志着 Chrome、Safari 和 Firefox 等主流浏览器全面实现了原生的数学公式排版。
758
+
759
+ 配合 `18s` 项目提供的数学字体 `m`(Latin Modern Math,源自高德纳的 Computer Modern 经典字体),`@webc.site/math` 编译器能够将 TeX 公式直接转换为原生的 MathML 元素,完全利用浏览器底层的排版能力,消除了对庞大运行时排版库的依赖。
package/mathml.js ADDED
@@ -0,0 +1 @@
1
+ var t={_:5,"^":6,"{":7,"}":8,"(":9,")":10},e=t=>t>=48&&t<=57,r=t=>(32|t)-97>>>0<26,l=(t,e,r)=>{for(;e<r;){let r=t.charCodeAt(e);if(r<=32&&(32===r||1<<r&9728))++e;else break}return e},n=' stretchy="false"',a=(t,e)=>' lspace="'+t+'px" rspace="'+e+'px"',i=' mathvariant="normal"',o=n+a(0,0),s=a(4,4),u=a(5,5),p=new Set(["matrix","pmatrix","bmatrix","vmatrix","Vmatrix","cases","array"]),m=new Set(["sin","cos","tan","cot","sec","csc","log","lg","ln","lim","exp","max","min","sup","inf","det","gcd","arcsin","arccos","arctan","sinh","cosh","tanh","coth","deg","arg"]),c=[3,"≤"],h=[3,"≥"],f=[3,"≠",i],d=[3,"→"],g=[3,"←"],x=[3,"…"],b={__proto__:null,alpha:[1,"α"],beta:[1,"β"],gamma:[1,"γ"],theta:[1,"θ"],pi:[1,"π"],infty:[1,"∞",i],le:c,leq:c,ge:h,geq:h,neq:f,ne:f,cdot:[3,"⋅"],times:[3,"\xd7"],pm:[3,"\xb1"],mp:[3,"∓",s],div:[3,"\xf7"],sum:[3,"∑"],int:[3,"∫"],to:d,rightarrow:d,leftarrow:g,gets:g,leftrightarrow:[3,"↔"],Leftarrow:[3,"⇐"],Rightarrow:[3,"⇒"],Leftrightarrow:[3,"⇔"],dots:x,ldots:x,cdots:[3,"⋯"],Delta:[1,"Δ",i],Gamma:[1,"Γ",i],Theta:[1,"Θ",i],Lambda:[1,"Λ",i],Xi:[1,"Ξ",i],Pi:[1,"Π",i],Sigma:[1,"Σ",i],Upsilon:[1,"Υ",i],Phi:[1,"Φ",i],Psi:[1,"Ψ",i],Omega:[1,"Ω",i],delta:[1,"δ"],epsilon:[1,"ϵ"],zeta:[1,"ζ"],eta:[1,"η"],iota:[1,"ι"],kappa:[1,"κ"],lambda:[1,"λ"],mu:[1,"μ"],nu:[1,"ν"],xi:[1,"ξ"],rho:[1,"ρ"],sigma:[1,"σ"],tau:[1,"τ"],upsilon:[1,"υ"],phi:[1,"ϕ"],chi:[1,"χ"],psi:[1,"ψ"],omega:[1,"ω"],nabla:[1,"∇",i],partial:[1,"∂",i],approx:[3,"≈",u],sim:[3,"∼",u],cong:[3,"≅",u],propto:[3,"∝",u],equiv:[3,"≡",u],neg:[1,"\xac"],lor:[3,"∨",s],land:[3,"∧",s],ni:[3,"∋",u],perp:[3,"⟂",u],parallel:[3,"∥",u],ell:[1,"ℓ"],hbar:[1,"ℏ"],forall:[1,"∀",i],exists:[1,"∃",i],in:[3,"∈"],notin:[3,"∉"],subset:[3,"⊂"],supset:[3,"⊃"],subseteq:[3,"⊆"],supseteq:[3,"⊇"],cup:[3,"∪"],cap:[3,"∩"],emptyset:[1,"∅",i]},_={"\\limits":1,"\\nolimits":2},w={__proto__:null,boxed:1,cancel:2,sout:3},C={__proto__:null,quad:"16px",qquad:"32px"},y={"-":[3,"−"],"*":[3,"∗"],"/":[3,"/",i],"(":[3,"(",n],")":[3,")",n],"[":[3,"[",n],"]":[3,"]",n],"|":[3,"|",o],".":[3,".",i]},q={__proto__:null,"\\{":"{","\\}":"}","<":"⟨",">":"⟩"},k=t=>[1,t],v=(t,e)=>{let r=e[0];if(null==t[r])return null;e[0]+=2;let l=t[r+1];return"."===l?[3,"",' fence="true" stretchy="true" symmetric="true"']:[3,q[l]??(l?.startsWith("\\")?l.slice(1):l)]},A=(t,e,r)=>{if(3===t[e[0]]&&"["===t[e[0]+1]&&(!r||1===t[e[0]+2])){for(e[0]+=2;0!==t[e[0]]&&(3!==t[e[0]]||"]"!==t[e[0]+1]);)e[0]+=2;3===t[e[0]]&&(e[0]+=2)}},j=(t,e)=>{if(7===t[e[0]]){e[0]+=2;let r="";for(;0!==t[e[0]]&&8!==t[e[0]];)r+=t[e[0]+1],e[0]+=2;return 8===t[e[0]]&&(e[0]+=2),r}return""},L=(t,e,r,l)=>{let n=[],a=[],i=[];for(;e[0]<t.length;){let o=t[e[0]],s=t[e[0]+1];if(0===o||!r&&8===o)break;if(r&&4===o&&"\\end"===s){let r=e[0];if(e[0]+=2,j(t,e)===l)break;e[0]=r}if(3===o&&"&"===s){e[0]+=2,a.push(i),i=[];continue}if(4===o&&"\\\\"===s){e[0]+=2,A(t,e,1),a.push(i),i=[],n.push(a),a=[];continue}let u=z(t,e);u&&i.push(u)}if((i.length||a.length)&&(a.push(i),n.push(a)),n.length){let t=n[n.length-1];t[1]||t[0][0]||n.pop()}return n},M=(t,e)=>[13,V(t,e,1)],P={__proto__:null,"\\":(t,e)=>(3===t[e[0]]&&"*"===t[e[0]+1]&&(e[0]+=2),A(t,e,1),[15]),text:(t,e)=>{if(7===t[e[0]]){let r=j(t,e);if(""===r)return[8,[]];let l=r.split("\\\\");if(l.length>1){let t=[];return l.forEach((e,r)=>{r>0&&t.push([15]),e&&t.push([16,e])}),[8,t]}return[16,r]}let r=V(t,e,1);if(r)return[16,r[1]];throw[3,"text"]},frac:(t,e)=>[7,V(t,e,1),V(t,e,1)],overline:M,bar:M,sqrt:(t,e)=>{if(3===t[e[0]]&&"["===t[e[0]+1]){e[0]+=2;let r=[];for(;0!==t[e[0]]&&(3!==t[e[0]]||"]"!==t[e[0]+1]);){let l=z(t,e);l&&r.push(l)}return 3===t[e[0]]&&(e[0]+=2),[11,V(t,e,1),[8,r]]}return[10,V(t,e,1)]},left:(t,e)=>{let r=v(t,e),l=B(t,e);if(4===t[e[0]]&&"\\right"===t[e[0]+1])return e[0]+=2,[12,[r,...l,v(t,e)].filter(Boolean)];throw[1,r]},phantom:(t,e)=>[19,V(t,e,1)],pmod:(t,e)=>[8,[[17,"8px"],[3,"(",n],[16,"mod"],[17,"4px"],V(t,e,1),[3,")",n]]],begin:(t,e,r)=>{if(7===t[e[0]]){let r=j(t,e);return"array"===r&&(A(t,e),7===t[e[0]]?j(t,e):0!==t[e[0]]&&(e[0]+=2)),[14,r,L(t,e,1,r)]}return[1,r]},end:(t,e,r,l)=>{throw[0,l]},right:(t,e,r,l)=>{throw[2,l]}},S={2:k,3:t=>y[t]??[3,t],9:()=>y["("],10:()=>y[")"],1:t=>[2,t],7:(t,e,r)=>{let l=[8,B(e,r)];return 8===e[r[0]]&&(r[0]+=2),l},4:(t,e,r)=>{let l=t.slice(1),n=P[l];if(n)return n(e,r,t,l);if(p.has(l))return((t,e,r)=>{if(7===t[e[0]]){e[0]+=2;let l=L(t,e,0,r);return 8===t[e[0]]&&(e[0]+=2),[14,r,l]}let l=V(t,e,1);return l?[14,r,[[[l]]]]:null})(e,r,l)??k(t);let a=C[l];if(a)return[17,a];let i=w[l];return i?[18,i,V(e,r,1)]:m.has(l)?[9,l]:b[l]??k(t)}},V=(t,e,r)=>{let l=e[0],n=t[l];if(null==n)return null;e[0]+=2;let a=t[l+1];return r&&1===n&&a[1]&&(t.splice(e[0],0,1,a.slice(1)),a=a[0]),S[n]?.(a,t,e)??null},z=(t,e)=>{let r=V(t,e);if(!r)return null;let l=0;if(4===t[e[0]]){let r=_[t[e[0]+1]];void 0!==r&&(l=r,e[0]+=2)}let n=null,a=null,i;for(;null!=(i=t[e[0]])&&(5===i||6===i);){e[0]+=2;let r=V(t,e,1);5===i?n=r:a=r}return n&&a?[6,r,n,a,l]:n?[5,r,n,l]:a?[4,r,a,l]:r},B=(t,e)=>{let r,l=[];for(;null!=(r=t[e[0]])&&0!==r&&8!==r&&(4!==r||"\\right"!==t[e[0]+1]);){let r=z(t,e);r&&l.push(r)}return l},D={__proto__:null,pmatrix:["(",")"],bmatrix:["[","]"],vmatrix:["|","|"],Vmatrix:["‖","‖"],cases:["{",""]},E="mrow",G={1:' style="display:inline-block;border:1px solid;padding:2px 3px"',2:' style="display:inline-block;background:linear-gradient(to top right,transparent 47%,currentColor 47%,currentColor 53%,transparent 53%)"',3:' style="display:inline-block;background:linear-gradient(transparent 47%,currentColor 47%,currentColor 53%,transparent 53%)"'},O={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"},R=t=>/[&<>"]/.test(t)?t.replace(/[&<>"]/g,t=>O[t]):t,T=(t,e,r)=>"<"+t+(r??"")+">"+e+"</"+t+">",U=(t,e,r)=>T(t,R(e),r),W=(t,e,r,l)=>T(t,X(e)+X(r)+(l?X(l):"")),X=t=>{if(!t)return T(E,"");let[e,r]=t;return 8===e?r[1]?T(E,r.map(I).join("")):X(r[0]):9===e?T(E,I(t)):I(t)},F=([t,e],r,l,n)=>1===r||2!==r&&("∑"===e||9===t&&("lim"===e||"max"===e||"min"===e||"sup"===e||"inf"===e))?l:n,H={1:([t,e,r])=>U("mi",e,r),2:([t,e])=>U("mn",e),3:([t,e,r])=>U("mo",e,r),9:([t,e])=>U("mi",e)+"<mo>⁡</mo>",8:([t,e])=>e.map(I).join(""),7:([t,e,r])=>W("mfrac",e,r),4:([t,e,r,l])=>W(F(e,l,"mover","msup"),e,r),5:([t,e,r,l])=>W(F(e,l,"munder","msub"),e,r),6:([t,e,r,l,n])=>W(F(e,n,"munderover","msubsup"),e,r,l),16:([t,e])=>U("mtext",e.replace(/ /g,"\xa0")),17:([t,e])=>'<mspace width="'+e+'"></mspace>',10:([t,e])=>T("msqrt",X(e)),11:([t,e,r])=>W("mroot",e,r),12:([t,e])=>T(E,e.map(I).join("")),13:([t,e])=>W("mover",e,[3,"\xaf"]),18:([t,e,r])=>{let l=G[e];return l?"<mrow"+l+">"+X(r)+"</mrow>":X(r)},19:([t,e])=>T("mphantom",X(e)),14:([t,e,r])=>{let l=T("mtable",r.map(t=>T("mtr",t.map(t=>{let e=t.map(I).join("");return T("mtd",t[1]?T(E,e):e)}).join(""))).join("")),n=D[e];return n?T(E,(n[0]?U("mo",n[0]):"")+l+(n[1]?U("mo",n[1]):"")):l},15:()=>'<mspace linebreak="newline"></mspace>'},I=t=>t?H[t[0]](t):"",J=(n,a)=>{let i=n.includes("\n")||n.includes("\r")?n.replace(/[\r\n]+/g," "):n;return'<math xmlns="http://www.w3.org/1998/Math/MathML"'+(a?' display="block"':"")+"><semantics><mrow>"+B((n=>{let a=[],i=n.length,o=0;for(;o<i&&!((o=l(n,o,i))>=i);){let s=n.charCodeAt(o);if(92===s){let t=o;if(++o<i)if(r(n.charCodeAt(o)))for(;++o<i&&r(n.charCodeAt(o)););else++o;let e=n.slice(t,o);if("\\text"===e){let t=l(n,o,i);if(123===n.charCodeAt(t)){let e=1,r=t+1,l=r;for(;l<i&&e;){let t=n.charCodeAt(l);123===t?++e:125===t&&--e,e&&++l}if(!e){a.push(4,"\\text",7,"{",2,n.slice(r,l),8,"}"),o=l+1;continue}}}a.push(4,e);continue}if(e(s)||46===s&&e(n.charCodeAt(o+1))){let t=o;if(46===s)o+=2;else{for(;++o<i&&e(n.charCodeAt(o)););46===n.charCodeAt(o)&&e(n.charCodeAt(o+1))&&(o+=2)}for(;o<i&&e(n.charCodeAt(o));)++o;a.push(1,n.slice(t,o));continue}if(r(s)){a.push(2,n[o]),++o;continue}let u=n[o];a.push(t[u]??3,u),++o}return a.push(0,""),a})(i),[0]).map(I).join("")+'</mrow><annotation encoding="application/x-tex">'+R(i)+"</annotation></semantics></math>"};export{J as default};
package/mathml.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mathml.js"],"sourcesContent":["//#region src/const/STYL.js\nvar STYLE_BOX = \" style=\\\"display:inline-block;border:1px solid;padding:2px 3px\\\"\";\nvar STYLE_CANCEL = \" style=\\\"display:inline-block;background:linear-gradient(to top right,transparent 47%,currentColor 47%,currentColor 53%,transparent 53%)\\\"\";\nvar STYLE_SOUT = \" style=\\\"display:inline-block;background:linear-gradient(transparent 47%,currentColor 47%,currentColor 53%,transparent 53%)\\\"\";\n//#endregion\n//#region src/lex.js\nvar MASK_WHITESPACE = 9728, CHAR_DOT = 46, CHAR_TOK = {\n\t_: 5,\n\t\"^\": 6,\n\t\"{\": 7,\n\t\"}\": 8,\n\t\"(\": 9,\n\t\")\": 10\n}, digit = (c) => c >= 48 && c <= 57, alpha = (c) => (c | 32) - 97 >>> 0 < 26, skip = (str, idx, len) => {\n\twhile (idx < len) {\n\t\tconst code = str.charCodeAt(idx);\n\t\tif (code <= 32 && (code === 32 || 1 << code & MASK_WHITESPACE)) ++idx;\n\t\telse break;\n\t}\n\treturn idx;\n};\nvar lex_default = (str) => {\n\tconst tokens = [], len = str.length;\n\tlet idx = 0;\n\twhile (idx < len) {\n\t\tidx = skip(str, idx, len);\n\t\tif (idx >= len) break;\n\t\tconst code = str.charCodeAt(idx);\n\t\tif (code === 92) {\n\t\t\tconst start = idx;\n\t\t\t++idx;\n\t\t\tif (idx < len) if (alpha(str.charCodeAt(idx))) while (++idx < len && alpha(str.charCodeAt(idx)));\n\t\t\telse ++idx;\n\t\t\tconst cmd = str.slice(start, idx);\n\t\t\tif (cmd === \"\\\\text\") {\n\t\t\t\tconst temp_idx = skip(str, idx, len);\n\t\t\t\tif (str.charCodeAt(temp_idx) === 123) {\n\t\t\t\t\tlet brace_count = 1, text_start = temp_idx + 1, text_idx = text_start;\n\t\t\t\t\twhile (text_idx < len && brace_count) {\n\t\t\t\t\t\tconst c_code = str.charCodeAt(text_idx);\n\t\t\t\t\t\tif (c_code === 123) ++brace_count;\n\t\t\t\t\t\telse if (c_code === 125) --brace_count;\n\t\t\t\t\t\tif (brace_count) ++text_idx;\n\t\t\t\t\t}\n\t\t\t\t\tif (!brace_count) {\n\t\t\t\t\t\ttokens.push(4, \"\\\\text\", 7, \"{\", 2, str.slice(text_start, text_idx), 8, \"}\");\n\t\t\t\t\t\tidx = text_idx + 1;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttokens.push(4, cmd);\n\t\t\tcontinue;\n\t\t}\n\t\tif (digit(code) || code === CHAR_DOT && digit(str.charCodeAt(idx + 1))) {\n\t\t\tconst start = idx;\n\t\t\tif (code === CHAR_DOT) idx += 2;\n\t\t\telse {\n\t\t\t\twhile (++idx < len && digit(str.charCodeAt(idx)));\n\t\t\t\tif (str.charCodeAt(idx) === CHAR_DOT && digit(str.charCodeAt(idx + 1))) idx += 2;\n\t\t\t}\n\t\t\twhile (idx < len && digit(str.charCodeAt(idx))) ++idx;\n\t\t\ttokens.push(1, str.slice(start, idx));\n\t\t\tcontinue;\n\t\t}\n\t\tif (alpha(code)) {\n\t\t\ttokens.push(2, str[idx]);\n\t\t\t++idx;\n\t\t\tcontinue;\n\t\t}\n\t\tconst char = str[idx];\n\t\ttokens.push(CHAR_TOK[char] ?? 3, char);\n\t\t++idx;\n\t}\n\ttokens.push(0, \"\");\n\treturn tokens;\n};\n//#endregion\n//#region src/const/ATTR.js\nvar FALSE = \" stretchy=\\\"false\\\"\", space = (l, r) => \" lspace=\\\"\" + l + \"px\\\" rspace=\\\"\" + r + \"px\\\"\";\nvar ATTR_NORMAL = \" mathvariant=\\\"normal\\\"\";\nvar ATTR_STRETCHY_FALSE = FALSE;\nvar ATTR_BAR = FALSE + space(0, 0);\nvar ATTR_BIN = space(4, 4);\nvar ATTR_REL = space(5, 5);\n//#endregion\n//#region src/const/ENV.js\nvar ENV_NAMES = new Set([\n\t\"matrix\",\n\t\"pmatrix\",\n\t\"bmatrix\",\n\t\"vmatrix\",\n\t\"Vmatrix\",\n\t\"cases\",\n\t\"array\"\n]);\n//#endregion\n//#region src/const/FUNC.js\nvar FUNC_NAMES = new Set([\n\t\"sin\",\n\t\"cos\",\n\t\"tan\",\n\t\"cot\",\n\t\"sec\",\n\t\"csc\",\n\t\"log\",\n\t\"lg\",\n\t\"ln\",\n\t\"lim\",\n\t\"exp\",\n\t\"max\",\n\t\"min\",\n\t\"sup\",\n\t\"inf\",\n\t\"det\",\n\t\"gcd\",\n\t\"arcsin\",\n\t\"arccos\",\n\t\"arctan\",\n\t\"sinh\",\n\t\"cosh\",\n\t\"tanh\",\n\t\"coth\",\n\t\"deg\",\n\t\"arg\"\n]);\n//#endregion\n//#region src/const/SYM.js\nvar LE = [3, \"≤\"], GE = [3, \"≥\"], NE = [\n\t3,\n\t\"≠\",\n\tATTR_NORMAL\n], RIGHT_ARROW = [3, \"→\"], LEFT_ARROW = [3, \"←\"], L_DOTS = [3, \"…\"];\nvar SYM_MAP = {\n\t__proto__: null,\n\talpha: [1, \"α\"],\n\tbeta: [1, \"β\"],\n\tgamma: [1, \"γ\"],\n\ttheta: [1, \"θ\"],\n\tpi: [1, \"π\"],\n\tinfty: [\n\t\t1,\n\t\t\"∞\",\n\t\tATTR_NORMAL\n\t],\n\tle: LE,\n\tleq: LE,\n\tge: GE,\n\tgeq: GE,\n\tneq: NE,\n\tne: NE,\n\tcdot: [3, \"⋅\"],\n\ttimes: [3, \"×\"],\n\tpm: [3, \"±\"],\n\tmp: [\n\t\t3,\n\t\t\"∓\",\n\t\tATTR_BIN\n\t],\n\tdiv: [3, \"÷\"],\n\tsum: [3, \"∑\"],\n\tint: [3, \"∫\"],\n\tto: RIGHT_ARROW,\n\trightarrow: RIGHT_ARROW,\n\tleftarrow: LEFT_ARROW,\n\tgets: LEFT_ARROW,\n\tleftrightarrow: [3, \"↔\"],\n\tLeftarrow: [3, \"⇐\"],\n\tRightarrow: [3, \"⇒\"],\n\tLeftrightarrow: [3, \"⇔\"],\n\tdots: L_DOTS,\n\tldots: L_DOTS,\n\tcdots: [3, \"⋯\"],\n\tDelta: [\n\t\t1,\n\t\t\"Δ\",\n\t\tATTR_NORMAL\n\t],\n\tGamma: [\n\t\t1,\n\t\t\"Γ\",\n\t\tATTR_NORMAL\n\t],\n\tTheta: [\n\t\t1,\n\t\t\"Θ\",\n\t\tATTR_NORMAL\n\t],\n\tLambda: [\n\t\t1,\n\t\t\"Λ\",\n\t\tATTR_NORMAL\n\t],\n\tXi: [\n\t\t1,\n\t\t\"Ξ\",\n\t\tATTR_NORMAL\n\t],\n\tPi: [\n\t\t1,\n\t\t\"Π\",\n\t\tATTR_NORMAL\n\t],\n\tSigma: [\n\t\t1,\n\t\t\"Σ\",\n\t\tATTR_NORMAL\n\t],\n\tUpsilon: [\n\t\t1,\n\t\t\"Υ\",\n\t\tATTR_NORMAL\n\t],\n\tPhi: [\n\t\t1,\n\t\t\"Φ\",\n\t\tATTR_NORMAL\n\t],\n\tPsi: [\n\t\t1,\n\t\t\"Ψ\",\n\t\tATTR_NORMAL\n\t],\n\tOmega: [\n\t\t1,\n\t\t\"Ω\",\n\t\tATTR_NORMAL\n\t],\n\tdelta: [1, \"δ\"],\n\tepsilon: [1, \"ϵ\"],\n\tzeta: [1, \"ζ\"],\n\teta: [1, \"η\"],\n\tiota: [1, \"ι\"],\n\tkappa: [1, \"κ\"],\n\tlambda: [1, \"λ\"],\n\tmu: [1, \"μ\"],\n\tnu: [1, \"ν\"],\n\txi: [1, \"ξ\"],\n\trho: [1, \"ρ\"],\n\tsigma: [1, \"σ\"],\n\ttau: [1, \"τ\"],\n\tupsilon: [1, \"υ\"],\n\tphi: [1, \"ϕ\"],\n\tchi: [1, \"χ\"],\n\tpsi: [1, \"ψ\"],\n\tomega: [1, \"ω\"],\n\tnabla: [\n\t\t1,\n\t\t\"∇\",\n\t\tATTR_NORMAL\n\t],\n\tpartial: [\n\t\t1,\n\t\t\"∂\",\n\t\tATTR_NORMAL\n\t],\n\tapprox: [\n\t\t3,\n\t\t\"≈\",\n\t\tATTR_REL\n\t],\n\tsim: [\n\t\t3,\n\t\t\"∼\",\n\t\tATTR_REL\n\t],\n\tcong: [\n\t\t3,\n\t\t\"≅\",\n\t\tATTR_REL\n\t],\n\tpropto: [\n\t\t3,\n\t\t\"∝\",\n\t\tATTR_REL\n\t],\n\tequiv: [\n\t\t3,\n\t\t\"≡\",\n\t\tATTR_REL\n\t],\n\tneg: [1, \"¬\"],\n\tlor: [\n\t\t3,\n\t\t\"∨\",\n\t\tATTR_BIN\n\t],\n\tland: [\n\t\t3,\n\t\t\"∧\",\n\t\tATTR_BIN\n\t],\n\tni: [\n\t\t3,\n\t\t\"∋\",\n\t\tATTR_REL\n\t],\n\tperp: [\n\t\t3,\n\t\t\"⟂\",\n\t\tATTR_REL\n\t],\n\tparallel: [\n\t\t3,\n\t\t\"∥\",\n\t\tATTR_REL\n\t],\n\tell: [1, \"ℓ\"],\n\thbar: [1, \"ℏ\"],\n\tforall: [\n\t\t1,\n\t\t\"∀\",\n\t\tATTR_NORMAL\n\t],\n\texists: [\n\t\t1,\n\t\t\"∃\",\n\t\tATTR_NORMAL\n\t],\n\tin: [3, \"∈\"],\n\tnotin: [3, \"∉\"],\n\tsubset: [3, \"⊂\"],\n\tsupset: [3, \"⊃\"],\n\tsubseteq: [3, \"⊆\"],\n\tsupseteq: [3, \"⊇\"],\n\tcup: [3, \"∪\"],\n\tcap: [3, \"∩\"],\n\temptyset: [\n\t\t1,\n\t\t\"∅\",\n\t\tATTR_NORMAL\n\t]\n};\n//#endregion\n//#region src/parse.js\nvar LIMITS_MAP = {\n\t\"\\\\limits\": 1,\n\t\"\\\\nolimits\": 2\n}, MENCLOSE_MAP = {\n\t__proto__: null,\n\tboxed: 1,\n\tcancel: 2,\n\tsout: 3\n}, SPACE_MAP = {\n\t__proto__: null,\n\tquad: \"16px\",\n\tqquad: \"32px\"\n}, CHAR_MAP = {\n\t\"-\": [3, \"−\"],\n\t\"*\": [3, \"∗\"],\n\t\"/\": [\n\t\t3,\n\t\t\"/\",\n\t\tATTR_NORMAL\n\t],\n\t\"(\": [\n\t\t3,\n\t\t\"(\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t\")\": [\n\t\t3,\n\t\t\")\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t\"[\": [\n\t\t3,\n\t\t\"[\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t\"]\": [\n\t\t3,\n\t\t\"]\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t\"|\": [\n\t\t3,\n\t\t\"|\",\n\t\tATTR_BAR\n\t],\n\t\".\": [\n\t\t3,\n\t\t\".\",\n\t\tATTR_NORMAL\n\t]\n}, DELIM_MAP = {\n\t__proto__: null,\n\t\"\\\\{\": \"{\",\n\t\"\\\\}\": \"}\",\n\t\"<\": \"⟨\",\n\t\">\": \"⟩\"\n}, ident = (val) => [1, val], num = (val) => [2, val], op = (val) => CHAR_MAP[val] ?? [3, val], lparen = () => CHAR_MAP[\"(\"], rparen = () => CHAR_MAP[\")\"], delim = (tokens, state_ref) => {\n\tconst idx = state_ref[0];\n\tif (tokens[idx] == null) return null;\n\tstate_ref[0] += 2;\n\tconst val = tokens[idx + 1];\n\tif (val === \".\") return [\n\t\t3,\n\t\t\"\",\n\t\t\" fence=\\\"true\\\" stretchy=\\\"true\\\" symmetric=\\\"true\\\"\"\n\t];\n\treturn [3, DELIM_MAP[val] ?? (val?.startsWith(\"\\\\\") ? val.slice(1) : val)];\n}, opt = (tokens, state_ref, check_num) => {\n\tif (tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"[\") {\n\t\tif (!check_num || tokens[state_ref[0] + 2] === 1) {\n\t\t\tstate_ref[0] += 2;\n\t\t\twhile (tokens[state_ref[0]] !== 0 && !(tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"]\")) state_ref[0] += 2;\n\t\t\tif (tokens[state_ref[0]] === 3) state_ref[0] += 2;\n\t\t}\n\t}\n}, brace = (tokens, state_ref) => {\n\tif (tokens[state_ref[0]] === 7) {\n\t\tstate_ref[0] += 2;\n\t\tlet str = \"\";\n\t\twhile (tokens[state_ref[0]] !== 0 && tokens[state_ref[0]] !== 8) {\n\t\t\tstr += tokens[state_ref[0] + 1];\n\t\t\tstate_ref[0] += 2;\n\t\t}\n\t\tif (tokens[state_ref[0]] === 8) state_ref[0] += 2;\n\t\treturn str;\n\t}\n\treturn \"\";\n}, rows = (tokens, state_ref, is_end_check, env_name) => {\n\tconst rows = [];\n\tlet current_row = [], current_cell = [];\n\twhile (state_ref[0] < tokens.length) {\n\t\tconst next_type = tokens[state_ref[0]], next_val = tokens[state_ref[0] + 1];\n\t\tif (next_type === 0) break;\n\t\tif (!is_end_check && next_type === 8) break;\n\t\tif (is_end_check && next_type === 4 && next_val === \"\\\\end\") {\n\t\t\tconst saved_idx = state_ref[0];\n\t\t\tstate_ref[0] += 2;\n\t\t\tif (brace(tokens, state_ref) === env_name) break;\n\t\t\tstate_ref[0] = saved_idx;\n\t\t}\n\t\tif (next_type === 3 && next_val === \"&\") {\n\t\t\tstate_ref[0] += 2;\n\t\t\tcurrent_row.push(current_cell);\n\t\t\tcurrent_cell = [];\n\t\t\tcontinue;\n\t\t}\n\t\tif (next_type === 4 && next_val === \"\\\\\\\\\") {\n\t\t\tstate_ref[0] += 2;\n\t\t\topt(tokens, state_ref, 1);\n\t\t\tcurrent_row.push(current_cell);\n\t\t\tcurrent_cell = [];\n\t\t\trows.push(current_row);\n\t\t\tcurrent_row = [];\n\t\t\tcontinue;\n\t\t}\n\t\tconst node = grab(tokens, state_ref);\n\t\tif (node) current_cell.push(node);\n\t}\n\tif (current_cell.length || current_row.length) {\n\t\tcurrent_row.push(current_cell);\n\t\trows.push(current_row);\n\t}\n\tif (rows.length) {\n\t\tconst last_row = rows[rows.length - 1];\n\t\tif (!last_row[1] && !last_row[0][0]) rows.pop();\n\t}\n\treturn rows;\n}, matrix = (tokens, state_ref, name) => {\n\tif (tokens[state_ref[0]] === 7) {\n\t\tstate_ref[0] += 2;\n\t\tconst matrix_rows = rows(tokens, state_ref, 0, name);\n\t\tif (tokens[state_ref[0]] === 8) state_ref[0] += 2;\n\t\treturn [\n\t\t\t14,\n\t\t\tname,\n\t\t\tmatrix_rows\n\t\t];\n\t}\n\tconst node = read(tokens, state_ref, 1);\n\treturn node ? [\n\t\t14,\n\t\tname,\n\t\t[[[node]]]\n\t] : null;\n}, txt = (tokens, state_ref) => {\n\tif (tokens[state_ref[0]] === 7) {\n\t\tconst text_val = brace(tokens, state_ref);\n\t\tif (text_val === \"\") return [8, []];\n\t\tconst parts = text_val.split(\"\\\\\\\\\");\n\t\tif (parts.length > 1) {\n\t\t\tconst nodes = [];\n\t\t\tparts.forEach((p, i) => {\n\t\t\t\tif (i > 0) nodes.push([15]);\n\t\t\t\tif (p) nodes.push([16, p]);\n\t\t\t});\n\t\t\treturn [8, nodes];\n\t\t}\n\t\treturn [16, text_val];\n\t}\n\tconst next_node = read(tokens, state_ref, 1);\n\tif (next_node) return [16, next_node[1]];\n\tthrow [3, \"text\"];\n}, parseBegin = (tokens, state_ref, val) => {\n\tif (tokens[state_ref[0]] === 7) {\n\t\tconst env_name = brace(tokens, state_ref);\n\t\tif (env_name === \"array\") {\n\t\t\topt(tokens, state_ref);\n\t\t\tif (tokens[state_ref[0]] === 7) brace(tokens, state_ref);\n\t\t\telse if (tokens[state_ref[0]] !== 0) state_ref[0] += 2;\n\t\t}\n\t\treturn [\n\t\t\t14,\n\t\t\tenv_name,\n\t\t\trows(tokens, state_ref, 1, env_name)\n\t\t];\n\t}\n\treturn [1, val];\n}, sqrt = (tokens, state_ref) => {\n\tif (tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"[\") {\n\t\tstate_ref[0] += 2;\n\t\tconst index_nodes = [];\n\t\twhile (tokens[state_ref[0]] !== 0 && !(tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"]\")) {\n\t\t\tconst node = grab(tokens, state_ref);\n\t\t\tif (node) index_nodes.push(node);\n\t\t}\n\t\tif (tokens[state_ref[0]] === 3) state_ref[0] += 2;\n\t\treturn [\n\t\t\t11,\n\t\t\tread(tokens, state_ref, 1),\n\t\t\t[8, index_nodes]\n\t\t];\n\t}\n\treturn [10, read(tokens, state_ref, 1)];\n}, fence = (tokens, state_ref) => {\n\tconst left_delim = delim(tokens, state_ref), body = parse(tokens, state_ref);\n\tif (tokens[state_ref[0]] === 4 && tokens[state_ref[0] + 1] === \"\\\\right\") {\n\t\tstate_ref[0] += 2;\n\t\treturn [12, [\n\t\t\tleft_delim,\n\t\t\t...body,\n\t\t\tdelim(tokens, state_ref)\n\t\t].filter(Boolean)];\n\t}\n\tthrow [1, left_delim];\n}, over = (tokens, state_ref) => [13, read(tokens, state_ref, 1)], frac = (tokens, state_ref) => [\n\t7,\n\tread(tokens, state_ref, 1),\n\tread(tokens, state_ref, 1)\n], phantom = (tokens, state_ref) => [19, read(tokens, state_ref, 1)], pmod = (tokens, state_ref) => [8, [\n\t[17, \"8px\"],\n\t[\n\t\t3,\n\t\t\"(\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t[16, \"mod\"],\n\t[17, \"4px\"],\n\tread(tokens, state_ref, 1),\n\t[\n\t\t3,\n\t\t\")\",\n\t\tATTR_STRETCHY_FALSE\n\t]\n]], CMD_MAP = {\n\t__proto__: null,\n\t\"\\\\\": (tokens, state_ref) => {\n\t\tif (tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"*\") state_ref[0] += 2;\n\t\topt(tokens, state_ref, 1);\n\t\treturn [15];\n\t},\n\ttext: txt,\n\tfrac,\n\toverline: over,\n\tbar: over,\n\tsqrt,\n\tleft: fence,\n\tphantom,\n\tpmod,\n\tbegin: parseBegin,\n\tend: (tokens, state_ref, val, name) => {\n\t\tthrow [0, name];\n\t},\n\tright: (tokens, state_ref, val, name) => {\n\t\tthrow [2, name];\n\t}\n}, TOK_MAP = {\n\t[2]: ident,\n\t[3]: op,\n\t[9]: lparen,\n\t[10]: rparen,\n\t[1]: num,\n\t[7]: (val, tokens, state_ref) => {\n\t\tconst res = [8, parse(tokens, state_ref)];\n\t\tif (tokens[state_ref[0]] === 8) state_ref[0] += 2;\n\t\treturn res;\n\t},\n\t[4]: (val, tokens, state_ref) => {\n\t\tconst name = val.slice(1), handler = CMD_MAP[name];\n\t\tif (handler) return handler(tokens, state_ref, val, name);\n\t\tif (ENV_NAMES.has(name)) return matrix(tokens, state_ref, name) ?? ident(val);\n\t\tconst space = SPACE_MAP[name];\n\t\tif (space) return [17, space];\n\t\tconst notation = MENCLOSE_MAP[name];\n\t\tif (notation) return [\n\t\t\t18,\n\t\t\tnotation,\n\t\t\tread(tokens, state_ref, 1)\n\t\t];\n\t\tif (FUNC_NAMES.has(name)) return [9, name];\n\t\treturn SYM_MAP[name] ?? ident(val);\n\t}\n}, read = (tokens, state_ref, split_num) => {\n\tconst idx = state_ref[0], type = tokens[idx];\n\tif (type == null) return null;\n\tstate_ref[0] += 2;\n\tlet val = tokens[idx + 1];\n\tif (split_num && type === 1 && val[1]) {\n\t\ttokens.splice(state_ref[0], 0, 1, val.slice(1));\n\t\tval = val[0];\n\t}\n\treturn TOK_MAP[type]?.(val, tokens, state_ref) ?? null;\n}, grab = (tokens, state_ref) => {\n\tconst base = read(tokens, state_ref);\n\tif (!base) return null;\n\tlet limits = 0;\n\tif (tokens[state_ref[0]] === 4) {\n\t\tconst limits_val = LIMITS_MAP[tokens[state_ref[0] + 1]];\n\t\tif (limits_val !== void 0) {\n\t\t\tlimits = limits_val;\n\t\t\tstate_ref[0] += 2;\n\t\t}\n\t}\n\tlet sub = null, sup = null, type;\n\twhile ((type = tokens[state_ref[0]]) != null) {\n\t\tif (type !== 5 && type !== 6) break;\n\t\tstate_ref[0] += 2;\n\t\tconst val = read(tokens, state_ref, 1);\n\t\tif (type === 5) sub = val;\n\t\telse sup = val;\n\t}\n\treturn sub && sup ? [\n\t\t6,\n\t\tbase,\n\t\tsub,\n\t\tsup,\n\t\tlimits\n\t] : sub ? [\n\t\t5,\n\t\tbase,\n\t\tsub,\n\t\tlimits\n\t] : sup ? [\n\t\t4,\n\t\tbase,\n\t\tsup,\n\t\tlimits\n\t] : base;\n}, parse = (tokens, state_ref) => {\n\tconst nodes = [];\n\tlet type;\n\twhile ((type = tokens[state_ref[0]]) != null) {\n\t\tif (type === 0 || type === 8) break;\n\t\tif (type === 4 && tokens[state_ref[0] + 1] === \"\\\\right\") break;\n\t\tconst node = grab(tokens, state_ref);\n\t\tif (node) nodes.push(node);\n\t}\n\treturn nodes;\n};\n//#endregion\n//#region src/mathml.js\nvar ENV_DELIMS = {\n\t__proto__: null,\n\tpmatrix: [\"(\", \")\"],\n\tbmatrix: [\"[\", \"]\"],\n\tvmatrix: [\"|\", \"|\"],\n\tVmatrix: [\"‖\", \"‖\"],\n\tcases: [\"{\", \"\"]\n}, MROW = \"mrow\", NOTATION_STYLE_MAP = {\n\t[1]: STYLE_BOX,\n\t[2]: STYLE_CANCEL,\n\t[3]: STYLE_SOUT\n}, ESC_MAP = {\n\t\"&\": \"&amp;\",\n\t\"<\": \"&lt;\",\n\t\">\": \"&gt;\",\n\t\"\\\"\": \"&quot;\"\n}, esc = (str) => /[&<>\"]/.test(str) ? str.replace(/[&<>\"]/g, (m) => ESC_MAP[m]) : str, wrap = (tag_name, inner, attr) => \"<\" + tag_name + (attr ?? \"\") + \">\" + inner + \"</\" + tag_name + \">\", tag = (name, val, attr) => wrap(name, esc(val), attr), nest = (name, n1, n2, n3) => wrap(name, row(n1) + row(n2) + (n3 ? row(n3) : \"\")), row = (n) => {\n\tif (!n) return wrap(MROW, \"\");\n\tconst [type, val] = n;\n\treturn type === 8 ? val[1] ? wrap(MROW, val.map(show).join(\"\")) : row(val[0]) : type === 9 ? wrap(MROW, show(n)) : show(n);\n}, scriptTag = ([type, val], limits, display, inline) => limits === 1 || limits !== 2 && (val === \"∑\" || type === 9 && (val === \"lim\" || val === \"max\" || val === \"min\" || val === \"sup\" || val === \"inf\")) ? display : inline, SHOW_MAP = {\n\t[1]: ([_, val, attr]) => tag(\"mi\", val, attr),\n\t[2]: ([_, val]) => tag(\"mn\", val),\n\t[3]: ([_, val, attr]) => tag(\"mo\", val, attr),\n\t[9]: ([_, val]) => tag(\"mi\", val) + \"<mo>⁡</mo>\",\n\t[8]: ([_, val]) => val.map(show).join(\"\"),\n\t[7]: ([_, n1, n2]) => nest(\"mfrac\", n1, n2),\n\t[4]: ([_, n1, n2, limits]) => nest(scriptTag(n1, limits, \"mover\", \"msup\"), n1, n2),\n\t[5]: ([_, n1, n2, limits]) => nest(scriptTag(n1, limits, \"munder\", \"msub\"), n1, n2),\n\t[6]: ([_, n1, n2, n3, limits]) => nest(scriptTag(n1, limits, \"munderover\", \"msubsup\"), n1, n2, n3),\n\t[16]: ([_, val]) => tag(\"mtext\", val.replace(/ /g, \"\\xA0\")),\n\t[17]: ([_, val]) => \"<mspace width=\\\"\" + val + \"\\\"></mspace>\",\n\t[10]: ([_, n1]) => wrap(\"msqrt\", row(n1)),\n\t[11]: ([_, n1, n2]) => nest(\"mroot\", n1, n2),\n\t[12]: ([_, val]) => wrap(MROW, val.map(show).join(\"\")),\n\t[13]: ([_, n1]) => nest(\"mover\", n1, [3, \"¯\"]),\n\t[18]: ([_, notation, n1]) => {\n\t\tconst style = NOTATION_STYLE_MAP[notation];\n\t\treturn style ? \"<mrow\" + style + \">\" + row(n1) + \"</mrow>\" : row(n1);\n\t},\n\t[19]: ([_, n1]) => wrap(\"mphantom\", row(n1)),\n\t[14]: ([_, env_name, rows_cells]) => {\n\t\tconst m_table = wrap(\"mtable\", rows_cells.map((row_cells) => wrap(\"mtr\", row_cells.map((cell_nodes) => {\n\t\t\tconst inner_html = cell_nodes.map(show).join(\"\");\n\t\t\treturn wrap(\"mtd\", cell_nodes[1] ? wrap(MROW, inner_html) : inner_html);\n\t\t}).join(\"\"))).join(\"\")), delims = ENV_DELIMS[env_name];\n\t\treturn delims ? wrap(MROW, (delims[0] ? tag(\"mo\", delims[0]) : \"\") + m_table + (delims[1] ? tag(\"mo\", delims[1]) : \"\")) : m_table;\n\t},\n\t[15]: () => \"<mspace linebreak=\\\"newline\\\"></mspace>\"\n}, show = (n) => n ? SHOW_MAP[n[0]](n) : \"\";\nvar mathml_default = (tex, block) => {\n\tconst clean = tex.includes(\"\\n\") || tex.includes(\"\\r\") ? tex.replace(/[\\r\\n]+/g, \" \") : tex;\n\treturn \"<math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\"\" + (block ? \" display=\\\"block\\\"\" : \"\") + \"><semantics><mrow>\" + parse(lex_default(clean), [0]).map(show).join(\"\") + \"</mrow><annotation encoding=\\\"application/x-tex\\\">\" + esc(clean) + \"</annotation></semantics></math>\";\n};\n//#endregion\nexport { mathml_default as default };\n"],"names":["CHAR_TOK","_","digit","c","alpha","skip","str","idx","len","code","charCodeAt","FALSE","space","l","r","ATTR_NORMAL","ATTR_BAR","ATTR_BIN","ATTR_REL","ENV_NAMES","Set","FUNC_NAMES","LE","GE","NE","RIGHT_ARROW","LEFT_ARROW","L_DOTS","SYM_MAP","__proto__","beta","gamma","theta","pi","infty","le","leq","ge","geq","neq","ne","cdot","times","pm","mp","div","sum","int","to","rightarrow","leftarrow","gets","leftrightarrow","Leftarrow","Rightarrow","Leftrightarrow","dots","ldots","cdots","Delta","Gamma","Theta","Lambda","Xi","Pi","Sigma","Upsilon","Phi","Psi","Omega","delta","epsilon","zeta","eta","iota","kappa","lambda","mu","nu","xi","rho","sigma","tau","upsilon","phi","chi","psi","omega","nabla","partial","approx","sim","cong","propto","equiv","neg","lor","land","ni","perp","parallel","ell","hbar","forall","exists","in","notin","subset","supset","subseteq","supseteq","cup","cap","emptyset","LIMITS_MAP","MENCLOSE_MAP","boxed","cancel","sout","SPACE_MAP","quad","qquad","CHAR_MAP","DELIM_MAP","ident","val","delim","tokens","state_ref","startsWith","slice","opt","check_num","brace","rows","is_end_check","env_name","current_row","current_cell","length","next_type","next_val","saved_idx","push","node","grab","last_row","pop","over","read","CMD_MAP","text","text_val","parts","split","nodes","forEach","p","i","next_node","frac","overline","bar","sqrt","index_nodes","left","left_delim","body","parse","filter","Boolean","phantom","pmod","begin","end","name","right","TOK_MAP","res","handler","has","matrix","matrix_rows","notation","split_num","type","splice","base","limits","limits_val","sub","sup","ENV_DELIMS","pmatrix","bmatrix","vmatrix","Vmatrix","cases","MROW","NOTATION_STYLE_MAP","ESC_MAP","esc","test","replace","m","wrap","tag_name","inner","attr","tag","nest","n1","n2","n3","row","n","map","show","join","scriptTag","display","inline","SHOW_MAP","style","rows_cells","m_table","row_cells","cell_nodes","inner_html","delims","mathml_default","tex","block","clean","includes","lex_default","start","cmd","temp_idx","brace_count","text_start","text_idx","c_code","char","default"],"mappings":"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"}
package/md.js ADDED
@@ -0,0 +1 @@
1
+ var e={_:5,"^":6,"{":7,"}":8,"(":9,")":10},t=e=>e>=48&&e<=57,r=e=>(32|e)-97>>>0<26,l=(e,t,r)=>{for(;t<r;){let r=e.charCodeAt(t);if(r<=32&&(32===r||1<<r&9728))++t;else break}return t},n=' stretchy="false"',i=(e,t)=>' lspace="'+e+'px" rspace="'+t+'px"',a=' mathvariant="normal"',o=n+i(0,0),s=i(4,4),u=i(5,5),p=new Set(["matrix","pmatrix","bmatrix","vmatrix","Vmatrix","cases","array"]),m=new Set(["sin","cos","tan","cot","sec","csc","log","lg","ln","lim","exp","max","min","sup","inf","det","gcd","arcsin","arccos","arctan","sinh","cosh","tanh","coth","deg","arg"]),c=[3,"≤"],h=[3,"≥"],f=[3,"≠",a],d=[3,"→"],g=[3,"←"],x=[3,"…"],b={__proto__:null,alpha:[1,"α"],beta:[1,"β"],gamma:[1,"γ"],theta:[1,"θ"],pi:[1,"π"],infty:[1,"∞",a],le:c,leq:c,ge:h,geq:h,neq:f,ne:f,cdot:[3,"⋅"],times:[3,"\xd7"],pm:[3,"\xb1"],mp:[3,"∓",s],div:[3,"\xf7"],sum:[3,"∑"],int:[3,"∫"],to:d,rightarrow:d,leftarrow:g,gets:g,leftrightarrow:[3,"↔"],Leftarrow:[3,"⇐"],Rightarrow:[3,"⇒"],Leftrightarrow:[3,"⇔"],dots:x,ldots:x,cdots:[3,"⋯"],Delta:[1,"Δ",a],Gamma:[1,"Γ",a],Theta:[1,"Θ",a],Lambda:[1,"Λ",a],Xi:[1,"Ξ",a],Pi:[1,"Π",a],Sigma:[1,"Σ",a],Upsilon:[1,"Υ",a],Phi:[1,"Φ",a],Psi:[1,"Ψ",a],Omega:[1,"Ω",a],delta:[1,"δ"],epsilon:[1,"ϵ"],zeta:[1,"ζ"],eta:[1,"η"],iota:[1,"ι"],kappa:[1,"κ"],lambda:[1,"λ"],mu:[1,"μ"],nu:[1,"ν"],xi:[1,"ξ"],rho:[1,"ρ"],sigma:[1,"σ"],tau:[1,"τ"],upsilon:[1,"υ"],phi:[1,"ϕ"],chi:[1,"χ"],psi:[1,"ψ"],omega:[1,"ω"],nabla:[1,"∇",a],partial:[1,"∂",a],approx:[3,"≈",u],sim:[3,"∼",u],cong:[3,"≅",u],propto:[3,"∝",u],equiv:[3,"≡",u],neg:[1,"\xac"],lor:[3,"∨",s],land:[3,"∧",s],ni:[3,"∋",u],perp:[3,"⟂",u],parallel:[3,"∥",u],ell:[1,"ℓ"],hbar:[1,"ℏ"],forall:[1,"∀",a],exists:[1,"∃",a],in:[3,"∈"],notin:[3,"∉"],subset:[3,"⊂"],supset:[3,"⊃"],subseteq:[3,"⊆"],supseteq:[3,"⊇"],cup:[3,"∪"],cap:[3,"∩"],emptyset:[1,"∅",a]},_={"\\limits":1,"\\nolimits":2},w={__proto__:null,boxed:1,cancel:2,sout:3},y={__proto__:null,quad:"16px",qquad:"32px"},C={"-":[3,"−"],"*":[3,"∗"],"/":[3,"/",a],"(":[3,"(",n],")":[3,")",n],"[":[3,"[",n],"]":[3,"]",n],"|":[3,"|",o],".":[3,".",a]},k={__proto__:null,"\\{":"{","\\}":"}","<":"⟨",">":"⟩"},q=e=>[1,e],$=(e,t)=>{let r=t[0];if(null==e[r])return null;t[0]+=2;let l=e[r+1];return"."===l?[3,"",' fence="true" stretchy="true" symmetric="true"']:[3,k[l]??(l?.startsWith("\\")?l.slice(1):l)]},v=(e,t,r)=>{if(3===e[t[0]]&&"["===e[t[0]+1]&&(!r||1===e[t[0]+2])){for(t[0]+=2;0!==e[t[0]]&&(3!==e[t[0]]||"]"!==e[t[0]+1]);)t[0]+=2;3===e[t[0]]&&(t[0]+=2)}},A=(e,t)=>{if(7===e[t[0]]){t[0]+=2;let r="";for(;0!==e[t[0]]&&8!==e[t[0]];)r+=e[t[0]+1],t[0]+=2;return 8===e[t[0]]&&(t[0]+=2),r}return""},j=(e,t,r,l)=>{let n=[],i=[],a=[];for(;t[0]<e.length;){let o=e[t[0]],s=e[t[0]+1];if(0===o||!r&&8===o)break;if(r&&4===o&&"\\end"===s){let r=t[0];if(t[0]+=2,A(e,t)===l)break;t[0]=r}if(3===o&&"&"===s){t[0]+=2,i.push(a),a=[];continue}if(4===o&&"\\\\"===s){t[0]+=2,v(e,t,1),i.push(a),a=[],n.push(i),i=[];continue}let u=O(e,t);u&&a.push(u)}if((a.length||i.length)&&(i.push(a),n.push(i)),n.length){let e=n[n.length-1];e[1]||e[0][0]||n.pop()}return n},L=(e,t)=>[13,S(e,t,1)],M={__proto__:null,"\\":(e,t)=>(3===e[t[0]]&&"*"===e[t[0]+1]&&(t[0]+=2),v(e,t,1),[15]),text:(e,t)=>{if(7===e[t[0]]){let r=A(e,t);if(""===r)return[8,[]];let l=r.split("\\\\");if(l.length>1){let e=[];return l.forEach((t,r)=>{r>0&&e.push([15]),t&&e.push([16,t])}),[8,e]}return[16,r]}let r=S(e,t,1);if(r)return[16,r[1]];throw[3,"text"]},frac:(e,t)=>[7,S(e,t,1),S(e,t,1)],overline:L,bar:L,sqrt:(e,t)=>{if(3===e[t[0]]&&"["===e[t[0]+1]){t[0]+=2;let r=[];for(;0!==e[t[0]]&&(3!==e[t[0]]||"]"!==e[t[0]+1]);){let l=O(e,t);l&&r.push(l)}return 3===e[t[0]]&&(t[0]+=2),[11,S(e,t,1),[8,r]]}return[10,S(e,t,1)]},left:(e,t)=>{let r=$(e,t),l=V(e,t);if(4===e[t[0]]&&"\\right"===e[t[0]+1])return t[0]+=2,[12,[r,...l,$(e,t)].filter(Boolean)];throw[1,r]},phantom:(e,t)=>[19,S(e,t,1)],pmod:(e,t)=>[8,[[17,"8px"],[3,"(",n],[16,"mod"],[17,"4px"],S(e,t,1),[3,")",n]]],begin:(e,t,r)=>{if(7===e[t[0]]){let r=A(e,t);return"array"===r&&(v(e,t),7===e[t[0]]?A(e,t):0!==e[t[0]]&&(t[0]+=2)),[14,r,j(e,t,1,r)]}return[1,r]},end:(e,t,r,l)=>{throw[0,l]},right:(e,t,r,l)=>{throw[2,l]}},P={2:q,3:e=>C[e]??[3,e],9:()=>C["("],10:()=>C[")"],1:e=>[2,e],7:(e,t,r)=>{let l=[8,V(t,r)];return 8===t[r[0]]&&(r[0]+=2),l},4:(e,t,r)=>{let l=e.slice(1),n=M[l];if(n)return n(t,r,e,l);if(p.has(l))return((e,t,r)=>{if(7===e[t[0]]){t[0]+=2;let l=j(e,t,0,r);return 8===e[t[0]]&&(t[0]+=2),[14,r,l]}let l=S(e,t,1);return l?[14,r,[[[l]]]]:null})(t,r,l)??q(e);let i=y[l];if(i)return[17,i];let a=w[l];return a?[18,a,S(t,r,1)]:m.has(l)?[9,l]:b[l]??q(e)}},S=(e,t,r)=>{let l=t[0],n=e[l];if(null==n)return null;t[0]+=2;let i=e[l+1];return r&&1===n&&i[1]&&(e.splice(t[0],0,1,i.slice(1)),i=i[0]),P[n]?.(i,e,t)??null},O=(e,t)=>{let r=S(e,t);if(!r)return null;let l=0;if(4===e[t[0]]){let r=_[e[t[0]+1]];void 0!==r&&(l=r,t[0]+=2)}let n=null,i=null,a;for(;null!=(a=e[t[0]])&&(5===a||6===a);){t[0]+=2;let r=S(e,t,1);5===a?n=r:i=r}return n&&i?[6,r,n,i,l]:n?[5,r,n,l]:i?[4,r,i,l]:r},V=(e,t)=>{let r,l=[];for(;null!=(r=e[t[0]])&&0!==r&&8!==r&&(4!==r||"\\right"!==e[t[0]+1]);){let r=O(e,t);r&&l.push(r)}return l},z={__proto__:null,pmatrix:["(",")"],bmatrix:["[","]"],vmatrix:["|","|"],Vmatrix:["‖","‖"],cases:["{",""]},B="mrow",D={1:' style="display:inline-block;border:1px solid;padding:2px 3px"',2:' style="display:inline-block;background:linear-gradient(to top right,transparent 47%,currentColor 47%,currentColor 53%,transparent 53%)"',3:' style="display:inline-block;background:linear-gradient(transparent 47%,currentColor 47%,currentColor 53%,transparent 53%)"'},E={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"},G=e=>/[&<>"]/.test(e)?e.replace(/[&<>"]/g,e=>E[e]):e,R=(e,t,r)=>"<"+e+(r??"")+">"+t+"</"+e+">",T=(e,t,r)=>R(e,G(t),r),U=(e,t,r,l)=>R(e,W(t)+W(r)+(l?W(l):"")),W=e=>{if(!e)return R(B,"");let[t,r]=e;return 8===t?r[1]?R(B,r.map(H).join("")):W(r[0]):9===t?R(B,H(e)):H(e)},X=([e,t],r,l,n)=>1===r||2!==r&&("∑"===t||9===e&&("lim"===t||"max"===t||"min"===t||"sup"===t||"inf"===t))?l:n,F={1:([e,t,r])=>T("mi",t,r),2:([e,t])=>T("mn",t),3:([e,t,r])=>T("mo",t,r),9:([e,t])=>T("mi",t)+"<mo>⁡</mo>",8:([e,t])=>t.map(H).join(""),7:([e,t,r])=>U("mfrac",t,r),4:([e,t,r,l])=>U(X(t,l,"mover","msup"),t,r),5:([e,t,r,l])=>U(X(t,l,"munder","msub"),t,r),6:([e,t,r,l,n])=>U(X(t,n,"munderover","msubsup"),t,r,l),16:([e,t])=>T("mtext",t.replace(/ /g,"\xa0")),17:([e,t])=>'<mspace width="'+t+'"></mspace>',10:([e,t])=>R("msqrt",W(t)),11:([e,t,r])=>U("mroot",t,r),12:([e,t])=>R(B,t.map(H).join("")),13:([e,t])=>U("mover",t,[3,"\xaf"]),18:([e,t,r])=>{let l=D[t];return l?"<mrow"+l+">"+W(r)+"</mrow>":W(r)},19:([e,t])=>R("mphantom",W(t)),14:([e,t,r])=>{let l=R("mtable",r.map(e=>R("mtr",e.map(e=>{let t=e.map(H).join("");return R("mtd",e[1]?R(B,t):t)}).join(""))).join("")),n=z[t];return n?R(B,(n[0]?T("mo",n[0]):"")+l+(n[1]?T("mo",n[1]):"")):l},15:()=>'<mspace linebreak="newline"></mspace>'},H=e=>e?F[e[0]](e):"",I=(n,i)=>{let a=n.includes("\n")||n.includes("\r")?n.replace(/[\r\n]+/g," "):n;return'<math xmlns="http://www.w3.org/1998/Math/MathML"'+(i?' display="block"':"")+"><semantics><mrow>"+V((n=>{let i=[],a=n.length,o=0;for(;o<a&&!((o=l(n,o,a))>=a);){let s=n.charCodeAt(o);if(92===s){let e=o;if(++o<a)if(r(n.charCodeAt(o)))for(;++o<a&&r(n.charCodeAt(o)););else++o;let t=n.slice(e,o);if("\\text"===t){let e=l(n,o,a);if(123===n.charCodeAt(e)){let t=1,r=e+1,l=r;for(;l<a&&t;){let e=n.charCodeAt(l);123===e?++t:125===e&&--t,t&&++l}if(!t){i.push(4,"\\text",7,"{",2,n.slice(r,l),8,"}"),o=l+1;continue}}}i.push(4,t);continue}if(t(s)||46===s&&t(n.charCodeAt(o+1))){let e=o;if(46===s)o+=2;else{for(;++o<a&&t(n.charCodeAt(o)););46===n.charCodeAt(o)&&t(n.charCodeAt(o+1))&&(o+=2)}for(;o<a&&t(n.charCodeAt(o));)++o;i.push(1,n.slice(e,o));continue}if(r(s)){i.push(2,n[o]),++o;continue}let u=n[o];i.push(e[u]??3,u),++o}return i.push(0,""),i})(a),[0]).map(H).join("")+'</mrow><annotation encoding="application/x-tex">'+G(a)+"</annotation></semantics></math>"},J=(e,t,r)=>{let l=e.length;for(let n=t;n<l;++n){let t=e[n];if("\\"===t||"$"===t||r&&"`"===t)return n}return -1},K=e=>{let t="",r=0,l=0,n=0,i=e.length;for(;r<i;)if(0===l){let i=J(e,r,1);if(-1===i){t+=e.slice(r);break}t+=e.slice(r,i);let a=e[i];if("\\"===a){let l="$"===e[i+1];t+=l?"$":"\\",r=i+(l?2:1)}else if("$"===a){let t="$"===e[i+1];l=t?4:3,n=r=i+(t?2:1)}else{let n="`"===e[i+1]&&"`"===e[i+2];t+=n?"```":"`",l=n?2:1,r=i+(n?3:1)}}else if(l>=3){let a=J(e,r,0);if(-1===a){r=i;break}if("\\"===e[a])r=a+(e[a+1]?2:1);else{let i=3===l;if(i||"$"===e[a+1]){let o=e.slice(n,a),s=i?"$":"$$";try{t+=I(o,!i)}catch{t+=s+o+s}l=0,r=a+(i?1:2)}else r=a+1}}else{let n=1===l?"`":"```",i=e.indexOf(n,r);if(-1===i){t+=e.slice(r);break}t+=e.slice(r,i)+n,l=0,r=i+n.length}return l>=3?t+(3===l?"$":"$$")+e.slice(n):t};export{K as default};
package/md.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/md.js"],"sourcesContent":["//#region src/const/STYL.js\nvar STYLE_BOX = \" style=\\\"display:inline-block;border:1px solid;padding:2px 3px\\\"\";\nvar STYLE_CANCEL = \" style=\\\"display:inline-block;background:linear-gradient(to top right,transparent 47%,currentColor 47%,currentColor 53%,transparent 53%)\\\"\";\nvar STYLE_SOUT = \" style=\\\"display:inline-block;background:linear-gradient(transparent 47%,currentColor 47%,currentColor 53%,transparent 53%)\\\"\";\n//#endregion\n//#region src/lex.js\nvar MASK_WHITESPACE = 9728, CHAR_DOT = 46, CHAR_TOK = {\n\t_: 5,\n\t\"^\": 6,\n\t\"{\": 7,\n\t\"}\": 8,\n\t\"(\": 9,\n\t\")\": 10\n}, digit = (c) => c >= 48 && c <= 57, alpha = (c) => (c | 32) - 97 >>> 0 < 26, skip = (str, idx, len) => {\n\twhile (idx < len) {\n\t\tconst code = str.charCodeAt(idx);\n\t\tif (code <= 32 && (code === 32 || 1 << code & MASK_WHITESPACE)) ++idx;\n\t\telse break;\n\t}\n\treturn idx;\n};\nvar lex_default = (str) => {\n\tconst tokens = [], len = str.length;\n\tlet idx = 0;\n\twhile (idx < len) {\n\t\tidx = skip(str, idx, len);\n\t\tif (idx >= len) break;\n\t\tconst code = str.charCodeAt(idx);\n\t\tif (code === 92) {\n\t\t\tconst start = idx;\n\t\t\t++idx;\n\t\t\tif (idx < len) if (alpha(str.charCodeAt(idx))) while (++idx < len && alpha(str.charCodeAt(idx)));\n\t\t\telse ++idx;\n\t\t\tconst cmd = str.slice(start, idx);\n\t\t\tif (cmd === \"\\\\text\") {\n\t\t\t\tconst temp_idx = skip(str, idx, len);\n\t\t\t\tif (str.charCodeAt(temp_idx) === 123) {\n\t\t\t\t\tlet brace_count = 1, text_start = temp_idx + 1, text_idx = text_start;\n\t\t\t\t\twhile (text_idx < len && brace_count) {\n\t\t\t\t\t\tconst c_code = str.charCodeAt(text_idx);\n\t\t\t\t\t\tif (c_code === 123) ++brace_count;\n\t\t\t\t\t\telse if (c_code === 125) --brace_count;\n\t\t\t\t\t\tif (brace_count) ++text_idx;\n\t\t\t\t\t}\n\t\t\t\t\tif (!brace_count) {\n\t\t\t\t\t\ttokens.push(4, \"\\\\text\", 7, \"{\", 2, str.slice(text_start, text_idx), 8, \"}\");\n\t\t\t\t\t\tidx = text_idx + 1;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\ttokens.push(4, cmd);\n\t\t\tcontinue;\n\t\t}\n\t\tif (digit(code) || code === CHAR_DOT && digit(str.charCodeAt(idx + 1))) {\n\t\t\tconst start = idx;\n\t\t\tif (code === CHAR_DOT) idx += 2;\n\t\t\telse {\n\t\t\t\twhile (++idx < len && digit(str.charCodeAt(idx)));\n\t\t\t\tif (str.charCodeAt(idx) === CHAR_DOT && digit(str.charCodeAt(idx + 1))) idx += 2;\n\t\t\t}\n\t\t\twhile (idx < len && digit(str.charCodeAt(idx))) ++idx;\n\t\t\ttokens.push(1, str.slice(start, idx));\n\t\t\tcontinue;\n\t\t}\n\t\tif (alpha(code)) {\n\t\t\ttokens.push(2, str[idx]);\n\t\t\t++idx;\n\t\t\tcontinue;\n\t\t}\n\t\tconst char = str[idx];\n\t\ttokens.push(CHAR_TOK[char] ?? 3, char);\n\t\t++idx;\n\t}\n\ttokens.push(0, \"\");\n\treturn tokens;\n};\n//#endregion\n//#region src/const/ATTR.js\nvar FALSE = \" stretchy=\\\"false\\\"\", space = (l, r) => \" lspace=\\\"\" + l + \"px\\\" rspace=\\\"\" + r + \"px\\\"\";\nvar ATTR_NORMAL = \" mathvariant=\\\"normal\\\"\";\nvar ATTR_STRETCHY_FALSE = FALSE;\nvar ATTR_BAR = FALSE + space(0, 0);\nvar ATTR_BIN = space(4, 4);\nvar ATTR_REL = space(5, 5);\n//#endregion\n//#region src/const/ENV.js\nvar ENV_NAMES = new Set([\n\t\"matrix\",\n\t\"pmatrix\",\n\t\"bmatrix\",\n\t\"vmatrix\",\n\t\"Vmatrix\",\n\t\"cases\",\n\t\"array\"\n]);\n//#endregion\n//#region src/const/FUNC.js\nvar FUNC_NAMES = new Set([\n\t\"sin\",\n\t\"cos\",\n\t\"tan\",\n\t\"cot\",\n\t\"sec\",\n\t\"csc\",\n\t\"log\",\n\t\"lg\",\n\t\"ln\",\n\t\"lim\",\n\t\"exp\",\n\t\"max\",\n\t\"min\",\n\t\"sup\",\n\t\"inf\",\n\t\"det\",\n\t\"gcd\",\n\t\"arcsin\",\n\t\"arccos\",\n\t\"arctan\",\n\t\"sinh\",\n\t\"cosh\",\n\t\"tanh\",\n\t\"coth\",\n\t\"deg\",\n\t\"arg\"\n]);\n//#endregion\n//#region src/const/SYM.js\nvar LE = [3, \"≤\"], GE = [3, \"≥\"], NE = [\n\t3,\n\t\"≠\",\n\tATTR_NORMAL\n], RIGHT_ARROW = [3, \"→\"], LEFT_ARROW = [3, \"←\"], L_DOTS = [3, \"…\"];\nvar SYM_MAP = {\n\t__proto__: null,\n\talpha: [1, \"α\"],\n\tbeta: [1, \"β\"],\n\tgamma: [1, \"γ\"],\n\ttheta: [1, \"θ\"],\n\tpi: [1, \"π\"],\n\tinfty: [\n\t\t1,\n\t\t\"∞\",\n\t\tATTR_NORMAL\n\t],\n\tle: LE,\n\tleq: LE,\n\tge: GE,\n\tgeq: GE,\n\tneq: NE,\n\tne: NE,\n\tcdot: [3, \"⋅\"],\n\ttimes: [3, \"×\"],\n\tpm: [3, \"±\"],\n\tmp: [\n\t\t3,\n\t\t\"∓\",\n\t\tATTR_BIN\n\t],\n\tdiv: [3, \"÷\"],\n\tsum: [3, \"∑\"],\n\tint: [3, \"∫\"],\n\tto: RIGHT_ARROW,\n\trightarrow: RIGHT_ARROW,\n\tleftarrow: LEFT_ARROW,\n\tgets: LEFT_ARROW,\n\tleftrightarrow: [3, \"↔\"],\n\tLeftarrow: [3, \"⇐\"],\n\tRightarrow: [3, \"⇒\"],\n\tLeftrightarrow: [3, \"⇔\"],\n\tdots: L_DOTS,\n\tldots: L_DOTS,\n\tcdots: [3, \"⋯\"],\n\tDelta: [\n\t\t1,\n\t\t\"Δ\",\n\t\tATTR_NORMAL\n\t],\n\tGamma: [\n\t\t1,\n\t\t\"Γ\",\n\t\tATTR_NORMAL\n\t],\n\tTheta: [\n\t\t1,\n\t\t\"Θ\",\n\t\tATTR_NORMAL\n\t],\n\tLambda: [\n\t\t1,\n\t\t\"Λ\",\n\t\tATTR_NORMAL\n\t],\n\tXi: [\n\t\t1,\n\t\t\"Ξ\",\n\t\tATTR_NORMAL\n\t],\n\tPi: [\n\t\t1,\n\t\t\"Π\",\n\t\tATTR_NORMAL\n\t],\n\tSigma: [\n\t\t1,\n\t\t\"Σ\",\n\t\tATTR_NORMAL\n\t],\n\tUpsilon: [\n\t\t1,\n\t\t\"Υ\",\n\t\tATTR_NORMAL\n\t],\n\tPhi: [\n\t\t1,\n\t\t\"Φ\",\n\t\tATTR_NORMAL\n\t],\n\tPsi: [\n\t\t1,\n\t\t\"Ψ\",\n\t\tATTR_NORMAL\n\t],\n\tOmega: [\n\t\t1,\n\t\t\"Ω\",\n\t\tATTR_NORMAL\n\t],\n\tdelta: [1, \"δ\"],\n\tepsilon: [1, \"ϵ\"],\n\tzeta: [1, \"ζ\"],\n\teta: [1, \"η\"],\n\tiota: [1, \"ι\"],\n\tkappa: [1, \"κ\"],\n\tlambda: [1, \"λ\"],\n\tmu: [1, \"μ\"],\n\tnu: [1, \"ν\"],\n\txi: [1, \"ξ\"],\n\trho: [1, \"ρ\"],\n\tsigma: [1, \"σ\"],\n\ttau: [1, \"τ\"],\n\tupsilon: [1, \"υ\"],\n\tphi: [1, \"ϕ\"],\n\tchi: [1, \"χ\"],\n\tpsi: [1, \"ψ\"],\n\tomega: [1, \"ω\"],\n\tnabla: [\n\t\t1,\n\t\t\"∇\",\n\t\tATTR_NORMAL\n\t],\n\tpartial: [\n\t\t1,\n\t\t\"∂\",\n\t\tATTR_NORMAL\n\t],\n\tapprox: [\n\t\t3,\n\t\t\"≈\",\n\t\tATTR_REL\n\t],\n\tsim: [\n\t\t3,\n\t\t\"∼\",\n\t\tATTR_REL\n\t],\n\tcong: [\n\t\t3,\n\t\t\"≅\",\n\t\tATTR_REL\n\t],\n\tpropto: [\n\t\t3,\n\t\t\"∝\",\n\t\tATTR_REL\n\t],\n\tequiv: [\n\t\t3,\n\t\t\"≡\",\n\t\tATTR_REL\n\t],\n\tneg: [1, \"¬\"],\n\tlor: [\n\t\t3,\n\t\t\"∨\",\n\t\tATTR_BIN\n\t],\n\tland: [\n\t\t3,\n\t\t\"∧\",\n\t\tATTR_BIN\n\t],\n\tni: [\n\t\t3,\n\t\t\"∋\",\n\t\tATTR_REL\n\t],\n\tperp: [\n\t\t3,\n\t\t\"⟂\",\n\t\tATTR_REL\n\t],\n\tparallel: [\n\t\t3,\n\t\t\"∥\",\n\t\tATTR_REL\n\t],\n\tell: [1, \"ℓ\"],\n\thbar: [1, \"ℏ\"],\n\tforall: [\n\t\t1,\n\t\t\"∀\",\n\t\tATTR_NORMAL\n\t],\n\texists: [\n\t\t1,\n\t\t\"∃\",\n\t\tATTR_NORMAL\n\t],\n\tin: [3, \"∈\"],\n\tnotin: [3, \"∉\"],\n\tsubset: [3, \"⊂\"],\n\tsupset: [3, \"⊃\"],\n\tsubseteq: [3, \"⊆\"],\n\tsupseteq: [3, \"⊇\"],\n\tcup: [3, \"∪\"],\n\tcap: [3, \"∩\"],\n\temptyset: [\n\t\t1,\n\t\t\"∅\",\n\t\tATTR_NORMAL\n\t]\n};\n//#endregion\n//#region src/parse.js\nvar LIMITS_MAP = {\n\t\"\\\\limits\": 1,\n\t\"\\\\nolimits\": 2\n}, MENCLOSE_MAP = {\n\t__proto__: null,\n\tboxed: 1,\n\tcancel: 2,\n\tsout: 3\n}, SPACE_MAP = {\n\t__proto__: null,\n\tquad: \"16px\",\n\tqquad: \"32px\"\n}, CHAR_MAP = {\n\t\"-\": [3, \"−\"],\n\t\"*\": [3, \"∗\"],\n\t\"/\": [\n\t\t3,\n\t\t\"/\",\n\t\tATTR_NORMAL\n\t],\n\t\"(\": [\n\t\t3,\n\t\t\"(\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t\")\": [\n\t\t3,\n\t\t\")\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t\"[\": [\n\t\t3,\n\t\t\"[\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t\"]\": [\n\t\t3,\n\t\t\"]\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t\"|\": [\n\t\t3,\n\t\t\"|\",\n\t\tATTR_BAR\n\t],\n\t\".\": [\n\t\t3,\n\t\t\".\",\n\t\tATTR_NORMAL\n\t]\n}, DELIM_MAP = {\n\t__proto__: null,\n\t\"\\\\{\": \"{\",\n\t\"\\\\}\": \"}\",\n\t\"<\": \"⟨\",\n\t\">\": \"⟩\"\n}, ident = (val) => [1, val], num = (val) => [2, val], op = (val) => CHAR_MAP[val] ?? [3, val], lparen = () => CHAR_MAP[\"(\"], rparen = () => CHAR_MAP[\")\"], delim = (tokens, state_ref) => {\n\tconst idx = state_ref[0];\n\tif (tokens[idx] == null) return null;\n\tstate_ref[0] += 2;\n\tconst val = tokens[idx + 1];\n\tif (val === \".\") return [\n\t\t3,\n\t\t\"\",\n\t\t\" fence=\\\"true\\\" stretchy=\\\"true\\\" symmetric=\\\"true\\\"\"\n\t];\n\treturn [3, DELIM_MAP[val] ?? (val?.startsWith(\"\\\\\") ? val.slice(1) : val)];\n}, opt = (tokens, state_ref, check_num) => {\n\tif (tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"[\") {\n\t\tif (!check_num || tokens[state_ref[0] + 2] === 1) {\n\t\t\tstate_ref[0] += 2;\n\t\t\twhile (tokens[state_ref[0]] !== 0 && !(tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"]\")) state_ref[0] += 2;\n\t\t\tif (tokens[state_ref[0]] === 3) state_ref[0] += 2;\n\t\t}\n\t}\n}, brace = (tokens, state_ref) => {\n\tif (tokens[state_ref[0]] === 7) {\n\t\tstate_ref[0] += 2;\n\t\tlet str = \"\";\n\t\twhile (tokens[state_ref[0]] !== 0 && tokens[state_ref[0]] !== 8) {\n\t\t\tstr += tokens[state_ref[0] + 1];\n\t\t\tstate_ref[0] += 2;\n\t\t}\n\t\tif (tokens[state_ref[0]] === 8) state_ref[0] += 2;\n\t\treturn str;\n\t}\n\treturn \"\";\n}, rows = (tokens, state_ref, is_end_check, env_name) => {\n\tconst rows = [];\n\tlet current_row = [], current_cell = [];\n\twhile (state_ref[0] < tokens.length) {\n\t\tconst next_type = tokens[state_ref[0]], next_val = tokens[state_ref[0] + 1];\n\t\tif (next_type === 0) break;\n\t\tif (!is_end_check && next_type === 8) break;\n\t\tif (is_end_check && next_type === 4 && next_val === \"\\\\end\") {\n\t\t\tconst saved_idx = state_ref[0];\n\t\t\tstate_ref[0] += 2;\n\t\t\tif (brace(tokens, state_ref) === env_name) break;\n\t\t\tstate_ref[0] = saved_idx;\n\t\t}\n\t\tif (next_type === 3 && next_val === \"&\") {\n\t\t\tstate_ref[0] += 2;\n\t\t\tcurrent_row.push(current_cell);\n\t\t\tcurrent_cell = [];\n\t\t\tcontinue;\n\t\t}\n\t\tif (next_type === 4 && next_val === \"\\\\\\\\\") {\n\t\t\tstate_ref[0] += 2;\n\t\t\topt(tokens, state_ref, 1);\n\t\t\tcurrent_row.push(current_cell);\n\t\t\tcurrent_cell = [];\n\t\t\trows.push(current_row);\n\t\t\tcurrent_row = [];\n\t\t\tcontinue;\n\t\t}\n\t\tconst node = grab(tokens, state_ref);\n\t\tif (node) current_cell.push(node);\n\t}\n\tif (current_cell.length || current_row.length) {\n\t\tcurrent_row.push(current_cell);\n\t\trows.push(current_row);\n\t}\n\tif (rows.length) {\n\t\tconst last_row = rows[rows.length - 1];\n\t\tif (!last_row[1] && !last_row[0][0]) rows.pop();\n\t}\n\treturn rows;\n}, matrix = (tokens, state_ref, name) => {\n\tif (tokens[state_ref[0]] === 7) {\n\t\tstate_ref[0] += 2;\n\t\tconst matrix_rows = rows(tokens, state_ref, 0, name);\n\t\tif (tokens[state_ref[0]] === 8) state_ref[0] += 2;\n\t\treturn [\n\t\t\t14,\n\t\t\tname,\n\t\t\tmatrix_rows\n\t\t];\n\t}\n\tconst node = read(tokens, state_ref, 1);\n\treturn node ? [\n\t\t14,\n\t\tname,\n\t\t[[[node]]]\n\t] : null;\n}, txt = (tokens, state_ref) => {\n\tif (tokens[state_ref[0]] === 7) {\n\t\tconst text_val = brace(tokens, state_ref);\n\t\tif (text_val === \"\") return [8, []];\n\t\tconst parts = text_val.split(\"\\\\\\\\\");\n\t\tif (parts.length > 1) {\n\t\t\tconst nodes = [];\n\t\t\tparts.forEach((p, i) => {\n\t\t\t\tif (i > 0) nodes.push([15]);\n\t\t\t\tif (p) nodes.push([16, p]);\n\t\t\t});\n\t\t\treturn [8, nodes];\n\t\t}\n\t\treturn [16, text_val];\n\t}\n\tconst next_node = read(tokens, state_ref, 1);\n\tif (next_node) return [16, next_node[1]];\n\tthrow [3, \"text\"];\n}, parseBegin = (tokens, state_ref, val) => {\n\tif (tokens[state_ref[0]] === 7) {\n\t\tconst env_name = brace(tokens, state_ref);\n\t\tif (env_name === \"array\") {\n\t\t\topt(tokens, state_ref);\n\t\t\tif (tokens[state_ref[0]] === 7) brace(tokens, state_ref);\n\t\t\telse if (tokens[state_ref[0]] !== 0) state_ref[0] += 2;\n\t\t}\n\t\treturn [\n\t\t\t14,\n\t\t\tenv_name,\n\t\t\trows(tokens, state_ref, 1, env_name)\n\t\t];\n\t}\n\treturn [1, val];\n}, sqrt = (tokens, state_ref) => {\n\tif (tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"[\") {\n\t\tstate_ref[0] += 2;\n\t\tconst index_nodes = [];\n\t\twhile (tokens[state_ref[0]] !== 0 && !(tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"]\")) {\n\t\t\tconst node = grab(tokens, state_ref);\n\t\t\tif (node) index_nodes.push(node);\n\t\t}\n\t\tif (tokens[state_ref[0]] === 3) state_ref[0] += 2;\n\t\treturn [\n\t\t\t11,\n\t\t\tread(tokens, state_ref, 1),\n\t\t\t[8, index_nodes]\n\t\t];\n\t}\n\treturn [10, read(tokens, state_ref, 1)];\n}, fence = (tokens, state_ref) => {\n\tconst left_delim = delim(tokens, state_ref), body = parse(tokens, state_ref);\n\tif (tokens[state_ref[0]] === 4 && tokens[state_ref[0] + 1] === \"\\\\right\") {\n\t\tstate_ref[0] += 2;\n\t\treturn [12, [\n\t\t\tleft_delim,\n\t\t\t...body,\n\t\t\tdelim(tokens, state_ref)\n\t\t].filter(Boolean)];\n\t}\n\tthrow [1, left_delim];\n}, over = (tokens, state_ref) => [13, read(tokens, state_ref, 1)], frac = (tokens, state_ref) => [\n\t7,\n\tread(tokens, state_ref, 1),\n\tread(tokens, state_ref, 1)\n], phantom = (tokens, state_ref) => [19, read(tokens, state_ref, 1)], pmod = (tokens, state_ref) => [8, [\n\t[17, \"8px\"],\n\t[\n\t\t3,\n\t\t\"(\",\n\t\tATTR_STRETCHY_FALSE\n\t],\n\t[16, \"mod\"],\n\t[17, \"4px\"],\n\tread(tokens, state_ref, 1),\n\t[\n\t\t3,\n\t\t\")\",\n\t\tATTR_STRETCHY_FALSE\n\t]\n]], CMD_MAP = {\n\t__proto__: null,\n\t\"\\\\\": (tokens, state_ref) => {\n\t\tif (tokens[state_ref[0]] === 3 && tokens[state_ref[0] + 1] === \"*\") state_ref[0] += 2;\n\t\topt(tokens, state_ref, 1);\n\t\treturn [15];\n\t},\n\ttext: txt,\n\tfrac,\n\toverline: over,\n\tbar: over,\n\tsqrt,\n\tleft: fence,\n\tphantom,\n\tpmod,\n\tbegin: parseBegin,\n\tend: (tokens, state_ref, val, name) => {\n\t\tthrow [0, name];\n\t},\n\tright: (tokens, state_ref, val, name) => {\n\t\tthrow [2, name];\n\t}\n}, TOK_MAP = {\n\t[2]: ident,\n\t[3]: op,\n\t[9]: lparen,\n\t[10]: rparen,\n\t[1]: num,\n\t[7]: (val, tokens, state_ref) => {\n\t\tconst res = [8, parse(tokens, state_ref)];\n\t\tif (tokens[state_ref[0]] === 8) state_ref[0] += 2;\n\t\treturn res;\n\t},\n\t[4]: (val, tokens, state_ref) => {\n\t\tconst name = val.slice(1), handler = CMD_MAP[name];\n\t\tif (handler) return handler(tokens, state_ref, val, name);\n\t\tif (ENV_NAMES.has(name)) return matrix(tokens, state_ref, name) ?? ident(val);\n\t\tconst space = SPACE_MAP[name];\n\t\tif (space) return [17, space];\n\t\tconst notation = MENCLOSE_MAP[name];\n\t\tif (notation) return [\n\t\t\t18,\n\t\t\tnotation,\n\t\t\tread(tokens, state_ref, 1)\n\t\t];\n\t\tif (FUNC_NAMES.has(name)) return [9, name];\n\t\treturn SYM_MAP[name] ?? ident(val);\n\t}\n}, read = (tokens, state_ref, split_num) => {\n\tconst idx = state_ref[0], type = tokens[idx];\n\tif (type == null) return null;\n\tstate_ref[0] += 2;\n\tlet val = tokens[idx + 1];\n\tif (split_num && type === 1 && val[1]) {\n\t\ttokens.splice(state_ref[0], 0, 1, val.slice(1));\n\t\tval = val[0];\n\t}\n\treturn TOK_MAP[type]?.(val, tokens, state_ref) ?? null;\n}, grab = (tokens, state_ref) => {\n\tconst base = read(tokens, state_ref);\n\tif (!base) return null;\n\tlet limits = 0;\n\tif (tokens[state_ref[0]] === 4) {\n\t\tconst limits_val = LIMITS_MAP[tokens[state_ref[0] + 1]];\n\t\tif (limits_val !== void 0) {\n\t\t\tlimits = limits_val;\n\t\t\tstate_ref[0] += 2;\n\t\t}\n\t}\n\tlet sub = null, sup = null, type;\n\twhile ((type = tokens[state_ref[0]]) != null) {\n\t\tif (type !== 5 && type !== 6) break;\n\t\tstate_ref[0] += 2;\n\t\tconst val = read(tokens, state_ref, 1);\n\t\tif (type === 5) sub = val;\n\t\telse sup = val;\n\t}\n\treturn sub && sup ? [\n\t\t6,\n\t\tbase,\n\t\tsub,\n\t\tsup,\n\t\tlimits\n\t] : sub ? [\n\t\t5,\n\t\tbase,\n\t\tsub,\n\t\tlimits\n\t] : sup ? [\n\t\t4,\n\t\tbase,\n\t\tsup,\n\t\tlimits\n\t] : base;\n}, parse = (tokens, state_ref) => {\n\tconst nodes = [];\n\tlet type;\n\twhile ((type = tokens[state_ref[0]]) != null) {\n\t\tif (type === 0 || type === 8) break;\n\t\tif (type === 4 && tokens[state_ref[0] + 1] === \"\\\\right\") break;\n\t\tconst node = grab(tokens, state_ref);\n\t\tif (node) nodes.push(node);\n\t}\n\treturn nodes;\n};\n//#endregion\n//#region src/mathml.js\nvar ENV_DELIMS = {\n\t__proto__: null,\n\tpmatrix: [\"(\", \")\"],\n\tbmatrix: [\"[\", \"]\"],\n\tvmatrix: [\"|\", \"|\"],\n\tVmatrix: [\"‖\", \"‖\"],\n\tcases: [\"{\", \"\"]\n}, MROW = \"mrow\", NOTATION_STYLE_MAP = {\n\t[1]: STYLE_BOX,\n\t[2]: STYLE_CANCEL,\n\t[3]: STYLE_SOUT\n}, ESC_MAP = {\n\t\"&\": \"&amp;\",\n\t\"<\": \"&lt;\",\n\t\">\": \"&gt;\",\n\t\"\\\"\": \"&quot;\"\n}, esc = (str) => /[&<>\"]/.test(str) ? str.replace(/[&<>\"]/g, (m) => ESC_MAP[m]) : str, wrap = (tag_name, inner, attr) => \"<\" + tag_name + (attr ?? \"\") + \">\" + inner + \"</\" + tag_name + \">\", tag = (name, val, attr) => wrap(name, esc(val), attr), nest = (name, n1, n2, n3) => wrap(name, row(n1) + row(n2) + (n3 ? row(n3) : \"\")), row = (n) => {\n\tif (!n) return wrap(MROW, \"\");\n\tconst [type, val] = n;\n\treturn type === 8 ? val[1] ? wrap(MROW, val.map(show).join(\"\")) : row(val[0]) : type === 9 ? wrap(MROW, show(n)) : show(n);\n}, scriptTag = ([type, val], limits, display, inline) => limits === 1 || limits !== 2 && (val === \"∑\" || type === 9 && (val === \"lim\" || val === \"max\" || val === \"min\" || val === \"sup\" || val === \"inf\")) ? display : inline, SHOW_MAP = {\n\t[1]: ([_, val, attr]) => tag(\"mi\", val, attr),\n\t[2]: ([_, val]) => tag(\"mn\", val),\n\t[3]: ([_, val, attr]) => tag(\"mo\", val, attr),\n\t[9]: ([_, val]) => tag(\"mi\", val) + \"<mo>⁡</mo>\",\n\t[8]: ([_, val]) => val.map(show).join(\"\"),\n\t[7]: ([_, n1, n2]) => nest(\"mfrac\", n1, n2),\n\t[4]: ([_, n1, n2, limits]) => nest(scriptTag(n1, limits, \"mover\", \"msup\"), n1, n2),\n\t[5]: ([_, n1, n2, limits]) => nest(scriptTag(n1, limits, \"munder\", \"msub\"), n1, n2),\n\t[6]: ([_, n1, n2, n3, limits]) => nest(scriptTag(n1, limits, \"munderover\", \"msubsup\"), n1, n2, n3),\n\t[16]: ([_, val]) => tag(\"mtext\", val.replace(/ /g, \"\\xA0\")),\n\t[17]: ([_, val]) => \"<mspace width=\\\"\" + val + \"\\\"></mspace>\",\n\t[10]: ([_, n1]) => wrap(\"msqrt\", row(n1)),\n\t[11]: ([_, n1, n2]) => nest(\"mroot\", n1, n2),\n\t[12]: ([_, val]) => wrap(MROW, val.map(show).join(\"\")),\n\t[13]: ([_, n1]) => nest(\"mover\", n1, [3, \"¯\"]),\n\t[18]: ([_, notation, n1]) => {\n\t\tconst style = NOTATION_STYLE_MAP[notation];\n\t\treturn style ? \"<mrow\" + style + \">\" + row(n1) + \"</mrow>\" : row(n1);\n\t},\n\t[19]: ([_, n1]) => wrap(\"mphantom\", row(n1)),\n\t[14]: ([_, env_name, rows_cells]) => {\n\t\tconst m_table = wrap(\"mtable\", rows_cells.map((row_cells) => wrap(\"mtr\", row_cells.map((cell_nodes) => {\n\t\t\tconst inner_html = cell_nodes.map(show).join(\"\");\n\t\t\treturn wrap(\"mtd\", cell_nodes[1] ? wrap(MROW, inner_html) : inner_html);\n\t\t}).join(\"\"))).join(\"\")), delims = ENV_DELIMS[env_name];\n\t\treturn delims ? wrap(MROW, (delims[0] ? tag(\"mo\", delims[0]) : \"\") + m_table + (delims[1] ? tag(\"mo\", delims[1]) : \"\")) : m_table;\n\t},\n\t[15]: () => \"<mspace linebreak=\\\"newline\\\"></mspace>\"\n}, show = (n) => n ? SHOW_MAP[n[0]](n) : \"\";\nvar mathml_default = (tex, block) => {\n\tconst clean = tex.includes(\"\\n\") || tex.includes(\"\\r\") ? tex.replace(/[\\r\\n]+/g, \" \") : tex;\n\treturn \"<math xmlns=\\\"http://www.w3.org/1998/Math/MathML\\\"\" + (block ? \" display=\\\"block\\\"\" : \"\") + \"><semantics><mrow>\" + parse(lex_default(clean), [0]).map(show).join(\"\") + \"</mrow><annotation encoding=\\\"application/x-tex\\\">\" + esc(clean) + \"</annotation></semantics></math>\";\n};\n//#endregion\n//#region src/md.js\nvar DOLLAR = \"$\", STATE_TEXT = 0, STATE_INLINE_CODE = 1, STATE_BLOCK_CODE = 2, STATE_INLINE_MATH = 3, STATE_BLOCK_MATH = 4, find = (str, start, is_md) => {\n\tconst len = str.length;\n\tfor (let i = start; i < len; ++i) {\n\t\tconst c = str[i];\n\t\tif (c === \"\\\\\" || c === DOLLAR || is_md && c === \"`\") return i;\n\t}\n\treturn -1;\n};\nvar md_default = (md) => {\n\tlet result = \"\", idx = 0, state = STATE_TEXT, math_start = 0;\n\tconst len = md.length;\n\twhile (idx < len) if (state === STATE_TEXT) {\n\t\tconst match_idx = find(md, idx, 1);\n\t\tif (match_idx === -1) {\n\t\t\tresult += md.slice(idx);\n\t\t\tbreak;\n\t\t}\n\t\tresult += md.slice(idx, match_idx);\n\t\tconst char = md[match_idx];\n\t\tif (char === \"\\\\\") {\n\t\t\tconst is_esc = md[match_idx + 1] === DOLLAR;\n\t\t\tresult += is_esc ? DOLLAR : \"\\\\\";\n\t\t\tidx = match_idx + (is_esc ? 2 : 1);\n\t\t} else if (char === DOLLAR) {\n\t\t\tconst block = md[match_idx + 1] === DOLLAR;\n\t\t\tstate = block ? STATE_BLOCK_MATH : STATE_INLINE_MATH;\n\t\t\tidx = match_idx + (block ? 2 : 1);\n\t\t\tmath_start = idx;\n\t\t} else {\n\t\t\tconst block = md[match_idx + 1] === \"`\" && md[match_idx + 2] === \"`\";\n\t\t\tresult += block ? \"```\" : \"`\";\n\t\t\tstate = block ? STATE_BLOCK_CODE : STATE_INLINE_CODE;\n\t\t\tidx = match_idx + (block ? 3 : 1);\n\t\t}\n\t} else if (state >= STATE_INLINE_MATH) {\n\t\tconst match_idx = find(md, idx, 0);\n\t\tif (match_idx === -1) {\n\t\t\tidx = len;\n\t\t\tbreak;\n\t\t}\n\t\tif (md[match_idx] === \"\\\\\") idx = match_idx + (md[match_idx + 1] ? 2 : 1);\n\t\telse {\n\t\t\tconst is_inline = state === STATE_INLINE_MATH;\n\t\t\tif (is_inline || md[match_idx + 1] === DOLLAR) {\n\t\t\t\tconst content = md.slice(math_start, match_idx), delim = is_inline ? DOLLAR : \"$$\";\n\t\t\t\ttry {\n\t\t\t\t\tresult += mathml_default(content, !is_inline);\n\t\t\t\t} catch {\n\t\t\t\t\tresult += delim + content + delim;\n\t\t\t\t}\n\t\t\t\tstate = STATE_TEXT;\n\t\t\t\tidx = match_idx + (is_inline ? 1 : 2);\n\t\t\t} else idx = match_idx + 1;\n\t\t}\n\t} else {\n\t\tconst delim = state === STATE_INLINE_CODE ? \"`\" : \"```\", match_idx = md.indexOf(delim, idx);\n\t\tif (match_idx === -1) {\n\t\t\tresult += md.slice(idx);\n\t\t\tbreak;\n\t\t}\n\t\tresult += md.slice(idx, match_idx) + delim;\n\t\tstate = STATE_TEXT;\n\t\tidx = match_idx + delim.length;\n\t}\n\treturn state >= STATE_INLINE_MATH ? result + (state === STATE_INLINE_MATH ? DOLLAR : \"$$\") + md.slice(math_start) : result;\n};\n//#endregion\nexport { md_default as default };\n"],"names":["CHAR_TOK","_","digit","c","alpha","skip","str","idx","len","code","charCodeAt","FALSE","space","l","r","ATTR_NORMAL","ATTR_BAR","ATTR_BIN","ATTR_REL","ENV_NAMES","Set","FUNC_NAMES","LE","GE","NE","RIGHT_ARROW","LEFT_ARROW","L_DOTS","SYM_MAP","__proto__","beta","gamma","theta","pi","infty","le","leq","ge","geq","neq","ne","cdot","times","pm","mp","div","sum","int","to","rightarrow","leftarrow","gets","leftrightarrow","Leftarrow","Rightarrow","Leftrightarrow","dots","ldots","cdots","Delta","Gamma","Theta","Lambda","Xi","Pi","Sigma","Upsilon","Phi","Psi","Omega","delta","epsilon","zeta","eta","iota","kappa","lambda","mu","nu","xi","rho","sigma","tau","upsilon","phi","chi","psi","omega","nabla","partial","approx","sim","cong","propto","equiv","neg","lor","land","ni","perp","parallel","ell","hbar","forall","exists","in","notin","subset","supset","subseteq","supseteq","cup","cap","emptyset","LIMITS_MAP","MENCLOSE_MAP","boxed","cancel","sout","SPACE_MAP","quad","qquad","CHAR_MAP","DELIM_MAP","ident","val","delim","tokens","state_ref","startsWith","slice","opt","check_num","brace","rows","is_end_check","env_name","current_row","current_cell","length","next_type","next_val","saved_idx","push","node","grab","last_row","pop","over","read","CMD_MAP","text","text_val","parts","split","nodes","forEach","p","i","next_node","frac","overline","bar","sqrt","index_nodes","left","left_delim","body","parse","filter","Boolean","phantom","pmod","begin","end","name","right","TOK_MAP","res","handler","has","matrix","matrix_rows","notation","split_num","type","splice","base","limits","limits_val","sub","sup","ENV_DELIMS","pmatrix","bmatrix","vmatrix","Vmatrix","cases","MROW","NOTATION_STYLE_MAP","ESC_MAP","esc","test","replace","m","wrap","tag_name","inner","attr","tag","nest","n1","n2","n3","row","n","map","show","join","scriptTag","display","inline","SHOW_MAP","style","rows_cells","m_table","row_cells","cell_nodes","inner_html","delims","mathml_default","tex","block","clean","includes","lex_default","start","cmd","temp_idx","brace_count","text_start","text_idx","c_code","char","find","is_md","md_default","md","result","state","math_start","match_idx","is_esc","is_inline","content","indexOf","default"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1 @@
1
+ {"name":"@webc.site/math","version":"0.1.1","description":"The world's smallest and fastest web Markdown formula renderer / 全球最小最快的网页Markdown公式渲染器","keywords":["markdown","math","mathml","render","tex"],"homepage":"https://math.webc.site","license":"MulanPSL-2.0","author":"i18n.site@gmail.com","repository":{"type":"git","url":"git+https://github.com/webc-site/math.git"},"type":"module","exports":{".":"./mathml.js","./*":"./*"},"scripts":{"prepare":"husky"},"dependencies":{},"lint-staged":{"**/*.svg":"bun sh/hook/svg.js","**/*.styl":"bun sh/hook/styl.js"}}