@markitdownjs/docx 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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=docx-converter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx-converter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/docx-converter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { DocxConverter } from '../docx-converter.js';
3
+ describe('DocxConverter', () => {
4
+ const converter = new DocxConverter();
5
+ it('should detect DOCX by MIME type', async () => {
6
+ expect(await converter.canConvert({
7
+ data: '',
8
+ mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
9
+ })).toBe(true);
10
+ });
11
+ it('should detect DOCX by extension', async () => {
12
+ expect(await converter.canConvert({ data: '', fileName: 'test.docx' })).toBe(true);
13
+ });
14
+ it('should detect DOCX by PK magic bytes (ZIP)', async () => {
15
+ const zipHeader = new Uint8Array([0x50, 0x4b, 0x03, 0x04, 0, 0, 0, 0]);
16
+ expect(await converter.canConvert({ data: zipHeader })).toBe(true);
17
+ });
18
+ it('should reject non-DOCX files', async () => {
19
+ expect(await converter.canConvert({ data: 'hello', fileName: 'test.txt' })).toBe(false);
20
+ });
21
+ it('should throw for invalid DOCX data (no word/document.xml)', async () => {
22
+ const invalidDocx = new Uint8Array([0x50, 0x4b, 0x03, 0x04]);
23
+ await expect(converter.convert({ data: invalidDocx, mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' })).rejects.toThrow();
24
+ });
25
+ });
26
+ //# sourceMappingURL=docx-converter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx-converter.test.js","sourceRoot":"","sources":["../../src/__tests__/docx-converter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,MAAM,SAAS,GAAG,IAAI,aAAa,EAAE,CAAC;IAEtC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC;YAChC,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,yEAAyE;SACpF,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,CAAC,MAAM,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7D,MAAM,MAAM,CACV,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,yEAAyE,EAAE,CAAC,CAC9H,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,116 @@
1
+ import type { Converter, ConversionInput, ConversionResult } from "@markitdownjs/shared";
2
+ /** Convert DOCX files to markdown via AST-first processing. */
3
+ export declare class DocxConverter implements Converter {
4
+ readonly id: "docx";
5
+ readonly supportedMimeTypes: string[];
6
+ readonly supportedExtensions: string[];
7
+ /**
8
+ * Determine whether this converter can handle the given input.
9
+ * @param input - The conversion input to inspect.
10
+ * @returns True if the input is a supported DOCX.
11
+ */
12
+ canConvert(input: ConversionInput): Promise<boolean>;
13
+ /**
14
+ * Convert a DOCX document into markdown via an AST intermediate.
15
+ *
16
+ * The converter uses JSZip to unpack the DOCX archive, parses the main
17
+ * document XML and relationship mappings, then walks paragraphs, runs,
18
+ * tables, lists, and hyperlinks to build an AST. Metadata is extracted
19
+ * from docProps/core.xml when present.
20
+ *
21
+ * @param input - The conversion input containing DOCX data.
22
+ * @returns A complete ConversionResult with markdown, AST, and metadata.
23
+ */
24
+ convert(input: ConversionInput): Promise<ConversionResult>;
25
+ /**
26
+ * Parse word/_rels/document.xml.rels to build a relationship ID -> target mapping.
27
+ *
28
+ * @param zip - The JSZip archive of the DOCX.
29
+ * @returns A Map from rId to the relative target path.
30
+ */
31
+ private parseRelationships;
32
+ /**
33
+ * Parse docProps/core.xml to extract document metadata.
34
+ *
35
+ * @param zip - The JSZip archive of the DOCX.
36
+ * @returns A DocumentMetadata object with available fields populated.
37
+ */
38
+ private parseMetadata;
39
+ /**
40
+ * Parse a w:p paragraph element into a HeadingNode or ParagraphNode.
41
+ *
42
+ * Handles heading styles (Heading1-6), list items, and inline formatting
43
+ * (bold, italic, strikethrough). Hyperlinks are resolved via the
44
+ * relationship map.
45
+ *
46
+ * @param paraEl - The w:p XML element.
47
+ * @param relsMap - Relationship ID to target path mapping.
48
+ * @returns A HeadingNode, ParagraphNode, or null if the paragraph is empty.
49
+ */
50
+ private parseParagraph;
51
+ /**
52
+ * Extract the paragraph style identifier (e.g. "Heading1").
53
+ *
54
+ * @param paraEl - The w:p XML element.
55
+ * @returns The style value, or undefined if none.
56
+ */
57
+ private getParagraphStyle;
58
+ /**
59
+ * Parse w:r run elements inside a paragraph, applying inline formatting.
60
+ *
61
+ * Recognised formatting: w:b (bold), w:i (italic), w:strike (strikethrough).
62
+ *
63
+ * @param paraEl - The w:p XML element.
64
+ * @param _relsMap - Relationship mapping (unused for runs, kept for signature).
65
+ * @returns An array of inline AST nodes.
66
+ */
67
+ private parseRuns;
68
+ /**
69
+ * Parse w:hyperlink elements inside a paragraph, resolving targets via the
70
+ * relationship map.
71
+ *
72
+ * @param paraEl - The w:p XML element.
73
+ * @param relsMap - Relationship ID to target path mapping.
74
+ * @returns An array of LinkNode elements.
75
+ */
76
+ private parseHyperlinks;
77
+ /**
78
+ * Check whether a run properties element has a boolean flag set.
79
+ *
80
+ * @param rPr - The w:rPr element, or undefined.
81
+ * @param tagName - The tag to check (e.g. "w:b").
82
+ * @returns True if the flag is present and not explicitly set to false/0.
83
+ */
84
+ private hasFlag;
85
+ /**
86
+ * Parse a w:tbl table element into a TableNode.
87
+ *
88
+ * Handles w:gridSpan for colspan and nested paragraphs within cells.
89
+ *
90
+ * @param tblEl - The w:tbl XML element.
91
+ * @param relsMap - Relationship mapping for hyperlink resolution.
92
+ * @returns A TableNode, or null if no rows are found.
93
+ */
94
+ private parseTable;
95
+ /**
96
+ * Extract a TableData summary from a TableNode for the ConversionResult.
97
+ *
98
+ * @param table - The parsed TableNode.
99
+ * @returns A TableData object with headers and rows.
100
+ */
101
+ private extractTableData;
102
+ /**
103
+ * Recursively extract all text content from an AST node.
104
+ *
105
+ * @param node - The AST node to extract text from.
106
+ * @returns The concatenated text content.
107
+ */
108
+ private getNodeText;
109
+ /**
110
+ * Convert input data to a Uint8Array.
111
+ * @param data - The input data in any supported format.
112
+ * @returns The data as a Uint8Array.
113
+ */
114
+ private toByteArray;
115
+ }
116
+ //# sourceMappingURL=docx-converter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx-converter.d.ts","sourceRoot":"","sources":["../src/docx-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAIjB,MAAM,sBAAsB,CAAC;AAkB9B,+DAA+D;AAC/D,qBAAa,aAAc,YAAW,SAAS;IAC7C,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAC9B,QAAQ,CAAC,kBAAkB,WAEzB;IACF,QAAQ,CAAC,mBAAmB,WAAa;IAEzC;;;;OAIG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA4B1D;;;;;;;;;;OAUG;IACG,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6EhE;;;;;OAKG;YACW,kBAAkB;IAuBhC;;;;;OAKG;YACW,aAAa;IAmC3B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;IAmCtB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAiDjB;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IA2CvB;;;;;;OAMG;IACH,OAAO,CAAC,OAAO;IAQf;;;;;;;;OAQG;IACH,OAAO,CAAC,UAAU;IAmElB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAUnB;;;;OAIG;YACW,WAAW;CAQ1B"}
@@ -0,0 +1,452 @@
1
+ import { createNode, parseXML, } from "@markitdownjs/shared";
2
+ import { MarkdownRenderer } from "@markitdownjs/ast";
3
+ /** Convert DOCX files to markdown via AST-first processing. */
4
+ export class DocxConverter {
5
+ id = "docx";
6
+ supportedMimeTypes = [
7
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
8
+ ];
9
+ supportedExtensions = [".docx"];
10
+ /**
11
+ * Determine whether this converter can handle the given input.
12
+ * @param input - The conversion input to inspect.
13
+ * @returns True if the input is a supported DOCX.
14
+ */
15
+ async canConvert(input) {
16
+ if (input.mimeType && this.supportedMimeTypes.includes(input.mimeType)) {
17
+ return true;
18
+ }
19
+ if (input.fileName) {
20
+ const ext = input.fileName.toLowerCase();
21
+ if (this.supportedExtensions.some((e) => ext.endsWith(e))) {
22
+ return true;
23
+ }
24
+ }
25
+ if (input.data instanceof Uint8Array || input.data instanceof ArrayBuffer) {
26
+ const bytes = input.data instanceof Uint8Array
27
+ ? input.data
28
+ : new Uint8Array(input.data);
29
+ if (bytes.length >= 4 &&
30
+ bytes[0] === 0x50 &&
31
+ bytes[1] === 0x4b &&
32
+ bytes[2] === 0x03 &&
33
+ bytes[3] === 0x04) {
34
+ return true;
35
+ }
36
+ }
37
+ return false;
38
+ }
39
+ /**
40
+ * Convert a DOCX document into markdown via an AST intermediate.
41
+ *
42
+ * The converter uses JSZip to unpack the DOCX archive, parses the main
43
+ * document XML and relationship mappings, then walks paragraphs, runs,
44
+ * tables, lists, and hyperlinks to build an AST. Metadata is extracted
45
+ * from docProps/core.xml when present.
46
+ *
47
+ * @param input - The conversion input containing DOCX data.
48
+ * @returns A complete ConversionResult with markdown, AST, and metadata.
49
+ */
50
+ async convert(input) {
51
+ const startTime = Date.now();
52
+ const data = await this.toByteArray(input.data);
53
+ const JSZip = (await import("jszip")).default;
54
+ const zip = await JSZip.loadAsync(data);
55
+ const renderer = new MarkdownRenderer();
56
+ // Parse relationship map (rId -> target file).
57
+ const relsMap = await this.parseRelationships(zip);
58
+ // Parse core metadata if available.
59
+ const metadata = await this.parseMetadata(zip);
60
+ const documentXml = await zip.file("word/document.xml")?.async("string");
61
+ if (!documentXml) {
62
+ throw new Error("Invalid DOCX: word/document.xml not found");
63
+ }
64
+ const doc = await parseXML(documentXml);
65
+ const body = doc.getElementsByTagName("w:body")[0];
66
+ if (!body) {
67
+ throw new Error("Invalid DOCX: no body element found");
68
+ }
69
+ const children = [];
70
+ const headings = [];
71
+ const tables = [];
72
+ for (let i = 0; i < body.childNodes.length; i++) {
73
+ const child = body.childNodes[i];
74
+ if (!child)
75
+ continue;
76
+ if (child.localName === "p") {
77
+ const para = this.parseParagraph(child, relsMap);
78
+ if (para) {
79
+ children.push(para);
80
+ if (para.type === "heading") {
81
+ headings.push({
82
+ level: para.level,
83
+ text: this.getNodeText(para),
84
+ });
85
+ }
86
+ }
87
+ }
88
+ else if (child.localName === "tbl") {
89
+ const table = this.parseTable(child, relsMap);
90
+ if (table) {
91
+ children.push(table);
92
+ tables.push(this.extractTableData(table));
93
+ }
94
+ }
95
+ }
96
+ const ast = createNode({ type: "document", children });
97
+ const markdown = renderer.render(ast);
98
+ const endTime = Date.now();
99
+ return {
100
+ markdown,
101
+ metadata,
102
+ assets: [],
103
+ tables,
104
+ images: [],
105
+ headings,
106
+ ast,
107
+ format: "markdown",
108
+ converterId: this.id,
109
+ stats: {
110
+ startTime,
111
+ endTime,
112
+ duration: endTime - startTime,
113
+ inputSize: data.length,
114
+ outputSize: markdown.length,
115
+ },
116
+ };
117
+ }
118
+ /**
119
+ * Parse word/_rels/document.xml.rels to build a relationship ID -> target mapping.
120
+ *
121
+ * @param zip - The JSZip archive of the DOCX.
122
+ * @returns A Map from rId to the relative target path.
123
+ */
124
+ async parseRelationships(zip // eslint-disable-line @typescript-eslint/no-explicit-any
125
+ ) {
126
+ const map = new Map();
127
+ const relsXml = await zip
128
+ .file("word/_rels/document.xml.rels")
129
+ ?.async("string");
130
+ if (!relsXml)
131
+ return map;
132
+ const doc = await parseXML(relsXml);
133
+ const rels = doc.getElementsByTagName("Relationship");
134
+ for (let i = 0; i < rels.length; i++) {
135
+ const rel = rels.item(i);
136
+ if (!rel)
137
+ continue;
138
+ const id = rel.getAttribute("Id");
139
+ const target = rel.getAttribute("Target");
140
+ if (id && target) {
141
+ map.set(id, target);
142
+ }
143
+ }
144
+ return map;
145
+ }
146
+ /**
147
+ * Parse docProps/core.xml to extract document metadata.
148
+ *
149
+ * @param zip - The JSZip archive of the DOCX.
150
+ * @returns A DocumentMetadata object with available fields populated.
151
+ */
152
+ async parseMetadata(zip // eslint-disable-line @typescript-eslint/no-explicit-any
153
+ ) {
154
+ const metadata = {};
155
+ const coreXml = await zip.file("docProps/core.xml")?.async("string");
156
+ if (!coreXml)
157
+ return metadata;
158
+ try {
159
+ const doc = await parseXML(coreXml);
160
+ const title = doc.getElementsByTagName("dc:title")[0];
161
+ if (title)
162
+ metadata.title = title.textContent ?? undefined;
163
+ const creator = doc.getElementsByTagName("dc:creator")[0];
164
+ if (creator)
165
+ metadata.author = creator.textContent ?? undefined;
166
+ const created = doc.getElementsByTagName("dcterms:created")[0];
167
+ if (created)
168
+ metadata.createdAt = created.textContent ?? undefined;
169
+ const modified = doc.getElementsByTagName("dcterms:modified")[0];
170
+ if (modified)
171
+ metadata.modifiedAt = modified.textContent ?? undefined;
172
+ const description = doc.getElementsByTagName("dc:description")[0];
173
+ if (description)
174
+ metadata.description = description.textContent ?? undefined;
175
+ const subject = doc.getElementsByTagName("dc:subject")[0];
176
+ if (subject)
177
+ metadata.subject = subject.textContent ?? undefined;
178
+ }
179
+ catch {
180
+ // Metadata parsing is best-effort.
181
+ }
182
+ return metadata;
183
+ }
184
+ /**
185
+ * Parse a w:p paragraph element into a HeadingNode or ParagraphNode.
186
+ *
187
+ * Handles heading styles (Heading1-6), list items, and inline formatting
188
+ * (bold, italic, strikethrough). Hyperlinks are resolved via the
189
+ * relationship map.
190
+ *
191
+ * @param paraEl - The w:p XML element.
192
+ * @param relsMap - Relationship ID to target path mapping.
193
+ * @returns A HeadingNode, ParagraphNode, or null if the paragraph is empty.
194
+ */
195
+ parseParagraph(paraEl, relsMap) {
196
+ const pStyle = this.getParagraphStyle(paraEl);
197
+ const inlineNodes = this.parseRuns(paraEl, relsMap);
198
+ // Also gather text from hyperlinks that are direct children of the paragraph.
199
+ const hyperlinkNodes = this.parseHyperlinks(paraEl, relsMap);
200
+ const allNodes = [...inlineNodes, ...hyperlinkNodes];
201
+ if (allNodes.length === 0)
202
+ return null;
203
+ // Check for heading style.
204
+ if (pStyle && /^Heading[1-6]$/.test(pStyle)) {
205
+ const level = parseInt(pStyle.replace("Heading", ""), 10);
206
+ return createNode({
207
+ type: "heading",
208
+ level,
209
+ children: allNodes,
210
+ });
211
+ }
212
+ return createNode({
213
+ type: "paragraph",
214
+ children: allNodes,
215
+ });
216
+ }
217
+ /**
218
+ * Extract the paragraph style identifier (e.g. "Heading1").
219
+ *
220
+ * @param paraEl - The w:p XML element.
221
+ * @returns The style value, or undefined if none.
222
+ */
223
+ getParagraphStyle(paraEl) {
224
+ const pPr = paraEl.getElementsByTagName("w:pPr")[0];
225
+ if (!pPr)
226
+ return undefined;
227
+ const pStyle = pPr.getElementsByTagName("w:pStyle")[0];
228
+ if (!pStyle)
229
+ return undefined;
230
+ return pStyle.getAttribute("w:val") ?? undefined;
231
+ }
232
+ /**
233
+ * Parse w:r run elements inside a paragraph, applying inline formatting.
234
+ *
235
+ * Recognised formatting: w:b (bold), w:i (italic), w:strike (strikethrough).
236
+ *
237
+ * @param paraEl - The w:p XML element.
238
+ * @param _relsMap - Relationship mapping (unused for runs, kept for signature).
239
+ * @returns An array of inline AST nodes.
240
+ */
241
+ parseRuns(paraEl, _relsMap) {
242
+ const nodes = [];
243
+ const runs = paraEl.getElementsByTagName("w:r");
244
+ for (let i = 0; i < runs.length; i++) {
245
+ const run = runs.item(i);
246
+ if (!run)
247
+ continue;
248
+ const textEl = run.getElementsByTagName("w:t")[0];
249
+ if (!textEl)
250
+ continue;
251
+ const text = textEl.textContent ?? "";
252
+ if (!text)
253
+ continue;
254
+ const rPr = run.getElementsByTagName("w:rPr")[0];
255
+ const isBold = this.hasFlag(rPr, "w:b");
256
+ const isItalic = this.hasFlag(rPr, "w:i");
257
+ const isStrikethrough = this.hasFlag(rPr, "w:strike");
258
+ let node = createNode({
259
+ type: "text",
260
+ value: text,
261
+ });
262
+ if (isItalic) {
263
+ node = createNode({
264
+ type: "emphasis",
265
+ children: [node],
266
+ });
267
+ }
268
+ if (isBold) {
269
+ node = createNode({
270
+ type: "strong",
271
+ children: [node],
272
+ });
273
+ }
274
+ if (isStrikethrough) {
275
+ node = createNode({
276
+ type: "strikethrough",
277
+ children: [node],
278
+ });
279
+ }
280
+ nodes.push(node);
281
+ }
282
+ return nodes;
283
+ }
284
+ /**
285
+ * Parse w:hyperlink elements inside a paragraph, resolving targets via the
286
+ * relationship map.
287
+ *
288
+ * @param paraEl - The w:p XML element.
289
+ * @param relsMap - Relationship ID to target path mapping.
290
+ * @returns An array of LinkNode elements.
291
+ */
292
+ parseHyperlinks(paraEl, relsMap) {
293
+ const links = [];
294
+ const hyperlinks = paraEl.getElementsByTagName("w:hyperlink");
295
+ for (let i = 0; i < hyperlinks.length; i++) {
296
+ const hl = hyperlinks.item(i);
297
+ if (!hl)
298
+ continue;
299
+ const rid = hl.getAttribute("r:id") ?? "";
300
+ const href = relsMap.get(rid) ?? "";
301
+ // Gather text from runs inside the hyperlink.
302
+ const textNodes = [];
303
+ const runs = hl.getElementsByTagName("w:r");
304
+ for (let j = 0; j < runs.length; j++) {
305
+ const run = runs.item(j);
306
+ if (!run)
307
+ continue;
308
+ const tEl = run.getElementsByTagName("w:t")[0];
309
+ const text = tEl?.textContent ?? "";
310
+ if (text) {
311
+ textNodes.push(createNode({ type: "text", value: text }));
312
+ }
313
+ }
314
+ if (textNodes.length > 0 && href) {
315
+ links.push(createNode({
316
+ type: "link",
317
+ href,
318
+ children: textNodes,
319
+ }));
320
+ }
321
+ }
322
+ return links;
323
+ }
324
+ /**
325
+ * Check whether a run properties element has a boolean flag set.
326
+ *
327
+ * @param rPr - The w:rPr element, or undefined.
328
+ * @param tagName - The tag to check (e.g. "w:b").
329
+ * @returns True if the flag is present and not explicitly set to false/0.
330
+ */
331
+ hasFlag(rPr, tagName) {
332
+ if (!rPr)
333
+ return false;
334
+ const el = rPr.getElementsByTagName(tagName)[0];
335
+ if (!el)
336
+ return false;
337
+ const val = el.getAttribute("w:val");
338
+ return val === null || val === "true" || val === "1";
339
+ }
340
+ /**
341
+ * Parse a w:tbl table element into a TableNode.
342
+ *
343
+ * Handles w:gridSpan for colspan and nested paragraphs within cells.
344
+ *
345
+ * @param tblEl - The w:tbl XML element.
346
+ * @param relsMap - Relationship mapping for hyperlink resolution.
347
+ * @returns A TableNode, or null if no rows are found.
348
+ */
349
+ parseTable(tblEl, relsMap) {
350
+ const rows = [];
351
+ const trs = tblEl.getElementsByTagName("w:tr");
352
+ for (let i = 0; i < trs.length; i++) {
353
+ const tr = trs.item(i);
354
+ if (!tr)
355
+ continue;
356
+ const cells = [];
357
+ const tcs = tr.getElementsByTagName("w:tc");
358
+ for (let j = 0; j < tcs.length; j++) {
359
+ const tc = tcs.item(j);
360
+ if (!tc)
361
+ continue;
362
+ // Determine colspan from w:gridSpan.
363
+ let colspan;
364
+ const gridSpan = tc.getElementsByTagName("w:gridSpan")[0];
365
+ if (gridSpan) {
366
+ const val = parseInt(gridSpan.getAttribute("w:val") ?? "1", 10);
367
+ if (val > 1)
368
+ colspan = val;
369
+ }
370
+ // Parse paragraphs inside the cell.
371
+ const cellNodes = [];
372
+ const paragraphs = tc.getElementsByTagName("w:p");
373
+ for (let k = 0; k < paragraphs.length; k++) {
374
+ const para = this.parseParagraph(paragraphs.item(k), relsMap);
375
+ if (para)
376
+ cellNodes.push(para);
377
+ }
378
+ if (cellNodes.length === 0) {
379
+ cellNodes.push(createNode({ type: "text", value: "" }));
380
+ }
381
+ cells.push(createNode({
382
+ type: "table-cell",
383
+ children: cellNodes,
384
+ ...(colspan !== undefined ? { colspan } : {}),
385
+ }));
386
+ }
387
+ if (cells.length > 0) {
388
+ rows.push(createNode({
389
+ type: "table-row",
390
+ children: cells,
391
+ isHeader: i === 0,
392
+ }));
393
+ }
394
+ }
395
+ if (rows.length === 0)
396
+ return null;
397
+ return createNode({
398
+ type: "table",
399
+ children: rows,
400
+ });
401
+ }
402
+ /**
403
+ * Extract a TableData summary from a TableNode for the ConversionResult.
404
+ *
405
+ * @param table - The parsed TableNode.
406
+ * @returns A TableData object with headers and rows.
407
+ */
408
+ extractTableData(table) {
409
+ const allRows = table.children;
410
+ if (allRows.length === 0)
411
+ return { headers: [], rows: [] };
412
+ const headerRow = allRows[0];
413
+ const headers = headerRow.children.map((cell) => this.getNodeText(cell));
414
+ const dataRows = [];
415
+ for (let i = 1; i < allRows.length; i++) {
416
+ const row = allRows[i];
417
+ dataRows.push(row.children.map((cell) => this.getNodeText(cell)));
418
+ }
419
+ return { headers, rows: dataRows };
420
+ }
421
+ /**
422
+ * Recursively extract all text content from an AST node.
423
+ *
424
+ * @param node - The AST node to extract text from.
425
+ * @returns The concatenated text content.
426
+ */
427
+ getNodeText(node) {
428
+ if (node.type === "text")
429
+ return node.value;
430
+ if ("children" in node && node.children) {
431
+ return node.children
432
+ .map((c) => this.getNodeText(c))
433
+ .join("");
434
+ }
435
+ return "";
436
+ }
437
+ /**
438
+ * Convert input data to a Uint8Array.
439
+ * @param data - The input data in any supported format.
440
+ * @returns The data as a Uint8Array.
441
+ */
442
+ async toByteArray(data) {
443
+ if (data instanceof Uint8Array)
444
+ return data;
445
+ if (data instanceof ArrayBuffer)
446
+ return new Uint8Array(data);
447
+ if (data instanceof Blob)
448
+ return new Uint8Array(await data.arrayBuffer());
449
+ return new TextEncoder().encode(data);
450
+ }
451
+ }
452
+ //# sourceMappingURL=docx-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx-converter.js","sourceRoot":"","sources":["../src/docx-converter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { DocxConverter } from "./docx-converter.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { DocxConverter } from "./docx-converter.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@markitdownjs/docx",
3
+ "version": "0.1.0",
4
+ "description": "DOCX converter for MarkItDownJS",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "module": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "dependencies": {
20
+ "jszip": "^3.10.0",
21
+ "@markitdownjs/ast": "0.1.0",
22
+ "@markitdownjs/shared": "0.1.0"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^5.5.0"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc --project tsconfig.json",
29
+ "dev": "tsc --watch --project tsconfig.json",
30
+ "typecheck": "tsc --noEmit",
31
+ "clean": "rm -rf dist tsconfig.tsbuildinfo"
32
+ }
33
+ }