@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.
Files changed (90) hide show
  1. package/README.md +91 -0
  2. package/dist/convert.d.ts +54 -0
  3. package/dist/convert.d.ts.map +1 -0
  4. package/dist/convert.js +216 -0
  5. package/dist/convert.js.map +1 -0
  6. package/dist/image.d.ts +17 -0
  7. package/dist/image.d.ts.map +1 -0
  8. package/dist/image.js +66 -0
  9. package/dist/image.js.map +1 -0
  10. package/dist/index.d.ts +10 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +51 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/merge.d.ts +14 -0
  15. package/dist/merge.d.ts.map +1 -0
  16. package/dist/merge.js +51 -0
  17. package/dist/merge.js.map +1 -0
  18. package/dist/metrics.d.ts +19 -0
  19. package/dist/metrics.d.ts.map +1 -0
  20. package/dist/metrics.js +151 -0
  21. package/dist/metrics.js.map +1 -0
  22. package/dist/model.d.ts +114 -0
  23. package/dist/model.d.ts.map +1 -0
  24. package/dist/model.js +121 -0
  25. package/dist/model.js.map +1 -0
  26. package/dist/pdfcore.d.ts +118 -0
  27. package/dist/pdfcore.d.ts.map +1 -0
  28. package/dist/pdfcore.js +398 -0
  29. package/dist/pdfcore.js.map +1 -0
  30. package/dist/read/csv.d.ts +17 -0
  31. package/dist/read/csv.d.ts.map +1 -0
  32. package/dist/read/csv.js +167 -0
  33. package/dist/read/csv.js.map +1 -0
  34. package/dist/read/doc.d.ts +3 -0
  35. package/dist/read/doc.d.ts.map +1 -0
  36. package/dist/read/doc.js +360 -0
  37. package/dist/read/doc.js.map +1 -0
  38. package/dist/read/docx.d.ts +3 -0
  39. package/dist/read/docx.d.ts.map +1 -0
  40. package/dist/read/docx.js +455 -0
  41. package/dist/read/docx.js.map +1 -0
  42. package/dist/read/html.d.ts +4 -0
  43. package/dist/read/html.d.ts.map +1 -0
  44. package/dist/read/html.js +236 -0
  45. package/dist/read/html.js.map +1 -0
  46. package/dist/read/json.d.ts +9 -0
  47. package/dist/read/json.d.ts.map +1 -0
  48. package/dist/read/json.js +105 -0
  49. package/dist/read/json.js.map +1 -0
  50. package/dist/read/markdown.d.ts +4 -0
  51. package/dist/read/markdown.d.ts.map +1 -0
  52. package/dist/read/markdown.js +247 -0
  53. package/dist/read/markdown.js.map +1 -0
  54. package/dist/read/odt.d.ts +3 -0
  55. package/dist/read/odt.d.ts.map +1 -0
  56. package/dist/read/odt.js +359 -0
  57. package/dist/read/odt.js.map +1 -0
  58. package/dist/read/rtf.d.ts +3 -0
  59. package/dist/read/rtf.d.ts.map +1 -0
  60. package/dist/read/rtf.js +341 -0
  61. package/dist/read/rtf.js.map +1 -0
  62. package/dist/read/text.d.ts +4 -0
  63. package/dist/read/text.d.ts.map +1 -0
  64. package/dist/read/text.js +62 -0
  65. package/dist/read/text.js.map +1 -0
  66. package/dist/unzip.d.ts +23 -0
  67. package/dist/unzip.d.ts.map +1 -0
  68. package/dist/unzip.js +152 -0
  69. package/dist/unzip.js.map +1 -0
  70. package/dist/write/data.d.ts +16 -0
  71. package/dist/write/data.d.ts.map +1 -0
  72. package/dist/write/data.js +89 -0
  73. package/dist/write/data.js.map +1 -0
  74. package/dist/write/pdf.d.ts +10 -0
  75. package/dist/write/pdf.d.ts.map +1 -0
  76. package/dist/write/pdf.js +696 -0
  77. package/dist/write/pdf.js.map +1 -0
  78. package/dist/write/pdfSettings.d.ts +13 -0
  79. package/dist/write/pdfSettings.d.ts.map +1 -0
  80. package/dist/write/pdfSettings.js +26 -0
  81. package/dist/write/pdfSettings.js.map +1 -0
  82. package/dist/write/text.d.ts +5 -0
  83. package/dist/write/text.d.ts.map +1 -0
  84. package/dist/write/text.js +341 -0
  85. package/dist/write/text.js.map +1 -0
  86. package/dist/xml.d.ts +22 -0
  87. package/dist/xml.d.ts.map +1 -0
  88. package/dist/xml.js +83 -0
  89. package/dist/xml.js.map +1 -0
  90. 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,4 @@
1
+ import { type RichDoc } from '../model.js';
2
+ export declare function readHtml(file: File): Promise<RichDoc>;
3
+ export declare function parseHtmlDoc(source: string, filename?: string): RichDoc;
4
+ //# sourceMappingURL=html.d.ts.map
@@ -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"}