fable-editor 1.0.0
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/LICENSE +21 -0
- package/README.md +175 -0
- package/dist/angular/LICENSE +21 -0
- package/dist/angular/README.md +175 -0
- package/dist/angular/angular/fable-editor.component.d.ts +29 -0
- package/dist/angular/angular/fable-editor.module.d.ts +7 -0
- package/dist/angular/angular/index.d.ts +2 -0
- package/dist/angular/core/config.d.ts +17 -0
- package/dist/angular/core/docx-import.d.ts +1 -0
- package/dist/angular/core/editor.d.ts +219 -0
- package/dist/angular/core/i18n.d.ts +139 -0
- package/dist/angular/core/icons.d.ts +2 -0
- package/dist/angular/core/index.d.ts +7 -0
- package/dist/angular/core/paste-engine.d.ts +6 -0
- package/dist/angular/core/types.d.ts +87 -0
- package/dist/angular/esm2022/angular/fable-editor.component.mjs +101 -0
- package/dist/angular/esm2022/angular/fable-editor.module.mjs +16 -0
- package/dist/angular/esm2022/angular/index.mjs +3 -0
- package/dist/angular/esm2022/core/config.mjs +122 -0
- package/dist/angular/esm2022/core/docx-import.mjs +391 -0
- package/dist/angular/esm2022/core/editor.mjs +2700 -0
- package/dist/angular/esm2022/core/i18n.mjs +278 -0
- package/dist/angular/esm2022/core/icons.mjs +89 -0
- package/dist/angular/esm2022/core/index.mjs +6 -0
- package/dist/angular/esm2022/core/paste-engine.mjs +482 -0
- package/dist/angular/esm2022/core/types.mjs +2 -0
- package/dist/angular/esm2022/fable-editor.mjs +5 -0
- package/dist/angular/esm2022/index.mjs +2 -0
- package/dist/angular/fesm2022/fable-editor.mjs +4176 -0
- package/dist/angular/fesm2022/fable-editor.mjs.map +1 -0
- package/dist/angular/index.d.ts +1 -0
- package/dist/core/config.d.ts +18 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/docx-import.d.ts +2 -0
- package/dist/core/docx-import.d.ts.map +1 -0
- package/dist/core/editor.css +1175 -0
- package/dist/core/editor.d.ts +221 -0
- package/dist/core/editor.d.ts.map +1 -0
- package/dist/core/i18n.d.ts +141 -0
- package/dist/core/i18n.d.ts.map +1 -0
- package/dist/core/icons.d.ts +3 -0
- package/dist/core/icons.d.ts.map +1 -0
- package/dist/core/index.cjs +12 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.mjs +2789 -0
- package/dist/core/paste-engine.d.ts +7 -0
- package/dist/core/paste-engine.d.ts.map +1 -0
- package/dist/core/types.d.ts +88 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/react/FableEditor.d.ts +13 -0
- package/dist/react/FableEditor.d.ts.map +1 -0
- package/dist/react/index.cjs +41 -0
- package/dist/react/index.d.ts +3 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.mjs +3471 -0
- package/package.json +105 -0
- package/style.css +1175 -0
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/* Minimal .docx → HTML converter with no dependencies.
|
|
2
|
+
Parses the ZIP container manually and inflates entries with the browser's
|
|
3
|
+
DecompressionStream, then maps WordprocessingML to editor-friendly HTML:
|
|
4
|
+
headings, run formatting, colors, hyperlinks, lists, tables and images. */
|
|
5
|
+
function parseZip(buf) {
|
|
6
|
+
const d = new DataView(buf);
|
|
7
|
+
const entries = new Map();
|
|
8
|
+
// find End Of Central Directory record (sig 0x06054b50), scanning back over the comment
|
|
9
|
+
let eocd = -1;
|
|
10
|
+
for (let i = buf.byteLength - 22; i >= Math.max(0, buf.byteLength - 22 - 0xffff); i--) {
|
|
11
|
+
if (d.getUint32(i, true) === 0x06054b50) {
|
|
12
|
+
eocd = i;
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (eocd < 0)
|
|
17
|
+
throw new Error('EOCD not found');
|
|
18
|
+
const count = d.getUint16(eocd + 10, true);
|
|
19
|
+
let p = d.getUint32(eocd + 16, true);
|
|
20
|
+
const utf8 = new TextDecoder();
|
|
21
|
+
for (let i = 0; i < count; i++) {
|
|
22
|
+
if (d.getUint32(p, true) !== 0x02014b50)
|
|
23
|
+
break;
|
|
24
|
+
const method = d.getUint16(p + 10, true);
|
|
25
|
+
const compSize = d.getUint32(p + 20, true);
|
|
26
|
+
const nameLen = d.getUint16(p + 28, true);
|
|
27
|
+
const extraLen = d.getUint16(p + 30, true);
|
|
28
|
+
const commentLen = d.getUint16(p + 32, true);
|
|
29
|
+
const localOffset = d.getUint32(p + 42, true);
|
|
30
|
+
const name = utf8.decode(new Uint8Array(buf, p + 46, nameLen));
|
|
31
|
+
entries.set(name, { name, method, compSize, localOffset });
|
|
32
|
+
p += 46 + nameLen + extraLen + commentLen;
|
|
33
|
+
}
|
|
34
|
+
return entries;
|
|
35
|
+
}
|
|
36
|
+
async function readEntry(buf, e) {
|
|
37
|
+
const d = new DataView(buf, e.localOffset);
|
|
38
|
+
if (d.getUint32(0, true) !== 0x04034b50)
|
|
39
|
+
throw new Error('Bad local header');
|
|
40
|
+
const nameLen = d.getUint16(26, true);
|
|
41
|
+
const extraLen = d.getUint16(28, true);
|
|
42
|
+
const start = e.localOffset + 30 + nameLen + extraLen;
|
|
43
|
+
const comp = new Uint8Array(buf.slice(start, start + e.compSize));
|
|
44
|
+
if (e.method === 0)
|
|
45
|
+
return comp;
|
|
46
|
+
if (e.method !== 8)
|
|
47
|
+
throw new Error('Unsupported compression method ' + e.method);
|
|
48
|
+
const stream = new Blob([comp]).stream().pipeThrough(new DecompressionStream('deflate-raw'));
|
|
49
|
+
return new Uint8Array(await new Response(stream).arrayBuffer());
|
|
50
|
+
}
|
|
51
|
+
/* ------------------------------------------------------------- helpers */
|
|
52
|
+
const esc = (s) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
53
|
+
const kids = (el, name) => Array.from(el.children).filter((c) => c.localName === name);
|
|
54
|
+
const kid = (el, ...path) => {
|
|
55
|
+
let cur = el;
|
|
56
|
+
for (const name of path) {
|
|
57
|
+
if (!cur)
|
|
58
|
+
return null;
|
|
59
|
+
cur = Array.from(cur.children).find((c) => c.localName === name) || null;
|
|
60
|
+
}
|
|
61
|
+
return cur;
|
|
62
|
+
};
|
|
63
|
+
const val = (el, attrName = 'val') => {
|
|
64
|
+
if (!el)
|
|
65
|
+
return '';
|
|
66
|
+
for (const a of Array.from(el.attributes)) {
|
|
67
|
+
if (a.localName === attrName)
|
|
68
|
+
return a.value;
|
|
69
|
+
}
|
|
70
|
+
return '';
|
|
71
|
+
};
|
|
72
|
+
/** A toggle property like <w:b/> is on unless val is explicitly false/0. */
|
|
73
|
+
const flagOn = (rPr, name) => {
|
|
74
|
+
const el = rPr ? kid(rPr, name) : null;
|
|
75
|
+
if (!el)
|
|
76
|
+
return false;
|
|
77
|
+
const v = val(el);
|
|
78
|
+
return v !== 'false' && v !== '0';
|
|
79
|
+
};
|
|
80
|
+
const HIGHLIGHTS = {
|
|
81
|
+
yellow: '#FFFF00',
|
|
82
|
+
green: '#00FF00',
|
|
83
|
+
cyan: '#00FFFF',
|
|
84
|
+
magenta: '#FF00FF',
|
|
85
|
+
blue: '#0000FF',
|
|
86
|
+
red: '#FF0000',
|
|
87
|
+
darkBlue: '#00008B',
|
|
88
|
+
darkCyan: '#008B8B',
|
|
89
|
+
darkGreen: '#006400',
|
|
90
|
+
darkMagenta: '#8B008B',
|
|
91
|
+
darkRed: '#8B0000',
|
|
92
|
+
darkYellow: '#808000',
|
|
93
|
+
darkGray: '#A9A9A9',
|
|
94
|
+
lightGray: '#D3D3D3',
|
|
95
|
+
black: '#000000',
|
|
96
|
+
white: '#FFFFFF'
|
|
97
|
+
};
|
|
98
|
+
const IMG_MIME = {
|
|
99
|
+
png: 'image/png',
|
|
100
|
+
jpg: 'image/jpeg',
|
|
101
|
+
jpeg: 'image/jpeg',
|
|
102
|
+
gif: 'image/gif',
|
|
103
|
+
bmp: 'image/bmp',
|
|
104
|
+
webp: 'image/webp'
|
|
105
|
+
};
|
|
106
|
+
function toBase64(bytes) {
|
|
107
|
+
let bin = '';
|
|
108
|
+
for (let i = 0; i < bytes.length; i += 0x8000) {
|
|
109
|
+
bin += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
|
|
110
|
+
}
|
|
111
|
+
return btoa(bin);
|
|
112
|
+
}
|
|
113
|
+
/* ------------------------------------------------------------- converter */
|
|
114
|
+
class DocxConverter {
|
|
115
|
+
rels;
|
|
116
|
+
images;
|
|
117
|
+
numFmt;
|
|
118
|
+
constructor(rels, images, numFmt) {
|
|
119
|
+
this.rels = rels;
|
|
120
|
+
this.images = images;
|
|
121
|
+
this.numFmt = numFmt;
|
|
122
|
+
}
|
|
123
|
+
convertBody(body) {
|
|
124
|
+
let html = '';
|
|
125
|
+
// stack of open lists for nested numbering
|
|
126
|
+
let listStack = [];
|
|
127
|
+
const closeLists = (depth) => {
|
|
128
|
+
while (listStack.length > depth)
|
|
129
|
+
html += `</${listStack.pop()}>`;
|
|
130
|
+
};
|
|
131
|
+
for (const child of Array.from(body.children)) {
|
|
132
|
+
if (child.localName === 'p') {
|
|
133
|
+
const list = this.paraList(child);
|
|
134
|
+
if (list) {
|
|
135
|
+
const depth = list.ilvl + 1;
|
|
136
|
+
while (listStack.length > depth)
|
|
137
|
+
html += `</${listStack.pop()}>`;
|
|
138
|
+
if (listStack.length === depth && listStack[depth - 1] !== list.type) {
|
|
139
|
+
html += `</${listStack.pop()}>`;
|
|
140
|
+
}
|
|
141
|
+
while (listStack.length < depth) {
|
|
142
|
+
html += `<${list.type}>`;
|
|
143
|
+
listStack.push(list.type);
|
|
144
|
+
}
|
|
145
|
+
html += `<li>${this.runsOf(child) || '<br>'}</li>`;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
closeLists(0);
|
|
149
|
+
html += this.convertPara(child);
|
|
150
|
+
}
|
|
151
|
+
else if (child.localName === 'tbl') {
|
|
152
|
+
closeLists(0);
|
|
153
|
+
html += this.convertTable(child);
|
|
154
|
+
}
|
|
155
|
+
else if (child.localName === 'sectPr') {
|
|
156
|
+
// section properties — no visual content
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
closeLists(0);
|
|
160
|
+
return html || '<p><br></p>';
|
|
161
|
+
}
|
|
162
|
+
paraList(p) {
|
|
163
|
+
const numPr = kid(p, 'pPr', 'numPr');
|
|
164
|
+
if (!numPr)
|
|
165
|
+
return null;
|
|
166
|
+
const numId = val(kid(numPr, 'numId'));
|
|
167
|
+
if (!numId || numId === '0')
|
|
168
|
+
return null;
|
|
169
|
+
const ilvl = parseInt(val(kid(numPr, 'ilvl')) || '0', 10) || 0;
|
|
170
|
+
return { type: this.numFmt.get(numId) || 'ul', ilvl: Math.min(ilvl, 8) };
|
|
171
|
+
}
|
|
172
|
+
convertPara(p) {
|
|
173
|
+
const pPr = kid(p, 'pPr');
|
|
174
|
+
const style = val(kid(p, 'pPr', 'pStyle'));
|
|
175
|
+
let tag = 'p';
|
|
176
|
+
const m = /^Heading([1-6])$/i.exec(style);
|
|
177
|
+
if (m)
|
|
178
|
+
tag = 'h' + m[1];
|
|
179
|
+
else if (/^Title$/i.test(style))
|
|
180
|
+
tag = 'h1';
|
|
181
|
+
const css = [];
|
|
182
|
+
const jc = val(kid(p, 'pPr', 'jc'));
|
|
183
|
+
if (jc === 'center')
|
|
184
|
+
css.push('text-align:center');
|
|
185
|
+
else if (jc === 'right' || jc === 'end')
|
|
186
|
+
css.push('text-align:right');
|
|
187
|
+
else if (jc === 'both' || jc === 'distribute')
|
|
188
|
+
css.push('text-align:justify');
|
|
189
|
+
if (pPr && kid(pPr, 'bidi'))
|
|
190
|
+
css.push('direction:rtl');
|
|
191
|
+
const inner = this.runsOf(p);
|
|
192
|
+
const attrs = css.length ? ` style="${css.join(';')}"` : '';
|
|
193
|
+
return `<${tag}${attrs}>${inner || '<br>'}</${tag}>`;
|
|
194
|
+
}
|
|
195
|
+
runsOf(el) {
|
|
196
|
+
let html = '';
|
|
197
|
+
for (const child of Array.from(el.children)) {
|
|
198
|
+
if (child.localName === 'r')
|
|
199
|
+
html += this.convertRun(child);
|
|
200
|
+
else if (child.localName === 'hyperlink') {
|
|
201
|
+
let href = this.rels.get(val(child, 'id')) || '';
|
|
202
|
+
const anchor = val(child, 'anchor');
|
|
203
|
+
if (!href && anchor)
|
|
204
|
+
href = '#' + anchor;
|
|
205
|
+
const inner = this.runsOf(child);
|
|
206
|
+
html += href ? `<a href="${esc(href)}">${inner}</a>` : inner;
|
|
207
|
+
}
|
|
208
|
+
else if (child.localName === 'smartTag' || child.localName === 'ins') {
|
|
209
|
+
html += this.runsOf(child);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return html;
|
|
213
|
+
}
|
|
214
|
+
convertRun(r) {
|
|
215
|
+
const rPr = kid(r, 'rPr');
|
|
216
|
+
let text = '';
|
|
217
|
+
for (const child of Array.from(r.children)) {
|
|
218
|
+
if (child.localName === 't')
|
|
219
|
+
text += esc(child.textContent || '');
|
|
220
|
+
else if (child.localName === 'br' || child.localName === 'cr')
|
|
221
|
+
text += '<br>';
|
|
222
|
+
else if (child.localName === 'tab')
|
|
223
|
+
text += ' ';
|
|
224
|
+
else if (child.localName === 'drawing' || child.localName === 'pict' || child.localName === 'object') {
|
|
225
|
+
text += this.convertImage(child);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (!text)
|
|
229
|
+
return '';
|
|
230
|
+
const css = [];
|
|
231
|
+
const color = val(rPr ? kid(rPr, 'color') : null);
|
|
232
|
+
if (color && color !== 'auto')
|
|
233
|
+
css.push('color:#' + color);
|
|
234
|
+
const highlight = val(rPr ? kid(rPr, 'highlight') : null);
|
|
235
|
+
if (highlight && HIGHLIGHTS[highlight])
|
|
236
|
+
css.push('background-color:' + HIGHLIGHTS[highlight]);
|
|
237
|
+
const sz = parseFloat(val(rPr ? kid(rPr, 'sz') : null));
|
|
238
|
+
if (sz)
|
|
239
|
+
css.push('font-size:' + Math.round((sz / 2) * (4 / 3)) + 'px');
|
|
240
|
+
const font = rPr ? kid(rPr, 'rFonts') : null;
|
|
241
|
+
const fontName = val(font, 'ascii') || val(font, 'cs');
|
|
242
|
+
if (fontName)
|
|
243
|
+
css.push(`font-family:'${fontName}'`);
|
|
244
|
+
if (css.length)
|
|
245
|
+
text = `<span style="${css.join(';')}">${text}</span>`;
|
|
246
|
+
if (flagOn(rPr, 'b'))
|
|
247
|
+
text = `<strong>${text}</strong>`;
|
|
248
|
+
if (flagOn(rPr, 'i'))
|
|
249
|
+
text = `<em>${text}</em>`;
|
|
250
|
+
if (flagOn(rPr, 'u') && val(kid(rPr, 'u')) !== 'none')
|
|
251
|
+
text = `<u>${text}</u>`;
|
|
252
|
+
if (flagOn(rPr, 'strike'))
|
|
253
|
+
text = `<s>${text}</s>`;
|
|
254
|
+
const vert = val(rPr ? kid(rPr, 'vertAlign') : null);
|
|
255
|
+
if (vert === 'superscript')
|
|
256
|
+
text = `<sup>${text}</sup>`;
|
|
257
|
+
else if (vert === 'subscript')
|
|
258
|
+
text = `<sub>${text}</sub>`;
|
|
259
|
+
return text;
|
|
260
|
+
}
|
|
261
|
+
convertImage(holder) {
|
|
262
|
+
// find any blip (DrawingML) or imagedata (VML) descendant regardless of depth
|
|
263
|
+
let relId = '';
|
|
264
|
+
let widthPx = 0;
|
|
265
|
+
const walk = (el) => {
|
|
266
|
+
if (el.localName === 'blip')
|
|
267
|
+
relId = relId || val(el, 'embed') || val(el, 'link');
|
|
268
|
+
if (el.localName === 'imagedata')
|
|
269
|
+
relId = relId || val(el, 'id');
|
|
270
|
+
if (el.localName === 'extent') {
|
|
271
|
+
const cx = parseFloat(el.getAttribute('cx') || '0');
|
|
272
|
+
if (cx)
|
|
273
|
+
widthPx = Math.round(cx / 9525); // EMU → px
|
|
274
|
+
}
|
|
275
|
+
for (const c of Array.from(el.children))
|
|
276
|
+
walk(c);
|
|
277
|
+
};
|
|
278
|
+
walk(holder);
|
|
279
|
+
if (!relId)
|
|
280
|
+
return '';
|
|
281
|
+
const src = this.images.get(relId);
|
|
282
|
+
if (!src)
|
|
283
|
+
return '';
|
|
284
|
+
const w = widthPx ? ` width="${widthPx}"` : '';
|
|
285
|
+
return `<img src="${src}" alt=""${w}>`;
|
|
286
|
+
}
|
|
287
|
+
convertTable(tbl) {
|
|
288
|
+
let html = '<table style="border-collapse:collapse;width:100%"><tbody>';
|
|
289
|
+
for (const tr of kids(tbl, 'tr')) {
|
|
290
|
+
html += '<tr>';
|
|
291
|
+
for (const tc of kids(tr, 'tc')) {
|
|
292
|
+
const span = parseInt(val(kid(tc, 'tcPr', 'gridSpan')) || '1', 10) || 1;
|
|
293
|
+
const spanAttr = span > 1 ? ` colspan="${span}"` : '';
|
|
294
|
+
let inner = '';
|
|
295
|
+
for (const child of Array.from(tc.children)) {
|
|
296
|
+
if (child.localName === 'p')
|
|
297
|
+
inner += this.convertPara(child);
|
|
298
|
+
else if (child.localName === 'tbl')
|
|
299
|
+
inner += this.convertTable(child);
|
|
300
|
+
}
|
|
301
|
+
html += `<td style="border:1px solid #b9c2cc"${spanAttr}>${inner || '<br>'}</td>`;
|
|
302
|
+
}
|
|
303
|
+
html += '</tr>';
|
|
304
|
+
}
|
|
305
|
+
return html + '</tbody></table>';
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
/* ------------------------------------------------------------- entry point */
|
|
309
|
+
export async function importDocxToHtml(input) {
|
|
310
|
+
const buf = input instanceof ArrayBuffer ? input : await input.arrayBuffer();
|
|
311
|
+
const entries = parseZip(buf);
|
|
312
|
+
const decoder = new TextDecoder();
|
|
313
|
+
const readXml = async (name) => {
|
|
314
|
+
const e = entries.get(name);
|
|
315
|
+
if (!e)
|
|
316
|
+
return null;
|
|
317
|
+
return new DOMParser().parseFromString(decoder.decode(await readEntry(buf, e)), 'application/xml');
|
|
318
|
+
};
|
|
319
|
+
const doc = await readXml('word/document.xml');
|
|
320
|
+
const body = doc?.getElementsByTagName('*');
|
|
321
|
+
let bodyEl = null;
|
|
322
|
+
if (body) {
|
|
323
|
+
for (const el of Array.from(body)) {
|
|
324
|
+
if (el.localName === 'body') {
|
|
325
|
+
bodyEl = el;
|
|
326
|
+
break;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
if (!bodyEl)
|
|
331
|
+
throw new Error('word/document.xml missing or invalid');
|
|
332
|
+
// relationships: id → target (hyperlinks are absolute, images relative to word/)
|
|
333
|
+
const rels = new Map();
|
|
334
|
+
const imageTargets = new Map();
|
|
335
|
+
const relsDoc = await readXml('word/_rels/document.xml.rels');
|
|
336
|
+
if (relsDoc) {
|
|
337
|
+
for (const rel of Array.from(relsDoc.getElementsByTagName('*'))) {
|
|
338
|
+
if (rel.localName !== 'Relationship')
|
|
339
|
+
continue;
|
|
340
|
+
const id = rel.getAttribute('Id') || '';
|
|
341
|
+
const target = rel.getAttribute('Target') || '';
|
|
342
|
+
const type = rel.getAttribute('Type') || '';
|
|
343
|
+
if (/hyperlink/i.test(type))
|
|
344
|
+
rels.set(id, target);
|
|
345
|
+
else if (/image/i.test(type))
|
|
346
|
+
imageTargets.set(id, target);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// load referenced images as data URLs
|
|
350
|
+
const images = new Map();
|
|
351
|
+
for (const [id, target] of imageTargets) {
|
|
352
|
+
const path = target.startsWith('/') ? target.slice(1) : 'word/' + target.replace(/^\.\//, '');
|
|
353
|
+
const entry = entries.get(path);
|
|
354
|
+
if (!entry)
|
|
355
|
+
continue;
|
|
356
|
+
const ext = (path.split('.').pop() || '').toLowerCase();
|
|
357
|
+
const mime = IMG_MIME[ext];
|
|
358
|
+
if (!mime)
|
|
359
|
+
continue; // skip unsupported formats like emf/wmf
|
|
360
|
+
try {
|
|
361
|
+
images.set(id, `data:${mime};base64,${toBase64(await readEntry(buf, entry))}`);
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
/* skip broken image */
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
// numbering: numId → ul/ol (from level-0 numFmt of the abstract definition)
|
|
368
|
+
const numFmt = new Map();
|
|
369
|
+
const numDoc = await readXml('word/numbering.xml');
|
|
370
|
+
if (numDoc) {
|
|
371
|
+
const abstractFmt = new Map();
|
|
372
|
+
const all = Array.from(numDoc.getElementsByTagName('*'));
|
|
373
|
+
for (const el of all) {
|
|
374
|
+
if (el.localName !== 'abstractNum')
|
|
375
|
+
continue;
|
|
376
|
+
const id = val(el, 'abstractNumId');
|
|
377
|
+
const lvl0 = kids(el, 'lvl').find((l) => val(l, 'ilvl') === '0') || kids(el, 'lvl')[0];
|
|
378
|
+
const fmt = lvl0 ? val(kid(lvl0, 'numFmt')) : '';
|
|
379
|
+
abstractFmt.set(id, fmt === 'bullet' ? 'ul' : 'ol');
|
|
380
|
+
}
|
|
381
|
+
for (const el of all) {
|
|
382
|
+
if (el.localName !== 'num')
|
|
383
|
+
continue;
|
|
384
|
+
const numId = val(el, 'numId');
|
|
385
|
+
const absId = val(kid(el, 'abstractNumId'));
|
|
386
|
+
numFmt.set(numId, abstractFmt.get(absId) || 'ul');
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return new DocxConverter(rels, images, numFmt).convertBody(bodyEl);
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jeC1pbXBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29yZS9kb2N4LWltcG9ydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OzZFQUc2RTtBQVM3RSxTQUFTLFFBQVEsQ0FBQyxHQUFnQjtJQUNoQyxNQUFNLENBQUMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUM1Qyx3RkFBd0Y7SUFDeEYsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDZCxLQUFLLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxVQUFVLEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsVUFBVSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RGLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDeEMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNULE1BQU07UUFDUixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxHQUFHLENBQUM7UUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FB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QUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsS0FBSyxNQUFNLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLEVBQUUsQ0FBQyxTQUFTLEtBQUssS0FBSztnQkFBRSxTQUFTO1lBQ3JDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDL0IsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogTWluaW1hbCAuZG9jeCDihpIgSFRNTCBjb252ZXJ0ZXIgd2l0aCBubyBkZXBlbmRlbmNpZXMuXG4gICBQYXJzZXMgdGhlIFpJUCBjb250YWluZXIgbWFudWFsbHkgYW5kIGluZmxhdGVzIGVudHJpZXMgd2l0aCB0aGUgYnJvd3NlcidzXG4gICBEZWNvbXByZXNzaW9uU3RyZWFtLCB0aGVuIG1hcHMgV29yZHByb2Nlc3NpbmdNTCB0byBlZGl0b3ItZnJpZW5kbHkgSFRNTDpcbiAgIGhlYWRpbmdzLCBydW4gZm9ybWF0dGluZywgY29sb3JzLCBoeXBlcmxpbmtzLCBsaXN0cywgdGFibGVzIGFuZCBpbWFnZXMuICovXG5cbmludGVyZmFjZSBaaXBFbnRyeSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0aG9kOiBudW1iZXI7XG4gIGNvbXBTaXplOiBudW1iZXI7XG4gIGxvY2FsT2Zmc2V0OiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIHBhcnNlWmlwKGJ1ZjogQXJyYXlCdWZmZXIpOiBNYXA8c3RyaW5nLCBaaXBFbnRyeT4ge1xuICBjb25zdCBkID0gbmV3IERhdGFWaWV3KGJ1Zik7XG4gIGNvbnN0IGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgWmlwRW50cnk+KCk7XG4gIC8vIGZpbmQgRW5kIE9mIENlbnRyYWwgRGlyZWN0b3J5IHJlY29yZCAoc2lnIDB4MDYwNTRiNTApLCBzY2FubmluZyBiYWNrIG92ZXIgdGhlIGNvbW1lbnRcbiAgbGV0IGVvY2QgPSAtMTtcbiAgZm9yIChsZXQgaSA9IGJ1Zi5ieXRlTGVuZ3RoIC0gMjI7IGkgPj0gTWF0aC5tYXgoMCwgYnVmLmJ5dGVMZW5ndGggLSAyMiAtIDB4ZmZmZik7IGktLSkge1xuICAgIGlmIChkLmdldFVpbnQzMihpLCB0cnVlKSA9PT0gMHgwNjA1NGI1MCkge1xuICAgICAgZW9jZCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGVvY2QgPCAwKSB0aHJvdyBuZXcgRXJyb3IoJ0VPQ0Qgbm90IGZvdW5kJyk7XG4gIGNvbnN0IGNvdW50ID0gZC5nZXRVaW50MTYoZW9jZCArIDEwLCB0cnVlKTtcbiAgbGV0IHAgPSBkLmdldFVpbnQzMihlb2NkICsgMTYsIHRydWUpO1xuICBjb25zdCB1dGY4ID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGlmIChkLmdldFVpbnQzMihwLCB0cnVlKSAhPT0gMHgwMjAxNGI1MCkgYnJlYWs7XG4gICAgY29uc3QgbWV0aG9kID0gZC5nZXRVaW50MTYocCArIDEwLCB0cnVlKTtcbiAgICBjb25zdCBjb21wU2l6ZSA9IGQuZ2V0VWludDMyKHAgKyAyMCwgdHJ1ZSk7XG4gICAgY29uc3QgbmFtZUxlbiA9IGQuZ2V0VWludDE2KHAgKyAyOCwgdHJ1ZSk7XG4gICAgY29uc3QgZXh0cmFMZW4gPSBkLmdldFVpbnQxNihwICsgMzAsIHRydWUpO1xuICAgIGNvbnN0IGNvbW1lbnRMZW4gPSBkLmdldFVpbnQxNihwICsgMzIsIHRydWUpO1xuICAgIGNvbnN0IGxvY2FsT2Zmc2V0ID0gZC5nZXRVaW50MzIocCArIDQyLCB0cnVlKTtcbiAgICBjb25zdCBuYW1lID0gdXRmOC5kZWNvZGUobmV3IFVpbnQ4QXJyYXkoYnVmLCBwICsgNDYsIG5hbWVMZW4pKTtcbiAgICBlbnRyaWVzLnNldChuYW1lLCB7IG5hbWUsIG1ldGhvZCwgY29tcFNpemUsIGxvY2FsT2Zmc2V0IH0pO1xuICAgIHAgKz0gNDYgKyBuYW1lTGVuICsgZXh0cmFMZW4gKyBjb21tZW50TGVuO1xuICB9XG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZWFkRW50cnkoYnVmOiBBcnJheUJ1ZmZlciwgZTogWmlwRW50cnkpOiBQcm9taXNlPFVpbnQ4QXJyYXk+IHtcbiAgY29uc3QgZCA9IG5ldyBEYXRhVmlldyhidWYsIGUubG9jYWxPZmZzZXQpO1xuICBpZiAoZC5nZXRVaW50MzIoMCwgdHJ1ZSkgIT09IDB4MDQwMzRiNTApIHRocm93IG5ldyBFcnJvcignQmFkIGxvY2FsIGhlYWRlcicpO1xuICBjb25zdCBuYW1lTGVuID0gZC5nZXRVaW50MTYoMjYsIHRydWUpO1xuICBjb25zdCBleHRyYUxlbiA9IGQuZ2V0VWludDE2KDI4LCB0cnVlKTtcbiAgY29uc3Qgc3RhcnQgPSBlLmxvY2FsT2Zmc2V0ICsgMzAgKyBuYW1lTGVuICsgZXh0cmFMZW47XG4gIGNvbnN0IGNvbXAgPSBuZXcgVWludDhBcnJheShidWYuc2xpY2Uoc3RhcnQsIHN0YXJ0ICsgZS5jb21wU2l6ZSkpO1xuICBpZiAoZS5tZXRob2QgPT09IDApIHJldHVybiBjb21wO1xuICBpZiAoZS5tZXRob2QgIT09IDgpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kICcgKyBlLm1ldGhvZCk7XG4gIGNvbnN0IHN0cmVhbSA9IG5ldyBCbG9iKFtjb21wIGFzIEJsb2JQYXJ0XSkuc3RyZWFtKCkucGlwZVRocm91Z2gobmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2RlZmxhdGUtcmF3JykpO1xuICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgbmV3IFJlc3BvbnNlKHN0cmVhbSkuYXJyYXlCdWZmZXIoKSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAqL1xuY29uc3QgZXNjID0gKHM6IHN0cmluZykgPT5cbiAgcy5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpO1xuXG5jb25zdCBraWRzID0gKGVsOiBFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBFbGVtZW50W10gPT5cbiAgQXJyYXkuZnJvbShlbC5jaGlsZHJlbikuZmlsdGVyKChjKSA9PiBjLmxvY2FsTmFtZSA9PT0gbmFtZSk7XG5cbmNvbnN0IGtpZCA9IChlbDogRWxlbWVudCwgLi4ucGF0aDogc3RyaW5nW10pOiBFbGVtZW50IHwgbnVsbCA9PiB7XG4gIGxldCBjdXI6IEVsZW1lbnQgfCBudWxsID0gZWw7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBwYXRoKSB7XG4gICAgaWYgKCFjdXIpIHJldHVybiBudWxsO1xuICAgIGN1ciA9IEFycmF5LmZyb20oY3VyLmNoaWxkcmVuKS5maW5kKChjKSA9PiBjLmxvY2FsTmFtZSA9PT0gbmFtZSkgfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gY3VyO1xufTtcblxuY29uc3QgdmFsID0gKGVsOiBFbGVtZW50IHwgbnVsbCwgYXR0ck5hbWUgPSAndmFsJyk6IHN0cmluZyA9PiB7XG4gIGlmICghZWwpIHJldHVybiAnJztcbiAgZm9yIChjb25zdCBhIG9mIEFycmF5LmZyb20oZWwuYXR0cmlidXRlcykpIHtcbiAgICBpZiAoYS5sb2NhbE5hbWUgPT09IGF0dHJOYW1lKSByZXR1cm4gYS52YWx1ZTtcbiAgfVxuICByZXR1cm4gJyc7XG59O1xuXG4vKiogQSB0b2dnbGUgcHJvcGVydHkgbGlrZSA8dzpiLz4gaXMgb24gdW5sZXNzIHZhbCBpcyBleHBsaWNpdGx5IGZhbHNlLzAuICovXG5jb25zdCBmbGFnT24gPSAoclByOiBFbGVtZW50IHwgbnVsbCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGVsID0gclByID8ga2lkKHJQciwgbmFtZSkgOiBudWxsO1xuICBpZiAoIWVsKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHYgPSB2YWwoZWwpO1xuICByZXR1cm4gdiAhPT0gJ2ZhbHNlJyAmJiB2ICE9PSAnMCc7XG59O1xuXG5jb25zdCBISUdITElHSFRTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICB5ZWxsb3c6ICcjRkZGRjAwJyxcbiAgZ3JlZW46ICcjMDBGRjAwJyxcbiAgY3lhbjogJyMwMEZGRkYnLFxuICBtYWdlbnRhOiAnI0ZGMDBGRicsXG4gIGJsdWU6ICcjMDAwMEZGJyxcbiAgcmVkOiAnI0ZGMDAwMCcsXG4gIGRhcmtCbHVlOiAnIzAwMDA4QicsXG4gIGRhcmtDeWFuOiAnIzAwOEI4QicsXG4gIGRhcmtHcmVlbjogJyMwMDY0MDAnLFxuICBkYXJrTWFnZW50YTogJyM4QjAwOEInLFxuICBkYXJrUmVkOiAnIzhCMDAwMCcsXG4gIGRhcmtZZWxsb3c6ICcjODA4MDAwJyxcbiAgZGFya0dyYXk6ICcjQTlBOUE5JyxcbiAgbGlnaHRHcmF5OiAnI0QzRDNEMycsXG4gIGJsYWNrOiAnIzAwMDAwMCcsXG4gIHdoaXRlOiAnI0ZGRkZGRidcbn07XG5cbmNvbnN0IElNR19NSU1FOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICBwbmc6ICdpbWFnZS9wbmcnLFxuICBqcGc6ICdpbWFnZS9qcGVnJyxcbiAganBlZzogJ2ltYWdlL2pwZWcnLFxuICBnaWY6ICdpbWFnZS9naWYnLFxuICBibXA6ICdpbWFnZS9ibXAnLFxuICB3ZWJwOiAnaW1hZ2Uvd2VicCdcbn07XG5cbmZ1bmN0aW9uIHRvQmFzZTY0KGJ5dGVzOiBVaW50OEFycmF5KTogc3RyaW5nIHtcbiAgbGV0IGJpbiA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAweDgwMDApIHtcbiAgICBiaW4gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcy5zdWJhcnJheShpLCBpICsgMHg4MDAwKSk7XG4gIH1cbiAgcmV0dXJuIGJ0b2EoYmluKTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZXJ0ZXIgKi9cbmNsYXNzIERvY3hDb252ZXJ0ZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlbHM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcHJpdmF0ZSBpbWFnZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gICAgcHJpdmF0ZSBudW1GbXQ6IE1hcDxzdHJpbmcsICd1bCcgfCAnb2wnPlxuICApIHt9XG5cbiAgY29udmVydEJvZHkoYm9keTogRWxlbWVudCk6IHN0cmluZyB7XG4gICAgbGV0IGh0bWwgPSAnJztcbiAgICAvLyBzdGFjayBvZiBvcGVuIGxpc3RzIGZvciBuZXN0ZWQgbnVtYmVyaW5nXG4gICAgbGV0IGxpc3RTdGFjazogQXJyYXk8J3VsJyB8ICdvbCc+ID0gW107XG4gICAgY29uc3QgY2xvc2VMaXN0cyA9IChkZXB0aDogbnVtYmVyKSA9PiB7XG4gICAgICB3aGlsZSAobGlzdFN0YWNrLmxlbmd0aCA+IGRlcHRoKSBodG1sICs9IGA8LyR7bGlzdFN0YWNrLnBvcCgpfT5gO1xuICAgIH07XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKGJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICBpZiAoY2hpbGQubG9jYWxOYW1lID09PSAncCcpIHtcbiAgICAgICAgY29uc3QgbGlzdCA9IHRoaXMucGFyYUxpc3QoY2hpbGQpO1xuICAgICAgICBpZiAobGlzdCkge1xuICAgICAgICAgIGNvbnN0IGRlcHRoID0gbGlzdC5pbHZsICsgMTtcbiAgICAgICAgICB3aGlsZSAobGlzdFN0YWNrLmxlbmd0aCA+IGRlcHRoKSBodG1sICs9IGA8LyR7bGlzdFN0YWNrLnBvcCgpfT5gO1xuICAgICAgICAgIGlmIChsaXN0U3RhY2subGVuZ3RoID09PSBkZXB0aCAmJiBsaXN0U3RhY2tbZGVwdGggLSAxXSAhPT0gbGlzdC50eXBlKSB7XG4gICAgICAgICAgICBodG1sICs9IGA8LyR7bGlzdFN0YWNrLnBvcCgpfT5gO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAobGlzdFN0YWNrLmxlbmd0aCA8IGRlcHRoKSB7XG4gICAgICAgICAgICBodG1sICs9IGA8JHtsaXN0LnR5cGV9PmA7XG4gICAgICAgICAgICBsaXN0U3RhY2sucHVzaChsaXN0LnR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBodG1sICs9IGA8bGk+JHt0aGlzLnJ1bnNPZihjaGlsZCkgfHwgJzxicj4nfTwvbGk+YDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjbG9zZUxpc3RzKDApO1xuICAgICAgICBodG1sICs9IHRoaXMuY29udmVydFBhcmEoY2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICd0YmwnKSB7XG4gICAgICAgIGNsb3NlTGlzdHMoMCk7XG4gICAgICAgIGh0bWwgKz0gdGhpcy5jb252ZXJ0VGFibGUoY2hpbGQpO1xuICAgICAgfSBlbHNlIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICdzZWN0UHInKSB7XG4gICAgICAgIC8vIHNlY3Rpb24gcHJvcGVydGllcyDigJQgbm8gdmlzdWFsIGNvbnRlbnRcbiAgICAgIH1cbiAgICB9XG4gICAgY2xvc2VMaXN0cygwKTtcbiAgICByZXR1cm4gaHRtbCB8fCAnPHA+PGJyPjwvcD4nO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJhTGlzdChwOiBFbGVtZW50KTogeyB0eXBlOiAndWwnIHwgJ29sJzsgaWx2bDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBudW1QciA9IGtpZChwLCAncFByJywgJ251bVByJyk7XG4gICAgaWYgKCFudW1QcikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbnVtSWQgPSB2YWwoa2lkKG51bVByLCAnbnVtSWQnKSk7XG4gICAgaWYgKCFudW1JZCB8fCBudW1JZCA9PT0gJzAnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBpbHZsID0gcGFyc2VJbnQodmFsKGtpZChudW1QciwgJ2lsdmwnKSkgfHwgJzAnLCAxMCkgfHwgMDtcbiAgICByZXR1cm4geyB0eXBlOiB0aGlzLm51bUZtdC5nZXQobnVtSWQpIHx8ICd1bCcsIGlsdmw6IE1hdGgubWluKGlsdmwsIDgpIH07XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRQYXJhKHA6IEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBQciA9IGtpZChwLCAncFByJyk7XG4gICAgY29uc3Qgc3R5bGUgPSB2YWwoa2lkKHAsICdwUHInLCAncFN0eWxlJykpO1xuICAgIGxldCB0YWcgPSAncCc7XG4gICAgY29uc3QgbSA9IC9eSGVhZGluZyhbMS02XSkkL2kuZXhlYyhzdHlsZSk7XG4gICAgaWYgKG0pIHRhZyA9ICdoJyArIG1bMV07XG4gICAgZWxzZSBpZiAoL15UaXRsZSQvaS50ZXN0KHN0eWxlKSkgdGFnID0gJ2gxJztcbiAgICBjb25zdCBjc3M6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgamMgPSB2YWwoa2lkKHAsICdwUHInLCAnamMnKSk7XG4gICAgaWYgKGpjID09PSAnY2VudGVyJykgY3NzLnB1c2goJ3RleHQtYWxpZ246Y2VudGVyJyk7XG4gICAgZWxzZSBpZiAoamMgPT09ICdyaWdodCcgfHwgamMgPT09ICdlbmQnKSBjc3MucHVzaCgndGV4dC1hbGlnbjpyaWdodCcpO1xuICAgIGVsc2UgaWYgKGpjID09PSAnYm90aCcgfHwgamMgPT09ICdkaXN0cmlidXRlJykgY3NzLnB1c2goJ3RleHQtYWxpZ246anVzdGlmeScpO1xuICAgIGlmIChwUHIgJiYga2lkKHBQciwgJ2JpZGknKSkgY3NzLnB1c2goJ2RpcmVjdGlvbjpydGwnKTtcbiAgICBjb25zdCBpbm5lciA9IHRoaXMucnVuc09mKHApO1xuICAgIGNvbnN0IGF0dHJzID0gY3NzLmxlbmd0aCA/IGAgc3R5bGU9XCIke2Nzcy5qb2luKCc7Jyl9XCJgIDogJyc7XG4gICAgcmV0dXJuIGA8JHt0YWd9JHthdHRyc30+JHtpbm5lciB8fCAnPGJyPid9PC8ke3RhZ30+YDtcbiAgfVxuXG4gIHByaXZhdGUgcnVuc09mKGVsOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICBsZXQgaHRtbCA9ICcnO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgQXJyYXkuZnJvbShlbC5jaGlsZHJlbikpIHtcbiAgICAgIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICdyJykgaHRtbCArPSB0aGlzLmNvbnZlcnRSdW4oY2hpbGQpO1xuICAgICAgZWxzZSBpZiAoY2hpbGQubG9jYWxOYW1lID09PSAnaHlwZXJsaW5rJykge1xuICAgICAgICBsZXQgaHJlZiA9IHRoaXMucmVscy5nZXQodmFsKGNoaWxkLCAnaWQnKSkgfHwgJyc7XG4gICAgICAgIGNvbnN0IGFuY2hvciA9IHZhbChjaGlsZCwgJ2FuY2hvcicpO1xuICAgICAgICBpZiAoIWhyZWYgJiYgYW5jaG9yKSBocmVmID0gJyMnICsgYW5jaG9yO1xuICAgICAgICBjb25zdCBpbm5lciA9IHRoaXMucnVuc09mKGNoaWxkKTtcbiAgICAgICAgaHRtbCArPSBocmVmID8gYDxhIGhyZWY9XCIke2VzYyhocmVmKX1cIj4ke2lubmVyfTwvYT5gIDogaW5uZXI7XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ3NtYXJ0VGFnJyB8fCBjaGlsZC5sb2NhbE5hbWUgPT09ICdpbnMnKSB7XG4gICAgICAgIGh0bWwgKz0gdGhpcy5ydW5zT2YoY2hpbGQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJ1bihyOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICBjb25zdCByUHIgPSBraWQociwgJ3JQcicpO1xuICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBBcnJheS5mcm9tKHIuY2hpbGRyZW4pKSB7XG4gICAgICBpZiAoY2hpbGQubG9jYWxOYW1lID09PSAndCcpIHRleHQgKz0gZXNjKGNoaWxkLnRleHRDb250ZW50IHx8ICcnKTtcbiAgICAgIGVsc2UgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ2JyJyB8fCBjaGlsZC5sb2NhbE5hbWUgPT09ICdjcicpIHRleHQgKz0gJzxicj4nO1xuICAgICAgZWxzZSBpZiAoY2hpbGQubG9jYWxOYW1lID09PSAndGFiJykgdGV4dCArPSAnJmVtc3A7JztcbiAgICAgIGVsc2UgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ2RyYXdpbmcnIHx8IGNoaWxkLmxvY2FsTmFtZSA9PT0gJ3BpY3QnIHx8IGNoaWxkLmxvY2FsTmFtZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgdGV4dCArPSB0aGlzLmNvbnZlcnRJbWFnZShjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGV4dCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IGNzczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBjb2xvciA9IHZhbChyUHIgPyBraWQoclByLCAnY29sb3InKSA6IG51bGwpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvciAhPT0gJ2F1dG8nKSBjc3MucHVzaCgnY29sb3I6IycgKyBjb2xvcik7XG4gICAgY29uc3QgaGlnaGxpZ2h0ID0gdmFsKHJQciA/IGtpZChyUHIsICdoaWdobGlnaHQnKSA6IG51bGwpO1xuICAgIGlmIChoaWdobGlnaHQgJiYgSElHSExJR0hUU1toaWdobGlnaHRdKSBjc3MucHVzaCgnYmFja2dyb3VuZC1jb2xvcjonICsgSElHSExJR0hUU1toaWdobGlnaHRdKTtcbiAgICBjb25zdCBzeiA9IHBhcnNlRmxvYXQodmFsKHJQciA/IGtpZChyUHIsICdzeicpIDogbnVsbCkpO1xuICAgIGlmIChzeikgY3NzLnB1c2goJ2ZvbnQtc2l6ZTonICsgTWF0aC5yb3VuZCgoc3ogLyAyKSAqICg0IC8gMykpICsgJ3B4Jyk7XG4gICAgY29uc3QgZm9udCA9IHJQciA/IGtpZChyUHIsICdyRm9udHMnKSA6IG51bGw7XG4gICAgY29uc3QgZm9udE5hbWUgPSB2YWwoZm9udCwgJ2FzY2lpJykgfHwgdmFsKGZvbnQsICdjcycpO1xuICAgIGlmIChmb250TmFtZSkgY3NzLnB1c2goYGZvbnQtZmFtaWx5Oicke2ZvbnROYW1lfSdgKTtcbiAgICBpZiAoY3NzLmxlbmd0aCkgdGV4dCA9IGA8c3BhbiBzdHlsZT1cIiR7Y3NzLmpvaW4oJzsnKX1cIj4ke3RleHR9PC9zcGFuPmA7XG4gICAgaWYgKGZsYWdPbihyUHIsICdiJykpIHRleHQgPSBgPHN0cm9uZz4ke3RleHR9PC9zdHJvbmc+YDtcbiAgICBpZiAoZmxhZ09uKHJQciwgJ2knKSkgdGV4dCA9IGA8ZW0+JHt0ZXh0fTwvZW0+YDtcbiAgICBpZiAoZmxhZ09uKHJQciwgJ3UnKSAmJiB2YWwoa2lkKHJQciEsICd1JykpICE9PSAnbm9uZScpIHRleHQgPSBgPHU+JHt0ZXh0fTwvdT5gO1xuICAgIGlmIChmbGFnT24oclByLCAnc3RyaWtlJykpIHRleHQgPSBgPHM+JHt0ZXh0fTwvcz5gO1xuICAgIGNvbnN0IHZlcnQgPSB2YWwoclByID8ga2lkKHJQciwgJ3ZlcnRBbGlnbicpIDogbnVsbCk7XG4gICAgaWYgKHZlcnQgPT09ICdzdXBlcnNjcmlwdCcpIHRleHQgPSBgPHN1cD4ke3RleHR9PC9zdXA+YDtcbiAgICBlbHNlIGlmICh2ZXJ0ID09PSAnc3Vic2NyaXB0JykgdGV4dCA9IGA8c3ViPiR7dGV4dH08L3N1Yj5gO1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SW1hZ2UoaG9sZGVyOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICAvLyBmaW5kIGFueSBibGlwIChEcmF3aW5nTUwpIG9yIGltYWdlZGF0YSAoVk1MKSBkZXNjZW5kYW50IHJlZ2FyZGxlc3Mgb2YgZGVwdGhcbiAgICBsZXQgcmVsSWQgPSAnJztcbiAgICBsZXQgd2lkdGhQeCA9IDA7XG4gICAgY29uc3Qgd2FsayA9IChlbDogRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGVsLmxvY2FsTmFtZSA9PT0gJ2JsaXAnKSByZWxJZCA9IHJlbElkIHx8IHZhbChlbCwgJ2VtYmVkJykgfHwgdmFsKGVsLCAnbGluaycpO1xuICAgICAgaWYgKGVsLmxvY2FsTmFtZSA9PT0gJ2ltYWdlZGF0YScpIHJlbElkID0gcmVsSWQgfHwgdmFsKGVsLCAnaWQnKTtcbiAgICAgIGlmIChlbC5sb2NhbE5hbWUgPT09ICdleHRlbnQnKSB7XG4gICAgICAgIGNvbnN0IGN4ID0gcGFyc2VGbG9hdChlbC5nZXRBdHRyaWJ1dGUoJ2N4JykgfHwgJzAnKTtcbiAgICAgICAgaWYgKGN4KSB3aWR0aFB4ID0gTWF0aC5yb3VuZChjeCAvIDk1MjUpOyAvLyBFTVUg4oaSIHB4XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgQXJyYXkuZnJvbShlbC5jaGlsZHJlbikpIHdhbGsoYyk7XG4gICAgfTtcbiAgICB3YWxrKGhvbGRlcik7XG4gICAgaWYgKCFyZWxJZCkgcmV0dXJuICcnO1xuICAgIGNvbnN0IHNyYyA9IHRoaXMuaW1hZ2VzLmdldChyZWxJZCk7XG4gICAgaWYgKCFzcmMpIHJldHVybiAnJztcbiAgICBjb25zdCB3ID0gd2lkdGhQeCA/IGAgd2lkdGg9XCIke3dpZHRoUHh9XCJgIDogJyc7XG4gICAgcmV0dXJuIGA8aW1nIHNyYz1cIiR7c3JjfVwiIGFsdD1cIlwiJHt3fT5gO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VGFibGUodGJsOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7d2lkdGg6MTAwJVwiPjx0Ym9keT4nO1xuICAgIGZvciAoY29uc3QgdHIgb2Yga2lkcyh0YmwsICd0cicpKSB7XG4gICAgICBodG1sICs9ICc8dHI+JztcbiAgICAgIGZvciAoY29uc3QgdGMgb2Yga2lkcyh0ciwgJ3RjJykpIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHBhcnNlSW50KHZhbChraWQodGMsICd0Y1ByJywgJ2dyaWRTcGFuJykpIHx8ICcxJywgMTApIHx8IDE7XG4gICAgICAgIGNvbnN0IHNwYW5BdHRyID0gc3BhbiA+IDEgPyBgIGNvbHNwYW49XCIke3NwYW59XCJgIDogJyc7XG4gICAgICAgIGxldCBpbm5lciA9ICcnO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIEFycmF5LmZyb20odGMuY2hpbGRyZW4pKSB7XG4gICAgICAgICAgaWYgKGNoaWxkLmxvY2FsTmFtZSA9PT0gJ3AnKSBpbm5lciArPSB0aGlzLmNvbnZlcnRQYXJhKGNoaWxkKTtcbiAgICAgICAgICBlbHNlIGlmIChjaGlsZC5sb2NhbE5hbWUgPT09ICd0YmwnKSBpbm5lciArPSB0aGlzLmNvbnZlcnRUYWJsZShjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwiYm9yZGVyOjFweCBzb2xpZCAjYjljMmNjXCIke3NwYW5BdHRyfT4ke2lubmVyIHx8ICc8YnI+J308L3RkPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgfVxuICAgIHJldHVybiBodG1sICsgJzwvdGJvZHk+PC90YWJsZT4nO1xuICB9XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZW50cnkgcG9pbnQgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbXBvcnREb2N4VG9IdG1sKGlucHV0OiBGaWxlIHwgQmxvYiB8IEFycmF5QnVmZmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYnVmID0gaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IGlucHV0IDogYXdhaXQgaW5wdXQuYXJyYXlCdWZmZXIoKTtcbiAgY29uc3QgZW50cmllcyA9IHBhcnNlWmlwKGJ1Zik7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcbiAgY29uc3QgcmVhZFhtbCA9IGFzeW5jIChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPERvY3VtZW50IHwgbnVsbD4gPT4ge1xuICAgIGNvbnN0IGUgPSBlbnRyaWVzLmdldChuYW1lKTtcbiAgICBpZiAoIWUpIHJldHVybiBudWxsO1xuICAgIHJldHVybiBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGRlY29kZXIuZGVjb2RlKGF3YWl0IHJlYWRFbnRyeShidWYsIGUpKSwgJ2FwcGxpY2F0aW9uL3htbCcpO1xuICB9O1xuXG4gIGNvbnN0IGRvYyA9IGF3YWl0IHJlYWRYbWwoJ3dvcmQvZG9jdW1lbnQueG1sJyk7XG4gIGNvbnN0IGJvZHkgPSBkb2M/LmdldEVsZW1lbnRzQnlUYWdOYW1lKCcqJyk7XG4gIGxldCBib2R5RWw6IEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgaWYgKGJvZHkpIHtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIEFycmF5LmZyb20oYm9keSkpIHtcbiAgICAgIGlmIChlbC5sb2NhbE5hbWUgPT09ICdib2R5Jykge1xuICAgICAgICBib2R5RWwgPSBlbDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmICghYm9keUVsKSB0aHJvdyBuZXcgRXJyb3IoJ3dvcmQvZG9jdW1lbnQueG1sIG1pc3Npbmcgb3IgaW52YWxpZCcpO1xuXG4gIC8vIHJlbGF0aW9uc2hpcHM6IGlkIOKGkiB0YXJnZXQgKGh5cGVybGlua3MgYXJlIGFic29sdXRlLCBpbWFnZXMgcmVsYXRpdmUgdG8gd29yZC8pXG4gIGNvbnN0IHJlbHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCBpbWFnZVRhcmdldHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBjb25zdCByZWxzRG9jID0gYXdhaXQgcmVhZFhtbCgnd29yZC9fcmVscy9kb2N1bWVudC54bWwucmVscycpO1xuICBpZiAocmVsc0RvYykge1xuICAgIGZvciAoY29uc3QgcmVsIG9mIEFycmF5LmZyb20ocmVsc0RvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKSkge1xuICAgICAgaWYgKHJlbC5sb2NhbE5hbWUgIT09ICdSZWxhdGlvbnNoaXAnKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGlkID0gcmVsLmdldEF0dHJpYnV0ZSgnSWQnKSB8fCAnJztcbiAgICAgIGNvbnN0IHRhcmdldCA9IHJlbC5nZXRBdHRyaWJ1dGUoJ1RhcmdldCcpIHx8ICcnO1xuICAgICAgY29uc3QgdHlwZSA9IHJlbC5nZXRBdHRyaWJ1dGUoJ1R5cGUnKSB8fCAnJztcbiAgICAgIGlmICgvaHlwZXJsaW5rL2kudGVzdCh0eXBlKSkgcmVscy5zZXQoaWQsIHRhcmdldCk7XG4gICAgICBlbHNlIGlmICgvaW1hZ2UvaS50ZXN0KHR5cGUpKSBpbWFnZVRhcmdldHMuc2V0KGlkLCB0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxvYWQgcmVmZXJlbmNlZCBpbWFnZXMgYXMgZGF0YSBVUkxzXG4gIGNvbnN0IGltYWdlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgW2lkLCB0YXJnZXRdIG9mIGltYWdlVGFyZ2V0cykge1xuICAgIGNvbnN0IHBhdGggPSB0YXJnZXQuc3RhcnRzV2l0aCgnLycpID8gdGFyZ2V0LnNsaWNlKDEpIDogJ3dvcmQvJyArIHRhcmdldC5yZXBsYWNlKC9eXFwuXFwvLywgJycpO1xuICAgIGNvbnN0IGVudHJ5ID0gZW50cmllcy5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyeSkgY29udGludWU7XG4gICAgY29uc3QgZXh0ID0gKHBhdGguc3BsaXQoJy4nKS5wb3AoKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBtaW1lID0gSU1HX01JTUVbZXh0XTtcbiAgICBpZiAoIW1pbWUpIGNvbnRpbnVlOyAvLyBza2lwIHVuc3VwcG9ydGVkIGZvcm1hdHMgbGlrZSBlbWYvd21mXG4gICAgdHJ5IHtcbiAgICAgIGltYWdlcy5zZXQoaWQsIGBkYXRhOiR7bWltZX07YmFzZTY0LCR7dG9CYXNlNjQoYXdhaXQgcmVhZEVudHJ5KGJ1ZiwgZW50cnkpKX1gKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIHNraXAgYnJva2VuIGltYWdlICovXG4gICAgfVxuICB9XG5cbiAgLy8gbnVtYmVyaW5nOiBudW1JZCDihpIgdWwvb2wgKGZyb20gbGV2ZWwtMCBudW1GbXQgb2YgdGhlIGFic3RyYWN0IGRlZmluaXRpb24pXG4gIGNvbnN0IG51bUZtdCA9IG5ldyBNYXA8c3RyaW5nLCAndWwnIHwgJ29sJz4oKTtcbiAgY29uc3QgbnVtRG9jID0gYXdhaXQgcmVhZFhtbCgnd29yZC9udW1iZXJpbmcueG1sJyk7XG4gIGlmIChudW1Eb2MpIHtcbiAgICBjb25zdCBhYnN0cmFjdEZtdCA9IG5ldyBNYXA8c3RyaW5nLCAndWwnIHwgJ29sJz4oKTtcbiAgICBjb25zdCBhbGwgPSBBcnJheS5mcm9tKG51bURvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgnKicpKTtcbiAgICBmb3IgKGNvbnN0IGVsIG9mIGFsbCkge1xuICAgICAgaWYgKGVsLmxvY2FsTmFtZSAhPT0gJ2Fic3RyYWN0TnVtJykgY29udGludWU7XG4gICAgICBjb25zdCBpZCA9IHZhbChlbCwgJ2Fic3RyYWN0TnVtSWQnKTtcbiAgICAgIGNvbnN0IGx2bDAgPSBraWRzKGVsLCAnbHZsJykuZmluZCgobCkgPT4gdmFsKGwsICdpbHZsJykgPT09ICcwJykgfHwga2lkcyhlbCwgJ2x2bCcpWzBdO1xuICAgICAgY29uc3QgZm10ID0gbHZsMCA/IHZhbChraWQobHZsMCwgJ251bUZtdCcpKSA6ICcnO1xuICAgICAgYWJzdHJhY3RGbXQuc2V0KGlkLCBmbXQgPT09ICdidWxsZXQnID8gJ3VsJyA6ICdvbCcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVsIG9mIGFsbCkge1xuICAgICAgaWYgKGVsLmxvY2FsTmFtZSAhPT0gJ251bScpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgbnVtSWQgPSB2YWwoZWwsICdudW1JZCcpO1xuICAgICAgY29uc3QgYWJzSWQgPSB2YWwoa2lkKGVsLCAnYWJzdHJhY3ROdW1JZCcpKTtcbiAgICAgIG51bUZtdC5zZXQobnVtSWQsIGFic3RyYWN0Rm10LmdldChhYnNJZCkgfHwgJ3VsJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBEb2N4Q29udmVydGVyKHJlbHMsIGltYWdlcywgbnVtRm10KS5jb252ZXJ0Qm9keShib2R5RWwpO1xufVxuIl19
|