remark-docx 0.3.11 → 0.3.12
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 +1 -1
- package/lib/plugins/math/index.cjs +91 -346
- package/lib/plugins/math/index.cjs.map +1 -1
- package/lib/plugins/math/index.d.ts +6 -0
- package/lib/plugins/math/index.js +92 -347
- package/lib/plugins/math/index.js.map +1 -1
- package/package.json +4 -2
- package/lib/plugins/math/parser.d.ts +0 -1
package/README.md
CHANGED
|
@@ -131,7 +131,7 @@ const processor = unified()
|
|
|
131
131
|
|
|
132
132
|
### Math
|
|
133
133
|
|
|
134
|
-
Render LaTeX with [
|
|
134
|
+
Render LaTeX with [MathJax](https://github.com/mathjax/MathJax).
|
|
135
135
|
|
|
136
136
|
```javascript
|
|
137
137
|
import { unified } from "unified";
|
|
@@ -1,374 +1,119 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var docx = require('docx');
|
|
4
|
-
var
|
|
4
|
+
var mathml2omml = require('mathml2omml');
|
|
5
|
+
var fastXmlParser = require('fast-xml-parser');
|
|
6
|
+
var mathjax_js = require('@mathjax/src/js/mathjax.js');
|
|
7
|
+
var tex_js = require('@mathjax/src/js/input/tex.js');
|
|
8
|
+
var SerializedMmlVisitor_js = require('@mathjax/src/js/core/MmlTree/SerializedMmlVisitor.js');
|
|
9
|
+
var MathItem_js = require('@mathjax/src/js/core/MathItem.js');
|
|
10
|
+
var liteAdaptor_js = require('@mathjax/src/js/adaptors/liteAdaptor.js');
|
|
11
|
+
var html_js = require('@mathjax/src/js/handlers/html.js');
|
|
12
|
+
var loader_js = require('@mathjax/src/js/components/loader.js');
|
|
13
|
+
require('@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js');
|
|
14
|
+
require('@mathjax/src/components/js/input/tex/extensions/ams/ams.js');
|
|
15
|
+
require('@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js');
|
|
16
|
+
require('@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js');
|
|
17
|
+
require('@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js');
|
|
18
|
+
require('@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js');
|
|
5
19
|
|
|
6
|
-
|
|
7
|
-
|
|
20
|
+
// https://devblogs.microsoft.com/math-in-office/officemath/
|
|
21
|
+
class MathAttributeComponent extends docx.XmlAttributeComponent {
|
|
8
22
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
switch (n.content) {
|
|
19
|
-
case "#":
|
|
20
|
-
return mapString("#");
|
|
21
|
-
case "$":
|
|
22
|
-
return mapString("$");
|
|
23
|
-
case "%":
|
|
24
|
-
return mapString("%");
|
|
25
|
-
case "&":
|
|
26
|
-
return mapString("&");
|
|
27
|
-
case "textasciitilde":
|
|
28
|
-
return mapString("~");
|
|
29
|
-
case "textasciicircum":
|
|
30
|
-
return mapString("^");
|
|
31
|
-
case "textbackslash":
|
|
32
|
-
return mapString("∖");
|
|
33
|
-
case "{":
|
|
34
|
-
return mapString("{");
|
|
35
|
-
case "}":
|
|
36
|
-
return mapString("}");
|
|
37
|
-
case "textbar":
|
|
38
|
-
return mapString("|");
|
|
39
|
-
case "textless":
|
|
40
|
-
return mapString("<");
|
|
41
|
-
case "textgreater":
|
|
42
|
-
return mapString(">");
|
|
43
|
-
case "neq":
|
|
44
|
-
return mapString("≠");
|
|
45
|
-
case "sim":
|
|
46
|
-
return mapString("∼");
|
|
47
|
-
case "simeq":
|
|
48
|
-
return mapString("≃");
|
|
49
|
-
case "approx":
|
|
50
|
-
return mapString("≈");
|
|
51
|
-
case "fallingdotseq":
|
|
52
|
-
return mapString("≒");
|
|
53
|
-
case "risingdotseq":
|
|
54
|
-
return mapString("≓");
|
|
55
|
-
case "equiv":
|
|
56
|
-
return mapString("≡");
|
|
57
|
-
case "geq":
|
|
58
|
-
return mapString("≥");
|
|
59
|
-
case "geqq":
|
|
60
|
-
return mapString("≧");
|
|
61
|
-
case "leq":
|
|
62
|
-
return mapString("≤");
|
|
63
|
-
case "leqq":
|
|
64
|
-
return mapString("≦");
|
|
65
|
-
case "gg":
|
|
66
|
-
return mapString("≫");
|
|
67
|
-
case "ll":
|
|
68
|
-
return mapString("≪");
|
|
69
|
-
case "times":
|
|
70
|
-
return mapString("×");
|
|
71
|
-
case "div":
|
|
72
|
-
return mapString("÷");
|
|
73
|
-
case "pm":
|
|
74
|
-
return mapString("±");
|
|
75
|
-
case "mp":
|
|
76
|
-
return mapString("∓");
|
|
77
|
-
case "oplus":
|
|
78
|
-
return mapString("⊕");
|
|
79
|
-
case "ominus":
|
|
80
|
-
return mapString("⊖");
|
|
81
|
-
case "otimes":
|
|
82
|
-
return mapString("⊗");
|
|
83
|
-
case "oslash":
|
|
84
|
-
return mapString("⊘");
|
|
85
|
-
case "circ":
|
|
86
|
-
return mapString("∘");
|
|
87
|
-
case "cdot":
|
|
88
|
-
return mapString("⋅");
|
|
89
|
-
case "bullet":
|
|
90
|
-
return mapString("∙");
|
|
91
|
-
case "ltimes":
|
|
92
|
-
return mapString("⋉");
|
|
93
|
-
case "rtimes":
|
|
94
|
-
return mapString("⋊");
|
|
95
|
-
case "in":
|
|
96
|
-
return mapString("∈");
|
|
97
|
-
case "ni":
|
|
98
|
-
return mapString("∋");
|
|
99
|
-
case "notin":
|
|
100
|
-
return mapString("∉");
|
|
101
|
-
case "subset":
|
|
102
|
-
return mapString("⊂");
|
|
103
|
-
case "supset":
|
|
104
|
-
return mapString("⊃");
|
|
105
|
-
case "subseteq":
|
|
106
|
-
return mapString("⊆");
|
|
107
|
-
case "supseteq":
|
|
108
|
-
return mapString("⊇");
|
|
109
|
-
case "nsubseteq":
|
|
110
|
-
return mapString("⊈");
|
|
111
|
-
case "nsupseteq":
|
|
112
|
-
return mapString("⊉");
|
|
113
|
-
case "subsetneq":
|
|
114
|
-
return mapString("⊊");
|
|
115
|
-
case "supsetneq":
|
|
116
|
-
return mapString("⊋");
|
|
117
|
-
case "cap":
|
|
118
|
-
return mapString("∩");
|
|
119
|
-
case "cup":
|
|
120
|
-
return mapString("∪");
|
|
121
|
-
case "emptyset":
|
|
122
|
-
return mapString("∅");
|
|
123
|
-
case "infty":
|
|
124
|
-
return mapString("∞");
|
|
125
|
-
case "partial":
|
|
126
|
-
return mapString("∂");
|
|
127
|
-
case "aleph":
|
|
128
|
-
return mapString("ℵ");
|
|
129
|
-
case "hbar":
|
|
130
|
-
return mapString("ℏ");
|
|
131
|
-
case "wp":
|
|
132
|
-
return mapString("℘");
|
|
133
|
-
case "Re":
|
|
134
|
-
return mapString("ℜ");
|
|
135
|
-
case "Im":
|
|
136
|
-
return mapString("ℑ");
|
|
137
|
-
case "alpha":
|
|
138
|
-
return mapString("α");
|
|
139
|
-
case "beta":
|
|
140
|
-
return mapString("β");
|
|
141
|
-
case "gamma":
|
|
142
|
-
return mapString("γ");
|
|
143
|
-
case "delta":
|
|
144
|
-
return mapString("δ");
|
|
145
|
-
case "epsilon":
|
|
146
|
-
return mapString("ϵ");
|
|
147
|
-
case "zeta":
|
|
148
|
-
return mapString("ζ");
|
|
149
|
-
case "eta":
|
|
150
|
-
return mapString("η");
|
|
151
|
-
case "theta":
|
|
152
|
-
return mapString("θ");
|
|
153
|
-
case "iota":
|
|
154
|
-
return mapString("ι");
|
|
155
|
-
case "kappa":
|
|
156
|
-
return mapString("κ");
|
|
157
|
-
case "lambda":
|
|
158
|
-
return mapString("λ");
|
|
159
|
-
case "eta":
|
|
160
|
-
return mapString("η");
|
|
161
|
-
case "mu":
|
|
162
|
-
return mapString("μ");
|
|
163
|
-
case "nu":
|
|
164
|
-
return mapString("ν");
|
|
165
|
-
case "xi":
|
|
166
|
-
return mapString("ξ");
|
|
167
|
-
case "pi":
|
|
168
|
-
return mapString("π");
|
|
169
|
-
case "rho":
|
|
170
|
-
return mapString("ρ");
|
|
171
|
-
case "sigma":
|
|
172
|
-
return mapString("σ");
|
|
173
|
-
case "tau":
|
|
174
|
-
return mapString("τ");
|
|
175
|
-
case "upsilon":
|
|
176
|
-
return mapString("υ");
|
|
177
|
-
case "phi":
|
|
178
|
-
return mapString("ϕ");
|
|
179
|
-
case "chi":
|
|
180
|
-
return mapString("χ");
|
|
181
|
-
case "psi":
|
|
182
|
-
return mapString("ψ");
|
|
183
|
-
case "omega":
|
|
184
|
-
return mapString("ω");
|
|
185
|
-
case "varepsilon":
|
|
186
|
-
return mapString("ε");
|
|
187
|
-
case "vartheta":
|
|
188
|
-
return mapString("ϑ");
|
|
189
|
-
case "varrho":
|
|
190
|
-
return mapString("ϱ");
|
|
191
|
-
case "varsigma":
|
|
192
|
-
return mapString("ς");
|
|
193
|
-
case "varphi":
|
|
194
|
-
return mapString("φ");
|
|
195
|
-
case "Gamma":
|
|
196
|
-
return mapString("Γ");
|
|
197
|
-
case "Delta":
|
|
198
|
-
return mapString("Δ");
|
|
199
|
-
case "Theta":
|
|
200
|
-
return mapString("Θ");
|
|
201
|
-
case "Lambda":
|
|
202
|
-
return mapString("Λ");
|
|
203
|
-
case "Xi":
|
|
204
|
-
return mapString("Ξ");
|
|
205
|
-
case "Pi":
|
|
206
|
-
return mapString("Π");
|
|
207
|
-
case "Sigma":
|
|
208
|
-
return mapString("Σ");
|
|
209
|
-
case "Upsilon":
|
|
210
|
-
return mapString("Υ");
|
|
211
|
-
case "Phi":
|
|
212
|
-
return mapString("Φ");
|
|
213
|
-
case "Psi":
|
|
214
|
-
return mapString("Ψ");
|
|
215
|
-
case "Omega":
|
|
216
|
-
return mapString("Ω");
|
|
217
|
-
case "newline":
|
|
218
|
-
case "\\":
|
|
219
|
-
// line break
|
|
220
|
-
return false;
|
|
221
|
-
case "^": {
|
|
222
|
-
const prev = runs.pop();
|
|
223
|
-
if (!prev)
|
|
224
|
-
break;
|
|
225
|
-
return new docx.MathSuperScript({
|
|
226
|
-
children: [prev],
|
|
227
|
-
superScript: mapGroup((_c = (_b = (_a = n.args) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.content) !== null && _c !== void 0 ? _c : []),
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
case "_": {
|
|
231
|
-
const prev = runs.pop();
|
|
232
|
-
if (!prev)
|
|
233
|
-
break;
|
|
234
|
-
return new docx.MathSubScript({
|
|
235
|
-
children: [prev],
|
|
236
|
-
subScript: mapGroup((_f = (_e = (_d = n.args) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.content) !== null && _f !== void 0 ? _f : []),
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
case "hat":
|
|
240
|
-
// TODO: implement
|
|
241
|
-
break;
|
|
242
|
-
case "widehat":
|
|
243
|
-
// TODO: implement
|
|
244
|
-
break;
|
|
245
|
-
case "sum": {
|
|
246
|
-
// TODO: support superscript and subscript
|
|
247
|
-
return new docx.MathSum({
|
|
248
|
-
children: [],
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
case "int":
|
|
252
|
-
return mapString("∫");
|
|
253
|
-
case "frac":
|
|
254
|
-
case "tfrac":
|
|
255
|
-
case "dfrac": {
|
|
256
|
-
const args = (_g = n.args) !== null && _g !== void 0 ? _g : [];
|
|
257
|
-
if (args.length === 2 &&
|
|
258
|
-
hasCurlyBrackets(args[0]) &&
|
|
259
|
-
hasCurlyBrackets(args[1])) {
|
|
260
|
-
return new docx.MathFraction({
|
|
261
|
-
numerator: mapGroup(args[0].content),
|
|
262
|
-
denominator: mapGroup(args[1].content),
|
|
263
|
-
});
|
|
23
|
+
class MathXmlComponent extends docx.XmlComponent {
|
|
24
|
+
constructor(rootKey, children, attrs) {
|
|
25
|
+
super(rootKey);
|
|
26
|
+
if (attrs) {
|
|
27
|
+
const mathAttrs = {};
|
|
28
|
+
for (const [k, v] of Object.entries(attrs)) {
|
|
29
|
+
if (k.startsWith("m:")) {
|
|
30
|
+
mathAttrs[k] = v;
|
|
31
|
+
}
|
|
264
32
|
}
|
|
265
|
-
|
|
33
|
+
this.root.push(new MathAttributeComponent(mathAttrs));
|
|
266
34
|
}
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
if (args.length === 1 && hasCurlyBrackets(args[0])) {
|
|
270
|
-
return new docx.MathRadical({
|
|
271
|
-
children: mapGroup(args[0].content),
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
if (args.length === 2 &&
|
|
275
|
-
hasSquareBrackets(args[0]) &&
|
|
276
|
-
hasCurlyBrackets(args[1])) {
|
|
277
|
-
return new docx.MathRadical({
|
|
278
|
-
children: mapGroup(args[1].content),
|
|
279
|
-
degree: mapGroup(args[0].content),
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
break;
|
|
35
|
+
if (children.length) {
|
|
36
|
+
this.root.push(...children);
|
|
283
37
|
}
|
|
284
38
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
const
|
|
288
|
-
const
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
switch (n.type) {
|
|
296
|
-
case "root":
|
|
297
|
-
break;
|
|
298
|
-
case "string":
|
|
299
|
-
return [mapString(n.content)];
|
|
300
|
-
case "whitespace":
|
|
301
|
-
break;
|
|
302
|
-
case "parbreak":
|
|
303
|
-
break;
|
|
304
|
-
case "comment":
|
|
39
|
+
}
|
|
40
|
+
const isXmlText = (o) => "#text" in o;
|
|
41
|
+
const buildElement = (o) => {
|
|
42
|
+
const attrs = o[":@"];
|
|
43
|
+
let tagName = "";
|
|
44
|
+
let children;
|
|
45
|
+
for (const k of Object.keys(o)) {
|
|
46
|
+
if (k !== ":@") {
|
|
47
|
+
tagName = k;
|
|
48
|
+
children = o[k];
|
|
305
49
|
break;
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (tagName.startsWith("m:")) {
|
|
53
|
+
const mathChildren = [];
|
|
54
|
+
for (const n of children !== null && children !== void 0 ? children : []) {
|
|
55
|
+
if (isXmlText(n)) {
|
|
56
|
+
const text = n["#text"];
|
|
57
|
+
mathChildren.push(String(text));
|
|
311
58
|
}
|
|
312
59
|
else {
|
|
313
|
-
|
|
60
|
+
const c = buildElement(n);
|
|
61
|
+
if (c) {
|
|
62
|
+
mathChildren.push(c);
|
|
63
|
+
}
|
|
314
64
|
}
|
|
315
|
-
case "environment":
|
|
316
|
-
case "mathenv":
|
|
317
|
-
break;
|
|
318
|
-
case "verbatim":
|
|
319
|
-
break;
|
|
320
|
-
case "inlinemath":
|
|
321
|
-
break;
|
|
322
|
-
case "displaymath":
|
|
323
|
-
break;
|
|
324
|
-
case "group":
|
|
325
|
-
return mapGroup(n.content);
|
|
326
|
-
case "verb":
|
|
327
|
-
break;
|
|
328
|
-
default:
|
|
329
|
-
invariant(false, "unreachable");
|
|
330
|
-
}
|
|
331
|
-
return [];
|
|
332
|
-
};
|
|
333
|
-
/**
|
|
334
|
-
* @internal
|
|
335
|
-
*/
|
|
336
|
-
const parseLatex = (value) => {
|
|
337
|
-
const parsed = unifiedLatexUtilParse.parseMath(value);
|
|
338
|
-
const paragraphs = [[]];
|
|
339
|
-
let runs = paragraphs[0];
|
|
340
|
-
for (const n of parsed) {
|
|
341
|
-
const res = mapNode(n, runs);
|
|
342
|
-
if (!res) {
|
|
343
|
-
// line break
|
|
344
|
-
paragraphs.push((runs = []));
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
runs.push(...res);
|
|
348
65
|
}
|
|
66
|
+
return new MathXmlComponent(tagName, mathChildren, attrs);
|
|
349
67
|
}
|
|
350
|
-
return
|
|
68
|
+
return null;
|
|
351
69
|
};
|
|
352
|
-
|
|
353
70
|
/**
|
|
354
71
|
* A plugin to render latex inside "math" and "inlineMath" nodes
|
|
355
72
|
*/
|
|
356
73
|
const latexPlugin = () => {
|
|
74
|
+
// https://github.com/mathjax/MathJax-demos-node/blob/master/mjs/mixed/tex2mml
|
|
75
|
+
// https://github.com/mathjax/MathJax-src/blob/master/components/mjs/input/tex/tex.js
|
|
76
|
+
// https://github.com/mathjax/MathJax-src/blob/master/ts/components/startup.ts#L490
|
|
77
|
+
// https://github.com/mathjax/MathJax-src/blob/master/testsuite/src/setupTex.ts#L162
|
|
78
|
+
html_js.RegisterHTMLHandler(liteAdaptor_js.liteAdaptor());
|
|
79
|
+
const load = [
|
|
80
|
+
"[tex]/noerrors",
|
|
81
|
+
"[tex]/ams",
|
|
82
|
+
"[tex]/newcommand",
|
|
83
|
+
"[tex]/boldsymbol",
|
|
84
|
+
"[tex]/textmacros",
|
|
85
|
+
"[tex]/unicode",
|
|
86
|
+
];
|
|
87
|
+
const packages = ["base"].concat(load.map((name) => name.slice(6)));
|
|
88
|
+
loader_js.Loader.preLoaded(...load);
|
|
89
|
+
const tex = new tex_js.TeX({ packages });
|
|
90
|
+
const doc = mathjax_js.mathjax.document("", { InputJax: tex });
|
|
91
|
+
const visitor = new SerializedMmlVisitor_js.SerializedMmlVisitor();
|
|
92
|
+
const parser = new fastXmlParser.XMLParser({
|
|
93
|
+
ignoreAttributes: false,
|
|
94
|
+
preserveOrder: true,
|
|
95
|
+
attributeNamePrefix: "",
|
|
96
|
+
});
|
|
97
|
+
const parseLatex = (value) => {
|
|
98
|
+
const node = doc.convert(value, { end: MathItem_js.STATE["CONVERT"] });
|
|
99
|
+
const mathml = visitor.visitTree(node);
|
|
100
|
+
const omml = mathml2omml.mml2omml(mathml);
|
|
101
|
+
const obj = parser.parse(omml);
|
|
102
|
+
return buildElement(obj[0]);
|
|
103
|
+
};
|
|
357
104
|
return async () => {
|
|
358
105
|
return {
|
|
359
106
|
math: ({ value }) => {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
],
|
|
366
|
-
})
|
|
107
|
+
const math = parseLatex(value);
|
|
108
|
+
if (!math) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return new docx.Paragraph({
|
|
112
|
+
children: [math],
|
|
113
|
+
});
|
|
367
114
|
},
|
|
368
115
|
inlineMath: ({ value }) => {
|
|
369
|
-
return
|
|
370
|
-
children: parseLatex(value).flatMap((runs) => runs),
|
|
371
|
-
});
|
|
116
|
+
return parseLatex(value);
|
|
372
117
|
},
|
|
373
118
|
};
|
|
374
119
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/plugins/math/parser.ts","../../../src/plugins/math/index.ts"],"sourcesContent":["import {\n MathRun,\n MathSuperScript,\n MathSubScript,\n MathRadical,\n MathFraction,\n MathSum,\n} from \"docx\";\nimport { parseMath } from \"@unified-latex/unified-latex-util-parse\";\nimport type * as latex from \"@unified-latex/unified-latex-types\";\n\nfunction invariant(cond: any, message: string): asserts cond {\n if (!cond) throw new Error(message);\n}\n\nconst hasSquareBrackets = (\n arg: latex.Argument | undefined,\n): arg is latex.Argument => {\n return !!arg && arg.openMark === \"[\" && arg.closeMark === \"]\";\n};\nconst hasCurlyBrackets = (\n arg: latex.Argument | undefined,\n): arg is latex.Argument => {\n return !!arg && arg.openMark === \"{\" && arg.closeMark === \"}\";\n};\n\nconst mapString = (s: string): MathRun => new MathRun(s);\n\nconst mapMacro = (n: latex.Macro, runs: MathRun[]): MathRun | false => {\n switch (n.content) {\n case \"#\":\n return mapString(\"#\");\n case \"$\":\n return mapString(\"$\");\n case \"%\":\n return mapString(\"%\");\n case \"&\":\n return mapString(\"&\");\n case \"textasciitilde\":\n return mapString(\"~\");\n case \"textasciicircum\":\n return mapString(\"^\");\n case \"textbackslash\":\n return mapString(\"∖\");\n case \"{\":\n return mapString(\"{\");\n case \"}\":\n return mapString(\"}\");\n case \"textbar\":\n return mapString(\"|\");\n case \"textless\":\n return mapString(\"<\");\n case \"textgreater\":\n return mapString(\">\");\n case \"neq\":\n return mapString(\"≠\");\n case \"sim\":\n return mapString(\"∼\");\n case \"simeq\":\n return mapString(\"≃\");\n case \"approx\":\n return mapString(\"≈\");\n case \"fallingdotseq\":\n return mapString(\"≒\");\n case \"risingdotseq\":\n return mapString(\"≓\");\n case \"equiv\":\n return mapString(\"≡\");\n case \"geq\":\n return mapString(\"≥\");\n case \"geqq\":\n return mapString(\"≧\");\n case \"leq\":\n return mapString(\"≤\");\n case \"leqq\":\n return mapString(\"≦\");\n case \"gg\":\n return mapString(\"≫\");\n case \"ll\":\n return mapString(\"≪\");\n case \"times\":\n return mapString(\"×\");\n case \"div\":\n return mapString(\"÷\");\n case \"pm\":\n return mapString(\"±\");\n case \"mp\":\n return mapString(\"∓\");\n case \"oplus\":\n return mapString(\"⊕\");\n case \"ominus\":\n return mapString(\"⊖\");\n case \"otimes\":\n return mapString(\"⊗\");\n case \"oslash\":\n return mapString(\"⊘\");\n case \"circ\":\n return mapString(\"∘\");\n case \"cdot\":\n return mapString(\"⋅\");\n case \"bullet\":\n return mapString(\"∙\");\n case \"ltimes\":\n return mapString(\"⋉\");\n case \"rtimes\":\n return mapString(\"⋊\");\n case \"in\":\n return mapString(\"∈\");\n case \"ni\":\n return mapString(\"∋\");\n case \"notin\":\n return mapString(\"∉\");\n case \"subset\":\n return mapString(\"⊂\");\n case \"supset\":\n return mapString(\"⊃\");\n case \"subseteq\":\n return mapString(\"⊆\");\n case \"supseteq\":\n return mapString(\"⊇\");\n case \"nsubseteq\":\n return mapString(\"⊈\");\n case \"nsupseteq\":\n return mapString(\"⊉\");\n case \"subsetneq\":\n return mapString(\"⊊\");\n case \"supsetneq\":\n return mapString(\"⊋\");\n case \"cap\":\n return mapString(\"∩\");\n case \"cup\":\n return mapString(\"∪\");\n case \"emptyset\":\n return mapString(\"∅\");\n case \"infty\":\n return mapString(\"∞\");\n case \"partial\":\n return mapString(\"∂\");\n case \"aleph\":\n return mapString(\"ℵ\");\n case \"hbar\":\n return mapString(\"ℏ\");\n case \"wp\":\n return mapString(\"℘\");\n case \"Re\":\n return mapString(\"ℜ\");\n case \"Im\":\n return mapString(\"ℑ\");\n case \"alpha\":\n return mapString(\"α\");\n case \"beta\":\n return mapString(\"β\");\n case \"gamma\":\n return mapString(\"γ\");\n case \"delta\":\n return mapString(\"δ\");\n case \"epsilon\":\n return mapString(\"ϵ\");\n case \"zeta\":\n return mapString(\"ζ\");\n case \"eta\":\n return mapString(\"η\");\n case \"theta\":\n return mapString(\"θ\");\n case \"iota\":\n return mapString(\"ι\");\n case \"kappa\":\n return mapString(\"κ\");\n case \"lambda\":\n return mapString(\"λ\");\n case \"eta\":\n return mapString(\"η\");\n case \"mu\":\n return mapString(\"μ\");\n case \"nu\":\n return mapString(\"ν\");\n case \"xi\":\n return mapString(\"ξ\");\n case \"pi\":\n return mapString(\"π\");\n case \"rho\":\n return mapString(\"ρ\");\n case \"sigma\":\n return mapString(\"σ\");\n case \"tau\":\n return mapString(\"τ\");\n case \"upsilon\":\n return mapString(\"υ\");\n case \"phi\":\n return mapString(\"ϕ\");\n case \"chi\":\n return mapString(\"χ\");\n case \"psi\":\n return mapString(\"ψ\");\n case \"omega\":\n return mapString(\"ω\");\n case \"varepsilon\":\n return mapString(\"ε\");\n case \"vartheta\":\n return mapString(\"ϑ\");\n case \"varrho\":\n return mapString(\"ϱ\");\n case \"varsigma\":\n return mapString(\"ς\");\n case \"varphi\":\n return mapString(\"φ\");\n case \"Gamma\":\n return mapString(\"Γ\");\n case \"Delta\":\n return mapString(\"Δ\");\n case \"Theta\":\n return mapString(\"Θ\");\n case \"Lambda\":\n return mapString(\"Λ\");\n case \"Xi\":\n return mapString(\"Ξ\");\n case \"Pi\":\n return mapString(\"Π\");\n case \"Sigma\":\n return mapString(\"Σ\");\n case \"Upsilon\":\n return mapString(\"Υ\");\n case \"Phi\":\n return mapString(\"Φ\");\n case \"Psi\":\n return mapString(\"Ψ\");\n case \"Omega\":\n return mapString(\"Ω\");\n case \"newline\":\n case \"\\\\\":\n // line break\n return false;\n case \"^\": {\n const prev = runs.pop();\n if (!prev) break;\n return new MathSuperScript({\n children: [prev],\n superScript: mapGroup(n.args?.[0]?.content ?? []),\n });\n }\n case \"_\": {\n const prev = runs.pop();\n if (!prev) break;\n return new MathSubScript({\n children: [prev],\n subScript: mapGroup(n.args?.[0]?.content ?? []),\n });\n }\n case \"hat\":\n // TODO: implement\n break;\n case \"widehat\":\n // TODO: implement\n break;\n case \"sum\": {\n // TODO: support superscript and subscript\n return new MathSum({\n children: [],\n });\n }\n case \"int\":\n return mapString(\"∫\");\n case \"frac\":\n case \"tfrac\":\n case \"dfrac\": {\n const args = n.args ?? [];\n if (\n args.length === 2 &&\n hasCurlyBrackets(args[0]) &&\n hasCurlyBrackets(args[1])\n ) {\n return new MathFraction({\n numerator: mapGroup(args[0].content),\n denominator: mapGroup(args[1].content),\n });\n }\n break;\n }\n case \"sqrt\": {\n const args = n.args ?? [];\n if (args.length === 1 && hasCurlyBrackets(args[0])) {\n return new MathRadical({\n children: mapGroup(args[0].content),\n });\n }\n if (\n args.length === 2 &&\n hasSquareBrackets(args[0]) &&\n hasCurlyBrackets(args[1])\n ) {\n return new MathRadical({\n children: mapGroup(args[1].content),\n degree: mapGroup(args[0].content),\n });\n }\n break;\n }\n default:\n break;\n }\n return mapString(n.content);\n};\n\nconst mapGroup = (nodes: latex.Node[]): MathRun[] => {\n const group: MathRun[] = [];\n for (const c of nodes) {\n group.push(...(mapNode(c, group) || []));\n }\n return group;\n};\n\nconst mapNode = (n: latex.Node, runs: MathRun[]): MathRun[] | false => {\n switch (n.type) {\n case \"root\":\n break;\n case \"string\":\n return [mapString(n.content)];\n case \"whitespace\":\n break;\n case \"parbreak\":\n break;\n case \"comment\":\n break;\n case \"macro\":\n const run = mapMacro(n, runs);\n if (!run) {\n // line break\n return false;\n } else {\n return [run];\n }\n case \"environment\":\n case \"mathenv\":\n break;\n case \"verbatim\":\n break;\n case \"inlinemath\":\n break;\n case \"displaymath\":\n break;\n case \"group\":\n return mapGroup(n.content);\n case \"verb\":\n break;\n default:\n invariant(false, \"unreachable\");\n }\n\n return [];\n};\n\n/**\n * @internal\n */\nexport const parseLatex = (value: string): MathRun[][] => {\n const parsed = parseMath(value);\n const paragraphs: MathRun[][] = [[]];\n let runs: MathRun[] = paragraphs[0]!;\n for (const n of parsed) {\n const res = mapNode(n, runs);\n if (!res) {\n // line break\n paragraphs.push((runs = []));\n } else {\n runs.push(...res);\n }\n }\n return paragraphs;\n};\n","import type { RemarkDocxPlugin } from \"../../types\";\nimport { Math, Paragraph } from \"docx\";\nimport { parseLatex } from \"./parser\";\n\n/**\n * A plugin to render latex inside \"math\" and \"inlineMath\" nodes\n */\nexport const latexPlugin = (): RemarkDocxPlugin => {\n return async () => {\n return {\n math: ({ value }) => {\n return parseLatex(value).map(\n (runs) =>\n new Paragraph({\n children: [\n new Math({\n children: runs,\n }),\n ],\n }),\n );\n },\n inlineMath: ({ value }) => {\n return new Math({\n children: parseLatex(value).flatMap((runs) => runs),\n });\n },\n };\n };\n};\n"],"names":["MathRun","MathSuperScript","MathSubScript","MathSum","MathFraction","MathRadical","parseMath","Paragraph","Math"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/plugins/math/index.ts"],"sourcesContent":["import type { RemarkDocxPlugin } from \"../../types\";\nimport { Paragraph, XmlAttributeComponent, XmlComponent } from \"docx\";\nimport { mml2omml } from \"mathml2omml\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { mathjax } from \"@mathjax/src/js/mathjax.js\";\nimport { TeX } from \"@mathjax/src/js/input/tex.js\";\nimport { SerializedMmlVisitor } from \"@mathjax/src/js/core/MmlTree/SerializedMmlVisitor.js\";\nimport { STATE } from \"@mathjax/src/js/core/MathItem.js\";\nimport { liteAdaptor } from \"@mathjax/src/js/adaptors/liteAdaptor.js\";\nimport { RegisterHTMLHandler } from \"@mathjax/src/js/handlers/html.js\";\n// import { source } from \"@mathjax/src/components/js/source.js\";\nimport { Loader } from \"@mathjax/src/js/components/loader.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/ams/ams.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js\";\n\n// https://devblogs.microsoft.com/math-in-office/officemath/\n\nclass MathAttributeComponent extends XmlAttributeComponent<\n Record<string, any>\n> {}\n\nclass MathXmlComponent extends XmlComponent {\n constructor(\n rootKey: string,\n children: (MathXmlComponent | string)[],\n attrs?: Record<string, any>,\n ) {\n super(rootKey);\n if (attrs) {\n const mathAttrs: Record<string, any> = {};\n for (const [k, v] of Object.entries(attrs)) {\n if (k.startsWith(\"m:\")) {\n mathAttrs[k] = v;\n }\n }\n this.root.push(new MathAttributeComponent(mathAttrs));\n }\n if (children.length) {\n this.root.push(...children);\n }\n }\n}\n\ninterface XmlText {\n \"#text\": string | number | boolean;\n}\ninterface XmlAttr {\n [key: string]: string | number | boolean;\n}\ninterface XmlElement {\n [key: string]: typeof key extends \":@\" ? XmlAttr : XmlNode[];\n}\ntype XmlNode = XmlElement | XmlText;\n\nconst isXmlText = (o: XmlNode): o is XmlText => \"#text\" in o;\n\nconst buildElement = (o: XmlElement): XmlComponent | null => {\n const attrs = o[\":@\"];\n let tagName = \"\";\n let children: XmlNode[] | undefined;\n for (const k of Object.keys(o)) {\n if (k !== \":@\") {\n tagName = k;\n children = o[k];\n break;\n }\n }\n\n if (tagName.startsWith(\"m:\")) {\n const mathChildren: (MathXmlComponent | string)[] = [];\n for (const n of children ?? []) {\n if (isXmlText(n)) {\n const text = n[\"#text\"];\n mathChildren.push(String(text));\n } else {\n const c = buildElement(n);\n if (c) {\n mathChildren.push(c);\n }\n }\n }\n return new MathXmlComponent(tagName, mathChildren, attrs);\n }\n\n return null;\n};\n\n/**\n * A plugin to render latex inside \"math\" and \"inlineMath\" nodes\n */\nexport const latexPlugin = (): RemarkDocxPlugin => {\n // https://github.com/mathjax/MathJax-demos-node/blob/master/mjs/mixed/tex2mml\n // https://github.com/mathjax/MathJax-src/blob/master/components/mjs/input/tex/tex.js\n // https://github.com/mathjax/MathJax-src/blob/master/ts/components/startup.ts#L490\n // https://github.com/mathjax/MathJax-src/blob/master/testsuite/src/setupTex.ts#L162\n RegisterHTMLHandler(liteAdaptor() as any);\n\n const load = [\n \"[tex]/noerrors\",\n \"[tex]/ams\",\n \"[tex]/newcommand\",\n \"[tex]/boldsymbol\",\n \"[tex]/textmacros\",\n \"[tex]/unicode\",\n ];\n const packages = [\"base\"].concat(load.map((name) => name.slice(6)));\n Loader.preLoaded(...load);\n\n const tex = new TeX({ packages });\n const doc = mathjax.document(\"\", { InputJax: tex });\n const visitor = new SerializedMmlVisitor();\n\n const parser = new XMLParser({\n ignoreAttributes: false,\n preserveOrder: true,\n attributeNamePrefix: \"\",\n });\n\n const parseLatex = (value: string): XmlComponent | null => {\n const node = doc.convert(value, { end: STATE[\"CONVERT\"] });\n const mathml = visitor.visitTree(node);\n const omml = mml2omml(mathml);\n const obj = parser.parse(omml);\n return buildElement(obj[0]);\n };\n\n return async () => {\n return {\n math: ({ value }) => {\n const math = parseLatex(value);\n if (!math) {\n return null;\n }\n return new Paragraph({\n children: [math],\n });\n },\n inlineMath: ({ value }) => {\n return parseLatex(value);\n },\n };\n };\n};\n"],"names":["XmlAttributeComponent","XmlComponent","RegisterHTMLHandler","liteAdaptor","Loader","TeX","mathjax","SerializedMmlVisitor","XMLParser","STATE","mml2omml","Paragraph"],"mappings":"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"}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import type { RemarkDocxPlugin } from "../../types";
|
|
2
|
+
import "@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js";
|
|
3
|
+
import "@mathjax/src/components/js/input/tex/extensions/ams/ams.js";
|
|
4
|
+
import "@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js";
|
|
5
|
+
import "@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js";
|
|
6
|
+
import "@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js";
|
|
7
|
+
import "@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js";
|
|
2
8
|
/**
|
|
3
9
|
* A plugin to render latex inside "math" and "inlineMath" nodes
|
|
4
10
|
*/
|
|
@@ -1,372 +1,117 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { Paragraph, XmlComponent, XmlAttributeComponent } from 'docx';
|
|
2
|
+
import { mml2omml } from 'mathml2omml';
|
|
3
|
+
import { XMLParser } from 'fast-xml-parser';
|
|
4
|
+
import { mathjax } from '@mathjax/src/js/mathjax.js';
|
|
5
|
+
import { TeX } from '@mathjax/src/js/input/tex.js';
|
|
6
|
+
import { SerializedMmlVisitor } from '@mathjax/src/js/core/MmlTree/SerializedMmlVisitor.js';
|
|
7
|
+
import { STATE } from '@mathjax/src/js/core/MathItem.js';
|
|
8
|
+
import { liteAdaptor } from '@mathjax/src/js/adaptors/liteAdaptor.js';
|
|
9
|
+
import { RegisterHTMLHandler } from '@mathjax/src/js/handlers/html.js';
|
|
10
|
+
import { Loader } from '@mathjax/src/js/components/loader.js';
|
|
11
|
+
import '@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js';
|
|
12
|
+
import '@mathjax/src/components/js/input/tex/extensions/ams/ams.js';
|
|
13
|
+
import '@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js';
|
|
14
|
+
import '@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js';
|
|
15
|
+
import '@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js';
|
|
16
|
+
import '@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js';
|
|
3
17
|
|
|
4
|
-
|
|
5
|
-
|
|
18
|
+
// https://devblogs.microsoft.com/math-in-office/officemath/
|
|
19
|
+
class MathAttributeComponent extends XmlAttributeComponent {
|
|
6
20
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
switch (n.content) {
|
|
17
|
-
case "#":
|
|
18
|
-
return mapString("#");
|
|
19
|
-
case "$":
|
|
20
|
-
return mapString("$");
|
|
21
|
-
case "%":
|
|
22
|
-
return mapString("%");
|
|
23
|
-
case "&":
|
|
24
|
-
return mapString("&");
|
|
25
|
-
case "textasciitilde":
|
|
26
|
-
return mapString("~");
|
|
27
|
-
case "textasciicircum":
|
|
28
|
-
return mapString("^");
|
|
29
|
-
case "textbackslash":
|
|
30
|
-
return mapString("∖");
|
|
31
|
-
case "{":
|
|
32
|
-
return mapString("{");
|
|
33
|
-
case "}":
|
|
34
|
-
return mapString("}");
|
|
35
|
-
case "textbar":
|
|
36
|
-
return mapString("|");
|
|
37
|
-
case "textless":
|
|
38
|
-
return mapString("<");
|
|
39
|
-
case "textgreater":
|
|
40
|
-
return mapString(">");
|
|
41
|
-
case "neq":
|
|
42
|
-
return mapString("≠");
|
|
43
|
-
case "sim":
|
|
44
|
-
return mapString("∼");
|
|
45
|
-
case "simeq":
|
|
46
|
-
return mapString("≃");
|
|
47
|
-
case "approx":
|
|
48
|
-
return mapString("≈");
|
|
49
|
-
case "fallingdotseq":
|
|
50
|
-
return mapString("≒");
|
|
51
|
-
case "risingdotseq":
|
|
52
|
-
return mapString("≓");
|
|
53
|
-
case "equiv":
|
|
54
|
-
return mapString("≡");
|
|
55
|
-
case "geq":
|
|
56
|
-
return mapString("≥");
|
|
57
|
-
case "geqq":
|
|
58
|
-
return mapString("≧");
|
|
59
|
-
case "leq":
|
|
60
|
-
return mapString("≤");
|
|
61
|
-
case "leqq":
|
|
62
|
-
return mapString("≦");
|
|
63
|
-
case "gg":
|
|
64
|
-
return mapString("≫");
|
|
65
|
-
case "ll":
|
|
66
|
-
return mapString("≪");
|
|
67
|
-
case "times":
|
|
68
|
-
return mapString("×");
|
|
69
|
-
case "div":
|
|
70
|
-
return mapString("÷");
|
|
71
|
-
case "pm":
|
|
72
|
-
return mapString("±");
|
|
73
|
-
case "mp":
|
|
74
|
-
return mapString("∓");
|
|
75
|
-
case "oplus":
|
|
76
|
-
return mapString("⊕");
|
|
77
|
-
case "ominus":
|
|
78
|
-
return mapString("⊖");
|
|
79
|
-
case "otimes":
|
|
80
|
-
return mapString("⊗");
|
|
81
|
-
case "oslash":
|
|
82
|
-
return mapString("⊘");
|
|
83
|
-
case "circ":
|
|
84
|
-
return mapString("∘");
|
|
85
|
-
case "cdot":
|
|
86
|
-
return mapString("⋅");
|
|
87
|
-
case "bullet":
|
|
88
|
-
return mapString("∙");
|
|
89
|
-
case "ltimes":
|
|
90
|
-
return mapString("⋉");
|
|
91
|
-
case "rtimes":
|
|
92
|
-
return mapString("⋊");
|
|
93
|
-
case "in":
|
|
94
|
-
return mapString("∈");
|
|
95
|
-
case "ni":
|
|
96
|
-
return mapString("∋");
|
|
97
|
-
case "notin":
|
|
98
|
-
return mapString("∉");
|
|
99
|
-
case "subset":
|
|
100
|
-
return mapString("⊂");
|
|
101
|
-
case "supset":
|
|
102
|
-
return mapString("⊃");
|
|
103
|
-
case "subseteq":
|
|
104
|
-
return mapString("⊆");
|
|
105
|
-
case "supseteq":
|
|
106
|
-
return mapString("⊇");
|
|
107
|
-
case "nsubseteq":
|
|
108
|
-
return mapString("⊈");
|
|
109
|
-
case "nsupseteq":
|
|
110
|
-
return mapString("⊉");
|
|
111
|
-
case "subsetneq":
|
|
112
|
-
return mapString("⊊");
|
|
113
|
-
case "supsetneq":
|
|
114
|
-
return mapString("⊋");
|
|
115
|
-
case "cap":
|
|
116
|
-
return mapString("∩");
|
|
117
|
-
case "cup":
|
|
118
|
-
return mapString("∪");
|
|
119
|
-
case "emptyset":
|
|
120
|
-
return mapString("∅");
|
|
121
|
-
case "infty":
|
|
122
|
-
return mapString("∞");
|
|
123
|
-
case "partial":
|
|
124
|
-
return mapString("∂");
|
|
125
|
-
case "aleph":
|
|
126
|
-
return mapString("ℵ");
|
|
127
|
-
case "hbar":
|
|
128
|
-
return mapString("ℏ");
|
|
129
|
-
case "wp":
|
|
130
|
-
return mapString("℘");
|
|
131
|
-
case "Re":
|
|
132
|
-
return mapString("ℜ");
|
|
133
|
-
case "Im":
|
|
134
|
-
return mapString("ℑ");
|
|
135
|
-
case "alpha":
|
|
136
|
-
return mapString("α");
|
|
137
|
-
case "beta":
|
|
138
|
-
return mapString("β");
|
|
139
|
-
case "gamma":
|
|
140
|
-
return mapString("γ");
|
|
141
|
-
case "delta":
|
|
142
|
-
return mapString("δ");
|
|
143
|
-
case "epsilon":
|
|
144
|
-
return mapString("ϵ");
|
|
145
|
-
case "zeta":
|
|
146
|
-
return mapString("ζ");
|
|
147
|
-
case "eta":
|
|
148
|
-
return mapString("η");
|
|
149
|
-
case "theta":
|
|
150
|
-
return mapString("θ");
|
|
151
|
-
case "iota":
|
|
152
|
-
return mapString("ι");
|
|
153
|
-
case "kappa":
|
|
154
|
-
return mapString("κ");
|
|
155
|
-
case "lambda":
|
|
156
|
-
return mapString("λ");
|
|
157
|
-
case "eta":
|
|
158
|
-
return mapString("η");
|
|
159
|
-
case "mu":
|
|
160
|
-
return mapString("μ");
|
|
161
|
-
case "nu":
|
|
162
|
-
return mapString("ν");
|
|
163
|
-
case "xi":
|
|
164
|
-
return mapString("ξ");
|
|
165
|
-
case "pi":
|
|
166
|
-
return mapString("π");
|
|
167
|
-
case "rho":
|
|
168
|
-
return mapString("ρ");
|
|
169
|
-
case "sigma":
|
|
170
|
-
return mapString("σ");
|
|
171
|
-
case "tau":
|
|
172
|
-
return mapString("τ");
|
|
173
|
-
case "upsilon":
|
|
174
|
-
return mapString("υ");
|
|
175
|
-
case "phi":
|
|
176
|
-
return mapString("ϕ");
|
|
177
|
-
case "chi":
|
|
178
|
-
return mapString("χ");
|
|
179
|
-
case "psi":
|
|
180
|
-
return mapString("ψ");
|
|
181
|
-
case "omega":
|
|
182
|
-
return mapString("ω");
|
|
183
|
-
case "varepsilon":
|
|
184
|
-
return mapString("ε");
|
|
185
|
-
case "vartheta":
|
|
186
|
-
return mapString("ϑ");
|
|
187
|
-
case "varrho":
|
|
188
|
-
return mapString("ϱ");
|
|
189
|
-
case "varsigma":
|
|
190
|
-
return mapString("ς");
|
|
191
|
-
case "varphi":
|
|
192
|
-
return mapString("φ");
|
|
193
|
-
case "Gamma":
|
|
194
|
-
return mapString("Γ");
|
|
195
|
-
case "Delta":
|
|
196
|
-
return mapString("Δ");
|
|
197
|
-
case "Theta":
|
|
198
|
-
return mapString("Θ");
|
|
199
|
-
case "Lambda":
|
|
200
|
-
return mapString("Λ");
|
|
201
|
-
case "Xi":
|
|
202
|
-
return mapString("Ξ");
|
|
203
|
-
case "Pi":
|
|
204
|
-
return mapString("Π");
|
|
205
|
-
case "Sigma":
|
|
206
|
-
return mapString("Σ");
|
|
207
|
-
case "Upsilon":
|
|
208
|
-
return mapString("Υ");
|
|
209
|
-
case "Phi":
|
|
210
|
-
return mapString("Φ");
|
|
211
|
-
case "Psi":
|
|
212
|
-
return mapString("Ψ");
|
|
213
|
-
case "Omega":
|
|
214
|
-
return mapString("Ω");
|
|
215
|
-
case "newline":
|
|
216
|
-
case "\\":
|
|
217
|
-
// line break
|
|
218
|
-
return false;
|
|
219
|
-
case "^": {
|
|
220
|
-
const prev = runs.pop();
|
|
221
|
-
if (!prev)
|
|
222
|
-
break;
|
|
223
|
-
return new MathSuperScript({
|
|
224
|
-
children: [prev],
|
|
225
|
-
superScript: mapGroup((_c = (_b = (_a = n.args) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.content) !== null && _c !== void 0 ? _c : []),
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
case "_": {
|
|
229
|
-
const prev = runs.pop();
|
|
230
|
-
if (!prev)
|
|
231
|
-
break;
|
|
232
|
-
return new MathSubScript({
|
|
233
|
-
children: [prev],
|
|
234
|
-
subScript: mapGroup((_f = (_e = (_d = n.args) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.content) !== null && _f !== void 0 ? _f : []),
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
case "hat":
|
|
238
|
-
// TODO: implement
|
|
239
|
-
break;
|
|
240
|
-
case "widehat":
|
|
241
|
-
// TODO: implement
|
|
242
|
-
break;
|
|
243
|
-
case "sum": {
|
|
244
|
-
// TODO: support superscript and subscript
|
|
245
|
-
return new MathSum({
|
|
246
|
-
children: [],
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
case "int":
|
|
250
|
-
return mapString("∫");
|
|
251
|
-
case "frac":
|
|
252
|
-
case "tfrac":
|
|
253
|
-
case "dfrac": {
|
|
254
|
-
const args = (_g = n.args) !== null && _g !== void 0 ? _g : [];
|
|
255
|
-
if (args.length === 2 &&
|
|
256
|
-
hasCurlyBrackets(args[0]) &&
|
|
257
|
-
hasCurlyBrackets(args[1])) {
|
|
258
|
-
return new MathFraction({
|
|
259
|
-
numerator: mapGroup(args[0].content),
|
|
260
|
-
denominator: mapGroup(args[1].content),
|
|
261
|
-
});
|
|
21
|
+
class MathXmlComponent extends XmlComponent {
|
|
22
|
+
constructor(rootKey, children, attrs) {
|
|
23
|
+
super(rootKey);
|
|
24
|
+
if (attrs) {
|
|
25
|
+
const mathAttrs = {};
|
|
26
|
+
for (const [k, v] of Object.entries(attrs)) {
|
|
27
|
+
if (k.startsWith("m:")) {
|
|
28
|
+
mathAttrs[k] = v;
|
|
29
|
+
}
|
|
262
30
|
}
|
|
263
|
-
|
|
31
|
+
this.root.push(new MathAttributeComponent(mathAttrs));
|
|
264
32
|
}
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
if (args.length === 1 && hasCurlyBrackets(args[0])) {
|
|
268
|
-
return new MathRadical({
|
|
269
|
-
children: mapGroup(args[0].content),
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
if (args.length === 2 &&
|
|
273
|
-
hasSquareBrackets(args[0]) &&
|
|
274
|
-
hasCurlyBrackets(args[1])) {
|
|
275
|
-
return new MathRadical({
|
|
276
|
-
children: mapGroup(args[1].content),
|
|
277
|
-
degree: mapGroup(args[0].content),
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
break;
|
|
33
|
+
if (children.length) {
|
|
34
|
+
this.root.push(...children);
|
|
281
35
|
}
|
|
282
36
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
const
|
|
286
|
-
const
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
switch (n.type) {
|
|
294
|
-
case "root":
|
|
295
|
-
break;
|
|
296
|
-
case "string":
|
|
297
|
-
return [mapString(n.content)];
|
|
298
|
-
case "whitespace":
|
|
299
|
-
break;
|
|
300
|
-
case "parbreak":
|
|
301
|
-
break;
|
|
302
|
-
case "comment":
|
|
37
|
+
}
|
|
38
|
+
const isXmlText = (o) => "#text" in o;
|
|
39
|
+
const buildElement = (o) => {
|
|
40
|
+
const attrs = o[":@"];
|
|
41
|
+
let tagName = "";
|
|
42
|
+
let children;
|
|
43
|
+
for (const k of Object.keys(o)) {
|
|
44
|
+
if (k !== ":@") {
|
|
45
|
+
tagName = k;
|
|
46
|
+
children = o[k];
|
|
303
47
|
break;
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (tagName.startsWith("m:")) {
|
|
51
|
+
const mathChildren = [];
|
|
52
|
+
for (const n of children !== null && children !== void 0 ? children : []) {
|
|
53
|
+
if (isXmlText(n)) {
|
|
54
|
+
const text = n["#text"];
|
|
55
|
+
mathChildren.push(String(text));
|
|
309
56
|
}
|
|
310
57
|
else {
|
|
311
|
-
|
|
58
|
+
const c = buildElement(n);
|
|
59
|
+
if (c) {
|
|
60
|
+
mathChildren.push(c);
|
|
61
|
+
}
|
|
312
62
|
}
|
|
313
|
-
case "environment":
|
|
314
|
-
case "mathenv":
|
|
315
|
-
break;
|
|
316
|
-
case "verbatim":
|
|
317
|
-
break;
|
|
318
|
-
case "inlinemath":
|
|
319
|
-
break;
|
|
320
|
-
case "displaymath":
|
|
321
|
-
break;
|
|
322
|
-
case "group":
|
|
323
|
-
return mapGroup(n.content);
|
|
324
|
-
case "verb":
|
|
325
|
-
break;
|
|
326
|
-
default:
|
|
327
|
-
invariant(false, "unreachable");
|
|
328
|
-
}
|
|
329
|
-
return [];
|
|
330
|
-
};
|
|
331
|
-
/**
|
|
332
|
-
* @internal
|
|
333
|
-
*/
|
|
334
|
-
const parseLatex = (value) => {
|
|
335
|
-
const parsed = parseMath(value);
|
|
336
|
-
const paragraphs = [[]];
|
|
337
|
-
let runs = paragraphs[0];
|
|
338
|
-
for (const n of parsed) {
|
|
339
|
-
const res = mapNode(n, runs);
|
|
340
|
-
if (!res) {
|
|
341
|
-
// line break
|
|
342
|
-
paragraphs.push((runs = []));
|
|
343
|
-
}
|
|
344
|
-
else {
|
|
345
|
-
runs.push(...res);
|
|
346
63
|
}
|
|
64
|
+
return new MathXmlComponent(tagName, mathChildren, attrs);
|
|
347
65
|
}
|
|
348
|
-
return
|
|
66
|
+
return null;
|
|
349
67
|
};
|
|
350
|
-
|
|
351
68
|
/**
|
|
352
69
|
* A plugin to render latex inside "math" and "inlineMath" nodes
|
|
353
70
|
*/
|
|
354
71
|
const latexPlugin = () => {
|
|
72
|
+
// https://github.com/mathjax/MathJax-demos-node/blob/master/mjs/mixed/tex2mml
|
|
73
|
+
// https://github.com/mathjax/MathJax-src/blob/master/components/mjs/input/tex/tex.js
|
|
74
|
+
// https://github.com/mathjax/MathJax-src/blob/master/ts/components/startup.ts#L490
|
|
75
|
+
// https://github.com/mathjax/MathJax-src/blob/master/testsuite/src/setupTex.ts#L162
|
|
76
|
+
RegisterHTMLHandler(liteAdaptor());
|
|
77
|
+
const load = [
|
|
78
|
+
"[tex]/noerrors",
|
|
79
|
+
"[tex]/ams",
|
|
80
|
+
"[tex]/newcommand",
|
|
81
|
+
"[tex]/boldsymbol",
|
|
82
|
+
"[tex]/textmacros",
|
|
83
|
+
"[tex]/unicode",
|
|
84
|
+
];
|
|
85
|
+
const packages = ["base"].concat(load.map((name) => name.slice(6)));
|
|
86
|
+
Loader.preLoaded(...load);
|
|
87
|
+
const tex = new TeX({ packages });
|
|
88
|
+
const doc = mathjax.document("", { InputJax: tex });
|
|
89
|
+
const visitor = new SerializedMmlVisitor();
|
|
90
|
+
const parser = new XMLParser({
|
|
91
|
+
ignoreAttributes: false,
|
|
92
|
+
preserveOrder: true,
|
|
93
|
+
attributeNamePrefix: "",
|
|
94
|
+
});
|
|
95
|
+
const parseLatex = (value) => {
|
|
96
|
+
const node = doc.convert(value, { end: STATE["CONVERT"] });
|
|
97
|
+
const mathml = visitor.visitTree(node);
|
|
98
|
+
const omml = mml2omml(mathml);
|
|
99
|
+
const obj = parser.parse(omml);
|
|
100
|
+
return buildElement(obj[0]);
|
|
101
|
+
};
|
|
355
102
|
return async () => {
|
|
356
103
|
return {
|
|
357
104
|
math: ({ value }) => {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
],
|
|
364
|
-
})
|
|
105
|
+
const math = parseLatex(value);
|
|
106
|
+
if (!math) {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
return new Paragraph({
|
|
110
|
+
children: [math],
|
|
111
|
+
});
|
|
365
112
|
},
|
|
366
113
|
inlineMath: ({ value }) => {
|
|
367
|
-
return
|
|
368
|
-
children: parseLatex(value).flatMap((runs) => runs),
|
|
369
|
-
});
|
|
114
|
+
return parseLatex(value);
|
|
370
115
|
},
|
|
371
116
|
};
|
|
372
117
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/plugins/math/parser.ts","../../../src/plugins/math/index.ts"],"sourcesContent":["import {\n MathRun,\n MathSuperScript,\n MathSubScript,\n MathRadical,\n MathFraction,\n MathSum,\n} from \"docx\";\nimport { parseMath } from \"@unified-latex/unified-latex-util-parse\";\nimport type * as latex from \"@unified-latex/unified-latex-types\";\n\nfunction invariant(cond: any, message: string): asserts cond {\n if (!cond) throw new Error(message);\n}\n\nconst hasSquareBrackets = (\n arg: latex.Argument | undefined,\n): arg is latex.Argument => {\n return !!arg && arg.openMark === \"[\" && arg.closeMark === \"]\";\n};\nconst hasCurlyBrackets = (\n arg: latex.Argument | undefined,\n): arg is latex.Argument => {\n return !!arg && arg.openMark === \"{\" && arg.closeMark === \"}\";\n};\n\nconst mapString = (s: string): MathRun => new MathRun(s);\n\nconst mapMacro = (n: latex.Macro, runs: MathRun[]): MathRun | false => {\n switch (n.content) {\n case \"#\":\n return mapString(\"#\");\n case \"$\":\n return mapString(\"$\");\n case \"%\":\n return mapString(\"%\");\n case \"&\":\n return mapString(\"&\");\n case \"textasciitilde\":\n return mapString(\"~\");\n case \"textasciicircum\":\n return mapString(\"^\");\n case \"textbackslash\":\n return mapString(\"∖\");\n case \"{\":\n return mapString(\"{\");\n case \"}\":\n return mapString(\"}\");\n case \"textbar\":\n return mapString(\"|\");\n case \"textless\":\n return mapString(\"<\");\n case \"textgreater\":\n return mapString(\">\");\n case \"neq\":\n return mapString(\"≠\");\n case \"sim\":\n return mapString(\"∼\");\n case \"simeq\":\n return mapString(\"≃\");\n case \"approx\":\n return mapString(\"≈\");\n case \"fallingdotseq\":\n return mapString(\"≒\");\n case \"risingdotseq\":\n return mapString(\"≓\");\n case \"equiv\":\n return mapString(\"≡\");\n case \"geq\":\n return mapString(\"≥\");\n case \"geqq\":\n return mapString(\"≧\");\n case \"leq\":\n return mapString(\"≤\");\n case \"leqq\":\n return mapString(\"≦\");\n case \"gg\":\n return mapString(\"≫\");\n case \"ll\":\n return mapString(\"≪\");\n case \"times\":\n return mapString(\"×\");\n case \"div\":\n return mapString(\"÷\");\n case \"pm\":\n return mapString(\"±\");\n case \"mp\":\n return mapString(\"∓\");\n case \"oplus\":\n return mapString(\"⊕\");\n case \"ominus\":\n return mapString(\"⊖\");\n case \"otimes\":\n return mapString(\"⊗\");\n case \"oslash\":\n return mapString(\"⊘\");\n case \"circ\":\n return mapString(\"∘\");\n case \"cdot\":\n return mapString(\"⋅\");\n case \"bullet\":\n return mapString(\"∙\");\n case \"ltimes\":\n return mapString(\"⋉\");\n case \"rtimes\":\n return mapString(\"⋊\");\n case \"in\":\n return mapString(\"∈\");\n case \"ni\":\n return mapString(\"∋\");\n case \"notin\":\n return mapString(\"∉\");\n case \"subset\":\n return mapString(\"⊂\");\n case \"supset\":\n return mapString(\"⊃\");\n case \"subseteq\":\n return mapString(\"⊆\");\n case \"supseteq\":\n return mapString(\"⊇\");\n case \"nsubseteq\":\n return mapString(\"⊈\");\n case \"nsupseteq\":\n return mapString(\"⊉\");\n case \"subsetneq\":\n return mapString(\"⊊\");\n case \"supsetneq\":\n return mapString(\"⊋\");\n case \"cap\":\n return mapString(\"∩\");\n case \"cup\":\n return mapString(\"∪\");\n case \"emptyset\":\n return mapString(\"∅\");\n case \"infty\":\n return mapString(\"∞\");\n case \"partial\":\n return mapString(\"∂\");\n case \"aleph\":\n return mapString(\"ℵ\");\n case \"hbar\":\n return mapString(\"ℏ\");\n case \"wp\":\n return mapString(\"℘\");\n case \"Re\":\n return mapString(\"ℜ\");\n case \"Im\":\n return mapString(\"ℑ\");\n case \"alpha\":\n return mapString(\"α\");\n case \"beta\":\n return mapString(\"β\");\n case \"gamma\":\n return mapString(\"γ\");\n case \"delta\":\n return mapString(\"δ\");\n case \"epsilon\":\n return mapString(\"ϵ\");\n case \"zeta\":\n return mapString(\"ζ\");\n case \"eta\":\n return mapString(\"η\");\n case \"theta\":\n return mapString(\"θ\");\n case \"iota\":\n return mapString(\"ι\");\n case \"kappa\":\n return mapString(\"κ\");\n case \"lambda\":\n return mapString(\"λ\");\n case \"eta\":\n return mapString(\"η\");\n case \"mu\":\n return mapString(\"μ\");\n case \"nu\":\n return mapString(\"ν\");\n case \"xi\":\n return mapString(\"ξ\");\n case \"pi\":\n return mapString(\"π\");\n case \"rho\":\n return mapString(\"ρ\");\n case \"sigma\":\n return mapString(\"σ\");\n case \"tau\":\n return mapString(\"τ\");\n case \"upsilon\":\n return mapString(\"υ\");\n case \"phi\":\n return mapString(\"ϕ\");\n case \"chi\":\n return mapString(\"χ\");\n case \"psi\":\n return mapString(\"ψ\");\n case \"omega\":\n return mapString(\"ω\");\n case \"varepsilon\":\n return mapString(\"ε\");\n case \"vartheta\":\n return mapString(\"ϑ\");\n case \"varrho\":\n return mapString(\"ϱ\");\n case \"varsigma\":\n return mapString(\"ς\");\n case \"varphi\":\n return mapString(\"φ\");\n case \"Gamma\":\n return mapString(\"Γ\");\n case \"Delta\":\n return mapString(\"Δ\");\n case \"Theta\":\n return mapString(\"Θ\");\n case \"Lambda\":\n return mapString(\"Λ\");\n case \"Xi\":\n return mapString(\"Ξ\");\n case \"Pi\":\n return mapString(\"Π\");\n case \"Sigma\":\n return mapString(\"Σ\");\n case \"Upsilon\":\n return mapString(\"Υ\");\n case \"Phi\":\n return mapString(\"Φ\");\n case \"Psi\":\n return mapString(\"Ψ\");\n case \"Omega\":\n return mapString(\"Ω\");\n case \"newline\":\n case \"\\\\\":\n // line break\n return false;\n case \"^\": {\n const prev = runs.pop();\n if (!prev) break;\n return new MathSuperScript({\n children: [prev],\n superScript: mapGroup(n.args?.[0]?.content ?? []),\n });\n }\n case \"_\": {\n const prev = runs.pop();\n if (!prev) break;\n return new MathSubScript({\n children: [prev],\n subScript: mapGroup(n.args?.[0]?.content ?? []),\n });\n }\n case \"hat\":\n // TODO: implement\n break;\n case \"widehat\":\n // TODO: implement\n break;\n case \"sum\": {\n // TODO: support superscript and subscript\n return new MathSum({\n children: [],\n });\n }\n case \"int\":\n return mapString(\"∫\");\n case \"frac\":\n case \"tfrac\":\n case \"dfrac\": {\n const args = n.args ?? [];\n if (\n args.length === 2 &&\n hasCurlyBrackets(args[0]) &&\n hasCurlyBrackets(args[1])\n ) {\n return new MathFraction({\n numerator: mapGroup(args[0].content),\n denominator: mapGroup(args[1].content),\n });\n }\n break;\n }\n case \"sqrt\": {\n const args = n.args ?? [];\n if (args.length === 1 && hasCurlyBrackets(args[0])) {\n return new MathRadical({\n children: mapGroup(args[0].content),\n });\n }\n if (\n args.length === 2 &&\n hasSquareBrackets(args[0]) &&\n hasCurlyBrackets(args[1])\n ) {\n return new MathRadical({\n children: mapGroup(args[1].content),\n degree: mapGroup(args[0].content),\n });\n }\n break;\n }\n default:\n break;\n }\n return mapString(n.content);\n};\n\nconst mapGroup = (nodes: latex.Node[]): MathRun[] => {\n const group: MathRun[] = [];\n for (const c of nodes) {\n group.push(...(mapNode(c, group) || []));\n }\n return group;\n};\n\nconst mapNode = (n: latex.Node, runs: MathRun[]): MathRun[] | false => {\n switch (n.type) {\n case \"root\":\n break;\n case \"string\":\n return [mapString(n.content)];\n case \"whitespace\":\n break;\n case \"parbreak\":\n break;\n case \"comment\":\n break;\n case \"macro\":\n const run = mapMacro(n, runs);\n if (!run) {\n // line break\n return false;\n } else {\n return [run];\n }\n case \"environment\":\n case \"mathenv\":\n break;\n case \"verbatim\":\n break;\n case \"inlinemath\":\n break;\n case \"displaymath\":\n break;\n case \"group\":\n return mapGroup(n.content);\n case \"verb\":\n break;\n default:\n invariant(false, \"unreachable\");\n }\n\n return [];\n};\n\n/**\n * @internal\n */\nexport const parseLatex = (value: string): MathRun[][] => {\n const parsed = parseMath(value);\n const paragraphs: MathRun[][] = [[]];\n let runs: MathRun[] = paragraphs[0]!;\n for (const n of parsed) {\n const res = mapNode(n, runs);\n if (!res) {\n // line break\n paragraphs.push((runs = []));\n } else {\n runs.push(...res);\n }\n }\n return paragraphs;\n};\n","import type { RemarkDocxPlugin } from \"../../types\";\nimport { Math, Paragraph } from \"docx\";\nimport { parseLatex } from \"./parser\";\n\n/**\n * A plugin to render latex inside \"math\" and \"inlineMath\" nodes\n */\nexport const latexPlugin = (): RemarkDocxPlugin => {\n return async () => {\n return {\n math: ({ value }) => {\n return parseLatex(value).map(\n (runs) =>\n new Paragraph({\n children: [\n new Math({\n children: runs,\n }),\n ],\n }),\n );\n },\n inlineMath: ({ value }) => {\n return new Math({\n children: parseLatex(value).flatMap((runs) => runs),\n });\n },\n };\n };\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/plugins/math/index.ts"],"sourcesContent":["import type { RemarkDocxPlugin } from \"../../types\";\nimport { Paragraph, XmlAttributeComponent, XmlComponent } from \"docx\";\nimport { mml2omml } from \"mathml2omml\";\nimport { XMLParser } from \"fast-xml-parser\";\nimport { mathjax } from \"@mathjax/src/js/mathjax.js\";\nimport { TeX } from \"@mathjax/src/js/input/tex.js\";\nimport { SerializedMmlVisitor } from \"@mathjax/src/js/core/MmlTree/SerializedMmlVisitor.js\";\nimport { STATE } from \"@mathjax/src/js/core/MathItem.js\";\nimport { liteAdaptor } from \"@mathjax/src/js/adaptors/liteAdaptor.js\";\nimport { RegisterHTMLHandler } from \"@mathjax/src/js/handlers/html.js\";\n// import { source } from \"@mathjax/src/components/js/source.js\";\nimport { Loader } from \"@mathjax/src/js/components/loader.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/noerrors/noerrors.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/ams/ams.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/boldsymbol/boldsymbol.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/newcommand/newcommand.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/textmacros/textmacros.js\";\nimport \"@mathjax/src/components/js/input/tex/extensions/unicode/unicode.js\";\n\n// https://devblogs.microsoft.com/math-in-office/officemath/\n\nclass MathAttributeComponent extends XmlAttributeComponent<\n Record<string, any>\n> {}\n\nclass MathXmlComponent extends XmlComponent {\n constructor(\n rootKey: string,\n children: (MathXmlComponent | string)[],\n attrs?: Record<string, any>,\n ) {\n super(rootKey);\n if (attrs) {\n const mathAttrs: Record<string, any> = {};\n for (const [k, v] of Object.entries(attrs)) {\n if (k.startsWith(\"m:\")) {\n mathAttrs[k] = v;\n }\n }\n this.root.push(new MathAttributeComponent(mathAttrs));\n }\n if (children.length) {\n this.root.push(...children);\n }\n }\n}\n\ninterface XmlText {\n \"#text\": string | number | boolean;\n}\ninterface XmlAttr {\n [key: string]: string | number | boolean;\n}\ninterface XmlElement {\n [key: string]: typeof key extends \":@\" ? XmlAttr : XmlNode[];\n}\ntype XmlNode = XmlElement | XmlText;\n\nconst isXmlText = (o: XmlNode): o is XmlText => \"#text\" in o;\n\nconst buildElement = (o: XmlElement): XmlComponent | null => {\n const attrs = o[\":@\"];\n let tagName = \"\";\n let children: XmlNode[] | undefined;\n for (const k of Object.keys(o)) {\n if (k !== \":@\") {\n tagName = k;\n children = o[k];\n break;\n }\n }\n\n if (tagName.startsWith(\"m:\")) {\n const mathChildren: (MathXmlComponent | string)[] = [];\n for (const n of children ?? []) {\n if (isXmlText(n)) {\n const text = n[\"#text\"];\n mathChildren.push(String(text));\n } else {\n const c = buildElement(n);\n if (c) {\n mathChildren.push(c);\n }\n }\n }\n return new MathXmlComponent(tagName, mathChildren, attrs);\n }\n\n return null;\n};\n\n/**\n * A plugin to render latex inside \"math\" and \"inlineMath\" nodes\n */\nexport const latexPlugin = (): RemarkDocxPlugin => {\n // https://github.com/mathjax/MathJax-demos-node/blob/master/mjs/mixed/tex2mml\n // https://github.com/mathjax/MathJax-src/blob/master/components/mjs/input/tex/tex.js\n // https://github.com/mathjax/MathJax-src/blob/master/ts/components/startup.ts#L490\n // https://github.com/mathjax/MathJax-src/blob/master/testsuite/src/setupTex.ts#L162\n RegisterHTMLHandler(liteAdaptor() as any);\n\n const load = [\n \"[tex]/noerrors\",\n \"[tex]/ams\",\n \"[tex]/newcommand\",\n \"[tex]/boldsymbol\",\n \"[tex]/textmacros\",\n \"[tex]/unicode\",\n ];\n const packages = [\"base\"].concat(load.map((name) => name.slice(6)));\n Loader.preLoaded(...load);\n\n const tex = new TeX({ packages });\n const doc = mathjax.document(\"\", { InputJax: tex });\n const visitor = new SerializedMmlVisitor();\n\n const parser = new XMLParser({\n ignoreAttributes: false,\n preserveOrder: true,\n attributeNamePrefix: \"\",\n });\n\n const parseLatex = (value: string): XmlComponent | null => {\n const node = doc.convert(value, { end: STATE[\"CONVERT\"] });\n const mathml = visitor.visitTree(node);\n const omml = mml2omml(mathml);\n const obj = parser.parse(omml);\n return buildElement(obj[0]);\n };\n\n return async () => {\n return {\n math: ({ value }) => {\n const math = parseLatex(value);\n if (!math) {\n return null;\n }\n return new Paragraph({\n children: [math],\n });\n },\n inlineMath: ({ value }) => {\n return parseLatex(value);\n },\n };\n };\n};\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "remark-docx",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"description": "remark plugin to compile markdown to docx (Microsoft Word, Office Open XML).",
|
|
5
5
|
"main": "lib/index.cjs",
|
|
6
6
|
"module": "lib/index.js",
|
|
@@ -33,11 +33,13 @@
|
|
|
33
33
|
"prepublishOnly": "npm run typedoc && rimraf lib && npm run build"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@
|
|
36
|
+
"@mathjax/src": "^4.0.0",
|
|
37
37
|
"docx": "9.5.1",
|
|
38
|
+
"fast-xml-parser": "^5.3.2",
|
|
38
39
|
"hast-util-from-html": "^2.0.3",
|
|
39
40
|
"hast-util-to-mdast": "^10.1.2",
|
|
40
41
|
"image-size": "^2.0.2",
|
|
42
|
+
"mathml2omml": "^0.5.0",
|
|
41
43
|
"mdast-util-definitions": "^6.0.0",
|
|
42
44
|
"shiki": "^3.19.0",
|
|
43
45
|
"unist-util-visit": "^5.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|