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,372 +1,117 @@
1
- import { MathRun, MathRadical, MathFraction, MathSum, MathSubScript, MathSuperScript, Math, Paragraph } from 'docx';
2
- import { parseMath } from '@unified-latex/unified-latex-util-parse';
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
- function invariant(cond, message) {
5
- throw new Error(message);
18
+ // https://devblogs.microsoft.com/math-in-office/officemath/
19
+ class MathAttributeComponent extends XmlAttributeComponent {
6
20
  }
7
- const hasSquareBrackets = (arg) => {
8
- return !!arg && arg.openMark === "[" && arg.closeMark === "]";
9
- };
10
- const hasCurlyBrackets = (arg) => {
11
- return !!arg && arg.openMark === "{" && arg.closeMark === "}";
12
- };
13
- const mapString = (s) => new MathRun(s);
14
- const mapMacro = (n, runs) => {
15
- var _a, _b, _c, _d, _e, _f, _g, _h;
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
- break;
31
+ this.root.push(new MathAttributeComponent(mathAttrs));
264
32
  }
265
- case "sqrt": {
266
- const args = (_h = n.args) !== null && _h !== void 0 ? _h : [];
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
- return mapString(n.content);
284
- };
285
- const mapGroup = (nodes) => {
286
- const group = [];
287
- for (const c of nodes) {
288
- group.push(...(mapNode(c, group) || []));
289
- }
290
- return group;
291
- };
292
- const mapNode = (n, runs) => {
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
- case "macro":
305
- const run = mapMacro(n, runs);
306
- if (!run) {
307
- // line break
308
- return false;
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
- return [run];
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 paragraphs;
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
- return parseLatex(value).map((runs) => new Paragraph({
359
- children: [
360
- new Math({
361
- children: runs,
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 new Math({
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.11",
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
- "@unified-latex/unified-latex-util-parse": "1.8.3",
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 {};