@doxi/docx 0.11.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 +59 -0
- package/dist/blocks.d.ts +30 -0
- package/dist/blocks.d.ts.map +1 -0
- package/dist/blocks.js +69 -0
- package/dist/blocks.js.map +1 -0
- package/dist/export.d.ts +41 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +70 -0
- package/dist/export.js.map +1 -0
- package/dist/import.d.ts +35 -0
- package/dist/import.d.ts.map +1 -0
- package/dist/import.js +156 -0
- package/dist/import.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/inline.d.ts +15 -0
- package/dist/inline.d.ts.map +1 -0
- package/dist/inline.js +48 -0
- package/dist/inline.js.map +1 -0
- package/dist/lists.d.ts +17 -0
- package/dist/lists.d.ts.map +1 -0
- package/dist/lists.js +60 -0
- package/dist/lists.js.map +1 -0
- package/dist/parse-blocks.d.ts +33 -0
- package/dist/parse-blocks.d.ts.map +1 -0
- package/dist/parse-blocks.js +145 -0
- package/dist/parse-blocks.js.map +1 -0
- package/dist/parse-numbering.d.ts +24 -0
- package/dist/parse-numbering.d.ts.map +1 -0
- package/dist/parse-numbering.js +90 -0
- package/dist/parse-numbering.js.map +1 -0
- package/dist/parse-runs.d.ts +28 -0
- package/dist/parse-runs.d.ts.map +1 -0
- package/dist/parse-runs.js +230 -0
- package/dist/parse-runs.js.map +1 -0
- package/dist/parse-tables.d.ts +15 -0
- package/dist/parse-tables.d.ts.map +1 -0
- package/dist/parse-tables.js +200 -0
- package/dist/parse-tables.js.map +1 -0
- package/dist/parse-xml.d.ts +26 -0
- package/dist/parse-xml.d.ts.map +1 -0
- package/dist/parse-xml.js +286 -0
- package/dist/parse-xml.js.map +1 -0
- package/dist/parts.d.ts +18 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +102 -0
- package/dist/parts.js.map +1 -0
- package/dist/runs.d.ts +40 -0
- package/dist/runs.d.ts.map +1 -0
- package/dist/runs.js +72 -0
- package/dist/runs.js.map +1 -0
- package/dist/tables.d.ts +18 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +95 -0
- package/dist/tables.js.map +1 -0
- package/dist/unzip.d.ts +16 -0
- package/dist/unzip.d.ts.map +1 -0
- package/dist/unzip.js +108 -0
- package/dist/unzip.js.map +1 -0
- package/dist/warnings.d.ts +18 -0
- package/dist/warnings.d.ts.map +1 -0
- package/dist/warnings.js +12 -0
- package/dist/warnings.js.map +1 -0
- package/dist/xml.d.ts +23 -0
- package/dist/xml.d.ts.map +1 -0
- package/dist/xml.js +58 -0
- package/dist/xml.js.map +1 -0
- package/dist/zip.d.ts +15 -0
- package/dist/zip.d.ts.map +1 -0
- package/dist/zip.js +165 -0
- package/dist/zip.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-runs.js","sourceRoot":"","sources":["../src/parse-runs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a `<w:tbl>` element into a Doxiva `table` node, reversing what
|
|
3
|
+
* `tables.ts` emits.
|
|
4
|
+
*
|
|
5
|
+
* vMerge handling: the exporter writes the master cell with
|
|
6
|
+
* `<w:vMerge w:val="restart"/>` and continuation rows with `<w:vMerge/>`
|
|
7
|
+
* (no val). We track open vMerges by column so we can count rowspan when
|
|
8
|
+
* we encounter the master, and we drop continuation cells entirely from
|
|
9
|
+
* the model — table_cell rowspan attrs carry that information.
|
|
10
|
+
*/
|
|
11
|
+
import type { DxNode } from '@doxi/core';
|
|
12
|
+
import type { ParsedElement } from './parse-xml.js';
|
|
13
|
+
import type { ParseBlockCtx } from './parse-blocks.js';
|
|
14
|
+
export declare function parseTable(el: ParsedElement, ctx: ParseBlockCtx): DxNode;
|
|
15
|
+
//# sourceMappingURL=parse-tables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-tables.d.ts","sourceRoot":"","sources":["../src/parse-tables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACxC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAGtD,wBAAgB,UAAU,CAAC,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAsBxE"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parse a `<w:tbl>` element into a Doxiva `table` node, reversing what
|
|
3
|
+
* `tables.ts` emits.
|
|
4
|
+
*
|
|
5
|
+
* vMerge handling: the exporter writes the master cell with
|
|
6
|
+
* `<w:vMerge w:val="restart"/>` and continuation rows with `<w:vMerge/>`
|
|
7
|
+
* (no val). We track open vMerges by column so we can count rowspan when
|
|
8
|
+
* we encounter the master, and we drop continuation cells entirely from
|
|
9
|
+
* the model — table_cell rowspan attrs carry that information.
|
|
10
|
+
*/
|
|
11
|
+
import { parseParagraph } from './parse-blocks.js';
|
|
12
|
+
export function parseTable(el, ctx) {
|
|
13
|
+
// Materialize rows first so we can peek forward for rowspan counts.
|
|
14
|
+
const rows = [];
|
|
15
|
+
for (const child of el.children) {
|
|
16
|
+
if (typeof child === 'string')
|
|
17
|
+
continue;
|
|
18
|
+
if (child.name === 'w:tr')
|
|
19
|
+
rows.push(child);
|
|
20
|
+
// w:tblPr, w:tblGrid silently skipped — column widths not preserved.
|
|
21
|
+
}
|
|
22
|
+
const rowNodes = [];
|
|
23
|
+
for (let rIdx = 0; rIdx < rows.length; rIdx++) {
|
|
24
|
+
rowNodes.push(parseRow(rows, rIdx, ctx));
|
|
25
|
+
}
|
|
26
|
+
// Empty table → emit at least one row with one empty cell so the schema
|
|
27
|
+
// (table_row+, table_cell+) is satisfied.
|
|
28
|
+
if (rowNodes.length === 0) {
|
|
29
|
+
const cell = ctx.schema.node('table_cell', null, [ctx.schema.node('paragraph', null)]);
|
|
30
|
+
const row = ctx.schema.node('table_row', null, [cell]);
|
|
31
|
+
return ctx.schema.node('table', null, [row]);
|
|
32
|
+
}
|
|
33
|
+
return ctx.schema.node('table', null, rowNodes);
|
|
34
|
+
}
|
|
35
|
+
function parseRow(rows, rIdx, ctx) {
|
|
36
|
+
const row = rows[rIdx];
|
|
37
|
+
let header = false;
|
|
38
|
+
// Pre-scan trPr.
|
|
39
|
+
for (const child of row.children) {
|
|
40
|
+
if (typeof child === 'string')
|
|
41
|
+
continue;
|
|
42
|
+
if (child.name === 'w:trPr') {
|
|
43
|
+
for (const tp of child.children) {
|
|
44
|
+
if (typeof tp === 'string')
|
|
45
|
+
continue;
|
|
46
|
+
if (tp.name === 'w:tblHeader')
|
|
47
|
+
header = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const cells = [];
|
|
52
|
+
// Track the column index as we walk cells — colspan advances it by N,
|
|
53
|
+
// continuation cells (vMerge no-val) are skipped but still take grid space.
|
|
54
|
+
let colCursor = 0;
|
|
55
|
+
for (const child of row.children) {
|
|
56
|
+
if (typeof child === 'string')
|
|
57
|
+
continue;
|
|
58
|
+
if (child.name !== 'w:tc')
|
|
59
|
+
continue;
|
|
60
|
+
const info = readTcPr(child);
|
|
61
|
+
if (info.vMergeContinuation) {
|
|
62
|
+
// Skip from the model; we still need to advance the column cursor by
|
|
63
|
+
// the cell's gridSpan so any subsequent master cell lines up right.
|
|
64
|
+
colCursor += info.colspan;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
// Master cell — compute rowspan if vMerge restart.
|
|
68
|
+
let rowspan = 1;
|
|
69
|
+
if (info.vMergeRestart) {
|
|
70
|
+
// Count subsequent rows that have a continuation cell aligned with the
|
|
71
|
+
// same column index.
|
|
72
|
+
const startCol = colCursor;
|
|
73
|
+
for (let nextR = rIdx + 1; nextR < rows.length; nextR++) {
|
|
74
|
+
if (rowHasContinuationAt(rows[nextR], startCol))
|
|
75
|
+
rowspan++;
|
|
76
|
+
else
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const cellAttrs = {};
|
|
81
|
+
if (info.colspan > 1)
|
|
82
|
+
cellAttrs.colspan = info.colspan;
|
|
83
|
+
if (rowspan > 1)
|
|
84
|
+
cellAttrs.rowspan = rowspan;
|
|
85
|
+
if (info.background !== undefined)
|
|
86
|
+
cellAttrs.background = info.background;
|
|
87
|
+
if (info.widthPx !== undefined)
|
|
88
|
+
cellAttrs.widthPx = info.widthPx;
|
|
89
|
+
const inner = parseCellContent(child, ctx);
|
|
90
|
+
cells.push(ctx.schema.node('table_cell', cellAttrs, inner));
|
|
91
|
+
colCursor += info.colspan;
|
|
92
|
+
}
|
|
93
|
+
// Word requires at least one cell per row; the schema does too.
|
|
94
|
+
if (cells.length === 0) {
|
|
95
|
+
cells.push(ctx.schema.node('table_cell', null, [ctx.schema.node('paragraph', null)]));
|
|
96
|
+
}
|
|
97
|
+
const rowAttrs = header ? { header: true } : null;
|
|
98
|
+
return ctx.schema.node('table_row', rowAttrs, cells);
|
|
99
|
+
}
|
|
100
|
+
function readTcPr(tc) {
|
|
101
|
+
const info = { colspan: 1, vMergeRestart: false, vMergeContinuation: false };
|
|
102
|
+
for (const child of tc.children) {
|
|
103
|
+
if (typeof child === 'string')
|
|
104
|
+
continue;
|
|
105
|
+
if (child.name !== 'w:tcPr')
|
|
106
|
+
continue;
|
|
107
|
+
for (const p of child.children) {
|
|
108
|
+
if (typeof p === 'string')
|
|
109
|
+
continue;
|
|
110
|
+
switch (p.name) {
|
|
111
|
+
case 'w:gridSpan': {
|
|
112
|
+
const v = p.attrs['w:val'];
|
|
113
|
+
if (v) {
|
|
114
|
+
const n = parseInt(v, 10);
|
|
115
|
+
if (Number.isFinite(n) && n >= 1)
|
|
116
|
+
info.colspan = n;
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
case 'w:vMerge': {
|
|
121
|
+
const v = p.attrs['w:val'];
|
|
122
|
+
if (v === 'restart')
|
|
123
|
+
info.vMergeRestart = true;
|
|
124
|
+
else
|
|
125
|
+
info.vMergeContinuation = true;
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
case 'w:shd': {
|
|
129
|
+
const fill = p.attrs['w:fill'];
|
|
130
|
+
if (fill && fill !== 'auto') {
|
|
131
|
+
info.background = fill.startsWith('#') ? fill : `#${fill}`;
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
}
|
|
135
|
+
case 'w:tcW': {
|
|
136
|
+
const v = p.attrs['w:w'];
|
|
137
|
+
const type = p.attrs['w:type'] ?? 'dxa';
|
|
138
|
+
if (v && type === 'dxa') {
|
|
139
|
+
const twips = parseInt(v, 10);
|
|
140
|
+
if (Number.isFinite(twips))
|
|
141
|
+
info.widthPx = Math.round(twips / 15);
|
|
142
|
+
}
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return info;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Does the given row carry a `<w:tc>` whose vMerge is a continuation and
|
|
152
|
+
* whose effective column position equals `targetCol`? Walks the row's cells,
|
|
153
|
+
* tracking colspan to figure out each cell's start column.
|
|
154
|
+
*/
|
|
155
|
+
function rowHasContinuationAt(row, targetCol) {
|
|
156
|
+
let col = 0;
|
|
157
|
+
for (const child of row.children) {
|
|
158
|
+
if (typeof child === 'string')
|
|
159
|
+
continue;
|
|
160
|
+
if (child.name !== 'w:tc')
|
|
161
|
+
continue;
|
|
162
|
+
const info = readTcPr(child);
|
|
163
|
+
if (col === targetCol) {
|
|
164
|
+
return info.vMergeContinuation;
|
|
165
|
+
}
|
|
166
|
+
if (col > targetCol)
|
|
167
|
+
return false;
|
|
168
|
+
col += info.colspan;
|
|
169
|
+
}
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
function parseCellContent(tc, ctx) {
|
|
173
|
+
const blocks = [];
|
|
174
|
+
for (const child of tc.children) {
|
|
175
|
+
if (typeof child === 'string')
|
|
176
|
+
continue;
|
|
177
|
+
if (child.name === 'w:tcPr')
|
|
178
|
+
continue;
|
|
179
|
+
if (child.name === 'w:p') {
|
|
180
|
+
const parsed = parseParagraph(child, ctx);
|
|
181
|
+
// Cell-level lists are flattened to plain paragraphs in v0.8.
|
|
182
|
+
if (parsed.kind === 'list-paragraph') {
|
|
183
|
+
ctx.warnings.add({
|
|
184
|
+
code: 'unsupported-feature',
|
|
185
|
+
message: 'List paragraphs inside table cells flattened to paragraphs',
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
blocks.push(parsed.node);
|
|
189
|
+
}
|
|
190
|
+
else if (child.name === 'w:tbl') {
|
|
191
|
+
blocks.push(parseTable(child, ctx));
|
|
192
|
+
}
|
|
193
|
+
// Other cell children silently skipped.
|
|
194
|
+
}
|
|
195
|
+
if (blocks.length === 0) {
|
|
196
|
+
blocks.push(ctx.schema.node('paragraph', null));
|
|
197
|
+
}
|
|
198
|
+
return blocks;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=parse-tables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-tables.js","sourceRoot":"","sources":["../src/parse-tables.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny XML parser used by the DOCX importer.
|
|
3
|
+
*
|
|
4
|
+
* Strategy:
|
|
5
|
+
* 1. Prefer the platform's `DOMParser` when available (browsers, jsdom,
|
|
6
|
+
* happy-dom). This is fast, well-tested, and handles all the edge cases.
|
|
7
|
+
* 2. Fall back to a hand-rolled state machine for Node-only environments
|
|
8
|
+
* where no DOM is present. The fallback supports tags, attributes,
|
|
9
|
+
* self-closing elements, CDATA, comments, processing instructions, the
|
|
10
|
+
* XML declaration, and the five standard entities plus numeric / hex
|
|
11
|
+
* character references.
|
|
12
|
+
*
|
|
13
|
+
* Both paths produce the same shape of result: a tree of `ParsedElement`
|
|
14
|
+
* nodes with qualified (namespaced) tag names like `w:p`.
|
|
15
|
+
*/
|
|
16
|
+
export interface ParsedElement {
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly attrs: Readonly<Record<string, string>>;
|
|
19
|
+
readonly children: ReadonlyArray<ParsedNode>;
|
|
20
|
+
}
|
|
21
|
+
export type ParsedNode = ParsedElement | string;
|
|
22
|
+
export interface ParsedXml {
|
|
23
|
+
readonly root: ParsedElement;
|
|
24
|
+
}
|
|
25
|
+
export declare function parseXml(xml: string): ParsedXml;
|
|
26
|
+
//# sourceMappingURL=parse-xml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-xml.d.ts","sourceRoot":"","sources":["../src/parse-xml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAChD,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;CAC7C;AACD,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,MAAM,CAAA;AAE/C,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAC7B;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAI/C"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiny XML parser used by the DOCX importer.
|
|
3
|
+
*
|
|
4
|
+
* Strategy:
|
|
5
|
+
* 1. Prefer the platform's `DOMParser` when available (browsers, jsdom,
|
|
6
|
+
* happy-dom). This is fast, well-tested, and handles all the edge cases.
|
|
7
|
+
* 2. Fall back to a hand-rolled state machine for Node-only environments
|
|
8
|
+
* where no DOM is present. The fallback supports tags, attributes,
|
|
9
|
+
* self-closing elements, CDATA, comments, processing instructions, the
|
|
10
|
+
* XML declaration, and the five standard entities plus numeric / hex
|
|
11
|
+
* character references.
|
|
12
|
+
*
|
|
13
|
+
* Both paths produce the same shape of result: a tree of `ParsedElement`
|
|
14
|
+
* nodes with qualified (namespaced) tag names like `w:p`.
|
|
15
|
+
*/
|
|
16
|
+
export function parseXml(xml) {
|
|
17
|
+
const DP = globalThis.DOMParser;
|
|
18
|
+
if (DP)
|
|
19
|
+
return viaDOMParser(xml, DP);
|
|
20
|
+
return viaHandWalker(xml);
|
|
21
|
+
}
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// DOMParser path
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function viaDOMParser(xml, DP) {
|
|
26
|
+
const doc = new DP().parseFromString(xml, 'application/xml');
|
|
27
|
+
const root = doc.documentElement;
|
|
28
|
+
if (!root)
|
|
29
|
+
throw new Error('parseXml: no document element');
|
|
30
|
+
// Browsers / jsdom signal parse errors via a <parsererror> root. happy-dom
|
|
31
|
+
// currently doesn't, but checking is cheap.
|
|
32
|
+
if (root.tagName === 'parsererror' || root.getElementsByTagName('parsererror').length > 0) {
|
|
33
|
+
const errText = root.textContent ?? 'unknown parse error';
|
|
34
|
+
throw new Error(`parseXml: malformed XML — ${errText.slice(0, 200)}`);
|
|
35
|
+
}
|
|
36
|
+
return { root: domToParsed(root) };
|
|
37
|
+
}
|
|
38
|
+
function domToParsed(el) {
|
|
39
|
+
const attrs = {};
|
|
40
|
+
for (let i = 0; i < el.attributes.length; i++) {
|
|
41
|
+
const a = el.attributes[i];
|
|
42
|
+
if (a)
|
|
43
|
+
attrs[a.name] = a.value;
|
|
44
|
+
}
|
|
45
|
+
const children = [];
|
|
46
|
+
for (let i = 0; i < el.childNodes.length; i++) {
|
|
47
|
+
const c = el.childNodes[i];
|
|
48
|
+
if (!c)
|
|
49
|
+
continue;
|
|
50
|
+
const kind = c.nodeType;
|
|
51
|
+
if (kind === 3 /* TEXT */) {
|
|
52
|
+
const text = c.data;
|
|
53
|
+
if (text)
|
|
54
|
+
children.push(text);
|
|
55
|
+
}
|
|
56
|
+
else if (kind === 4 /* CDATA */) {
|
|
57
|
+
const text = c.data;
|
|
58
|
+
if (text)
|
|
59
|
+
children.push(text);
|
|
60
|
+
}
|
|
61
|
+
else if (kind === 1 /* ELEMENT */) {
|
|
62
|
+
children.push(domToParsed(c));
|
|
63
|
+
}
|
|
64
|
+
// comments (8), PIs (7), etc. are skipped
|
|
65
|
+
}
|
|
66
|
+
return { name: el.tagName, attrs, children };
|
|
67
|
+
}
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
// Hand-walker fallback
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
function viaHandWalker(xml) {
|
|
72
|
+
const p = new Walker(xml);
|
|
73
|
+
p.skipProlog();
|
|
74
|
+
const root = p.readElement();
|
|
75
|
+
if (!root)
|
|
76
|
+
throw new Error('parseXml: no root element');
|
|
77
|
+
// Trailing whitespace / comments / PIs are allowed.
|
|
78
|
+
p.skipMisc();
|
|
79
|
+
if (!p.eof())
|
|
80
|
+
throw new Error(`parseXml: unexpected content after root element at offset ${p.pos}`);
|
|
81
|
+
return { root };
|
|
82
|
+
}
|
|
83
|
+
class Walker {
|
|
84
|
+
src;
|
|
85
|
+
pos = 0;
|
|
86
|
+
constructor(src) {
|
|
87
|
+
this.src = src;
|
|
88
|
+
}
|
|
89
|
+
eof() { return this.pos >= this.src.length; }
|
|
90
|
+
peek(o = 0) { return this.src[this.pos + o] ?? ''; }
|
|
91
|
+
startsWith(s) { return this.src.startsWith(s, this.pos); }
|
|
92
|
+
skipWs() {
|
|
93
|
+
while (this.pos < this.src.length) {
|
|
94
|
+
const c = this.src.charCodeAt(this.pos);
|
|
95
|
+
if (c === 32 || c === 9 || c === 10 || c === 13)
|
|
96
|
+
this.pos++;
|
|
97
|
+
else
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
skipProlog() {
|
|
102
|
+
this.skipWs();
|
|
103
|
+
if (this.startsWith('<?xml')) {
|
|
104
|
+
const end = this.src.indexOf('?>', this.pos);
|
|
105
|
+
if (end < 0)
|
|
106
|
+
throw new Error('parseXml: unterminated XML declaration');
|
|
107
|
+
this.pos = end + 2;
|
|
108
|
+
}
|
|
109
|
+
this.skipMisc();
|
|
110
|
+
}
|
|
111
|
+
// Comments, PIs, and whitespace between top-level constructs.
|
|
112
|
+
skipMisc() {
|
|
113
|
+
while (!this.eof()) {
|
|
114
|
+
this.skipWs();
|
|
115
|
+
if (this.startsWith('<!--')) {
|
|
116
|
+
const end = this.src.indexOf('-->', this.pos + 4);
|
|
117
|
+
if (end < 0)
|
|
118
|
+
throw new Error('parseXml: unterminated comment');
|
|
119
|
+
this.pos = end + 3;
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (this.startsWith('<?')) {
|
|
123
|
+
const end = this.src.indexOf('?>', this.pos + 2);
|
|
124
|
+
if (end < 0)
|
|
125
|
+
throw new Error('parseXml: unterminated processing instruction');
|
|
126
|
+
this.pos = end + 2;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (this.startsWith('<!DOCTYPE')) {
|
|
130
|
+
// Skip until the matching `>` (accept simple DTDs only).
|
|
131
|
+
const end = this.src.indexOf('>', this.pos);
|
|
132
|
+
if (end < 0)
|
|
133
|
+
throw new Error('parseXml: unterminated DOCTYPE');
|
|
134
|
+
this.pos = end + 1;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
readName() {
|
|
141
|
+
const start = this.pos;
|
|
142
|
+
while (this.pos < this.src.length) {
|
|
143
|
+
const c = this.src[this.pos];
|
|
144
|
+
if (c === ' ' || c === '\t' || c === '\n' || c === '\r' || c === '>' || c === '/' || c === '=')
|
|
145
|
+
break;
|
|
146
|
+
this.pos++;
|
|
147
|
+
}
|
|
148
|
+
if (this.pos === start)
|
|
149
|
+
throw new Error(`parseXml: expected a name at offset ${start}`);
|
|
150
|
+
return this.src.slice(start, this.pos);
|
|
151
|
+
}
|
|
152
|
+
readAttr() {
|
|
153
|
+
this.skipWs();
|
|
154
|
+
if (this.peek() === '/' || this.peek() === '>')
|
|
155
|
+
return null;
|
|
156
|
+
const name = this.readName();
|
|
157
|
+
this.skipWs();
|
|
158
|
+
if (this.peek() !== '=')
|
|
159
|
+
throw new Error(`parseXml: expected '=' after attribute name '${name}' at offset ${this.pos}`);
|
|
160
|
+
this.pos++; // consume '='
|
|
161
|
+
this.skipWs();
|
|
162
|
+
const quote = this.peek();
|
|
163
|
+
if (quote !== '"' && quote !== "'") {
|
|
164
|
+
throw new Error(`parseXml: expected quoted attribute value at offset ${this.pos}`);
|
|
165
|
+
}
|
|
166
|
+
this.pos++; // consume opening quote
|
|
167
|
+
const start = this.pos;
|
|
168
|
+
while (this.pos < this.src.length && this.src[this.pos] !== quote)
|
|
169
|
+
this.pos++;
|
|
170
|
+
if (this.pos >= this.src.length)
|
|
171
|
+
throw new Error('parseXml: unterminated attribute value');
|
|
172
|
+
const raw = this.src.slice(start, this.pos);
|
|
173
|
+
this.pos++; // consume closing quote
|
|
174
|
+
return { name, value: decodeEntities(raw) };
|
|
175
|
+
}
|
|
176
|
+
readElement() {
|
|
177
|
+
this.skipMisc();
|
|
178
|
+
if (this.eof())
|
|
179
|
+
return null;
|
|
180
|
+
if (this.peek() !== '<')
|
|
181
|
+
throw new Error(`parseXml: expected '<' at offset ${this.pos}`);
|
|
182
|
+
this.pos++; // consume '<'
|
|
183
|
+
const name = this.readName();
|
|
184
|
+
const attrs = {};
|
|
185
|
+
while (true) {
|
|
186
|
+
const a = this.readAttr();
|
|
187
|
+
if (!a)
|
|
188
|
+
break;
|
|
189
|
+
attrs[a.name] = a.value;
|
|
190
|
+
}
|
|
191
|
+
this.skipWs();
|
|
192
|
+
if (this.peek() === '/') {
|
|
193
|
+
// self-closing
|
|
194
|
+
this.pos++;
|
|
195
|
+
if (this.peek() !== '>')
|
|
196
|
+
throw new Error(`parseXml: expected '>' after '/' at offset ${this.pos}`);
|
|
197
|
+
this.pos++;
|
|
198
|
+
return { name, attrs, children: [] };
|
|
199
|
+
}
|
|
200
|
+
if (this.peek() !== '>')
|
|
201
|
+
throw new Error(`parseXml: expected '>' at offset ${this.pos}`);
|
|
202
|
+
this.pos++; // consume '>'
|
|
203
|
+
const children = [];
|
|
204
|
+
while (!this.eof()) {
|
|
205
|
+
// CDATA?
|
|
206
|
+
if (this.startsWith('<![CDATA[')) {
|
|
207
|
+
const end = this.src.indexOf(']]>', this.pos + 9);
|
|
208
|
+
if (end < 0)
|
|
209
|
+
throw new Error('parseXml: unterminated CDATA section');
|
|
210
|
+
const text = this.src.slice(this.pos + 9, end);
|
|
211
|
+
if (text)
|
|
212
|
+
children.push(text);
|
|
213
|
+
this.pos = end + 3;
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
// Comment?
|
|
217
|
+
if (this.startsWith('<!--')) {
|
|
218
|
+
const end = this.src.indexOf('-->', this.pos + 4);
|
|
219
|
+
if (end < 0)
|
|
220
|
+
throw new Error('parseXml: unterminated comment');
|
|
221
|
+
this.pos = end + 3;
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// PI?
|
|
225
|
+
if (this.startsWith('<?')) {
|
|
226
|
+
const end = this.src.indexOf('?>', this.pos + 2);
|
|
227
|
+
if (end < 0)
|
|
228
|
+
throw new Error('parseXml: unterminated processing instruction');
|
|
229
|
+
this.pos = end + 2;
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
// End tag?
|
|
233
|
+
if (this.startsWith('</')) {
|
|
234
|
+
this.pos += 2;
|
|
235
|
+
const endName = this.readName();
|
|
236
|
+
if (endName !== name) {
|
|
237
|
+
throw new Error(`parseXml: mismatched end tag </${endName}> for <${name}> at offset ${this.pos}`);
|
|
238
|
+
}
|
|
239
|
+
this.skipWs();
|
|
240
|
+
if (this.peek() !== '>')
|
|
241
|
+
throw new Error(`parseXml: expected '>' in end tag at offset ${this.pos}`);
|
|
242
|
+
this.pos++;
|
|
243
|
+
return { name, attrs, children };
|
|
244
|
+
}
|
|
245
|
+
// Child element?
|
|
246
|
+
if (this.peek() === '<') {
|
|
247
|
+
const child = this.readElement();
|
|
248
|
+
if (child)
|
|
249
|
+
children.push(child);
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
// Text node — read until next '<'.
|
|
253
|
+
const next = this.src.indexOf('<', this.pos);
|
|
254
|
+
const end = next < 0 ? this.src.length : next;
|
|
255
|
+
const text = decodeEntities(this.src.slice(this.pos, end));
|
|
256
|
+
if (text)
|
|
257
|
+
children.push(text);
|
|
258
|
+
this.pos = end;
|
|
259
|
+
}
|
|
260
|
+
throw new Error(`parseXml: unterminated element <${name}>`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
const ENTITY_RE = /&(#x[0-9a-fA-F]+|#[0-9]+|amp|lt|gt|quot|apos);/g;
|
|
264
|
+
function decodeEntities(s) {
|
|
265
|
+
if (s.indexOf('&') < 0)
|
|
266
|
+
return s;
|
|
267
|
+
return s.replace(ENTITY_RE, (_, body) => {
|
|
268
|
+
if (body[0] === '#') {
|
|
269
|
+
const code = body[1] === 'x'
|
|
270
|
+
? parseInt(body.slice(2), 16)
|
|
271
|
+
: parseInt(body.slice(1), 10);
|
|
272
|
+
if (!Number.isFinite(code))
|
|
273
|
+
return _;
|
|
274
|
+
return String.fromCodePoint(code);
|
|
275
|
+
}
|
|
276
|
+
switch (body) {
|
|
277
|
+
case 'amp': return '&';
|
|
278
|
+
case 'lt': return '<';
|
|
279
|
+
case 'gt': return '>';
|
|
280
|
+
case 'quot': return '"';
|
|
281
|
+
case 'apos': return "'";
|
|
282
|
+
default: return _;
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=parse-xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-xml.js","sourceRoot":"","sources":["../src/parse-xml.ts"],"names":[],"mappings":"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"}
|
package/dist/parts.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function contentTypesXml(): string;
|
|
2
|
+
export declare function rootRelsXml(): string;
|
|
3
|
+
export declare function documentRelsXml(hyperlinks: ReadonlyArray<{
|
|
4
|
+
id: string;
|
|
5
|
+
target: string;
|
|
6
|
+
}>): string;
|
|
7
|
+
export declare function stylesXml(): string;
|
|
8
|
+
/**
|
|
9
|
+
* Emit `numbering.xml`. The two predefined abstractNums (0 = bullet, 1 =
|
|
10
|
+
* decimal) and their seed `<w:num>` instances (numId 1, 2) are always
|
|
11
|
+
* present. Additional `<w:num>` rows can be threaded in via `extra` so each
|
|
12
|
+
* Doxiva `list` node gets its own numbering instance (independent restarts).
|
|
13
|
+
*/
|
|
14
|
+
export declare function numberingXml(extra?: ReadonlyArray<{
|
|
15
|
+
numId: number;
|
|
16
|
+
ordered: boolean;
|
|
17
|
+
}>): string;
|
|
18
|
+
//# sourceMappingURL=parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../src/parts.ts"],"names":[],"mappings":"AAEA,wBAAgB,eAAe,IAAI,MAAM,CASxC;AAED,wBAAgB,WAAW,IAAI,MAAM,CASpC;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAuBjG;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,GAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAM,GAAG,MAAM,CAOnG"}
|