@markitdownjs/pptx 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/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/pptx-converter.d.ts +88 -0
- package/dist/pptx-converter.d.ts.map +1 -0
- package/dist/pptx-converter.js +489 -0
- package/dist/pptx-converter.js.map +1 -0
- package/package.json +33 -0
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Converter, ConversionInput, ConversionResult } from "@markitdownjs/shared";
|
|
2
|
+
/** Convert PPTX files to markdown via AST-first processing. */
|
|
3
|
+
export declare class PptxConverter implements Converter {
|
|
4
|
+
readonly id: "pptx";
|
|
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 PPTX.
|
|
11
|
+
*/
|
|
12
|
+
canConvert(input: ConversionInput): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Convert a PPTX presentation into markdown via an AST intermediate.
|
|
15
|
+
*
|
|
16
|
+
* The converter uses JSZip to unpack the archive, reads the slide ordering
|
|
17
|
+
* from ppt/presentation.xml, then processes each slide in order extracting
|
|
18
|
+
* text, titles, tables, and speaker notes.
|
|
19
|
+
*
|
|
20
|
+
* @param input - The conversion input containing PPTX data.
|
|
21
|
+
* @returns A complete ConversionResult with markdown, AST, and metadata.
|
|
22
|
+
*/
|
|
23
|
+
convert(input: ConversionInput): Promise<ConversionResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Parse ppt/presentation.xml to extract the ordered list of slide file paths.
|
|
26
|
+
*
|
|
27
|
+
* @param zip - The JSZip archive of the PPTX.
|
|
28
|
+
* @returns An ordered array of slide XML file paths.
|
|
29
|
+
*/
|
|
30
|
+
private parseSlideOrder;
|
|
31
|
+
/**
|
|
32
|
+
* Detect the title shape on a slide by looking for a shape whose
|
|
33
|
+
* nvSpPr/cNvPr name contains "Title".
|
|
34
|
+
*
|
|
35
|
+
* @param slideDoc - The parsed slide XML document.
|
|
36
|
+
* @returns The concatenated title text, or undefined if no title shape is found.
|
|
37
|
+
*/
|
|
38
|
+
private detectTitleShape;
|
|
39
|
+
/**
|
|
40
|
+
* Extract content groups (by paragraph) from a slide's shapes.
|
|
41
|
+
*
|
|
42
|
+
* @param slideDoc - The parsed slide XML document.
|
|
43
|
+
* @returns An array of text strings, one per paragraph across all shapes.
|
|
44
|
+
*/
|
|
45
|
+
private extractContentGroups;
|
|
46
|
+
/**
|
|
47
|
+
* Extract all text from any XML document (used for both slides and notes).
|
|
48
|
+
*
|
|
49
|
+
* @param doc - The parsed XML document.
|
|
50
|
+
* @returns An array of non-empty text strings from a:t elements.
|
|
51
|
+
*/
|
|
52
|
+
private extractAllText;
|
|
53
|
+
/**
|
|
54
|
+
* Extract text from a shape element.
|
|
55
|
+
*
|
|
56
|
+
* @param sp - The shape XML element.
|
|
57
|
+
* @returns An array of text strings from a:t elements within the shape.
|
|
58
|
+
*/
|
|
59
|
+
private extractShapeText;
|
|
60
|
+
/**
|
|
61
|
+
* Extract tables from a slide as TableNode AST nodes.
|
|
62
|
+
*
|
|
63
|
+
* @param slideDoc - The parsed slide XML document.
|
|
64
|
+
* @returns An array of TableNode elements found on the slide.
|
|
65
|
+
*/
|
|
66
|
+
private extractTables;
|
|
67
|
+
/**
|
|
68
|
+
* Extract a TableData summary from a TableNode.
|
|
69
|
+
*
|
|
70
|
+
* @param table - The parsed TableNode.
|
|
71
|
+
* @returns A TableData object with headers and rows.
|
|
72
|
+
*/
|
|
73
|
+
private extractTableData;
|
|
74
|
+
/**
|
|
75
|
+
* Recursively extract all text content from an AST node.
|
|
76
|
+
*
|
|
77
|
+
* @param node - The AST node to extract text from.
|
|
78
|
+
* @returns The concatenated text content.
|
|
79
|
+
*/
|
|
80
|
+
private getNodeText;
|
|
81
|
+
/**
|
|
82
|
+
* Convert input data to a Uint8Array.
|
|
83
|
+
* @param data - The input data in any supported format.
|
|
84
|
+
* @returns The data as a Uint8Array.
|
|
85
|
+
*/
|
|
86
|
+
private toByteArray;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=pptx-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pptx-converter.d.ts","sourceRoot":"","sources":["../src/pptx-converter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAIjB,MAAM,sBAAsB,CAAC;AAiB9B,+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;;;;;;;;;OASG;IACG,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+JhE;;;;;OAKG;YACW,eAAe;IAkE7B;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAqBxB;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAYtB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IAkFrB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAUnB;;;;OAIG;YACW,WAAW;CAQ1B"}
|
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { createNode, parseXML, } from "@markitdownjs/shared";
|
|
2
|
+
import { MarkdownRenderer } from "@markitdownjs/ast";
|
|
3
|
+
/** Convert PPTX files to markdown via AST-first processing. */
|
|
4
|
+
export class PptxConverter {
|
|
5
|
+
id = "pptx";
|
|
6
|
+
supportedMimeTypes = [
|
|
7
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
8
|
+
];
|
|
9
|
+
supportedExtensions = [".pptx"];
|
|
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 PPTX.
|
|
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 PPTX presentation into markdown via an AST intermediate.
|
|
41
|
+
*
|
|
42
|
+
* The converter uses JSZip to unpack the archive, reads the slide ordering
|
|
43
|
+
* from ppt/presentation.xml, then processes each slide in order extracting
|
|
44
|
+
* text, titles, tables, and speaker notes.
|
|
45
|
+
*
|
|
46
|
+
* @param input - The conversion input containing PPTX data.
|
|
47
|
+
* @returns A complete ConversionResult with markdown, AST, and metadata.
|
|
48
|
+
*/
|
|
49
|
+
async convert(input) {
|
|
50
|
+
const startTime = Date.now();
|
|
51
|
+
const data = await this.toByteArray(input.data);
|
|
52
|
+
const JSZip = (await import("jszip")).default;
|
|
53
|
+
const zip = await JSZip.loadAsync(data);
|
|
54
|
+
const renderer = new MarkdownRenderer();
|
|
55
|
+
// Parse slide ordering from presentation.xml.
|
|
56
|
+
const slideOrder = await this.parseSlideOrder(zip);
|
|
57
|
+
const slideNodes = [];
|
|
58
|
+
const headings = [];
|
|
59
|
+
const tables = [];
|
|
60
|
+
let slideCount = 0;
|
|
61
|
+
for (let idx = 0; idx < slideOrder.length; idx++) {
|
|
62
|
+
const slidePath = slideOrder[idx];
|
|
63
|
+
const slideXml = await zip.file(slidePath)?.async("string");
|
|
64
|
+
if (!slideXml)
|
|
65
|
+
continue;
|
|
66
|
+
slideCount++;
|
|
67
|
+
const slideDoc = await parseXML(slideXml);
|
|
68
|
+
// Detect the title shape (name contains "Title").
|
|
69
|
+
const title = this.detectTitleShape(slideDoc);
|
|
70
|
+
// Extract all text runs grouped by shape / paragraph.
|
|
71
|
+
const contentGroups = this.extractContentGroups(slideDoc);
|
|
72
|
+
// Parse tables on the slide.
|
|
73
|
+
const slideTables = this.extractTables(slideDoc);
|
|
74
|
+
// Build slide section children.
|
|
75
|
+
const sectionChildren = [];
|
|
76
|
+
// Title as heading.
|
|
77
|
+
const titleText = title ?? `Slide ${slideCount}`;
|
|
78
|
+
const headingNode = createNode({
|
|
79
|
+
type: "heading",
|
|
80
|
+
level: 2,
|
|
81
|
+
children: [
|
|
82
|
+
createNode({ type: "text", value: titleText }),
|
|
83
|
+
],
|
|
84
|
+
});
|
|
85
|
+
sectionChildren.push(headingNode);
|
|
86
|
+
headings.push({ level: 2, text: titleText });
|
|
87
|
+
// Content paragraphs.
|
|
88
|
+
for (const group of contentGroups) {
|
|
89
|
+
if (group === title)
|
|
90
|
+
continue; // Skip title since we already rendered it.
|
|
91
|
+
const trimmed = group.trim();
|
|
92
|
+
if (!trimmed)
|
|
93
|
+
continue;
|
|
94
|
+
sectionChildren.push(createNode({
|
|
95
|
+
type: "paragraph",
|
|
96
|
+
children: [
|
|
97
|
+
createNode({ type: "text", value: trimmed }),
|
|
98
|
+
],
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
// Tables.
|
|
102
|
+
for (const slideTable of slideTables) {
|
|
103
|
+
sectionChildren.push(slideTable);
|
|
104
|
+
tables.push(this.extractTableData(slideTable));
|
|
105
|
+
}
|
|
106
|
+
// Speaker notes.
|
|
107
|
+
const notesPath = slidePath
|
|
108
|
+
.replace("ppt/slides/slide", "ppt/notesSlides/notesSlide")
|
|
109
|
+
.replace(".xml", ".xml");
|
|
110
|
+
const notesXml = notesPath ? await zip.file(notesPath)?.async("string") : undefined;
|
|
111
|
+
if (notesXml) {
|
|
112
|
+
const notesDoc = await parseXML(notesXml);
|
|
113
|
+
const notesTexts = this.extractAllText(notesDoc);
|
|
114
|
+
if (notesTexts.length > 0) {
|
|
115
|
+
sectionChildren.push(createNode({
|
|
116
|
+
type: "paragraph",
|
|
117
|
+
children: [
|
|
118
|
+
createNode({
|
|
119
|
+
type: "strong",
|
|
120
|
+
children: [
|
|
121
|
+
createNode({
|
|
122
|
+
type: "text",
|
|
123
|
+
value: "Speaker Notes:",
|
|
124
|
+
}),
|
|
125
|
+
],
|
|
126
|
+
}),
|
|
127
|
+
],
|
|
128
|
+
}));
|
|
129
|
+
for (const noteText of notesTexts) {
|
|
130
|
+
sectionChildren.push(createNode({
|
|
131
|
+
type: "paragraph",
|
|
132
|
+
children: [
|
|
133
|
+
createNode({ type: "text", value: noteText }),
|
|
134
|
+
],
|
|
135
|
+
}));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Wrap each slide in a SectionNode.
|
|
140
|
+
slideNodes.push(createNode({
|
|
141
|
+
type: "section",
|
|
142
|
+
title: titleText,
|
|
143
|
+
children: sectionChildren,
|
|
144
|
+
}));
|
|
145
|
+
// Page break between slides.
|
|
146
|
+
if (idx < slideOrder.length - 1) {
|
|
147
|
+
slideNodes.push(createNode({
|
|
148
|
+
type: "page-break",
|
|
149
|
+
pageNumber: slideCount,
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const ast = createNode({
|
|
154
|
+
type: "document",
|
|
155
|
+
children: slideNodes,
|
|
156
|
+
});
|
|
157
|
+
const markdown = renderer.render(ast);
|
|
158
|
+
const endTime = Date.now();
|
|
159
|
+
return {
|
|
160
|
+
markdown,
|
|
161
|
+
metadata: {
|
|
162
|
+
pageCount: slideCount,
|
|
163
|
+
format: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
164
|
+
source: "jszip",
|
|
165
|
+
},
|
|
166
|
+
assets: [],
|
|
167
|
+
tables,
|
|
168
|
+
images: [],
|
|
169
|
+
headings,
|
|
170
|
+
ast,
|
|
171
|
+
format: "markdown",
|
|
172
|
+
converterId: this.id,
|
|
173
|
+
stats: {
|
|
174
|
+
startTime,
|
|
175
|
+
endTime,
|
|
176
|
+
duration: endTime - startTime,
|
|
177
|
+
inputSize: data.length,
|
|
178
|
+
outputSize: markdown.length,
|
|
179
|
+
pagesProcessed: slideCount,
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Parse ppt/presentation.xml to extract the ordered list of slide file paths.
|
|
185
|
+
*
|
|
186
|
+
* @param zip - The JSZip archive of the PPTX.
|
|
187
|
+
* @returns An ordered array of slide XML file paths.
|
|
188
|
+
*/
|
|
189
|
+
async parseSlideOrder(zip // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
190
|
+
) {
|
|
191
|
+
const order = [];
|
|
192
|
+
const presXml = await zip
|
|
193
|
+
.file("ppt/presentation.xml")
|
|
194
|
+
?.async("string");
|
|
195
|
+
if (!presXml) {
|
|
196
|
+
// Fallback: collect slide files and sort.
|
|
197
|
+
zip.forEach((path) => {
|
|
198
|
+
if (/^ppt\/slides\/slide\d+\.xml$/.test(path)) {
|
|
199
|
+
order.push(path);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
order.sort();
|
|
203
|
+
return order;
|
|
204
|
+
}
|
|
205
|
+
const doc = await parseXML(presXml);
|
|
206
|
+
const sldIdLst = doc.getElementsByTagName("p:sldIdLst")[0];
|
|
207
|
+
if (!sldIdLst) {
|
|
208
|
+
zip.forEach((path) => {
|
|
209
|
+
if (/^ppt\/slides\/slide\d+\.xml$/.test(path)) {
|
|
210
|
+
order.push(path);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
order.sort();
|
|
214
|
+
return order;
|
|
215
|
+
}
|
|
216
|
+
const rIds = sldIdLst.getElementsByTagName("p:sldId");
|
|
217
|
+
for (let i = 0; i < rIds.length; i++) {
|
|
218
|
+
const el = rIds.item(i);
|
|
219
|
+
if (!el)
|
|
220
|
+
continue;
|
|
221
|
+
const rid = el.getAttribute("r:id") ?? "";
|
|
222
|
+
if (rid)
|
|
223
|
+
order.push(rid);
|
|
224
|
+
}
|
|
225
|
+
// Resolve rIds through presentation.xml.rels.
|
|
226
|
+
const relsXml = await zip
|
|
227
|
+
.file("ppt/_rels/presentation.xml.rels")
|
|
228
|
+
?.async("string");
|
|
229
|
+
if (!relsXml)
|
|
230
|
+
return order;
|
|
231
|
+
const relsDoc = await parseXML(relsXml);
|
|
232
|
+
const rels = relsDoc.getElementsByTagName("Relationship");
|
|
233
|
+
const ridToTarget = new Map();
|
|
234
|
+
for (let i = 0; i < rels.length; i++) {
|
|
235
|
+
const rel = rels.item(i);
|
|
236
|
+
if (!rel)
|
|
237
|
+
continue;
|
|
238
|
+
const id = rel.getAttribute("Id") ?? "";
|
|
239
|
+
const target = rel.getAttribute("Target") ?? "";
|
|
240
|
+
if (id && target)
|
|
241
|
+
ridToTarget.set(id, target);
|
|
242
|
+
}
|
|
243
|
+
return order
|
|
244
|
+
.map((rid) => {
|
|
245
|
+
const target = ridToTarget.get(rid);
|
|
246
|
+
if (target && !target.startsWith("/")) {
|
|
247
|
+
return target.startsWith("ppt/") ? target : `ppt/${target}`;
|
|
248
|
+
}
|
|
249
|
+
return "";
|
|
250
|
+
})
|
|
251
|
+
.filter((p) => p.length > 0);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Detect the title shape on a slide by looking for a shape whose
|
|
255
|
+
* nvSpPr/cNvPr name contains "Title".
|
|
256
|
+
*
|
|
257
|
+
* @param slideDoc - The parsed slide XML document.
|
|
258
|
+
* @returns The concatenated title text, or undefined if no title shape is found.
|
|
259
|
+
*/
|
|
260
|
+
detectTitleShape(slideDoc) {
|
|
261
|
+
const spTree = slideDoc.getElementsByTagName("p:spTree")[0];
|
|
262
|
+
if (!spTree)
|
|
263
|
+
return undefined;
|
|
264
|
+
const shapes = spTree.getElementsByTagName("p:sp");
|
|
265
|
+
for (let i = 0; i < shapes.length; i++) {
|
|
266
|
+
const sp = shapes.item(i);
|
|
267
|
+
if (!sp)
|
|
268
|
+
continue;
|
|
269
|
+
const cNvPr = sp.getElementsByTagName("p:cNvPr")[0];
|
|
270
|
+
if (!cNvPr)
|
|
271
|
+
continue;
|
|
272
|
+
const name = cNvPr.getAttribute("name") ?? "";
|
|
273
|
+
if (/title/i.test(name)) {
|
|
274
|
+
const texts = this.extractShapeText(sp);
|
|
275
|
+
if (texts.length > 0)
|
|
276
|
+
return texts.join("");
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return undefined;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Extract content groups (by paragraph) from a slide's shapes.
|
|
283
|
+
*
|
|
284
|
+
* @param slideDoc - The parsed slide XML document.
|
|
285
|
+
* @returns An array of text strings, one per paragraph across all shapes.
|
|
286
|
+
*/
|
|
287
|
+
extractContentGroups(slideDoc) {
|
|
288
|
+
const groups = [];
|
|
289
|
+
const spTree = slideDoc.getElementsByTagName("p:spTree")[0];
|
|
290
|
+
if (!spTree)
|
|
291
|
+
return groups;
|
|
292
|
+
const shapes = spTree.children;
|
|
293
|
+
for (let i = 0; i < shapes.length; i++) {
|
|
294
|
+
const shape = shapes[i];
|
|
295
|
+
if (!shape)
|
|
296
|
+
continue;
|
|
297
|
+
// Process paragraphs within shapes (txBody > bodyPr > lstStyle + p).
|
|
298
|
+
const txBody = shape.getElementsByTagName("p:txBody")[0] ??
|
|
299
|
+
shape.getElementsByTagName("a:txBody")[0];
|
|
300
|
+
if (!txBody)
|
|
301
|
+
continue;
|
|
302
|
+
const paragraphs = txBody.getElementsByTagName("a:p");
|
|
303
|
+
for (let j = 0; j < paragraphs.length; j++) {
|
|
304
|
+
const p = paragraphs.item(j);
|
|
305
|
+
if (!p)
|
|
306
|
+
continue;
|
|
307
|
+
const runs = p.getElementsByTagName("a:r");
|
|
308
|
+
let line = "";
|
|
309
|
+
for (let k = 0; k < runs.length; k++) {
|
|
310
|
+
const run = runs.item(k);
|
|
311
|
+
if (!run)
|
|
312
|
+
continue;
|
|
313
|
+
const tEl = run.getElementsByTagName("a:t")[0];
|
|
314
|
+
if (tEl) {
|
|
315
|
+
line += tEl.textContent ?? "";
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
groups.push(line);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return groups;
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Extract all text from any XML document (used for both slides and notes).
|
|
325
|
+
*
|
|
326
|
+
* @param doc - The parsed XML document.
|
|
327
|
+
* @returns An array of non-empty text strings from a:t elements.
|
|
328
|
+
*/
|
|
329
|
+
extractAllText(doc) {
|
|
330
|
+
const texts = [];
|
|
331
|
+
const aTs = doc.getElementsByTagName("a:t");
|
|
332
|
+
for (let i = 0; i < aTs.length; i++) {
|
|
333
|
+
const el = aTs.item(i);
|
|
334
|
+
if (!el)
|
|
335
|
+
continue;
|
|
336
|
+
const text = el.textContent?.trim();
|
|
337
|
+
if (text)
|
|
338
|
+
texts.push(text);
|
|
339
|
+
}
|
|
340
|
+
return texts;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Extract text from a shape element.
|
|
344
|
+
*
|
|
345
|
+
* @param sp - The shape XML element.
|
|
346
|
+
* @returns An array of text strings from a:t elements within the shape.
|
|
347
|
+
*/
|
|
348
|
+
extractShapeText(sp) {
|
|
349
|
+
const texts = [];
|
|
350
|
+
const aTs = sp.getElementsByTagName("a:t");
|
|
351
|
+
for (let i = 0; i < aTs.length; i++) {
|
|
352
|
+
const el = aTs.item(i);
|
|
353
|
+
if (!el)
|
|
354
|
+
continue;
|
|
355
|
+
const text = el.textContent?.trim();
|
|
356
|
+
if (text)
|
|
357
|
+
texts.push(text);
|
|
358
|
+
}
|
|
359
|
+
return texts;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Extract tables from a slide as TableNode AST nodes.
|
|
363
|
+
*
|
|
364
|
+
* @param slideDoc - The parsed slide XML document.
|
|
365
|
+
* @returns An array of TableNode elements found on the slide.
|
|
366
|
+
*/
|
|
367
|
+
extractTables(slideDoc) {
|
|
368
|
+
const tables = [];
|
|
369
|
+
const tblElements = slideDoc.getElementsByTagName("p:tbl");
|
|
370
|
+
for (let t = 0; t < tblElements.length; t++) {
|
|
371
|
+
const tbl = tblElements.item(t);
|
|
372
|
+
if (!tbl)
|
|
373
|
+
continue;
|
|
374
|
+
const rows = [];
|
|
375
|
+
const trs = tbl.getElementsByTagName("p:tr");
|
|
376
|
+
for (let i = 0; i < trs.length; i++) {
|
|
377
|
+
const tr = trs.item(i);
|
|
378
|
+
if (!tr)
|
|
379
|
+
continue;
|
|
380
|
+
const cells = [];
|
|
381
|
+
const tcs = tr.getElementsByTagName("p:tc");
|
|
382
|
+
for (let j = 0; j < tcs.length; j++) {
|
|
383
|
+
const tc = tcs.item(j);
|
|
384
|
+
if (!tc)
|
|
385
|
+
continue;
|
|
386
|
+
let colspan;
|
|
387
|
+
const gridSpan = tc.getElementsByTagName("a:gridSpan")[0];
|
|
388
|
+
if (gridSpan) {
|
|
389
|
+
const val = parseInt(gridSpan.getAttribute("val") ?? "1", 10);
|
|
390
|
+
if (val > 1)
|
|
391
|
+
colspan = val;
|
|
392
|
+
}
|
|
393
|
+
// Extract cell text.
|
|
394
|
+
const cellTexts = [];
|
|
395
|
+
const paragraphs = tc.getElementsByTagName("a:p");
|
|
396
|
+
for (let k = 0; k < paragraphs.length; k++) {
|
|
397
|
+
const p = paragraphs.item(k);
|
|
398
|
+
if (!p)
|
|
399
|
+
continue;
|
|
400
|
+
const runs = p.getElementsByTagName("a:r");
|
|
401
|
+
let line = "";
|
|
402
|
+
for (let r = 0; r < runs.length; r++) {
|
|
403
|
+
const run = runs.item(r);
|
|
404
|
+
if (!run)
|
|
405
|
+
continue;
|
|
406
|
+
const tEl = run.getElementsByTagName("a:t")[0];
|
|
407
|
+
if (tEl)
|
|
408
|
+
line += tEl.textContent ?? "";
|
|
409
|
+
}
|
|
410
|
+
if (line)
|
|
411
|
+
cellTexts.push(line);
|
|
412
|
+
}
|
|
413
|
+
const cellText = cellTexts.join(" ") || "";
|
|
414
|
+
cells.push(createNode({
|
|
415
|
+
type: "table-cell",
|
|
416
|
+
children: [
|
|
417
|
+
createNode({ type: "text", value: cellText }),
|
|
418
|
+
],
|
|
419
|
+
...(colspan !== undefined ? { colspan } : {}),
|
|
420
|
+
}));
|
|
421
|
+
}
|
|
422
|
+
if (cells.length > 0) {
|
|
423
|
+
rows.push(createNode({
|
|
424
|
+
type: "table-row",
|
|
425
|
+
children: cells,
|
|
426
|
+
isHeader: i === 0,
|
|
427
|
+
}));
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
if (rows.length > 0) {
|
|
431
|
+
tables.push(createNode({
|
|
432
|
+
type: "table",
|
|
433
|
+
children: rows,
|
|
434
|
+
}));
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return tables;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Extract a TableData summary from a TableNode.
|
|
441
|
+
*
|
|
442
|
+
* @param table - The parsed TableNode.
|
|
443
|
+
* @returns A TableData object with headers and rows.
|
|
444
|
+
*/
|
|
445
|
+
extractTableData(table) {
|
|
446
|
+
const allRows = table.children;
|
|
447
|
+
if (allRows.length === 0)
|
|
448
|
+
return { headers: [], rows: [] };
|
|
449
|
+
const headerRow = allRows[0];
|
|
450
|
+
const headers = headerRow.children.map((cell) => this.getNodeText(cell));
|
|
451
|
+
const dataRows = [];
|
|
452
|
+
for (let i = 1; i < allRows.length; i++) {
|
|
453
|
+
const row = allRows[i];
|
|
454
|
+
dataRows.push(row.children.map((cell) => this.getNodeText(cell)));
|
|
455
|
+
}
|
|
456
|
+
return { headers, rows: dataRows };
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Recursively extract all text content from an AST node.
|
|
460
|
+
*
|
|
461
|
+
* @param node - The AST node to extract text from.
|
|
462
|
+
* @returns The concatenated text content.
|
|
463
|
+
*/
|
|
464
|
+
getNodeText(node) {
|
|
465
|
+
if (node.type === "text")
|
|
466
|
+
return node.value;
|
|
467
|
+
if ("children" in node && node.children) {
|
|
468
|
+
return node.children
|
|
469
|
+
.map((c) => this.getNodeText(c))
|
|
470
|
+
.join("");
|
|
471
|
+
}
|
|
472
|
+
return "";
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Convert input data to a Uint8Array.
|
|
476
|
+
* @param data - The input data in any supported format.
|
|
477
|
+
* @returns The data as a Uint8Array.
|
|
478
|
+
*/
|
|
479
|
+
async toByteArray(data) {
|
|
480
|
+
if (data instanceof Uint8Array)
|
|
481
|
+
return data;
|
|
482
|
+
if (data instanceof ArrayBuffer)
|
|
483
|
+
return new Uint8Array(data);
|
|
484
|
+
if (data instanceof Blob)
|
|
485
|
+
return new Uint8Array(await data.arrayBuffer());
|
|
486
|
+
return new TextEncoder().encode(data);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
//# sourceMappingURL=pptx-converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pptx-converter.js","sourceRoot":"","sources":["../src/pptx-converter.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@markitdownjs/pptx",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "PowerPoint (PPTX) 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
|
+
}
|