@aruzone/aze-forge 0.1.0
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/LICENSE +21 -0
- package/README.md +408 -0
- package/dist/acceptance.d.ts +48 -0
- package/dist/acceptance.js +180 -0
- package/dist/acceptance.js.map +1 -0
- package/dist/assets.d.ts +19 -0
- package/dist/assets.js +509 -0
- package/dist/assets.js.map +1 -0
- package/dist/atomic-write.d.ts +1 -0
- package/dist/atomic-write.js +23 -0
- package/dist/atomic-write.js.map +1 -0
- package/dist/callout.d.ts +27 -0
- package/dist/callout.js +78 -0
- package/dist/callout.js.map +1 -0
- package/dist/capabilities-json.d.ts +4 -0
- package/dist/capabilities-json.js +225 -0
- package/dist/capabilities-json.js.map +1 -0
- package/dist/capabilities.d.ts +110 -0
- package/dist/capabilities.js +270 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1096 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler.d.ts +3 -0
- package/dist/compiler.js +1034 -0
- package/dist/compiler.js.map +1 -0
- package/dist/configuration-error.d.ts +4 -0
- package/dist/configuration-error.js +9 -0
- package/dist/configuration-error.js.map +1 -0
- package/dist/diagnostics-json.d.ts +23 -0
- package/dist/diagnostics-json.js +143 -0
- package/dist/diagnostics-json.js.map +1 -0
- package/dist/diagnostics.d.ts +16 -0
- package/dist/diagnostics.js +154 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/equation.d.ts +74 -0
- package/dist/equation.js +485 -0
- package/dist/equation.js.map +1 -0
- package/dist/font.d.ts +19 -0
- package/dist/font.js +75 -0
- package/dist/font.js.map +1 -0
- package/dist/format.d.ts +2 -0
- package/dist/format.js +308 -0
- package/dist/format.js.map +1 -0
- package/dist/hash.d.ts +5 -0
- package/dist/hash.js +189 -0
- package/dist/hash.js.map +1 -0
- package/dist/help.d.ts +9 -0
- package/dist/help.js +102 -0
- package/dist/help.js.map +1 -0
- package/dist/html-fragment.d.ts +7 -0
- package/dist/html-fragment.js +70 -0
- package/dist/html-fragment.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +14 -0
- package/dist/markdown.js +425 -0
- package/dist/markdown.js.map +1 -0
- package/dist/mermaid-browser.d.ts +43 -0
- package/dist/mermaid-browser.js +358 -0
- package/dist/mermaid-browser.js.map +1 -0
- package/dist/mermaid.d.ts +84 -0
- package/dist/mermaid.js +740 -0
- package/dist/mermaid.js.map +1 -0
- package/dist/model.d.ts +406 -0
- package/dist/model.js +2 -0
- package/dist/model.js.map +1 -0
- package/dist/parse.d.ts +3 -0
- package/dist/parse.js +1374 -0
- package/dist/parse.js.map +1 -0
- package/dist/preview-server.d.ts +39 -0
- package/dist/preview-server.js +156 -0
- package/dist/preview-server.js.map +1 -0
- package/dist/preview-shell.d.ts +29 -0
- package/dist/preview-shell.js +102 -0
- package/dist/preview-shell.js.map +1 -0
- package/dist/reference-validation.d.ts +7 -0
- package/dist/reference-validation.js +42 -0
- package/dist/reference-validation.js.map +1 -0
- package/dist/registry.d.ts +29 -0
- package/dist/registry.js +384 -0
- package/dist/registry.js.map +1 -0
- package/dist/render-html.d.ts +24 -0
- package/dist/render-html.js +149 -0
- package/dist/render-html.js.map +1 -0
- package/dist/render-pdf.d.ts +64 -0
- package/dist/render-pdf.js +503 -0
- package/dist/render-pdf.js.map +1 -0
- package/dist/render-png.d.ts +32 -0
- package/dist/render-png.js +427 -0
- package/dist/render-png.js.map +1 -0
- package/dist/render-svg.d.ts +23 -0
- package/dist/render-svg.js +243 -0
- package/dist/render-svg.js.map +1 -0
- package/dist/runtime-support.d.ts +26 -0
- package/dist/runtime-support.js +62 -0
- package/dist/runtime-support.js.map +1 -0
- package/dist/source-map.d.ts +12 -0
- package/dist/source-map.js +75 -0
- package/dist/source-map.js.map +1 -0
- package/dist/table.d.ts +22 -0
- package/dist/table.js +90 -0
- package/dist/table.js.map +1 -0
- package/dist/theme.d.ts +6 -0
- package/dist/theme.js +89 -0
- package/dist/theme.js.map +1 -0
- package/dist/tool-version.d.ts +3 -0
- package/dist/tool-version.js +3 -0
- package/dist/tool-version.js.map +1 -0
- package/dist/type-guards.d.ts +1 -0
- package/dist/type-guards.js +4 -0
- package/dist/type-guards.js.map +1 -0
- package/dist/validate-document.d.ts +2 -0
- package/dist/validate-document.js +248 -0
- package/dist/validate-document.js.map +1 -0
- package/dist/version.d.ts +37 -0
- package/dist/version.js +111 -0
- package/dist/version.js.map +1 -0
- package/dist/watch-dependencies.d.ts +15 -0
- package/dist/watch-dependencies.js +93 -0
- package/dist/watch-dependencies.js.map +1 -0
- package/dist/watch-events.d.ts +51 -0
- package/dist/watch-events.js +27 -0
- package/dist/watch-events.js.map +1 -0
- package/dist/watch-loop.d.ts +39 -0
- package/dist/watch-loop.js +117 -0
- package/dist/watch-loop.js.map +1 -0
- package/package.json +70 -0
- package/schemas/acceptance.json +104 -0
- package/schemas/capabilities.json +491 -0
- package/schemas/diagnostics.json +219 -0
- package/schemas/version.json +167 -0
package/dist/equation.js
ADDED
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import katex from "katex";
|
|
4
|
+
import { createDiagnostic } from "./diagnostics.js";
|
|
5
|
+
import { sha256 } from "./hash.js";
|
|
6
|
+
export const EQUATION_PLUGIN_TYPE = "equation";
|
|
7
|
+
export const EQUATION_PLUGIN_VERSION = "1.0.0";
|
|
8
|
+
export const EQUATION_BODY_SYNTAX_ID = "azeforge.readable-equation/v1";
|
|
9
|
+
export const EQUATION_BODY_SYNTAX_VERSION = "1.0.0";
|
|
10
|
+
export const EQUATION_LATEX_LANGUAGE_VERSION = "katex-0.18.5";
|
|
11
|
+
export const KATEX_VERSION = "0.18.5";
|
|
12
|
+
export const EQUATION_HTML_BLOCK_RENDERER_ID = "azeforge.equation.html/v1";
|
|
13
|
+
export const EQUATION_HTML_BLOCK_RENDERER_VERSION = "1.0.0";
|
|
14
|
+
export const HTML_RENDERER_ID = "html";
|
|
15
|
+
export const HTML_RENDERER_VERSION = "1.0.0";
|
|
16
|
+
export const MAX_EQUATION_TEX_LENGTH = 4000;
|
|
17
|
+
export const MAX_EQUATION_SOURCE_LENGTH = 4000;
|
|
18
|
+
export const equationSourceSchema = Object.freeze({
|
|
19
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
20
|
+
$id: "azeforge.equation/source/v1",
|
|
21
|
+
type: "object",
|
|
22
|
+
additionalProperties: false,
|
|
23
|
+
properties: {
|
|
24
|
+
id: {
|
|
25
|
+
type: "string",
|
|
26
|
+
pattern: "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$",
|
|
27
|
+
},
|
|
28
|
+
number: { type: "boolean" },
|
|
29
|
+
align: { type: "string", enum: ["left", "center", "right"] },
|
|
30
|
+
syntax: { type: "string", enum: ["readable", "latex"] },
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
export const equationDataSchema = Object.freeze({
|
|
34
|
+
$schema: "https://json-schema.org/draft/2020-12/schema",
|
|
35
|
+
$id: "azeforge.equation/data/v1",
|
|
36
|
+
type: "object",
|
|
37
|
+
additionalProperties: false,
|
|
38
|
+
required: ["syntax", "source", "tex", "pluginVersion"],
|
|
39
|
+
properties: {
|
|
40
|
+
kind: { const: "equation" },
|
|
41
|
+
syntax: { type: "string", enum: ["readable", "latex"] },
|
|
42
|
+
source: { type: "string", minLength: 1, maxLength: 4000 },
|
|
43
|
+
tex: { type: "string", minLength: 1, maxLength: 4000 },
|
|
44
|
+
pluginVersion: { const: "1.0.0" },
|
|
45
|
+
number: { type: "boolean" },
|
|
46
|
+
align: { type: "string", enum: ["left", "center", "right"] },
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
const GREEK_LOWER = Object.freeze({
|
|
50
|
+
alpha: "\\alpha",
|
|
51
|
+
beta: "\\beta",
|
|
52
|
+
gamma: "\\gamma",
|
|
53
|
+
delta: "\\delta",
|
|
54
|
+
epsilon: "\\epsilon",
|
|
55
|
+
zeta: "\\zeta",
|
|
56
|
+
eta: "\\eta",
|
|
57
|
+
theta: "\\theta",
|
|
58
|
+
iota: "\\iota",
|
|
59
|
+
kappa: "\\kappa",
|
|
60
|
+
lambda: "\\lambda",
|
|
61
|
+
mu: "\\mu",
|
|
62
|
+
nu: "\\nu",
|
|
63
|
+
xi: "\\xi",
|
|
64
|
+
pi: "\\pi",
|
|
65
|
+
rho: "\\rho",
|
|
66
|
+
sigma: "\\sigma",
|
|
67
|
+
tau: "\\tau",
|
|
68
|
+
upsilon: "\\upsilon",
|
|
69
|
+
phi: "\\phi",
|
|
70
|
+
chi: "\\chi",
|
|
71
|
+
psi: "\\psi",
|
|
72
|
+
omega: "\\omega",
|
|
73
|
+
});
|
|
74
|
+
const GREEK_UPPER = Object.freeze({
|
|
75
|
+
Alpha: "\\Alpha",
|
|
76
|
+
Beta: "\\Beta",
|
|
77
|
+
Gamma: "\\Gamma",
|
|
78
|
+
Delta: "\\Delta",
|
|
79
|
+
Epsilon: "\\Epsilon",
|
|
80
|
+
Zeta: "\\Zeta",
|
|
81
|
+
Eta: "\\Eta",
|
|
82
|
+
Theta: "\\Theta",
|
|
83
|
+
Iota: "\\Iota",
|
|
84
|
+
Kappa: "\\Kappa",
|
|
85
|
+
Lambda: "\\Lambda",
|
|
86
|
+
Mu: "\\Mu",
|
|
87
|
+
Nu: "\\Nu",
|
|
88
|
+
Xi: "\\Xi",
|
|
89
|
+
Pi: "\\Pi",
|
|
90
|
+
Rho: "\\Rho",
|
|
91
|
+
Sigma: "\\Sigma",
|
|
92
|
+
Tau: "\\Tau",
|
|
93
|
+
Upsilon: "\\Upsilon",
|
|
94
|
+
Phi: "\\Phi",
|
|
95
|
+
Chi: "\\Chi",
|
|
96
|
+
Psi: "\\Psi",
|
|
97
|
+
Omega: "\\Omega",
|
|
98
|
+
});
|
|
99
|
+
function replaceWord(input, word, replacement) {
|
|
100
|
+
return input.replace(new RegExp(`(?<![A-Za-z])${word}(?![A-Za-z])`, "g"), replacement);
|
|
101
|
+
}
|
|
102
|
+
function splitTopLevel(value, separator) {
|
|
103
|
+
const parts = [];
|
|
104
|
+
let depth = 0;
|
|
105
|
+
let current = "";
|
|
106
|
+
for (const char of value) {
|
|
107
|
+
if (char === "(" || char === "[")
|
|
108
|
+
depth += 1;
|
|
109
|
+
if (char === ")" || char === "]")
|
|
110
|
+
depth -= 1;
|
|
111
|
+
if (char === separator && depth === 0) {
|
|
112
|
+
parts.push(current);
|
|
113
|
+
current = "";
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
current += char;
|
|
117
|
+
}
|
|
118
|
+
parts.push(current);
|
|
119
|
+
return parts;
|
|
120
|
+
}
|
|
121
|
+
function translateMatrix(body) {
|
|
122
|
+
return body.replace(/matrix\s*\[((?:\[[^\]]*\],?)+)\]/g, (_match, rows) => {
|
|
123
|
+
const rowMatches = [...rows.matchAll(/\[([^\]]*)\]/g)].map((m) => m[1] ?? "");
|
|
124
|
+
const texRows = rowMatches.map((row) => splitTopLevel(row, ",")
|
|
125
|
+
.map((cell) => cell.trim())
|
|
126
|
+
.join(" & "));
|
|
127
|
+
return `\\begin{bmatrix}${texRows.join(" \\\\ ")} \\end{bmatrix}`;
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function translateCases(body) {
|
|
131
|
+
return body.replace(/cases\s*\(\s*([^)]*)\s*\)/g, (_match, inner) => {
|
|
132
|
+
const rows = splitTopLevel(inner, ";").map((row) => row.trim());
|
|
133
|
+
return `\\begin{cases}${rows.join(" \\\\ ")} \\end{cases}`;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Translate readable §12 equation Source into pinned KaTeX TeX.
|
|
138
|
+
* Every alias maps to a KaTeX-native target; translation is pure
|
|
139
|
+
* string rewriting and KaTeX remains the final validator.
|
|
140
|
+
*/
|
|
141
|
+
export function translateReadableToTex(source) {
|
|
142
|
+
let tex = source;
|
|
143
|
+
tex = translateMatrix(tex);
|
|
144
|
+
tex = translateCases(tex);
|
|
145
|
+
tex = tex.replace(/root\s*\(\s*([^,()]+?)\s*,\s*([^()]+?)\s*\)/g, (_, n, x) => `\\sqrt[${n.trim()}]{${x.trim()}}`);
|
|
146
|
+
tex = tex.replace(/frac\s*\(\s*([^,()]+?)\s*,\s*([^()]+?)\s*\)/g, (_, a, b) => `\\frac{${a.trim()}}{${b.trim()}}`);
|
|
147
|
+
tex = tex.replace(/sqrt\s*\(\s*([^()]+?)\s*\)/g, (_, x) => `\\sqrt{${x.trim()}}`);
|
|
148
|
+
for (const fn of ["sin", "cos", "tan", "exp", "log", "ln"]) {
|
|
149
|
+
tex = tex.replace(new RegExp(`(?<![A-Za-z\\\\])${fn}\\s*\\(`, "g"), `\\${fn}(`);
|
|
150
|
+
}
|
|
151
|
+
tex = tex.replace(/limit\s+([A-Za-z]+)\s*->\s*([^\s]+)\s+of\s+/g, (_, variable, target) => `\\lim_{${variable} \\to ${target}} `);
|
|
152
|
+
tex = tex.replace(/\b(sum|product)\s+([A-Za-z]+)\s*=\s*([^\s]+)\.\.([^\s]+)\s+of\s+/g, (_, op, variable, from, to) => `${op === "sum" ? "\\sum" : "\\prod"}_{${variable}=${from}}^{${to}} `);
|
|
153
|
+
tex = tex.replace(/integral\s+[A-Za-z]+\s*=\s*([^\s]+)\.\.([^\s]+)\s+of\s+/g, (_, from, to) => `\\int_{${from}}^{${to}} `);
|
|
154
|
+
tex = tex.replace(/integral\s+of\s+/g, "\\int ");
|
|
155
|
+
tex = tex.replace(/partial\s+([A-Za-z0-9()]+)\s*\/\s*partial\s+([A-Za-z]+)/g, (_, numerator, variable) => `\\frac{\\partial ${numerator}}{\\partial ${variable}}`);
|
|
156
|
+
tex = tex.replace(/\bd\s*\/\s*d([A-Za-z])\s+([A-Za-z0-9()^_]+)/g, (_, variable, fn) => `\\frac{d ${fn}}{d ${variable}}`);
|
|
157
|
+
for (const [name, target] of Object.entries(GREEK_LOWER)) {
|
|
158
|
+
tex = replaceWord(tex, name, ` ${target} `);
|
|
159
|
+
}
|
|
160
|
+
for (const [name, target] of Object.entries(GREEK_UPPER)) {
|
|
161
|
+
tex = replaceWord(tex, name, ` ${target} `);
|
|
162
|
+
}
|
|
163
|
+
tex = replaceWord(tex, "infinity", " \\infty ");
|
|
164
|
+
tex = replaceWord(tex, "partial", " \\partial ");
|
|
165
|
+
tex = replaceWord(tex, "in", " \\in ");
|
|
166
|
+
tex = replaceWord(tex, "notin", " \\notin ");
|
|
167
|
+
tex = replaceWord(tex, "subset", " \\subset ");
|
|
168
|
+
tex = replaceWord(tex, "union", " \\cup ");
|
|
169
|
+
tex = replaceWord(tex, "intersect", " \\cap ");
|
|
170
|
+
tex = replaceWord(tex, "forall", " \\forall ");
|
|
171
|
+
tex = replaceWord(tex, "exists", " \\exists ");
|
|
172
|
+
tex = tex.replace(/!=/g, " \\neq ");
|
|
173
|
+
tex = tex.replace(/<=/g, " \\leq ");
|
|
174
|
+
tex = tex.replace(/>=/g, " \\geq ");
|
|
175
|
+
tex = tex.replace(/\s+/g, " ").trim();
|
|
176
|
+
return tex;
|
|
177
|
+
}
|
|
178
|
+
function headerDiagnostic(code, message, range, sourceName, extra = {}) {
|
|
179
|
+
return createDiagnostic(code, "error", message, {
|
|
180
|
+
location: sourceName === undefined ? { range } : { source: sourceName, range },
|
|
181
|
+
...(extra.suggestion === undefined
|
|
182
|
+
? {}
|
|
183
|
+
: { suggestion: extra.suggestion }),
|
|
184
|
+
...(extra.data === undefined ? {} : { data: extra.data }),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
export function parseEquationHeader(entries, _blockRange, sourceName) {
|
|
188
|
+
const diagnostics = [];
|
|
189
|
+
let id;
|
|
190
|
+
let number;
|
|
191
|
+
let align;
|
|
192
|
+
let syntax = "readable";
|
|
193
|
+
for (const entry of entries) {
|
|
194
|
+
if (entry.key === "id") {
|
|
195
|
+
if (entry.value.length === 0) {
|
|
196
|
+
diagnostics.push(headerDiagnostic("azeforge.equation#invalid-attribute", "Equation attribute id must not be empty.", entry.range, sourceName, { data: { attribute: "id", value: entry.value } }));
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
id = entry.value;
|
|
200
|
+
}
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (entry.key === "number") {
|
|
204
|
+
if (entry.value !== "true" && entry.value !== "false") {
|
|
205
|
+
diagnostics.push(headerDiagnostic("azeforge.equation#invalid-attribute", 'Equation attribute "number" must be true or false.', entry.range, sourceName, { data: { attribute: "number", value: entry.value } }));
|
|
206
|
+
}
|
|
207
|
+
else {
|
|
208
|
+
number = entry.value === "true";
|
|
209
|
+
}
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
if (entry.key === "align") {
|
|
213
|
+
if (entry.value !== "left" && entry.value !== "center" && entry.value !== "right") {
|
|
214
|
+
diagnostics.push(headerDiagnostic("azeforge.equation#invalid-attribute", 'Equation attribute "align" must be left, center, or right.', entry.range, sourceName, { data: { attribute: "align", value: entry.value } }));
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
align = entry.value;
|
|
218
|
+
}
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
if (entry.key === "syntax") {
|
|
222
|
+
if (entry.value !== "readable" && entry.value !== "latex") {
|
|
223
|
+
diagnostics.push(headerDiagnostic("azeforge.equation#invalid-attribute", 'Equation attribute "syntax" must be readable or latex.', entry.range, sourceName, { data: { attribute: "syntax", value: entry.value } }));
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
syntax = entry.value;
|
|
227
|
+
}
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
diagnostics.push(headerDiagnostic("azeforge.equation#invalid-attribute", `Equation attribute "${entry.key}" is not a valid equation attribute.`, entry.range, sourceName, {
|
|
231
|
+
suggestion: "Valid equation attributes are id, number, align, and syntax.",
|
|
232
|
+
data: { attribute: entry.key },
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
return {
|
|
236
|
+
...(id === undefined ? {} : { id }),
|
|
237
|
+
...(number === undefined ? {} : { number }),
|
|
238
|
+
...(align === undefined ? {} : { align }),
|
|
239
|
+
syntax,
|
|
240
|
+
diagnostics,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function hasIntegrationVariable(body) {
|
|
244
|
+
const clauses = body.split(/\\\\|;/);
|
|
245
|
+
return clauses.every((clause) => {
|
|
246
|
+
if (!clause.includes("integral") && !clause.includes("\\int"))
|
|
247
|
+
return true;
|
|
248
|
+
return /\bd\s*[A-Za-z]\b/.test(clause);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
const KATEX_RENDER_OPTIONS = {
|
|
252
|
+
displayMode: true,
|
|
253
|
+
output: "htmlAndMathml",
|
|
254
|
+
trust: false,
|
|
255
|
+
strict: true,
|
|
256
|
+
throwOnError: true,
|
|
257
|
+
maxSize: 20,
|
|
258
|
+
maxExpand: 1000,
|
|
259
|
+
};
|
|
260
|
+
export class KatexCssError extends Error {
|
|
261
|
+
constructor(message = "The pinned KaTeX stylesheet is unavailable.") {
|
|
262
|
+
super(message);
|
|
263
|
+
this.name = "KatexCssError";
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
let cachedKatexCss;
|
|
267
|
+
/**
|
|
268
|
+
* Pinned KaTeX stylesheet with every `@font-face` source replaced by an
|
|
269
|
+
* embedded woff2 data URI (OFL faces from the pinned KaTeX package).
|
|
270
|
+
* Operator glyphs such as the display integral only size correctly in
|
|
271
|
+
* their own faces; embedding keeps Artifacts self-contained with no
|
|
272
|
+
* font fetch while MathML stays screen-reader-only.
|
|
273
|
+
*/
|
|
274
|
+
export function getKatexCss() {
|
|
275
|
+
if (cachedKatexCss !== undefined)
|
|
276
|
+
return cachedKatexCss;
|
|
277
|
+
const require = createRequire(import.meta.url);
|
|
278
|
+
const cssPath = require.resolve("katex/dist/katex.min.css");
|
|
279
|
+
const fontDirectory = cssPath.slice(0, cssPath.lastIndexOf("/") + 1);
|
|
280
|
+
const css = readFileSync(cssPath, "utf8").replace(/@font-face\{[^}]*\}/g, (block) => {
|
|
281
|
+
const match = /url\(fonts\/([^)]+?)\.woff2\)/.exec(block);
|
|
282
|
+
const face = match?.[1];
|
|
283
|
+
if (face === undefined)
|
|
284
|
+
return "";
|
|
285
|
+
const data = readFileSync(`${fontDirectory}fonts/${face}.woff2`).toString("base64");
|
|
286
|
+
return block.replace(/src:[^;}]*;?/, `src:url(data:font/woff2;base64,${data}) format("woff2");`);
|
|
287
|
+
});
|
|
288
|
+
if (!css.includes(".katex-mathml") || /url\(fonts\//.test(css)) {
|
|
289
|
+
throw new KatexCssError();
|
|
290
|
+
}
|
|
291
|
+
cachedKatexCss = css;
|
|
292
|
+
return css;
|
|
293
|
+
}
|
|
294
|
+
export function renderEquationToHtml(tex) {
|
|
295
|
+
return sanitizeKatexHtml(katex.renderToString(tex, { ...KATEX_RENDER_OPTIONS }));
|
|
296
|
+
}
|
|
297
|
+
export class EquationSanitizerError extends Error {
|
|
298
|
+
finding;
|
|
299
|
+
constructor(finding) {
|
|
300
|
+
super(finding === "executable-markup"
|
|
301
|
+
? "KaTeX Fragment failed final sanitization: executable markup is refused."
|
|
302
|
+
: "KaTeX Fragment failed final sanitization: unsafe URL scheme is refused.");
|
|
303
|
+
this.name = "EquationSanitizerError";
|
|
304
|
+
this.finding = finding;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
const UNSAFE_SANITIZER_URL_SCHEME = /^(?:javascript|vbscript|file|ftp|blob):|^data:text\/html/i;
|
|
308
|
+
/**
|
|
309
|
+
* Final sanitization for KaTeX Fragments. KaTeX with trust:false never
|
|
310
|
+
* emits scripts or remote loads, so any executable markup or unsafe URL
|
|
311
|
+
* scheme is a compromise signal and fails closed instead of being
|
|
312
|
+
* rewritten. Clean output passes through byte-identical.
|
|
313
|
+
*/
|
|
314
|
+
export function sanitizeKatexHtml(html) {
|
|
315
|
+
if (/<\s*(script|iframe|object|embed|link|meta|base)\b/i.test(html) ||
|
|
316
|
+
/\son[a-z]+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/i.test(html)) {
|
|
317
|
+
throw new EquationSanitizerError("executable-markup");
|
|
318
|
+
}
|
|
319
|
+
const urlAttribute = /\s(?:href|src|xlink:href)\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi;
|
|
320
|
+
for (let match = urlAttribute.exec(html); match !== null; match = urlAttribute.exec(html)) {
|
|
321
|
+
const raw = match[1] ?? "";
|
|
322
|
+
const url = raw
|
|
323
|
+
.replace(/^["']|["']$/g, "")
|
|
324
|
+
.replace(/[\s\0-\x1f]+/g, "")
|
|
325
|
+
.toLowerCase();
|
|
326
|
+
if (UNSAFE_SANITIZER_URL_SCHEME.test(url)) {
|
|
327
|
+
throw new EquationSanitizerError("unsafe-url");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return html;
|
|
331
|
+
}
|
|
332
|
+
export function validateEquationBody(options) {
|
|
333
|
+
const { header, body, bodyRanges, blockRange, sourceName, allowRawLatex } = options;
|
|
334
|
+
const location = (range) => sourceName === undefined ? { range } : { source: sourceName, range };
|
|
335
|
+
const trimmed = body.trim();
|
|
336
|
+
if (trimmed.length === 0) {
|
|
337
|
+
return {
|
|
338
|
+
diagnostics: [
|
|
339
|
+
createDiagnostic("azeforge.equation#empty", "error", "The equation Block must contain equation Source.", {
|
|
340
|
+
location: location(blockRange),
|
|
341
|
+
suggestion: "Add a readable equation such as F(omega) = sqrt(pi).",
|
|
342
|
+
}),
|
|
343
|
+
],
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
if (trimmed.length > MAX_EQUATION_SOURCE_LENGTH) {
|
|
347
|
+
return {
|
|
348
|
+
diagnostics: [
|
|
349
|
+
createDiagnostic("azeforge.equation#invalid-syntax", "error", "The equation Block exceeds the maximum supported length.", {
|
|
350
|
+
location: location(bodyRanges[0] ?? blockRange),
|
|
351
|
+
data: { length: trimmed.length },
|
|
352
|
+
}),
|
|
353
|
+
],
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
if (header.syntax === "latex" && !allowRawLatex) {
|
|
357
|
+
return {
|
|
358
|
+
diagnostics: [
|
|
359
|
+
createDiagnostic("azeforge.security#raw-latex-disabled", "error", "Raw LaTeX equations require explicit trusted-local approval.", {
|
|
360
|
+
location: location(options.syntaxRange ?? blockRange),
|
|
361
|
+
suggestion: "Render again with --allow-raw-latex on a trusted machine.",
|
|
362
|
+
data: { syntax: "latex" },
|
|
363
|
+
}),
|
|
364
|
+
],
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
if (header.syntax === "readable" && trimmed.includes("\\")) {
|
|
368
|
+
return {
|
|
369
|
+
diagnostics: [
|
|
370
|
+
createDiagnostic("azeforge.equation#invalid-syntax", "error", "The readable equation contains raw TeX markup.", {
|
|
371
|
+
location: location(bodyRanges[0] ?? blockRange),
|
|
372
|
+
suggestion: "Use readable aliases, or set syntax: latex with --allow-raw-latex.",
|
|
373
|
+
}),
|
|
374
|
+
],
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
if (header.syntax === "readable" && !hasIntegrationVariable(trimmed)) {
|
|
378
|
+
const lineIndex = body
|
|
379
|
+
.split("\n")
|
|
380
|
+
.findIndex((line) => (line.includes("integral") || line.includes("\\int")) &&
|
|
381
|
+
!/\bd\s*[A-Za-z]\b/.test(line));
|
|
382
|
+
const range = bodyRanges[lineIndex >= 0 ? lineIndex : 0] ?? blockRange;
|
|
383
|
+
return {
|
|
384
|
+
diagnostics: [
|
|
385
|
+
createDiagnostic("azeforge.equation#missing-integration-variable", "error", "The integral is missing an integration variable.", {
|
|
386
|
+
location: location(range),
|
|
387
|
+
suggestion: "Add an integration variable such as dx to the integral.",
|
|
388
|
+
data: { construct: "integral" },
|
|
389
|
+
}),
|
|
390
|
+
],
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
const tex = header.syntax === "latex" ? trimmed : translateReadableToTex(trimmed);
|
|
394
|
+
if (tex.length > MAX_EQUATION_TEX_LENGTH) {
|
|
395
|
+
return {
|
|
396
|
+
diagnostics: [
|
|
397
|
+
createDiagnostic("azeforge.equation#invalid-syntax", "error", "The equation Block exceeds the maximum supported length.", {
|
|
398
|
+
location: location(bodyRanges[0] ?? blockRange),
|
|
399
|
+
data: { length: tex.length },
|
|
400
|
+
}),
|
|
401
|
+
],
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
try {
|
|
405
|
+
katex.renderToString(tex, { ...KATEX_RENDER_OPTIONS });
|
|
406
|
+
}
|
|
407
|
+
catch {
|
|
408
|
+
return {
|
|
409
|
+
diagnostics: [
|
|
410
|
+
createDiagnostic(header.syntax === "latex"
|
|
411
|
+
? "azeforge.equation#invalid-latex"
|
|
412
|
+
: "azeforge.equation#invalid-syntax", "error", header.syntax === "latex"
|
|
413
|
+
? "The raw LaTeX equation could not be parsed."
|
|
414
|
+
: "The equation could not be parsed.", {
|
|
415
|
+
location: location(bodyRanges[0] ?? blockRange),
|
|
416
|
+
suggestion: header.syntax === "latex"
|
|
417
|
+
? "Check KaTeX-supported syntax without custom macros."
|
|
418
|
+
: "Check the readable equation syntax against supported aliases.",
|
|
419
|
+
}),
|
|
420
|
+
],
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
const block = {
|
|
424
|
+
kind: "equation",
|
|
425
|
+
range: blockRange,
|
|
426
|
+
...(header.id === undefined ? {} : { id: header.id }),
|
|
427
|
+
pluginVersion: EQUATION_PLUGIN_VERSION,
|
|
428
|
+
syntax: header.syntax,
|
|
429
|
+
source: trimmed,
|
|
430
|
+
tex,
|
|
431
|
+
...(header.number === undefined ? {} : { number: header.number }),
|
|
432
|
+
...(header.align === undefined ? {} : { align: header.align }),
|
|
433
|
+
};
|
|
434
|
+
return { block: Object.freeze(block), diagnostics: [] };
|
|
435
|
+
}
|
|
436
|
+
const pluginDescriptor = Object.freeze({
|
|
437
|
+
type: EQUATION_PLUGIN_TYPE,
|
|
438
|
+
version: EQUATION_PLUGIN_VERSION,
|
|
439
|
+
title: "Equation",
|
|
440
|
+
summary: "Readable equations rendered through pinned KaTeX.",
|
|
441
|
+
diagnosticNamespace: "azeforge.equation",
|
|
442
|
+
sourceSchema: equationSourceSchema,
|
|
443
|
+
bodySyntax: Object.freeze({
|
|
444
|
+
id: EQUATION_BODY_SYNTAX_ID,
|
|
445
|
+
version: EQUATION_BODY_SYNTAX_VERSION,
|
|
446
|
+
}),
|
|
447
|
+
dataSchema: equationDataSchema,
|
|
448
|
+
});
|
|
449
|
+
export const equationPlugin = Object.freeze({
|
|
450
|
+
descriptor: pluginDescriptor,
|
|
451
|
+
});
|
|
452
|
+
const blockRendererDescriptor = Object.freeze({
|
|
453
|
+
id: EQUATION_HTML_BLOCK_RENDERER_ID,
|
|
454
|
+
version: EQUATION_HTML_BLOCK_RENDERER_VERSION,
|
|
455
|
+
blockType: EQUATION_PLUGIN_TYPE,
|
|
456
|
+
pluginVersionRange: "1.0.0",
|
|
457
|
+
rendererId: HTML_RENDERER_ID,
|
|
458
|
+
rendererVersionRange: "1.0.0",
|
|
459
|
+
});
|
|
460
|
+
function renderEquationFragment(block, _context) {
|
|
461
|
+
const fragment = renderEquationToHtml(block.tex);
|
|
462
|
+
const align = block.align ?? "center";
|
|
463
|
+
const label = block.id === undefined ? "" : ` data-equation-id="${block.id}"`;
|
|
464
|
+
const number = block.number === true ? ' data-equation-number="true"' : "";
|
|
465
|
+
return `<figure class="aze-equation" data-align="${align}"${label}${number}>${fragment}</figure>`;
|
|
466
|
+
}
|
|
467
|
+
export const equationHtmlBlockRenderer = Object.freeze({
|
|
468
|
+
descriptor: blockRendererDescriptor,
|
|
469
|
+
render: renderEquationFragment,
|
|
470
|
+
});
|
|
471
|
+
export const htmlRendererDescriptor = Object.freeze({
|
|
472
|
+
id: HTML_RENDERER_ID,
|
|
473
|
+
version: HTML_RENDERER_VERSION,
|
|
474
|
+
formats: Object.freeze(["html"]),
|
|
475
|
+
capabilities: Object.freeze([]),
|
|
476
|
+
});
|
|
477
|
+
export function katexDependencyClosure() {
|
|
478
|
+
return {
|
|
479
|
+
katex: KATEX_VERSION,
|
|
480
|
+
language: EQUATION_LATEX_LANGUAGE_VERSION,
|
|
481
|
+
options: { ...KATEX_RENDER_OPTIONS },
|
|
482
|
+
css: sha256(getKatexCss()),
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
//# sourceMappingURL=equation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"equation.js","sourceRoot":"","sources":["../src/equation.ts"],"names":[],"mappings":"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"}
|
package/dist/font.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Sha256Hash } from "./model.js";
|
|
2
|
+
interface FontSubsetDescriptor {
|
|
3
|
+
readonly family: "Inter" | "JetBrains Mono";
|
|
4
|
+
readonly name: string;
|
|
5
|
+
readonly unicodeRange: string;
|
|
6
|
+
readonly weight: 400 | 700;
|
|
7
|
+
}
|
|
8
|
+
export interface EmbeddedFontFace extends FontSubsetDescriptor {
|
|
9
|
+
readonly data: string;
|
|
10
|
+
readonly sourceHash: Sha256Hash;
|
|
11
|
+
}
|
|
12
|
+
export declare class FontCoverageError extends Error {
|
|
13
|
+
readonly codePoint: number;
|
|
14
|
+
constructor(codePoint: number);
|
|
15
|
+
}
|
|
16
|
+
export declare function assertInterFontCoverage(values: readonly string[]): void;
|
|
17
|
+
export declare function loadInterFontFaces(): Promise<readonly EmbeddedFontFace[]>;
|
|
18
|
+
export declare function loadCodeFontFaces(): Promise<readonly EmbeddedFontFace[]>;
|
|
19
|
+
export {};
|
package/dist/font.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { sha256 } from "./hash.js";
|
|
3
|
+
const INTER_WEIGHTS = [400, 700];
|
|
4
|
+
const CODE_FONT_WEIGHTS = [400];
|
|
5
|
+
const INTER_SUBSET_RANGES = [
|
|
6
|
+
{
|
|
7
|
+
name: "cyrillic-ext",
|
|
8
|
+
unicodeRange: "U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F",
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
name: "cyrillic",
|
|
12
|
+
unicodeRange: "U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116",
|
|
13
|
+
},
|
|
14
|
+
{ name: "greek-ext", unicodeRange: "U+1F00-1FFF" },
|
|
15
|
+
{
|
|
16
|
+
name: "greek",
|
|
17
|
+
unicodeRange: "U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF",
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "vietnamese",
|
|
21
|
+
unicodeRange: "U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB",
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: "latin-ext",
|
|
25
|
+
unicodeRange: "U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "latin",
|
|
29
|
+
unicodeRange: "U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD",
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
const INTER_CODE_POINT_RANGES = INTER_SUBSET_RANGES.flatMap((subset) => subset.unicodeRange.split(",").map((entry) => {
|
|
33
|
+
const [startText, endText] = entry.slice(2).split("-");
|
|
34
|
+
const start = Number.parseInt(startText ?? "", 16);
|
|
35
|
+
const end = endText === undefined ? start : Number.parseInt(endText, 16);
|
|
36
|
+
return [start, end];
|
|
37
|
+
}));
|
|
38
|
+
export class FontCoverageError extends Error {
|
|
39
|
+
codePoint;
|
|
40
|
+
constructor(codePoint) {
|
|
41
|
+
super(`The default Theme font does not contain U+${codePoint.toString(16).toUpperCase().padStart(4, "0")}.`);
|
|
42
|
+
this.name = "FontCoverageError";
|
|
43
|
+
this.codePoint = codePoint;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function assertInterFontCoverage(values) {
|
|
47
|
+
for (const value of values) {
|
|
48
|
+
for (const character of value) {
|
|
49
|
+
const codePoint = character.codePointAt(0);
|
|
50
|
+
if (codePoint !== undefined &&
|
|
51
|
+
!INTER_CODE_POINT_RANGES.some(([start, end]) => codePoint >= start && codePoint <= end)) {
|
|
52
|
+
throw new FontCoverageError(codePoint);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function loadFontFaces(packageName, filePrefix, family, subsets, weights) {
|
|
58
|
+
const descriptors = subsets.flatMap((subset) => weights.map((weight) => ({ ...subset, family, weight })));
|
|
59
|
+
return Promise.all(descriptors.map(async (descriptor) => {
|
|
60
|
+
const moduleUrl = import.meta.resolve(`${packageName}/files/${filePrefix}-${descriptor.name}-${descriptor.weight}-normal.woff2`);
|
|
61
|
+
const bytes = await readFile(new URL(moduleUrl));
|
|
62
|
+
return Object.freeze({
|
|
63
|
+
...descriptor,
|
|
64
|
+
data: bytes.toString("base64"),
|
|
65
|
+
sourceHash: sha256(bytes),
|
|
66
|
+
});
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
export function loadInterFontFaces() {
|
|
70
|
+
return loadFontFaces("@fontsource/inter", "inter", "Inter", INTER_SUBSET_RANGES, INTER_WEIGHTS);
|
|
71
|
+
}
|
|
72
|
+
export function loadCodeFontFaces() {
|
|
73
|
+
return loadFontFaces("@fontsource/jetbrains-mono", "jetbrains-mono", "JetBrains Mono", INTER_SUBSET_RANGES.filter(({ name }) => name !== "greek-ext"), CODE_FONT_WEIGHTS);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=font.js.map
|
package/dist/font.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"font.js","sourceRoot":"","sources":["../src/font.ts"],"names":[],"mappings":"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"}
|
package/dist/format.d.ts
ADDED