@unisim/doc 0.1.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/README.md +91 -0
- package/dist/convert.d.ts +54 -0
- package/dist/convert.d.ts.map +1 -0
- package/dist/convert.js +216 -0
- package/dist/convert.js.map +1 -0
- package/dist/image.d.ts +17 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +66 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/merge.d.ts +14 -0
- package/dist/merge.d.ts.map +1 -0
- package/dist/merge.js +51 -0
- package/dist/merge.js.map +1 -0
- package/dist/metrics.d.ts +19 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +151 -0
- package/dist/metrics.js.map +1 -0
- package/dist/model.d.ts +114 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +121 -0
- package/dist/model.js.map +1 -0
- package/dist/pdfcore.d.ts +118 -0
- package/dist/pdfcore.d.ts.map +1 -0
- package/dist/pdfcore.js +398 -0
- package/dist/pdfcore.js.map +1 -0
- package/dist/read/csv.d.ts +17 -0
- package/dist/read/csv.d.ts.map +1 -0
- package/dist/read/csv.js +167 -0
- package/dist/read/csv.js.map +1 -0
- package/dist/read/doc.d.ts +3 -0
- package/dist/read/doc.d.ts.map +1 -0
- package/dist/read/doc.js +360 -0
- package/dist/read/doc.js.map +1 -0
- package/dist/read/docx.d.ts +3 -0
- package/dist/read/docx.d.ts.map +1 -0
- package/dist/read/docx.js +455 -0
- package/dist/read/docx.js.map +1 -0
- package/dist/read/html.d.ts +4 -0
- package/dist/read/html.d.ts.map +1 -0
- package/dist/read/html.js +236 -0
- package/dist/read/html.js.map +1 -0
- package/dist/read/json.d.ts +9 -0
- package/dist/read/json.d.ts.map +1 -0
- package/dist/read/json.js +105 -0
- package/dist/read/json.js.map +1 -0
- package/dist/read/markdown.d.ts +4 -0
- package/dist/read/markdown.d.ts.map +1 -0
- package/dist/read/markdown.js +247 -0
- package/dist/read/markdown.js.map +1 -0
- package/dist/read/odt.d.ts +3 -0
- package/dist/read/odt.d.ts.map +1 -0
- package/dist/read/odt.js +359 -0
- package/dist/read/odt.js.map +1 -0
- package/dist/read/rtf.d.ts +3 -0
- package/dist/read/rtf.d.ts.map +1 -0
- package/dist/read/rtf.js +341 -0
- package/dist/read/rtf.js.map +1 -0
- package/dist/read/text.d.ts +4 -0
- package/dist/read/text.d.ts.map +1 -0
- package/dist/read/text.js +62 -0
- package/dist/read/text.js.map +1 -0
- package/dist/unzip.d.ts +23 -0
- package/dist/unzip.d.ts.map +1 -0
- package/dist/unzip.js +152 -0
- package/dist/unzip.js.map +1 -0
- package/dist/write/data.d.ts +16 -0
- package/dist/write/data.d.ts.map +1 -0
- package/dist/write/data.js +89 -0
- package/dist/write/data.js.map +1 -0
- package/dist/write/pdf.d.ts +10 -0
- package/dist/write/pdf.d.ts.map +1 -0
- package/dist/write/pdf.js +696 -0
- package/dist/write/pdf.js.map +1 -0
- package/dist/write/pdfSettings.d.ts +13 -0
- package/dist/write/pdfSettings.d.ts.map +1 -0
- package/dist/write/pdfSettings.js +26 -0
- package/dist/write/pdfSettings.js.map +1 -0
- package/dist/write/text.d.ts +5 -0
- package/dist/write/text.d.ts.map +1 -0
- package/dist/write/text.js +341 -0
- package/dist/write/text.js.map +1 -0
- package/dist/xml.d.ts +22 -0
- package/dist/xml.d.ts.map +1 -0
- package/dist/xml.js +83 -0
- package/dist/xml.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// DOCX → RichDoc.
|
|
3
|
+
//
|
|
4
|
+
// A .docx is a ZIP of XML. The body is `word/document.xml`; what a paragraph's
|
|
5
|
+
// style *means* is in `styles.xml`; whether a list is bulleted or numbered is
|
|
6
|
+
// in `numbering.xml`; and where a hyperlink or an image actually points is in
|
|
7
|
+
// `word/_rels/document.xml.rels`. Reading the body alone gets you text with
|
|
8
|
+
// every heading flattened, every list bulleted and every link dead, so all four
|
|
9
|
+
// are read.
|
|
10
|
+
//
|
|
11
|
+
// THE PARTS THIS DELIBERATELY LEAVES BEHIND
|
|
12
|
+
// -----------------------------------------
|
|
13
|
+
// Headers and footers, footnotes, comments, tracked-change history, text boxes,
|
|
14
|
+
// charts, equations, columns, and anything positioned rather than flowed. Each
|
|
15
|
+
// is either a different document (a footer is not body text) or needs a layout
|
|
16
|
+
// model far past what the writer here can honour — and a footer silently
|
|
17
|
+
// appearing as a paragraph in the middle of page one is worse than not having
|
|
18
|
+
// it. Where one is present and dropped, it is NAMED in a notice, so the loss
|
|
19
|
+
// arrives with the file rather than being found later.
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
import { addNotice, mergeRuns, tidy, } from '../model.js';
|
|
22
|
+
import { ZipArchive } from '../unzip.js';
|
|
23
|
+
import { attr, child, children, descendant, descendants, onOff, parseXml } from '../xml.js';
|
|
24
|
+
const W = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
|
|
25
|
+
const R = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
|
|
26
|
+
const A = 'http://schemas.openxmlformats.org/drawingml/2006/main';
|
|
27
|
+
const DC = 'http://purl.org/dc/elements/1.1/';
|
|
28
|
+
const IMAGE_MIME = {
|
|
29
|
+
png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg', gif: 'image/gif',
|
|
30
|
+
bmp: 'image/bmp', webp: 'image/webp', tif: 'image/tiff', tiff: 'image/tiff',
|
|
31
|
+
emf: 'image/emf', wmf: 'image/wmf', svg: 'image/svg+xml',
|
|
32
|
+
};
|
|
33
|
+
/** Formats a reader can't rasterise, so the page would be blank where they are. */
|
|
34
|
+
const UNDRAWABLE = new Set(['emf', 'wmf', 'tif', 'tiff']);
|
|
35
|
+
export async function readDocx(file) {
|
|
36
|
+
const zip = await ZipArchive.open(file);
|
|
37
|
+
const documentXml = await zip.textOf('word/document.xml');
|
|
38
|
+
if (!documentXml) {
|
|
39
|
+
// A .doc renamed to .docx is the overwhelmingly common cause, and the two
|
|
40
|
+
// are completely different formats rather than versions of one.
|
|
41
|
+
throw new Error('This isn’t a Word .docx inside — it may be an old .doc renamed.');
|
|
42
|
+
}
|
|
43
|
+
const doc = { blocks: [], notices: [] };
|
|
44
|
+
const rels = await readRelationships(zip);
|
|
45
|
+
const styles = await readStyleNames(zip);
|
|
46
|
+
const numbering = await readNumbering(zip);
|
|
47
|
+
await readCoreProperties(zip, doc);
|
|
48
|
+
const body = child(parseXml(documentXml, 'document'), W, 'document');
|
|
49
|
+
const root = body ? child(body, W, 'body') : null;
|
|
50
|
+
if (!root)
|
|
51
|
+
throw new Error('This Word file has no body to read.');
|
|
52
|
+
const ctx = { zip, rels, styles, numbering, doc };
|
|
53
|
+
await readBlocks(root, ctx, doc.blocks);
|
|
54
|
+
noteWhatWasLeftBehind(zip, doc);
|
|
55
|
+
return tidy(doc);
|
|
56
|
+
}
|
|
57
|
+
// ── The body ─────────────────────────────────────────────────────────────────
|
|
58
|
+
/**
|
|
59
|
+
* Walk `w:body` (or a table cell, which has the same content model).
|
|
60
|
+
*
|
|
61
|
+
* List items are gathered as they go: Word has no list ELEMENT — consecutive
|
|
62
|
+
* paragraphs that happen to share a `numId` are a list — so a run of them is
|
|
63
|
+
* accumulated and flushed the moment something that is not one comes along.
|
|
64
|
+
*/
|
|
65
|
+
async function readBlocks(root, ctx, out) {
|
|
66
|
+
let pending = null;
|
|
67
|
+
const flush = () => {
|
|
68
|
+
if (pending?.items.length)
|
|
69
|
+
out.push({ kind: 'list', ordered: pending.ordered, items: pending.items });
|
|
70
|
+
pending = null;
|
|
71
|
+
};
|
|
72
|
+
for (const node of Array.from(root.childNodes)) {
|
|
73
|
+
if (node.nodeType !== 1)
|
|
74
|
+
continue;
|
|
75
|
+
const el = node;
|
|
76
|
+
if (el.namespaceURI !== W)
|
|
77
|
+
continue;
|
|
78
|
+
if (el.localName === 'p') {
|
|
79
|
+
const para = await readParagraph(el, ctx);
|
|
80
|
+
if (para.list) {
|
|
81
|
+
// A change of kind (bullet → numbered) starts a new list; a change of
|
|
82
|
+
// level does not, because that is the same list indenting.
|
|
83
|
+
if (!pending || pending.ordered !== para.list.ordered) {
|
|
84
|
+
flush();
|
|
85
|
+
pending = { ordered: para.list.ordered, items: [] };
|
|
86
|
+
}
|
|
87
|
+
pending.items.push({ runs: para.runs, level: para.list.level });
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
flush();
|
|
91
|
+
out.push(...para.blocks);
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (el.localName === 'tbl') {
|
|
95
|
+
flush();
|
|
96
|
+
out.push(await readTable(el, ctx));
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (el.localName === 'sdt') {
|
|
100
|
+
// A content control — a date picker, a dropdown, a citation. The value
|
|
101
|
+
// sits in `sdtContent`, which is ordinary body content.
|
|
102
|
+
const content = child(el, W, 'sdtContent');
|
|
103
|
+
if (content)
|
|
104
|
+
await readBlocks(content, ctx, out);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
flush();
|
|
109
|
+
}
|
|
110
|
+
async function readParagraph(el, ctx) {
|
|
111
|
+
const props = child(el, W, 'pPr');
|
|
112
|
+
const styleId = (props ? attr(child(props, W, 'pStyle'), W, 'val') : null) ?? '';
|
|
113
|
+
const runs = await readRuns(el, ctx);
|
|
114
|
+
const blocks = [];
|
|
115
|
+
// Images are block-level here even when Word floats them inline. A picture
|
|
116
|
+
// wrapped by text needs a layout model with float support; putting it on its
|
|
117
|
+
// own line keeps the reading order right, which is the part that matters.
|
|
118
|
+
const images = await readImages(el, ctx);
|
|
119
|
+
const list = readListMembership(props, ctx);
|
|
120
|
+
if (list)
|
|
121
|
+
return { runs, blocks, list };
|
|
122
|
+
const heading = headingLevel(styleId, ctx.styles, props);
|
|
123
|
+
if (heading) {
|
|
124
|
+
blocks.push({ kind: 'heading', level: heading, runs: mergeRuns(runs) });
|
|
125
|
+
}
|
|
126
|
+
else if (isQuote(styleId, ctx.styles)) {
|
|
127
|
+
blocks.push({ kind: 'quote', runs: mergeRuns(runs) });
|
|
128
|
+
}
|
|
129
|
+
else if (runs.length || !images.length) {
|
|
130
|
+
blocks.push({ kind: 'paragraph', runs: mergeRuns(runs) });
|
|
131
|
+
}
|
|
132
|
+
blocks.push(...images);
|
|
133
|
+
// A hard page break lands on the paragraph that follows it in Word's model,
|
|
134
|
+
// so it is emitted before this paragraph's own content.
|
|
135
|
+
if (hasPageBreak(el))
|
|
136
|
+
blocks.unshift({ kind: 'pagebreak' });
|
|
137
|
+
return { runs, blocks, list: null };
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Runs, hyperlinks and breaks, in document order.
|
|
141
|
+
*
|
|
142
|
+
* ⚠️ `w:del` — a tracked deletion — is SKIPPED, and skipping it is not an
|
|
143
|
+
* optimisation. Its text lives in `w:delText` and is what the author took OUT;
|
|
144
|
+
* including it puts deleted sentences back into the document, interleaved with
|
|
145
|
+
* the ones that replaced them. `w:ins` is the opposite case and IS included,
|
|
146
|
+
* because an accepted-looking insertion is what the document says now.
|
|
147
|
+
*/
|
|
148
|
+
async function readRuns(parent, ctx, inherited = {}) {
|
|
149
|
+
const out = [];
|
|
150
|
+
for (const node of Array.from(parent.childNodes)) {
|
|
151
|
+
if (node.nodeType !== 1)
|
|
152
|
+
continue;
|
|
153
|
+
const el = node;
|
|
154
|
+
if (el.namespaceURI !== W)
|
|
155
|
+
continue;
|
|
156
|
+
switch (el.localName) {
|
|
157
|
+
case 'r':
|
|
158
|
+
out.push(...readRun(el, inherited));
|
|
159
|
+
break;
|
|
160
|
+
case 'hyperlink': {
|
|
161
|
+
// Only an EXTERNAL relationship becomes a link. The other kind is
|
|
162
|
+
// `w:anchor`, a jump to a bookmark inside a document this has since
|
|
163
|
+
// repaginated into different pages — so its text stays and its link
|
|
164
|
+
// does not, rather than shipping a hotspot that goes nowhere.
|
|
165
|
+
const id = attr(el, R, 'id');
|
|
166
|
+
const rel = id ? ctx.rels.get(id) : null;
|
|
167
|
+
const href = rel?.external ? rel.target : undefined;
|
|
168
|
+
out.push(...(await readRuns(el, ctx, { ...inherited, link: href })));
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
case 'ins':
|
|
172
|
+
case 'smartTag':
|
|
173
|
+
case 'bdo':
|
|
174
|
+
out.push(...(await readRuns(el, ctx, inherited)));
|
|
175
|
+
break;
|
|
176
|
+
case 'sdt': {
|
|
177
|
+
const content = child(el, W, 'sdtContent');
|
|
178
|
+
if (content)
|
|
179
|
+
out.push(...(await readRuns(content, ctx, inherited)));
|
|
180
|
+
break;
|
|
181
|
+
}
|
|
182
|
+
case 'del':
|
|
183
|
+
break;
|
|
184
|
+
default:
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return out;
|
|
189
|
+
}
|
|
190
|
+
function readRun(el, inherited) {
|
|
191
|
+
const props = child(el, W, 'rPr');
|
|
192
|
+
const style = {
|
|
193
|
+
...inherited,
|
|
194
|
+
bold: (props ? onOff(child(props, W, 'b'), W) : false) || inherited.bold,
|
|
195
|
+
italic: (props ? onOff(child(props, W, 'i'), W) : false) || inherited.italic,
|
|
196
|
+
strike: (props ? onOff(child(props, W, 'strike'), W) : false) || inherited.strike,
|
|
197
|
+
};
|
|
198
|
+
// `w:u` carries the LINE STYLE in its value, and "none" is a real value used
|
|
199
|
+
// to switch inherited underlining off — so this one is not an on/off toggle
|
|
200
|
+
// and `onOff` would read `<w:u w:val="none"/>` as underlined.
|
|
201
|
+
const underline = props ? attr(child(props, W, 'u'), W, 'val') : null;
|
|
202
|
+
if (underline && underline !== 'none')
|
|
203
|
+
style.underline = true;
|
|
204
|
+
// Word marks inline code with a character style rather than a font run, and
|
|
205
|
+
// these are the ids the common exporters use.
|
|
206
|
+
const runStyle = (props ? attr(child(props, W, 'rStyle'), W, 'val') : null) ?? '';
|
|
207
|
+
if (/^(HTMLCode|Code|SourceText|VerbatimChar)$/i.test(runStyle))
|
|
208
|
+
style.code = true;
|
|
209
|
+
const out = [];
|
|
210
|
+
for (const node of Array.from(el.childNodes)) {
|
|
211
|
+
if (node.nodeType !== 1)
|
|
212
|
+
continue;
|
|
213
|
+
const part = node;
|
|
214
|
+
if (part.namespaceURI !== W)
|
|
215
|
+
continue;
|
|
216
|
+
if (part.localName === 't') {
|
|
217
|
+
out.push({ ...style, text: part.textContent ?? '' });
|
|
218
|
+
}
|
|
219
|
+
else if (part.localName === 'tab') {
|
|
220
|
+
out.push({ ...style, text: ' ' });
|
|
221
|
+
}
|
|
222
|
+
else if (part.localName === 'br') {
|
|
223
|
+
// A page break is handled at paragraph level; a plain break is a newline
|
|
224
|
+
// inside one paragraph, which the writers turn back into a line break.
|
|
225
|
+
if (attr(part, W, 'type') !== 'page')
|
|
226
|
+
out.push({ ...style, text: '\n' });
|
|
227
|
+
}
|
|
228
|
+
else if (part.localName === 'noBreakHyphen') {
|
|
229
|
+
out.push({ ...style, text: '-' });
|
|
230
|
+
}
|
|
231
|
+
else if (part.localName === 'sym') {
|
|
232
|
+
// A symbol-font character — Wingdings, mostly, for a tick or a bullet.
|
|
233
|
+
// The character code is meaningless outside its font, so it becomes a
|
|
234
|
+
// bullet rather than a random Latin letter.
|
|
235
|
+
out.push({ ...style, text: '•' });
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return out;
|
|
239
|
+
}
|
|
240
|
+
// ── Structure ────────────────────────────────────────────────────────────────
|
|
241
|
+
/**
|
|
242
|
+
* A paragraph's heading level, or null.
|
|
243
|
+
*
|
|
244
|
+
* Three signals, because one is not enough: the built-in style IDs are stable
|
|
245
|
+
* (`Heading1`) but a localised Word writes `berschrift1`; the human-readable
|
|
246
|
+
* name in `styles.xml` catches those; and `w:outlineLvl` catches a custom style
|
|
247
|
+
* that a template author made behave as a heading without naming it one.
|
|
248
|
+
*/
|
|
249
|
+
function headingLevel(styleId, styles, props) {
|
|
250
|
+
const clamp = (n) => Math.min(4, Math.max(1, n));
|
|
251
|
+
const byId = /^heading([1-9])$/i.exec(styleId.replace(/[-_\s]/g, ''));
|
|
252
|
+
if (byId)
|
|
253
|
+
return clamp(Number(byId[1]));
|
|
254
|
+
if (/^title$/i.test(styleId))
|
|
255
|
+
return 1;
|
|
256
|
+
if (/^subtitle$/i.test(styleId))
|
|
257
|
+
return 2;
|
|
258
|
+
const name = styles.get(styleId) ?? '';
|
|
259
|
+
const byName = /heading\s*([1-9])/i.exec(name);
|
|
260
|
+
if (byName)
|
|
261
|
+
return clamp(Number(byName[1]));
|
|
262
|
+
if (/^title$/i.test(name))
|
|
263
|
+
return 1;
|
|
264
|
+
const outline = props ? attr(child(props, W, 'outlineLvl'), W, 'val') : null;
|
|
265
|
+
if (outline !== null) {
|
|
266
|
+
const level = Number(outline);
|
|
267
|
+
// `outlineLvl` is 0-based, and 9 is its way of saying "body text".
|
|
268
|
+
if (Number.isFinite(level) && level <= 3)
|
|
269
|
+
return clamp(level + 1);
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
function isQuote(styleId, styles) {
|
|
274
|
+
const name = styles.get(styleId) ?? styleId;
|
|
275
|
+
return /^(intense\s*)?quote$/i.test(name.replace(/[-_]/g, ' ')) || /blockquote/i.test(name);
|
|
276
|
+
}
|
|
277
|
+
function readListMembership(props, ctx) {
|
|
278
|
+
if (!props)
|
|
279
|
+
return null;
|
|
280
|
+
const numPr = child(props, W, 'numPr');
|
|
281
|
+
if (!numPr)
|
|
282
|
+
return null;
|
|
283
|
+
const numId = attr(child(numPr, W, 'numId'), W, 'val');
|
|
284
|
+
// `numId="0"` is Word's way of saying "this paragraph was removed from its
|
|
285
|
+
// list" — a real value that means not-a-list.
|
|
286
|
+
if (!numId || numId === '0')
|
|
287
|
+
return null;
|
|
288
|
+
const level = Number(attr(child(numPr, W, 'ilvl'), W, 'val') ?? '0');
|
|
289
|
+
return {
|
|
290
|
+
ordered: ctx.numbering.get(numId) ?? false,
|
|
291
|
+
level: Number.isFinite(level) ? Math.min(4, Math.max(0, level)) : 0,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
function hasPageBreak(el) {
|
|
295
|
+
return descendants(el, W, 'br').some((br) => attr(br, W, 'type') === 'page');
|
|
296
|
+
}
|
|
297
|
+
async function readTable(el, ctx) {
|
|
298
|
+
const rows = [];
|
|
299
|
+
for (const tr of children(el, W, 'tr')) {
|
|
300
|
+
const cells = [];
|
|
301
|
+
for (const tc of children(tr, W, 'tc')) {
|
|
302
|
+
const runs = [];
|
|
303
|
+
for (const p of children(tc, W, 'p')) {
|
|
304
|
+
if (runs.length)
|
|
305
|
+
runs.push({ text: '\n' });
|
|
306
|
+
runs.push(...(await readRuns(p, ctx)));
|
|
307
|
+
}
|
|
308
|
+
cells.push(mergeRuns(runs));
|
|
309
|
+
}
|
|
310
|
+
if (cells.length)
|
|
311
|
+
rows.push(cells);
|
|
312
|
+
}
|
|
313
|
+
if (!rows.length)
|
|
314
|
+
return { kind: 'paragraph', runs: [{ text: ' ' }] };
|
|
315
|
+
// Word marks a header row with `tblHeader` on its properties. Where nothing
|
|
316
|
+
// says so, the first row is treated as the header — which is what a reader
|
|
317
|
+
// assumes looking at it, and what every one of these tables turns out to be.
|
|
318
|
+
const firstRow = children(el, W, 'tr')[0];
|
|
319
|
+
const marked = firstRow ? descendant(firstRow, W, 'tblHeader') !== null : false;
|
|
320
|
+
const useHeader = marked || rows.length > 1;
|
|
321
|
+
return {
|
|
322
|
+
kind: 'table',
|
|
323
|
+
header: useHeader ? rows[0] : null,
|
|
324
|
+
rows: useHeader ? rows.slice(1) : rows,
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// ── Images ───────────────────────────────────────────────────────────────────
|
|
328
|
+
async function readImages(el, ctx) {
|
|
329
|
+
const out = [];
|
|
330
|
+
const ids = [];
|
|
331
|
+
// The modern path: DrawingML, where the bitmap is named by `a:blip/@r:embed`.
|
|
332
|
+
for (const blip of descendants(el, A, 'blip')) {
|
|
333
|
+
const id = attr(blip, R, 'embed');
|
|
334
|
+
if (id)
|
|
335
|
+
ids.push(id);
|
|
336
|
+
}
|
|
337
|
+
// The 1997-era path, still emitted for anything pasted from an old document.
|
|
338
|
+
for (const data of Array.from(el.getElementsByTagName('v:imagedata'))) {
|
|
339
|
+
const id = attr(data, R, 'id');
|
|
340
|
+
if (id)
|
|
341
|
+
ids.push(id);
|
|
342
|
+
}
|
|
343
|
+
for (const id of ids) {
|
|
344
|
+
const rel = ctx.rels.get(id);
|
|
345
|
+
if (!rel || rel.external)
|
|
346
|
+
continue;
|
|
347
|
+
const path = rel.target.startsWith('/') ? rel.target.slice(1) : `word/${rel.target}`;
|
|
348
|
+
const ext = path.split('.').pop()?.toLowerCase() ?? '';
|
|
349
|
+
if (UNDRAWABLE.has(ext)) {
|
|
350
|
+
addNotice(ctx.doc, `A ${ext.toUpperCase()} drawing was left out — browsers can’t open that picture format.`);
|
|
351
|
+
continue;
|
|
352
|
+
}
|
|
353
|
+
const blob = await ctx.zip.blobOf(path, IMAGE_MIME[ext] ?? 'application/octet-stream');
|
|
354
|
+
if (blob)
|
|
355
|
+
out.push({ kind: 'image', file: blob, alt: '' });
|
|
356
|
+
}
|
|
357
|
+
return out;
|
|
358
|
+
}
|
|
359
|
+
// ── The side parts ───────────────────────────────────────────────────────────
|
|
360
|
+
async function readRelationships(zip) {
|
|
361
|
+
const map = new Map();
|
|
362
|
+
const xml = await zip.textOf('word/_rels/document.xml.rels');
|
|
363
|
+
if (!xml)
|
|
364
|
+
return map;
|
|
365
|
+
const RELS = 'http://schemas.openxmlformats.org/package/2006/relationships';
|
|
366
|
+
for (const rel of descendants(parseXml(xml, 'relationships'), RELS, 'Relationship')) {
|
|
367
|
+
const id = rel.getAttribute('Id');
|
|
368
|
+
const target = rel.getAttribute('Target');
|
|
369
|
+
if (!id || !target)
|
|
370
|
+
continue;
|
|
371
|
+
map.set(id, { target, external: rel.getAttribute('TargetMode') === 'External' });
|
|
372
|
+
}
|
|
373
|
+
return map;
|
|
374
|
+
}
|
|
375
|
+
/** styleId → the human-readable name, for the heading heuristics. */
|
|
376
|
+
async function readStyleNames(zip) {
|
|
377
|
+
const map = new Map();
|
|
378
|
+
const xml = await zip.textOf('word/styles.xml');
|
|
379
|
+
if (!xml)
|
|
380
|
+
return map;
|
|
381
|
+
for (const style of descendants(parseXml(xml, 'styles'), W, 'style')) {
|
|
382
|
+
const id = attr(style, W, 'styleId');
|
|
383
|
+
const name = attr(child(style, W, 'name'), W, 'val');
|
|
384
|
+
if (id && name)
|
|
385
|
+
map.set(id, name);
|
|
386
|
+
}
|
|
387
|
+
return map;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* numId → is it a numbered list?
|
|
391
|
+
*
|
|
392
|
+
* Two hops, and the indirection is the point: `w:num` is an instance, which
|
|
393
|
+
* points at an `w:abstractNum` definition, which holds the format per level.
|
|
394
|
+
* Two lists sharing one definition is normal, so reading the format off the
|
|
395
|
+
* instance is not possible. Level 0's format decides — a list that is numbered
|
|
396
|
+
* at the top and bulleted underneath is a design nobody has, and the model
|
|
397
|
+
* carries one flag per list.
|
|
398
|
+
*/
|
|
399
|
+
async function readNumbering(zip) {
|
|
400
|
+
const map = new Map();
|
|
401
|
+
const xml = await zip.textOf('word/numbering.xml');
|
|
402
|
+
if (!xml)
|
|
403
|
+
return map;
|
|
404
|
+
const doc = parseXml(xml, 'numbering');
|
|
405
|
+
const abstract = new Map();
|
|
406
|
+
for (const def of descendants(doc, W, 'abstractNum')) {
|
|
407
|
+
const id = attr(def, W, 'abstractNumId');
|
|
408
|
+
if (!id)
|
|
409
|
+
continue;
|
|
410
|
+
const level0 = children(def, W, 'lvl').find((l) => (attr(l, W, 'ilvl') ?? '0') === '0');
|
|
411
|
+
const format = attr(child(level0 ?? def, W, 'numFmt'), W, 'val') ?? 'bullet';
|
|
412
|
+
abstract.set(id, format !== 'bullet' && format !== 'none');
|
|
413
|
+
}
|
|
414
|
+
for (const num of descendants(doc, W, 'num')) {
|
|
415
|
+
const id = attr(num, W, 'numId');
|
|
416
|
+
const target = attr(child(num, W, 'abstractNumId'), W, 'val');
|
|
417
|
+
if (id && target)
|
|
418
|
+
map.set(id, abstract.get(target) ?? false);
|
|
419
|
+
}
|
|
420
|
+
return map;
|
|
421
|
+
}
|
|
422
|
+
async function readCoreProperties(zip, doc) {
|
|
423
|
+
const xml = await zip.textOf('docProps/core.xml');
|
|
424
|
+
if (!xml)
|
|
425
|
+
return;
|
|
426
|
+
const props = parseXml(xml, 'properties');
|
|
427
|
+
doc.title = descendant(props, DC, 'title')?.textContent?.trim() || undefined;
|
|
428
|
+
doc.author = descendant(props, DC, 'creator')?.textContent?.trim() || undefined;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Name what was in the file and is not in the result.
|
|
432
|
+
*
|
|
433
|
+
* Checked from the ARCHIVE rather than the body, because that is where the
|
|
434
|
+
* evidence is: a footer part exists or it does not, and no amount of walking
|
|
435
|
+
* `document.xml` reveals one.
|
|
436
|
+
*/
|
|
437
|
+
function noteWhatWasLeftBehind(zip, doc) {
|
|
438
|
+
const names = zip.names;
|
|
439
|
+
const has = (pattern) => names.some((n) => pattern.test(n));
|
|
440
|
+
if (has(/^word\/(header|footer)\d*\.xml$/)) {
|
|
441
|
+
addNotice(doc, 'Headers and footers were left out — they repeat per page, and this repaginates.');
|
|
442
|
+
}
|
|
443
|
+
// ⚠️ NOT footnotes. Word ships an empty `footnotes.xml` in almost every
|
|
444
|
+
// document it saves — it holds the separator marks, not any notes — so
|
|
445
|
+
// testing for the part announces a loss on documents that never had one, and
|
|
446
|
+
// a notice that cries wolf is worse than no notice. Saying so properly means
|
|
447
|
+
// parsing the part and counting real notes, which is not worth a second pass.
|
|
448
|
+
if (has(/^word\/comments\.xml$/)) {
|
|
449
|
+
addNotice(doc, 'Comments were left out — the document text is here, the margin notes are not.');
|
|
450
|
+
}
|
|
451
|
+
if (has(/^word\/charts?\//) || has(/^word\/embeddings\//)) {
|
|
452
|
+
addNotice(doc, 'A chart or embedded object was left out — those aren’t pictures, and can’t be drawn here.');
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
//# sourceMappingURL=docx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docx.js","sourceRoot":"","sources":["../../src/read/docx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/read/html.ts"],"names":[],"mappings":"AAoBA,OAAO,EAEsB,KAAK,OAAO,EACxC,MAAM,aAAa,CAAA;AAcpB,wBAAsB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAE3D;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAsBvE"}
|