remark-docx 0.0.7 → 0.1.2
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 +37 -3
- package/lib/index.js +471 -214
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +471 -214
- package/lib/index.mjs.map +1 -0
- package/lib/latex.d.ts +2 -0
- package/lib/transformer.d.ts +3 -3
- package/lib/utils.d.ts +2 -0
- package/package.json +29 -24
package/lib/index.mjs
CHANGED
|
@@ -1,74 +1,361 @@
|
|
|
1
|
+
import { __awaiter } from 'tslib';
|
|
1
2
|
import { visit } from 'unist-util-visit';
|
|
2
3
|
import * as docx from 'docx';
|
|
3
4
|
import { convertInchesToTwip, Packer } from 'docx';
|
|
5
|
+
import { parseMath } from '@unified-latex/unified-latex-util-parse';
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
12
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
13
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
14
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
15
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
16
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
17
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
18
|
-
***************************************************************************** */
|
|
19
|
-
|
|
20
|
-
var __assign = function() {
|
|
21
|
-
__assign = Object.assign || function __assign(t) {
|
|
22
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
23
|
-
s = arguments[i];
|
|
24
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
25
|
-
}
|
|
26
|
-
return t;
|
|
27
|
-
};
|
|
28
|
-
return __assign.apply(this, arguments);
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
function __awaiter(thisArg, _arguments, P, generator) {
|
|
32
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
33
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
34
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
35
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
36
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
37
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function __generator(thisArg, body) {
|
|
42
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
43
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
44
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
45
|
-
function step(op) {
|
|
46
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
47
|
-
while (_) try {
|
|
48
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
49
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
50
|
-
switch (op[0]) {
|
|
51
|
-
case 0: case 1: t = op; break;
|
|
52
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
53
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
54
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
55
|
-
default:
|
|
56
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
57
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
58
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
59
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
60
|
-
if (t[2]) _.ops.pop();
|
|
61
|
-
_.trys.pop(); continue;
|
|
62
|
-
}
|
|
63
|
-
op = body.call(thisArg, _);
|
|
64
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
65
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
66
|
-
}
|
|
7
|
+
const unreachable = (_) => {
|
|
8
|
+
throw new Error("unreachable");
|
|
9
|
+
};
|
|
10
|
+
function invariant(cond, message) {
|
|
11
|
+
if (!cond)
|
|
12
|
+
throw new Error(message);
|
|
67
13
|
}
|
|
68
14
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
15
|
+
const hasSquareBrackets = (arg) => {
|
|
16
|
+
return !!arg && arg.openMark === "[" && arg.closeMark === "]";
|
|
17
|
+
};
|
|
18
|
+
const hasCurlyBrackets = (arg) => {
|
|
19
|
+
return !!arg && arg.openMark === "{" && arg.closeMark === "}";
|
|
20
|
+
};
|
|
21
|
+
const mapString = (s) => new docx.MathRun(s);
|
|
22
|
+
const mapMacro = (n, runs) => {
|
|
23
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
24
|
+
switch (n.content) {
|
|
25
|
+
case "#":
|
|
26
|
+
return mapString("#");
|
|
27
|
+
case "$":
|
|
28
|
+
return mapString("$");
|
|
29
|
+
case "%":
|
|
30
|
+
return mapString("%");
|
|
31
|
+
case "&":
|
|
32
|
+
return mapString("&");
|
|
33
|
+
case "textasciitilde":
|
|
34
|
+
return mapString("~");
|
|
35
|
+
case "textasciicircum":
|
|
36
|
+
return mapString("^");
|
|
37
|
+
case "textbackslash":
|
|
38
|
+
return mapString("∖");
|
|
39
|
+
case "{":
|
|
40
|
+
return mapString("{");
|
|
41
|
+
case "}":
|
|
42
|
+
return mapString("}");
|
|
43
|
+
case "textbar":
|
|
44
|
+
return mapString("|");
|
|
45
|
+
case "textless":
|
|
46
|
+
return mapString("<");
|
|
47
|
+
case "textgreater":
|
|
48
|
+
return mapString(">");
|
|
49
|
+
case "neq":
|
|
50
|
+
return mapString("≠");
|
|
51
|
+
case "sim":
|
|
52
|
+
return mapString("∼");
|
|
53
|
+
case "simeq":
|
|
54
|
+
return mapString("≃");
|
|
55
|
+
case "approx":
|
|
56
|
+
return mapString("≈");
|
|
57
|
+
case "fallingdotseq":
|
|
58
|
+
return mapString("≒");
|
|
59
|
+
case "risingdotseq":
|
|
60
|
+
return mapString("≓");
|
|
61
|
+
case "equiv":
|
|
62
|
+
return mapString("≡");
|
|
63
|
+
case "geq":
|
|
64
|
+
return mapString("≥");
|
|
65
|
+
case "geqq":
|
|
66
|
+
return mapString("≧");
|
|
67
|
+
case "leq":
|
|
68
|
+
return mapString("≤");
|
|
69
|
+
case "leqq":
|
|
70
|
+
return mapString("≦");
|
|
71
|
+
case "gg":
|
|
72
|
+
return mapString("≫");
|
|
73
|
+
case "ll":
|
|
74
|
+
return mapString("≪");
|
|
75
|
+
case "times":
|
|
76
|
+
return mapString("×");
|
|
77
|
+
case "div":
|
|
78
|
+
return mapString("÷");
|
|
79
|
+
case "pm":
|
|
80
|
+
return mapString("±");
|
|
81
|
+
case "mp":
|
|
82
|
+
return mapString("∓");
|
|
83
|
+
case "oplus":
|
|
84
|
+
return mapString("⊕");
|
|
85
|
+
case "ominus":
|
|
86
|
+
return mapString("⊖");
|
|
87
|
+
case "otimes":
|
|
88
|
+
return mapString("⊗");
|
|
89
|
+
case "oslash":
|
|
90
|
+
return mapString("⊘");
|
|
91
|
+
case "circ":
|
|
92
|
+
return mapString("∘");
|
|
93
|
+
case "cdot":
|
|
94
|
+
return mapString("⋅");
|
|
95
|
+
case "bullet":
|
|
96
|
+
return mapString("∙");
|
|
97
|
+
case "ltimes":
|
|
98
|
+
return mapString("⋉");
|
|
99
|
+
case "rtimes":
|
|
100
|
+
return mapString("⋊");
|
|
101
|
+
case "in":
|
|
102
|
+
return mapString("∈");
|
|
103
|
+
case "ni":
|
|
104
|
+
return mapString("∋");
|
|
105
|
+
case "notin":
|
|
106
|
+
return mapString("∉");
|
|
107
|
+
case "subset":
|
|
108
|
+
return mapString("⊂");
|
|
109
|
+
case "supset":
|
|
110
|
+
return mapString("⊃");
|
|
111
|
+
case "subseteq":
|
|
112
|
+
return mapString("⊆");
|
|
113
|
+
case "supseteq":
|
|
114
|
+
return mapString("⊇");
|
|
115
|
+
case "nsubseteq":
|
|
116
|
+
return mapString("⊈");
|
|
117
|
+
case "nsupseteq":
|
|
118
|
+
return mapString("⊉");
|
|
119
|
+
case "subsetneq":
|
|
120
|
+
return mapString("⊊");
|
|
121
|
+
case "supsetneq":
|
|
122
|
+
return mapString("⊋");
|
|
123
|
+
case "cap":
|
|
124
|
+
return mapString("∩");
|
|
125
|
+
case "cup":
|
|
126
|
+
return mapString("∪");
|
|
127
|
+
case "emptyset":
|
|
128
|
+
return mapString("∅");
|
|
129
|
+
case "infty":
|
|
130
|
+
return mapString("∞");
|
|
131
|
+
case "partial":
|
|
132
|
+
return mapString("∂");
|
|
133
|
+
case "aleph":
|
|
134
|
+
return mapString("ℵ");
|
|
135
|
+
case "hbar":
|
|
136
|
+
return mapString("ℏ");
|
|
137
|
+
case "wp":
|
|
138
|
+
return mapString("℘");
|
|
139
|
+
case "Re":
|
|
140
|
+
return mapString("ℜ");
|
|
141
|
+
case "Im":
|
|
142
|
+
return mapString("ℑ");
|
|
143
|
+
case "alpha":
|
|
144
|
+
return mapString("α");
|
|
145
|
+
case "beta":
|
|
146
|
+
return mapString("β");
|
|
147
|
+
case "gamma":
|
|
148
|
+
return mapString("γ");
|
|
149
|
+
case "delta":
|
|
150
|
+
return mapString("δ");
|
|
151
|
+
case "epsilon":
|
|
152
|
+
return mapString("ϵ");
|
|
153
|
+
case "zeta":
|
|
154
|
+
return mapString("ζ");
|
|
155
|
+
case "eta":
|
|
156
|
+
return mapString("η");
|
|
157
|
+
case "theta":
|
|
158
|
+
return mapString("θ");
|
|
159
|
+
case "iota":
|
|
160
|
+
return mapString("ι");
|
|
161
|
+
case "kappa":
|
|
162
|
+
return mapString("κ");
|
|
163
|
+
case "lambda":
|
|
164
|
+
return mapString("λ");
|
|
165
|
+
case "eta":
|
|
166
|
+
return mapString("η");
|
|
167
|
+
case "mu":
|
|
168
|
+
return mapString("μ");
|
|
169
|
+
case "nu":
|
|
170
|
+
return mapString("ν");
|
|
171
|
+
case "xi":
|
|
172
|
+
return mapString("ξ");
|
|
173
|
+
case "pi":
|
|
174
|
+
return mapString("π");
|
|
175
|
+
case "rho":
|
|
176
|
+
return mapString("ρ");
|
|
177
|
+
case "sigma":
|
|
178
|
+
return mapString("σ");
|
|
179
|
+
case "tau":
|
|
180
|
+
return mapString("τ");
|
|
181
|
+
case "upsilon":
|
|
182
|
+
return mapString("υ");
|
|
183
|
+
case "phi":
|
|
184
|
+
return mapString("ϕ");
|
|
185
|
+
case "chi":
|
|
186
|
+
return mapString("χ");
|
|
187
|
+
case "psi":
|
|
188
|
+
return mapString("ψ");
|
|
189
|
+
case "omega":
|
|
190
|
+
return mapString("ω");
|
|
191
|
+
case "varepsilon":
|
|
192
|
+
return mapString("ε");
|
|
193
|
+
case "vartheta":
|
|
194
|
+
return mapString("ϑ");
|
|
195
|
+
case "varrho":
|
|
196
|
+
return mapString("ϱ");
|
|
197
|
+
case "varsigma":
|
|
198
|
+
return mapString("ς");
|
|
199
|
+
case "varphi":
|
|
200
|
+
return mapString("φ");
|
|
201
|
+
case "Gamma":
|
|
202
|
+
return mapString("Γ");
|
|
203
|
+
case "Delta":
|
|
204
|
+
return mapString("Δ");
|
|
205
|
+
case "Theta":
|
|
206
|
+
return mapString("Θ");
|
|
207
|
+
case "Lambda":
|
|
208
|
+
return mapString("Λ");
|
|
209
|
+
case "Xi":
|
|
210
|
+
return mapString("Ξ");
|
|
211
|
+
case "Pi":
|
|
212
|
+
return mapString("Π");
|
|
213
|
+
case "Sigma":
|
|
214
|
+
return mapString("Σ");
|
|
215
|
+
case "Upsilon":
|
|
216
|
+
return mapString("Υ");
|
|
217
|
+
case "Phi":
|
|
218
|
+
return mapString("Φ");
|
|
219
|
+
case "Psi":
|
|
220
|
+
return mapString("Ψ");
|
|
221
|
+
case "Omega":
|
|
222
|
+
return mapString("Ω");
|
|
223
|
+
case "newline":
|
|
224
|
+
case "\\":
|
|
225
|
+
// line break
|
|
226
|
+
return false;
|
|
227
|
+
case "^": {
|
|
228
|
+
const prev = runs.pop();
|
|
229
|
+
if (!prev)
|
|
230
|
+
break;
|
|
231
|
+
return new docx.MathSuperScript({
|
|
232
|
+
children: [prev],
|
|
233
|
+
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 : []),
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
case "_": {
|
|
237
|
+
const prev = runs.pop();
|
|
238
|
+
if (!prev)
|
|
239
|
+
break;
|
|
240
|
+
return new docx.MathSubScript({
|
|
241
|
+
children: [prev],
|
|
242
|
+
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 : []),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
case "hat":
|
|
246
|
+
// TODO: implement
|
|
247
|
+
break;
|
|
248
|
+
case "widehat":
|
|
249
|
+
// TODO: implement
|
|
250
|
+
break;
|
|
251
|
+
case "sum": {
|
|
252
|
+
// TODO: support superscript and subscript
|
|
253
|
+
return new docx.MathSum({
|
|
254
|
+
children: [],
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
case "int":
|
|
258
|
+
return mapString("∫");
|
|
259
|
+
case "frac":
|
|
260
|
+
case "tfrac":
|
|
261
|
+
case "dfrac": {
|
|
262
|
+
const args = (_g = n.args) !== null && _g !== void 0 ? _g : [];
|
|
263
|
+
if (args.length === 2 &&
|
|
264
|
+
hasCurlyBrackets(args[0]) &&
|
|
265
|
+
hasCurlyBrackets(args[1])) {
|
|
266
|
+
return new docx.MathFraction({
|
|
267
|
+
numerator: mapGroup(args[0].content),
|
|
268
|
+
denominator: mapGroup(args[1].content),
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
case "sqrt": {
|
|
274
|
+
const args = (_h = n.args) !== null && _h !== void 0 ? _h : [];
|
|
275
|
+
if (args.length === 1 && hasCurlyBrackets(args[0])) {
|
|
276
|
+
return new docx.MathRadical({
|
|
277
|
+
children: mapGroup(args[0].content),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
if (args.length === 2 &&
|
|
281
|
+
hasSquareBrackets(args[0]) &&
|
|
282
|
+
hasCurlyBrackets(args[1])) {
|
|
283
|
+
return new docx.MathRadical({
|
|
284
|
+
children: mapGroup(args[1].content),
|
|
285
|
+
degree: mapGroup(args[0].content),
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
return mapString(n.content);
|
|
292
|
+
};
|
|
293
|
+
const mapGroup = (nodes) => {
|
|
294
|
+
const group = [];
|
|
295
|
+
for (const c of nodes) {
|
|
296
|
+
group.push(...(mapNode(c, group) || []));
|
|
297
|
+
}
|
|
298
|
+
return group;
|
|
299
|
+
};
|
|
300
|
+
const mapNode = (n, runs) => {
|
|
301
|
+
switch (n.type) {
|
|
302
|
+
case "root":
|
|
303
|
+
break;
|
|
304
|
+
case "string":
|
|
305
|
+
return [mapString(n.content)];
|
|
306
|
+
case "whitespace":
|
|
307
|
+
break;
|
|
308
|
+
case "parbreak":
|
|
309
|
+
break;
|
|
310
|
+
case "comment":
|
|
311
|
+
break;
|
|
312
|
+
case "macro":
|
|
313
|
+
const run = mapMacro(n, runs);
|
|
314
|
+
if (!run) {
|
|
315
|
+
// line break
|
|
316
|
+
return false;
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
return [run];
|
|
320
|
+
}
|
|
321
|
+
case "environment":
|
|
322
|
+
case "mathenv":
|
|
323
|
+
break;
|
|
324
|
+
case "verbatim":
|
|
325
|
+
break;
|
|
326
|
+
case "inlinemath":
|
|
327
|
+
break;
|
|
328
|
+
case "displaymath":
|
|
329
|
+
break;
|
|
330
|
+
case "group":
|
|
331
|
+
return mapGroup(n.content);
|
|
332
|
+
case "verb":
|
|
333
|
+
break;
|
|
334
|
+
default:
|
|
335
|
+
unreachable();
|
|
336
|
+
}
|
|
337
|
+
return [];
|
|
338
|
+
};
|
|
339
|
+
const parseLatex = (value) => {
|
|
340
|
+
const parsed = parseMath(value);
|
|
341
|
+
const paragraphs = [[]];
|
|
342
|
+
let runs = paragraphs[0];
|
|
343
|
+
for (const n of parsed) {
|
|
344
|
+
const res = mapNode(n, runs);
|
|
345
|
+
if (!res) {
|
|
346
|
+
// line break
|
|
347
|
+
paragraphs.push((runs = []));
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
runs.push(...res);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return paragraphs;
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
const ORDERED_LIST_REF = "ordered";
|
|
357
|
+
const INDENT = 0.5;
|
|
358
|
+
const DEFAULT_NUMBERINGS = [
|
|
72
359
|
{
|
|
73
360
|
level: 0,
|
|
74
361
|
format: docx.LevelFormat.DECIMAL,
|
|
@@ -131,25 +418,22 @@ var DEFAULT_NUMBERINGS = [
|
|
|
131
418
|
},
|
|
132
419
|
},
|
|
133
420
|
];
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
};
|
|
137
|
-
function mdastToDocx(node, _a, images) {
|
|
138
|
-
var output = _a.output, title = _a.title, subject = _a.subject, creator = _a.creator, keywords = _a.keywords, description = _a.description, lastModifiedBy = _a.lastModifiedBy, revision = _a.revision, styles = _a.styles, background = _a.background;
|
|
139
|
-
var nodes = convertNodes(node.children, {
|
|
421
|
+
const mdastToDocx = (node, { output = "buffer", title, subject, creator, keywords, description, lastModifiedBy, revision, styles, background, }, images) => {
|
|
422
|
+
const nodes = convertNodes(node.children, {
|
|
140
423
|
deco: {},
|
|
141
|
-
images
|
|
424
|
+
images,
|
|
425
|
+
indent: 0,
|
|
142
426
|
});
|
|
143
|
-
|
|
144
|
-
title
|
|
145
|
-
subject
|
|
146
|
-
creator
|
|
147
|
-
keywords
|
|
148
|
-
description
|
|
149
|
-
lastModifiedBy
|
|
150
|
-
revision
|
|
151
|
-
styles
|
|
152
|
-
background
|
|
427
|
+
const doc = new docx.Document({
|
|
428
|
+
title,
|
|
429
|
+
subject,
|
|
430
|
+
creator,
|
|
431
|
+
keywords,
|
|
432
|
+
description,
|
|
433
|
+
lastModifiedBy,
|
|
434
|
+
revision,
|
|
435
|
+
styles,
|
|
436
|
+
background,
|
|
153
437
|
sections: [{ children: nodes }],
|
|
154
438
|
numbering: {
|
|
155
439
|
config: [
|
|
@@ -160,18 +444,16 @@ function mdastToDocx(node, _a, images) {
|
|
|
160
444
|
],
|
|
161
445
|
},
|
|
162
446
|
});
|
|
163
|
-
switch (output
|
|
447
|
+
switch (output) {
|
|
164
448
|
case "buffer":
|
|
165
449
|
return Packer.toBuffer(doc);
|
|
166
450
|
case "blob":
|
|
167
451
|
return Packer.toBlob(doc);
|
|
168
452
|
}
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
|
|
174
|
-
var node = nodes_1[_i];
|
|
453
|
+
};
|
|
454
|
+
const convertNodes = (nodes, ctx) => {
|
|
455
|
+
const results = [];
|
|
456
|
+
for (const node of nodes) {
|
|
175
457
|
switch (node.type) {
|
|
176
458
|
case "paragraph":
|
|
177
459
|
results.push(buildParagraph(node, ctx));
|
|
@@ -180,26 +462,23 @@ function convertNodes(nodes, ctx) {
|
|
|
180
462
|
results.push(buildHeading(node, ctx));
|
|
181
463
|
break;
|
|
182
464
|
case "thematicBreak":
|
|
183
|
-
results.push(buildThematicBreak(
|
|
465
|
+
results.push(buildThematicBreak());
|
|
184
466
|
break;
|
|
185
467
|
case "blockquote":
|
|
186
|
-
results.push
|
|
468
|
+
results.push(...buildBlockquote(node, ctx));
|
|
187
469
|
break;
|
|
188
470
|
case "list":
|
|
189
|
-
results.push
|
|
471
|
+
results.push(...buildList(node, ctx));
|
|
190
472
|
break;
|
|
191
473
|
case "listItem":
|
|
192
|
-
|
|
193
|
-
break;
|
|
474
|
+
invariant(false, "unreachable");
|
|
194
475
|
case "table":
|
|
195
476
|
results.push(buildTable(node, ctx));
|
|
196
477
|
break;
|
|
197
478
|
case "tableRow":
|
|
198
|
-
|
|
199
|
-
break;
|
|
479
|
+
invariant(false, "unreachable");
|
|
200
480
|
case "tableCell":
|
|
201
|
-
|
|
202
|
-
break;
|
|
481
|
+
invariant(false, "unreachable");
|
|
203
482
|
case "html":
|
|
204
483
|
results.push(buildHtml(node));
|
|
205
484
|
break;
|
|
@@ -224,8 +503,8 @@ function convertNodes(nodes, ctx) {
|
|
|
224
503
|
case "emphasis":
|
|
225
504
|
case "strong":
|
|
226
505
|
case "delete": {
|
|
227
|
-
|
|
228
|
-
results.push
|
|
506
|
+
const { type, children } = node;
|
|
507
|
+
results.push(...convertNodes(children, Object.assign(Object.assign({}, ctx), { deco: Object.assign(Object.assign({}, ctx.deco), { [type]: true }) })));
|
|
229
508
|
break;
|
|
230
509
|
}
|
|
231
510
|
case "inlineCode":
|
|
@@ -233,7 +512,7 @@ function convertNodes(nodes, ctx) {
|
|
|
233
512
|
results.push(buildText(node.value, ctx.deco));
|
|
234
513
|
break;
|
|
235
514
|
case "break":
|
|
236
|
-
results.push(buildBreak(
|
|
515
|
+
results.push(buildBreak());
|
|
237
516
|
break;
|
|
238
517
|
case "link":
|
|
239
518
|
results.push(buildLink(node, ctx));
|
|
@@ -254,19 +533,25 @@ function convertNodes(nodes, ctx) {
|
|
|
254
533
|
// FIXME: unimplemented
|
|
255
534
|
break;
|
|
256
535
|
case "math":
|
|
257
|
-
results.push(buildMath(node));
|
|
536
|
+
results.push(...buildMath(node));
|
|
258
537
|
break;
|
|
259
538
|
case "inlineMath":
|
|
260
539
|
results.push(buildInlineMath(node));
|
|
261
540
|
break;
|
|
541
|
+
default:
|
|
542
|
+
unreachable();
|
|
543
|
+
break;
|
|
262
544
|
}
|
|
263
545
|
}
|
|
264
546
|
return results;
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
547
|
+
};
|
|
548
|
+
const buildParagraph = ({ children }, ctx) => {
|
|
549
|
+
const list = ctx.list;
|
|
550
|
+
return new docx.Paragraph(Object.assign({ children: convertNodes(children, ctx), indent: ctx.indent > 0
|
|
551
|
+
? {
|
|
552
|
+
start: convertInchesToTwip(INDENT * ctx.indent),
|
|
553
|
+
}
|
|
554
|
+
: undefined }, (list &&
|
|
270
555
|
(list.ordered
|
|
271
556
|
? {
|
|
272
557
|
numbering: {
|
|
@@ -279,10 +564,9 @@ function buildParagraph(_a, ctx) {
|
|
|
279
564
|
level: list.level,
|
|
280
565
|
},
|
|
281
566
|
}))));
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
var heading;
|
|
567
|
+
};
|
|
568
|
+
const buildHeading = ({ children, depth }, ctx) => {
|
|
569
|
+
let heading;
|
|
286
570
|
switch (depth) {
|
|
287
571
|
case 1:
|
|
288
572
|
heading = docx.HeadingLevel.TITLE;
|
|
@@ -304,39 +588,33 @@ function buildHeading(_a, ctx) {
|
|
|
304
588
|
break;
|
|
305
589
|
}
|
|
306
590
|
return new docx.Paragraph({
|
|
307
|
-
heading
|
|
591
|
+
heading,
|
|
308
592
|
children: convertNodes(children, ctx),
|
|
309
593
|
});
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
_a.type;
|
|
594
|
+
};
|
|
595
|
+
const buildThematicBreak = (_) => {
|
|
313
596
|
return new docx.Paragraph({
|
|
314
597
|
thematicBreak: true,
|
|
315
598
|
});
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
function buildList(_a, ctx) {
|
|
323
|
-
_a.type; var children = _a.children, ordered = _a.ordered; _a.start; _a.spread;
|
|
324
|
-
var list = {
|
|
599
|
+
};
|
|
600
|
+
const buildBlockquote = ({ children }, ctx) => {
|
|
601
|
+
return convertNodes(children, Object.assign(Object.assign({}, ctx), { indent: ctx.indent + 1 }));
|
|
602
|
+
};
|
|
603
|
+
const buildList = ({ children, ordered, start: _start, spread: _spread }, ctx) => {
|
|
604
|
+
const list = {
|
|
325
605
|
level: ctx.list ? ctx.list.level + 1 : 0,
|
|
326
606
|
ordered: !!ordered,
|
|
327
607
|
};
|
|
328
|
-
return children.reduce(
|
|
329
|
-
acc.push
|
|
608
|
+
return children.reduce((acc, item) => {
|
|
609
|
+
acc.push(...buildListItem(item, Object.assign(Object.assign({}, ctx), { list })));
|
|
330
610
|
return acc;
|
|
331
611
|
}, []);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
_a.type; var children = _a.children; _a.checked; _a.spread;
|
|
612
|
+
};
|
|
613
|
+
const buildListItem = ({ children, checked: _checked, spread: _spread }, ctx) => {
|
|
335
614
|
return convertNodes(children, ctx);
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
var cellAligns = align === null || align === void 0 ? void 0 : align.map(function (a) {
|
|
615
|
+
};
|
|
616
|
+
const buildTable = ({ children, align }, ctx) => {
|
|
617
|
+
const cellAligns = align === null || align === void 0 ? void 0 : align.map((a) => {
|
|
340
618
|
switch (a) {
|
|
341
619
|
case "left":
|
|
342
620
|
return docx.AlignmentType.LEFT;
|
|
@@ -349,21 +627,19 @@ function buildTable(_a, ctx) {
|
|
|
349
627
|
}
|
|
350
628
|
});
|
|
351
629
|
return new docx.Table({
|
|
352
|
-
rows: children.map(
|
|
630
|
+
rows: children.map((r) => {
|
|
353
631
|
return buildTableRow(r, ctx, cellAligns);
|
|
354
632
|
}),
|
|
355
633
|
});
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
_a.type; var children = _a.children;
|
|
634
|
+
};
|
|
635
|
+
const buildTableRow = ({ children }, ctx, cellAligns) => {
|
|
359
636
|
return new docx.TableRow({
|
|
360
|
-
children: children.map(
|
|
637
|
+
children: children.map((c, i) => {
|
|
361
638
|
return buildTableCell(c, ctx, cellAligns === null || cellAligns === void 0 ? void 0 : cellAligns[i]);
|
|
362
639
|
}),
|
|
363
640
|
});
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
_a.type; var children = _a.children;
|
|
641
|
+
};
|
|
642
|
+
const buildTableCell = ({ children }, ctx, align) => {
|
|
367
643
|
return new docx.TableCell({
|
|
368
644
|
children: [
|
|
369
645
|
new docx.Paragraph({
|
|
@@ -372,111 +648,92 @@ function buildTableCell(_a, ctx, align) {
|
|
|
372
648
|
}),
|
|
373
649
|
],
|
|
374
650
|
});
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
_a.type; var value = _a.value;
|
|
651
|
+
};
|
|
652
|
+
const buildHtml = ({ value }) => {
|
|
378
653
|
// FIXME: transform to text for now
|
|
379
654
|
return new docx.Paragraph({
|
|
380
655
|
children: [buildText(value, {})],
|
|
381
656
|
});
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
_a.type; var value = _a.value; _a.lang; _a.meta;
|
|
657
|
+
};
|
|
658
|
+
const buildCode = ({ value, lang: _lang, meta: _meta }) => {
|
|
385
659
|
// FIXME: transform to text for now
|
|
386
660
|
return new docx.Paragraph({
|
|
387
661
|
children: [buildText(value, {})],
|
|
388
662
|
});
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
663
|
+
};
|
|
664
|
+
const buildMath = ({ value }) => {
|
|
665
|
+
return parseLatex(value).map((runs) => new docx.Paragraph({
|
|
666
|
+
children: [
|
|
667
|
+
new docx.Math({
|
|
668
|
+
children: runs,
|
|
669
|
+
}),
|
|
670
|
+
],
|
|
671
|
+
}));
|
|
672
|
+
};
|
|
673
|
+
const buildInlineMath = ({ value }) => {
|
|
674
|
+
return new docx.Math({
|
|
675
|
+
children: parseLatex(value).flatMap((runs) => runs),
|
|
395
676
|
});
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
_a.type; var value = _a.value;
|
|
399
|
-
// FIXME: transform to text for now
|
|
400
|
-
return new docx.TextRun(value);
|
|
401
|
-
}
|
|
402
|
-
function buildText(text, deco) {
|
|
677
|
+
};
|
|
678
|
+
const buildText = (text, deco) => {
|
|
403
679
|
return new docx.TextRun({
|
|
404
|
-
text
|
|
680
|
+
text,
|
|
405
681
|
bold: deco.strong,
|
|
406
682
|
italics: deco.emphasis,
|
|
407
683
|
strike: deco.delete,
|
|
408
684
|
});
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
_a.type;
|
|
685
|
+
};
|
|
686
|
+
const buildBreak = (_) => {
|
|
412
687
|
return new docx.TextRun({ text: "", break: 1 });
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
_a.type; var children = _a.children, url = _a.url; _a.title;
|
|
688
|
+
};
|
|
689
|
+
const buildLink = ({ children, url, title: _title }, ctx) => {
|
|
416
690
|
return new docx.ExternalHyperlink({
|
|
417
691
|
link: url,
|
|
418
692
|
children: convertNodes(children, ctx),
|
|
419
693
|
});
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
}
|
|
426
|
-
var _b = images[url], image = _b.image, width = _b.width, height = _b.height;
|
|
694
|
+
};
|
|
695
|
+
const buildImage = ({ url, title: _title, alt: _alt }, images) => {
|
|
696
|
+
const img = images[url];
|
|
697
|
+
invariant(img, `Fetch image was failed: ${url}`);
|
|
698
|
+
const { image, width, height } = img;
|
|
427
699
|
return new docx.ImageRun({
|
|
428
700
|
data: image,
|
|
429
701
|
transformation: {
|
|
430
|
-
width
|
|
431
|
-
height
|
|
702
|
+
width,
|
|
703
|
+
height,
|
|
432
704
|
},
|
|
433
705
|
});
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
_a.type; var children = _a.children;
|
|
706
|
+
};
|
|
707
|
+
const buildFootnote = ({ children }, ctx) => {
|
|
437
708
|
// FIXME: transform to paragraph for now
|
|
438
709
|
return new docx.Paragraph({
|
|
439
710
|
children: convertNodes(children, ctx),
|
|
440
711
|
});
|
|
441
|
-
}
|
|
712
|
+
};
|
|
442
713
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
var images = {};
|
|
447
|
-
this.Compiler = function (node) {
|
|
714
|
+
const plugin = function (opts = {}) {
|
|
715
|
+
let images = {};
|
|
716
|
+
this.Compiler = (node) => {
|
|
448
717
|
return mdastToDocx(node, opts, images);
|
|
449
718
|
};
|
|
450
|
-
return
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
case 0:
|
|
455
|
-
imageList = [];
|
|
456
|
-
visit(node, "image", function (node) {
|
|
457
|
-
imageList.push(node);
|
|
458
|
-
});
|
|
459
|
-
if (imageList.length === 0) {
|
|
460
|
-
return [2 /*return*/, node];
|
|
461
|
-
}
|
|
462
|
-
imageResolver = opts.imageResolver;
|
|
463
|
-
if (!imageResolver) {
|
|
464
|
-
throw new Error("options.imageResolver is not defined.");
|
|
465
|
-
}
|
|
466
|
-
return [4 /*yield*/, Promise.all(imageList.map(function (_a) {
|
|
467
|
-
var url = _a.url;
|
|
468
|
-
return imageResolver(url);
|
|
469
|
-
}))];
|
|
470
|
-
case 1:
|
|
471
|
-
imageDatas = _a.sent();
|
|
472
|
-
images = imageList.reduce(function (acc, img, i) {
|
|
473
|
-
acc[img.url] = imageDatas[i];
|
|
474
|
-
return acc;
|
|
475
|
-
}, {});
|
|
476
|
-
return [2 /*return*/, node];
|
|
477
|
-
}
|
|
719
|
+
return (node) => __awaiter(this, void 0, void 0, function* () {
|
|
720
|
+
const imageList = [];
|
|
721
|
+
visit(node, "image", (node) => {
|
|
722
|
+
imageList.push(node);
|
|
478
723
|
});
|
|
479
|
-
|
|
724
|
+
if (imageList.length === 0) {
|
|
725
|
+
return node;
|
|
726
|
+
}
|
|
727
|
+
const imageResolver = opts.imageResolver;
|
|
728
|
+
invariant(imageResolver, "options.imageResolver is not defined.");
|
|
729
|
+
const imageDatas = yield Promise.all(imageList.map(({ url }) => imageResolver(url)));
|
|
730
|
+
images = imageList.reduce((acc, img, i) => {
|
|
731
|
+
acc[img.url] = imageDatas[i];
|
|
732
|
+
return acc;
|
|
733
|
+
}, {});
|
|
734
|
+
return node;
|
|
735
|
+
});
|
|
480
736
|
};
|
|
481
737
|
|
|
482
738
|
export { plugin as default };
|
|
739
|
+
//# sourceMappingURL=index.mjs.map
|