remark-docx 0.3.11 → 0.3.13
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/index.cjs +9 -4
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +9 -4
- package/lib/index.js.map +1 -1
- package/lib/mdast-util-to-docx.d.ts +2 -2
- 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
|
@@ -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.13",
|
|
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 {};
|