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.
@@ -1,374 +1,119 @@
1
1
  'use strict';
2
2
 
3
3
  var docx = require('docx');
4
- var unifiedLatexUtilParse = require('@unified-latex/unified-latex-util-parse');
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
- function invariant(cond, message) {
7
- throw new Error(message);
20
+ // https://devblogs.microsoft.com/math-in-office/officemath/
21
+ class MathAttributeComponent extends docx.XmlAttributeComponent {
8
22
  }
9
- const hasSquareBrackets = (arg) => {
10
- return !!arg && arg.openMark === "[" && arg.closeMark === "]";
11
- };
12
- const hasCurlyBrackets = (arg) => {
13
- return !!arg && arg.openMark === "{" && arg.closeMark === "}";
14
- };
15
- const mapString = (s) => new docx.MathRun(s);
16
- const mapMacro = (n, runs) => {
17
- var _a, _b, _c, _d, _e, _f, _g, _h;
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
- break;
33
+ this.root.push(new MathAttributeComponent(mathAttrs));
266
34
  }
267
- case "sqrt": {
268
- const args = (_h = n.args) !== null && _h !== void 0 ? _h : [];
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
- return mapString(n.content);
286
- };
287
- const mapGroup = (nodes) => {
288
- const group = [];
289
- for (const c of nodes) {
290
- group.push(...(mapNode(c, group) || []));
291
- }
292
- return group;
293
- };
294
- const mapNode = (n, runs) => {
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
- case "macro":
307
- const run = mapMacro(n, runs);
308
- if (!run) {
309
- // line break
310
- return false;
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
- return [run];
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 paragraphs;
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
- return parseLatex(value).map((runs) => new docx.Paragraph({
361
- children: [
362
- new docx.Math({
363
- children: runs,
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 new docx.Math({
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":";;;;;;;;;;;;;;;;;;;AAmBA;AAEA,MAAM,sBAAuB,SAAQA,0BAEpC,CAAA;AAAG;AAEJ,MAAM,gBAAiB,SAAQC,iBAAY,CAAA;AACzC,IAAA,WAAA,CACE,OAAe,EACf,QAAuC,EACvC,KAA2B,EAAA;QAE3B,KAAK,CAAC,OAAO,CAAC;QACd,IAAI,KAAK,EAAE;YACT,MAAM,SAAS,GAAwB,EAAE;AACzC,YAAA,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC1C,gBAAA,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;AACtB,oBAAA,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;gBAClB;YACF;YACA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,sBAAsB,CAAC,SAAS,CAAC,CAAC;QACvD;AACA,QAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;YACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC;QAC7B;IACF;AACD;AAaD,MAAM,SAAS,GAAG,CAAC,CAAU,KAAmB,OAAO,IAAI,CAAC;AAE5D,MAAM,YAAY,GAAG,CAAC,CAAa,KAAyB;AAC1D,IAAA,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC;IACrB,IAAI,OAAO,GAAG,EAAE;AAChB,IAAA,IAAI,QAA+B;IACnC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;AAC9B,QAAA,IAAI,CAAC,KAAK,IAAI,EAAE;YACd,OAAO,GAAG,CAAC;AACX,YAAA,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;YACf;QACF;IACF;AAEA,IAAA,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE;QAC5B,MAAM,YAAY,GAAkC,EAAE;QACtD,KAAK,MAAM,CAAC,IAAI,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAA,MAAA,GAAR,QAAQ,GAAI,EAAE,EAAE;AAC9B,YAAA,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE;AAChB,gBAAA,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC;gBACvB,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC;iBAAO;AACL,gBAAA,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,EAAE;AACL,oBAAA,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtB;YACF;QACF;QACA,OAAO,IAAI,gBAAgB,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC;IAC3D;AAEA,IAAA,OAAO,IAAI;AACb,CAAC;AAED;;AAEG;AACI,MAAM,WAAW,GAAG,MAAuB;;;;;AAKhD,IAAAC,2BAAmB,CAACC,0BAAW,EAAS,CAAC;AAEzC,IAAA,MAAM,IAAI,GAAG;QACX,gBAAgB;QAChB,WAAW;QACX,kBAAkB;QAClB,kBAAkB;QAClB,kBAAkB;QAClB,eAAe;KAChB;IACD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,IAAAC,gBAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;IAEzB,MAAM,GAAG,GAAG,IAAIC,UAAG,CAAC,EAAE,QAAQ,EAAE,CAAC;AACjC,IAAA,MAAM,GAAG,GAAGC,kBAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AACnD,IAAA,MAAM,OAAO,GAAG,IAAIC,4CAAoB,EAAE;AAE1C,IAAA,MAAM,MAAM,GAAG,IAAIC,uBAAS,CAAC;AAC3B,QAAA,gBAAgB,EAAE,KAAK;AACvB,QAAA,aAAa,EAAE,IAAI;AACnB,QAAA,mBAAmB,EAAE,EAAE;AACxB,KAAA,CAAC;AAEF,IAAA,MAAM,UAAU,GAAG,CAAC,KAAa,KAAyB;AACxD,QAAA,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,EAAEC,iBAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC;AACtC,QAAA,MAAM,IAAI,GAAGC,oBAAQ,CAAC,MAAM,CAAC;QAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;AAC9B,QAAA,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7B,IAAA,CAAC;IAED,OAAO,YAAW;QAChB,OAAO;AACL,YAAA,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAI;AAClB,gBAAA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;gBAC9B,IAAI,CAAC,IAAI,EAAE;AACT,oBAAA,OAAO,IAAI;gBACb;gBACA,OAAO,IAAIC,cAAS,CAAC;oBACnB,QAAQ,EAAE,CAAC,IAAI,CAAC;AACjB,iBAAA,CAAC;YACJ,CAAC;AACD,YAAA,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,KAAI;AACxB,gBAAA,OAAO,UAAU,CAAC,KAAK,CAAC;YAC1B,CAAC;SACF;AACH,IAAA,CAAC;AACH;;;;"}
@@ -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
  */