docgen-utils 1.0.5
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 +118 -0
- package/dist/bundle.js +36086 -0
- package/dist/bundle.min.js +197 -0
- package/dist/cli.js +47432 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/packages/cli/commands/export-docs.d.ts +5 -0
- package/dist/packages/cli/commands/export-docs.d.ts.map +1 -0
- package/dist/packages/cli/commands/export-docs.js +24 -0
- package/dist/packages/cli/commands/export-docs.js.map +1 -0
- package/dist/packages/cli/commands/export-slides.d.ts +5 -0
- package/dist/packages/cli/commands/export-slides.d.ts.map +1 -0
- package/dist/packages/cli/commands/export-slides.js +86 -0
- package/dist/packages/cli/commands/export-slides.js.map +1 -0
- package/dist/packages/cli/commands/import-docx.d.ts +5 -0
- package/dist/packages/cli/commands/import-docx.d.ts.map +1 -0
- package/dist/packages/cli/commands/import-docx.js +27 -0
- package/dist/packages/cli/commands/import-docx.js.map +1 -0
- package/dist/packages/cli/commands/import-pptx.d.ts +5 -0
- package/dist/packages/cli/commands/import-pptx.d.ts.map +1 -0
- package/dist/packages/cli/commands/import-pptx.js +44 -0
- package/dist/packages/cli/commands/import-pptx.js.map +1 -0
- package/dist/packages/cli/index.d.ts +11 -0
- package/dist/packages/cli/index.d.ts.map +1 -0
- package/dist/packages/cli/index.js +103 -0
- package/dist/packages/cli/index.js.map +1 -0
- package/dist/packages/docs/common.d.ts +183 -0
- package/dist/packages/docs/common.d.ts.map +1 -0
- package/dist/packages/docs/common.js +27 -0
- package/dist/packages/docs/common.js.map +1 -0
- package/dist/packages/docs/convert.d.ts +7 -0
- package/dist/packages/docs/convert.d.ts.map +1 -0
- package/dist/packages/docs/convert.js +1399 -0
- package/dist/packages/docs/convert.js.map +1 -0
- package/dist/packages/docs/create-document.d.ts +30 -0
- package/dist/packages/docs/create-document.d.ts.map +1 -0
- package/dist/packages/docs/create-document.js +170 -0
- package/dist/packages/docs/create-document.js.map +1 -0
- package/dist/packages/docs/export.d.ts +57 -0
- package/dist/packages/docs/export.d.ts.map +1 -0
- package/dist/packages/docs/export.js +430 -0
- package/dist/packages/docs/export.js.map +1 -0
- package/dist/packages/docs/import-docx.d.ts +13 -0
- package/dist/packages/docs/import-docx.d.ts.map +1 -0
- package/dist/packages/docs/import-docx.js +2299 -0
- package/dist/packages/docs/import-docx.js.map +1 -0
- package/dist/packages/docs/parse.d.ts +6 -0
- package/dist/packages/docs/parse.d.ts.map +1 -0
- package/dist/packages/docs/parse.js +4253 -0
- package/dist/packages/docs/parse.js.map +1 -0
- package/dist/packages/shared/dom-parser-shim.d.ts +30 -0
- package/dist/packages/shared/dom-parser-shim.d.ts.map +1 -0
- package/dist/packages/shared/dom-parser-shim.js +152 -0
- package/dist/packages/shared/dom-parser-shim.js.map +1 -0
- package/dist/packages/slides/common.d.ts +325 -0
- package/dist/packages/slides/common.d.ts.map +1 -0
- package/dist/packages/slides/common.js +12 -0
- package/dist/packages/slides/common.js.map +1 -0
- package/dist/packages/slides/convert.d.ts +35 -0
- package/dist/packages/slides/convert.d.ts.map +1 -0
- package/dist/packages/slides/convert.js +308 -0
- package/dist/packages/slides/convert.js.map +1 -0
- package/dist/packages/slides/createPresentation.d.ts +51 -0
- package/dist/packages/slides/createPresentation.d.ts.map +1 -0
- package/dist/packages/slides/createPresentation.js +265 -0
- package/dist/packages/slides/createPresentation.js.map +1 -0
- package/dist/packages/slides/export.d.ts +24 -0
- package/dist/packages/slides/export.d.ts.map +1 -0
- package/dist/packages/slides/export.js +52 -0
- package/dist/packages/slides/export.js.map +1 -0
- package/dist/packages/slides/import-pptx.d.ts +13 -0
- package/dist/packages/slides/import-pptx.d.ts.map +1 -0
- package/dist/packages/slides/import-pptx.js +619 -0
- package/dist/packages/slides/import-pptx.js.map +1 -0
- package/dist/packages/slides/parse.d.ts +45 -0
- package/dist/packages/slides/parse.d.ts.map +1 -0
- package/dist/packages/slides/parse.js +1185 -0
- package/dist/packages/slides/parse.js.map +1 -0
- package/dist/packages/slides/transform.d.ts +37 -0
- package/dist/packages/slides/transform.d.ts.map +1 -0
- package/dist/packages/slides/transform.js +140 -0
- package/dist/packages/slides/transform.js.map +1 -0
- package/dist/packages/slides/vendor/VENDORING.md +58 -0
- package/dist/packages/slides/vendor/pptxgen.d.ts +805 -0
- package/dist/packages/slides/vendor/pptxgen.js +7442 -0
- package/package.json +57 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert parsed slide data into PptxGenJS slide elements.
|
|
3
|
+
*
|
|
4
|
+
* This is a faithful TypeScript port of the `addBackground()`, `addElements()`,
|
|
5
|
+
* and `fetchImageAsDataUrl()` functions from `dist/html2pptx.js`.
|
|
6
|
+
*
|
|
7
|
+
* It consumes the intermediate representation defined in `./common.ts` and calls
|
|
8
|
+
* the PptxGenJS Slide API to render backgrounds, images, shapes, text, and lists.
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// fetchImageAsDataUrl
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/**
|
|
14
|
+
* Download an external image and convert it to a base64 data URL using fetch.
|
|
15
|
+
*
|
|
16
|
+
* Throws on network errors or non-OK responses.
|
|
17
|
+
*/
|
|
18
|
+
export async function fetchImageAsDataUrl(url) {
|
|
19
|
+
try {
|
|
20
|
+
const response = await fetch(url, { mode: 'cors' });
|
|
21
|
+
if (!response.ok) {
|
|
22
|
+
throw new Error(`Failed to fetch image: ${response.status}`);
|
|
23
|
+
}
|
|
24
|
+
const blob = await response.blob();
|
|
25
|
+
return new Promise((resolve, reject) => {
|
|
26
|
+
const reader = new FileReader();
|
|
27
|
+
reader.onloadend = () => resolve(reader.result);
|
|
28
|
+
reader.onerror = reject;
|
|
29
|
+
reader.readAsDataURL(blob);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
34
|
+
throw new Error(`Failed to fetch image ${url}: ${message}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// applyBackground
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* Apply a slide background (color, gradient, or image) to a PptxGenJS Slide.
|
|
42
|
+
*/
|
|
43
|
+
export async function applyBackground(background, slide) {
|
|
44
|
+
if (background.type === 'image' && background.path) {
|
|
45
|
+
// Fetch the image and convert to data URL
|
|
46
|
+
try {
|
|
47
|
+
const dataUrl = await fetchImageAsDataUrl(background.path);
|
|
48
|
+
slide.background = { data: dataUrl };
|
|
49
|
+
}
|
|
50
|
+
catch (e) {
|
|
51
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
52
|
+
console.warn('Could not load background image:', message);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else if (background.type === 'gradient' && background.gradient) {
|
|
56
|
+
slide.background = {
|
|
57
|
+
type: 'gradient',
|
|
58
|
+
gradient: background.gradient,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
else if (background.type === 'color' && background.value) {
|
|
62
|
+
slide.background = { color: background.value };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
// addElementsToSlide
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
/**
|
|
69
|
+
* Resolve an image source to a PptxGenJS-compatible `{ data: string }` object.
|
|
70
|
+
*
|
|
71
|
+
* Data URIs are used directly. External/relative URLs are fetched and converted
|
|
72
|
+
* to data URLs via {@link fetchImageAsDataUrl}.
|
|
73
|
+
*
|
|
74
|
+
* Returns `null` when the fetch fails (e.g. CORS), allowing the caller to skip
|
|
75
|
+
* the image with a warning.
|
|
76
|
+
*/
|
|
77
|
+
async function getImageSource(src) {
|
|
78
|
+
if (src.startsWith('data:')) {
|
|
79
|
+
return { data: src };
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
try {
|
|
83
|
+
const dataUrl = await fetchImageAsDataUrl(src);
|
|
84
|
+
return { data: dataUrl };
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
88
|
+
console.warn(`Could not fetch image ${src}: ${message}`);
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Add all slide elements to a PptxGenJS Slide.
|
|
95
|
+
*
|
|
96
|
+
* Performs TWO passes over the elements array:
|
|
97
|
+
* 1. First pass - adds `slideBackgroundImage` elements (rendered behind everything).
|
|
98
|
+
* 2. Second pass - adds all other element types (image, backgroundImage, line, shape, list, text).
|
|
99
|
+
*
|
|
100
|
+
* @param elements - The parsed slide elements array.
|
|
101
|
+
* @param slide - The target PptxGenJS Slide instance.
|
|
102
|
+
* @param pres - The PptxGenJS presentation instance (needed for `pres.ShapeType`).
|
|
103
|
+
* Typed as `any` because `ShapeType` is a runtime property.
|
|
104
|
+
*/
|
|
105
|
+
export async function addElementsToSlide(elements, slide,
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
pres) {
|
|
108
|
+
// ---- First pass: slide background images ----
|
|
109
|
+
for (const el of elements) {
|
|
110
|
+
if (el.type === 'slideBackgroundImage') {
|
|
111
|
+
const imgSrc = await getImageSource(el.src);
|
|
112
|
+
if (!imgSrc) {
|
|
113
|
+
console.warn(`Skipping slide background image (CORS failure): ${el.src}`);
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const imageOptions = {
|
|
117
|
+
...imgSrc,
|
|
118
|
+
x: el.position.x,
|
|
119
|
+
y: el.position.y,
|
|
120
|
+
w: el.position.w,
|
|
121
|
+
h: el.position.h,
|
|
122
|
+
};
|
|
123
|
+
if (el.sizing && el.sizing.type) {
|
|
124
|
+
imageOptions.sizing = { type: el.sizing.type, w: el.position.w, h: el.position.h };
|
|
125
|
+
}
|
|
126
|
+
slide.addImage(imageOptions);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// ---- Second pass: all other elements ----
|
|
130
|
+
for (const el of elements) {
|
|
131
|
+
if (el.type === 'slideBackgroundImage') {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
else if (el.type === 'image') {
|
|
135
|
+
const imgSrc = await getImageSource(el.src);
|
|
136
|
+
if (!imgSrc) {
|
|
137
|
+
console.warn(`Skipping image (CORS failure): ${el.src}`);
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
const imageOptions = {
|
|
141
|
+
...imgSrc,
|
|
142
|
+
x: el.position.x,
|
|
143
|
+
y: el.position.y,
|
|
144
|
+
w: el.position.w,
|
|
145
|
+
h: el.position.h,
|
|
146
|
+
};
|
|
147
|
+
if (el.sizing && el.sizing.type) {
|
|
148
|
+
imageOptions.sizing = { type: el.sizing.type, w: el.position.w, h: el.position.h };
|
|
149
|
+
}
|
|
150
|
+
if (el.rectRadius) {
|
|
151
|
+
imageOptions.rectRadius = el.rectRadius;
|
|
152
|
+
}
|
|
153
|
+
slide.addImage(imageOptions);
|
|
154
|
+
}
|
|
155
|
+
else if (el.type === 'backgroundImage') {
|
|
156
|
+
const imgSrc = await getImageSource(el.src);
|
|
157
|
+
if (!imgSrc) {
|
|
158
|
+
console.warn(`Skipping background image (CORS failure): ${el.src}`);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
const imageOptions = {
|
|
162
|
+
...imgSrc,
|
|
163
|
+
x: el.position.x,
|
|
164
|
+
y: el.position.y,
|
|
165
|
+
w: el.position.w,
|
|
166
|
+
h: el.position.h,
|
|
167
|
+
};
|
|
168
|
+
if (el.sizing && el.sizing.type) {
|
|
169
|
+
imageOptions.sizing = { type: el.sizing.type, w: el.position.w, h: el.position.h };
|
|
170
|
+
}
|
|
171
|
+
slide.addImage(imageOptions);
|
|
172
|
+
}
|
|
173
|
+
else if (el.type === 'line') {
|
|
174
|
+
slide.addShape(pres.ShapeType.line, {
|
|
175
|
+
x: el.x1,
|
|
176
|
+
y: el.y1,
|
|
177
|
+
w: el.x2 - el.x1,
|
|
178
|
+
h: el.y2 - el.y1,
|
|
179
|
+
line: { color: el.color, width: el.width },
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
else if (el.type === 'shape') {
|
|
183
|
+
const shapeOptions = {
|
|
184
|
+
x: el.position.x,
|
|
185
|
+
y: el.position.y,
|
|
186
|
+
w: el.position.w,
|
|
187
|
+
h: el.position.h,
|
|
188
|
+
shape: el.shape.rectRadius > 0 ? pres.ShapeType.roundRect : pres.ShapeType.rect,
|
|
189
|
+
};
|
|
190
|
+
if (el.shape.gradient) {
|
|
191
|
+
shapeOptions.fill = { type: 'gradient', gradient: el.shape.gradient };
|
|
192
|
+
}
|
|
193
|
+
else if (el.shape.fill) {
|
|
194
|
+
shapeOptions.fill = { color: el.shape.fill };
|
|
195
|
+
if (el.shape.transparency != null)
|
|
196
|
+
shapeOptions.fill.transparency = el.shape.transparency;
|
|
197
|
+
}
|
|
198
|
+
if (el.shape.line)
|
|
199
|
+
shapeOptions.line = el.shape.line;
|
|
200
|
+
if (el.shape.rectRadius > 0)
|
|
201
|
+
shapeOptions.rectRadius = el.shape.rectRadius;
|
|
202
|
+
if (el.shape.shadow)
|
|
203
|
+
shapeOptions.shadow = el.shape.shadow;
|
|
204
|
+
if (el.style) {
|
|
205
|
+
if (el.style.fontSize)
|
|
206
|
+
shapeOptions.fontSize = el.style.fontSize;
|
|
207
|
+
if (el.style.fontFace)
|
|
208
|
+
shapeOptions.fontFace = el.style.fontFace;
|
|
209
|
+
if (el.style.color)
|
|
210
|
+
shapeOptions.color = el.style.color;
|
|
211
|
+
if (el.style.bold)
|
|
212
|
+
shapeOptions.bold = el.style.bold;
|
|
213
|
+
if (el.style.align)
|
|
214
|
+
shapeOptions.align = el.style.align;
|
|
215
|
+
if (el.style.valign)
|
|
216
|
+
shapeOptions.valign = el.style.valign;
|
|
217
|
+
if (el.style.fontFill)
|
|
218
|
+
shapeOptions.fontFill = el.style.fontFill;
|
|
219
|
+
if (el.style.margin)
|
|
220
|
+
shapeOptions.margin = el.style.margin;
|
|
221
|
+
if (el.style.inset !== undefined)
|
|
222
|
+
shapeOptions.inset = el.style.inset;
|
|
223
|
+
if (el.style.wrap !== undefined)
|
|
224
|
+
shapeOptions.wrap = el.style.wrap;
|
|
225
|
+
}
|
|
226
|
+
if (el.textRuns && el.textRuns.length > 0) {
|
|
227
|
+
slide.addText(el.textRuns, shapeOptions);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
slide.addText(el.text || '', shapeOptions);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
else if (el.type === 'list') {
|
|
234
|
+
const listOptions = {
|
|
235
|
+
x: el.position.x,
|
|
236
|
+
y: el.position.y,
|
|
237
|
+
w: el.position.w,
|
|
238
|
+
h: el.position.h,
|
|
239
|
+
fontSize: el.style.fontSize,
|
|
240
|
+
fontFace: el.style.fontFace,
|
|
241
|
+
color: el.style.color ?? undefined,
|
|
242
|
+
align: el.style.align,
|
|
243
|
+
valign: 'top',
|
|
244
|
+
lineSpacing: el.style.lineSpacing,
|
|
245
|
+
paraSpaceBefore: el.style.paraSpaceBefore,
|
|
246
|
+
paraSpaceAfter: el.style.paraSpaceAfter,
|
|
247
|
+
margin: el.style.margin,
|
|
248
|
+
};
|
|
249
|
+
if (el.style.margin)
|
|
250
|
+
listOptions.margin = el.style.margin;
|
|
251
|
+
slide.addText(el.items, listOptions);
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
// Text elements: p, h1-h6
|
|
255
|
+
const lineHeightPt = el.style.lineSpacing || ((el.style.fontSize ?? 0) * 1.2);
|
|
256
|
+
const isSingleLine = el.position.h <= lineHeightPt * 1.5;
|
|
257
|
+
let adjustedX = el.position.x;
|
|
258
|
+
let adjustedW = el.position.w;
|
|
259
|
+
if (isSingleLine) {
|
|
260
|
+
const widthIncrease = el.position.w * 0.02;
|
|
261
|
+
const align = el.style.align;
|
|
262
|
+
if (align === 'center') {
|
|
263
|
+
adjustedX = el.position.x - (widthIncrease / 2);
|
|
264
|
+
adjustedW = el.position.w + widthIncrease;
|
|
265
|
+
}
|
|
266
|
+
else if (align === 'right') {
|
|
267
|
+
adjustedX = el.position.x - widthIncrease;
|
|
268
|
+
adjustedW = el.position.w + widthIncrease;
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
adjustedW = el.position.w + widthIncrease;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const textOptions = {
|
|
275
|
+
x: adjustedX,
|
|
276
|
+
y: el.position.y,
|
|
277
|
+
w: adjustedW,
|
|
278
|
+
h: el.position.h,
|
|
279
|
+
fontSize: el.style.fontSize,
|
|
280
|
+
fontFace: el.style.fontFace,
|
|
281
|
+
color: el.style.color ?? undefined,
|
|
282
|
+
bold: el.style.bold,
|
|
283
|
+
italic: el.style.italic,
|
|
284
|
+
underline: el.style.underline,
|
|
285
|
+
valign: el.style.valign || 'top',
|
|
286
|
+
lineSpacing: el.style.lineSpacing,
|
|
287
|
+
paraSpaceBefore: el.style.paraSpaceBefore,
|
|
288
|
+
paraSpaceAfter: el.style.paraSpaceAfter,
|
|
289
|
+
inset: 0,
|
|
290
|
+
};
|
|
291
|
+
if (el.style.align)
|
|
292
|
+
textOptions.align = el.style.align;
|
|
293
|
+
if (el.style.margin)
|
|
294
|
+
textOptions.margin = el.style.margin;
|
|
295
|
+
if (el.style.rotate !== undefined)
|
|
296
|
+
textOptions.rotate = el.style.rotate;
|
|
297
|
+
if (el.style.transparency !== null && el.style.transparency !== undefined) {
|
|
298
|
+
textOptions.transparency = el.style.transparency;
|
|
299
|
+
}
|
|
300
|
+
if (el.style.fontFill) {
|
|
301
|
+
textOptions.fontFill = el.style.fontFill;
|
|
302
|
+
delete textOptions.color;
|
|
303
|
+
}
|
|
304
|
+
slide.addText(el.text, textOptions);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
//# sourceMappingURL=convert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../packages/slides/convert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createPresentation.ts - Assembly module that ties parse → convert together.
|
|
3
|
+
*
|
|
4
|
+
* This module mirrors the `html2pptx()` function from dist/html2pptx.js,
|
|
5
|
+
* using the typed parse and convert layers instead of the monolithic JS.
|
|
6
|
+
*
|
|
7
|
+
* Exports:
|
|
8
|
+
* - `addSlideFromHtml()` — convert a single HTML slide to a PptxGenJS slide
|
|
9
|
+
* - `createPresentation()` — convert multiple HTML strings into a full PPTX
|
|
10
|
+
*/
|
|
11
|
+
import type { Placeholder } from './common';
|
|
12
|
+
export interface CreatePresentationOptions {
|
|
13
|
+
title?: string;
|
|
14
|
+
author?: string;
|
|
15
|
+
company?: string;
|
|
16
|
+
subject?: string;
|
|
17
|
+
/** PptxGenJS layout name. Defaults to 'LAYOUT_16x9'. */
|
|
18
|
+
layout?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface SlideResult {
|
|
21
|
+
/** The PptxGenJS Slide object. */
|
|
22
|
+
slide: any;
|
|
23
|
+
/** Placeholder regions extracted from the HTML. */
|
|
24
|
+
placeholders: Placeholder[];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Convert a single HTML slide (already in a browser DOM context) to a PptxGenJS slide.
|
|
28
|
+
* This mirrors the `html2pptx()` function from the original JS.
|
|
29
|
+
*
|
|
30
|
+
* If `source` is a string, creates a temporary iframe, loads it, and parses.
|
|
31
|
+
* If `source` is a Document, parses directly.
|
|
32
|
+
* If `source` is an HTMLIFrameElement, uses its contentDocument.
|
|
33
|
+
*/
|
|
34
|
+
export declare function addSlideFromHtml(source: Document | HTMLIFrameElement | string, pres: any, // PptxGenJS instance
|
|
35
|
+
options?: {
|
|
36
|
+
slide?: any;
|
|
37
|
+
}): Promise<SlideResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Convert multiple HTML strings into a complete PPTX presentation.
|
|
40
|
+
* Each HTML string becomes one slide.
|
|
41
|
+
*
|
|
42
|
+
* @param htmlSlides - Array of complete HTML strings, one per slide.
|
|
43
|
+
* @param PptxGenJS - The PptxGenJS constructor (passed in so this module
|
|
44
|
+
* stays free of hard dependencies on the vendor bundle).
|
|
45
|
+
* @param options - Optional presentation metadata and layout.
|
|
46
|
+
* @returns The PptxGenJS presentation instance, ready for `.write()` or
|
|
47
|
+
* `.writeFile()`.
|
|
48
|
+
*/
|
|
49
|
+
export declare function createPresentation(htmlSlides: string[], PptxGenJS: any, // The PptxGenJS constructor
|
|
50
|
+
options?: CreatePresentationOptions): Promise<any>;
|
|
51
|
+
//# sourceMappingURL=createPresentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPresentation.d.ts","sourceRoot":"","sources":["../../../packages/slides/createPresentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,WAAW,EAKZ,MAAM,UAAU,CAAC;AAgBlB,MAAM,WAAW,yBAAyB;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAElC,KAAK,EAAE,GAAG,CAAC;IACX,mDAAmD;IACnD,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AA6LD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,QAAQ,GAAG,iBAAiB,GAAG,MAAM,EAE7C,IAAI,EAAE,GAAG,EAAE,qBAAqB;AAChC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,GAAG,CAAA;CAAO,GAC5B,OAAO,CAAC,WAAW,CAAC,CA8EtB;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAAE,EAEpB,SAAS,EAAE,GAAG,EAAE,4BAA4B;AAC5C,OAAO,GAAE,yBAA8B,GAEtC,OAAO,CAAC,GAAG,CAAC,CAuBd"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* createPresentation.ts - Assembly module that ties parse → convert together.
|
|
3
|
+
*
|
|
4
|
+
* This module mirrors the `html2pptx()` function from dist/html2pptx.js,
|
|
5
|
+
* using the typed parse and convert layers instead of the monolithic JS.
|
|
6
|
+
*
|
|
7
|
+
* Exports:
|
|
8
|
+
* - `addSlideFromHtml()` — convert a single HTML slide to a PptxGenJS slide
|
|
9
|
+
* - `createPresentation()` — convert multiple HTML strings into a full PPTX
|
|
10
|
+
*/
|
|
11
|
+
import { parseSlideHtml } from './parse';
|
|
12
|
+
import { applyBackground, addElementsToSlide } from './convert';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Constants (same as html2pptx.js)
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
const PT_PER_PX = 0.75;
|
|
17
|
+
const PX_PER_IN = 96;
|
|
18
|
+
const EMU_PER_IN = 914400;
|
|
19
|
+
/**
|
|
20
|
+
* Read the <body> computed size and check for content overflow.
|
|
21
|
+
* Returns dimensions (in CSS px) plus any overflow error messages.
|
|
22
|
+
*/
|
|
23
|
+
function getBodyDimensions(doc) {
|
|
24
|
+
const body = doc.body;
|
|
25
|
+
const style = doc.defaultView.getComputedStyle(body);
|
|
26
|
+
const width = parseFloat(style.width);
|
|
27
|
+
const height = parseFloat(style.height);
|
|
28
|
+
const scrollWidth = body.scrollWidth;
|
|
29
|
+
const scrollHeight = body.scrollHeight;
|
|
30
|
+
const errors = [];
|
|
31
|
+
// Skip overflow check if body has overflow:hidden — the content is
|
|
32
|
+
// intentionally clipped (decorative elements positioned outside the
|
|
33
|
+
// viewport should not trigger validation errors).
|
|
34
|
+
const overflow = style.overflow;
|
|
35
|
+
const overflowX = style.overflowX;
|
|
36
|
+
const overflowY = style.overflowY;
|
|
37
|
+
const isHidden = overflow === 'hidden' || (overflowX === 'hidden' && overflowY === 'hidden');
|
|
38
|
+
if (!isHidden) {
|
|
39
|
+
const widthOverflowPx = Math.max(0, scrollWidth - width - 1);
|
|
40
|
+
const heightOverflowPx = Math.max(0, scrollHeight - height - 1);
|
|
41
|
+
const widthOverflowPt = widthOverflowPx * PT_PER_PX;
|
|
42
|
+
const heightOverflowPt = heightOverflowPx * PT_PER_PX;
|
|
43
|
+
// Allow small overflow tolerance (up to 5pt) to handle minor rendering differences
|
|
44
|
+
const overflowTolerancePt = 5;
|
|
45
|
+
if (widthOverflowPt > overflowTolerancePt || heightOverflowPt > overflowTolerancePt) {
|
|
46
|
+
const directions = [];
|
|
47
|
+
if (widthOverflowPt > overflowTolerancePt) {
|
|
48
|
+
directions.push(`${widthOverflowPt.toFixed(1)}pt horizontally`);
|
|
49
|
+
}
|
|
50
|
+
if (heightOverflowPt > overflowTolerancePt) {
|
|
51
|
+
directions.push(`${heightOverflowPt.toFixed(1)}pt vertically`);
|
|
52
|
+
}
|
|
53
|
+
const reminder = heightOverflowPt > overflowTolerancePt
|
|
54
|
+
? ' (Remember: leave 0.5" margin at bottom of slide)'
|
|
55
|
+
: '';
|
|
56
|
+
errors.push(`HTML content overflows body by ${directions.join(' and ')}${reminder}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { width, height, scrollWidth, scrollHeight, errors };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate that the HTML body dimensions match the PptxGenJS presentation layout.
|
|
63
|
+
*/
|
|
64
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
65
|
+
function validateDimensions(bodyDimensions, pres) {
|
|
66
|
+
const errors = [];
|
|
67
|
+
const widthInches = bodyDimensions.width / PX_PER_IN;
|
|
68
|
+
const heightInches = bodyDimensions.height / PX_PER_IN;
|
|
69
|
+
if (pres.presLayout) {
|
|
70
|
+
const layoutWidth = pres.presLayout.width / EMU_PER_IN;
|
|
71
|
+
const layoutHeight = pres.presLayout.height / EMU_PER_IN;
|
|
72
|
+
if (Math.abs(layoutWidth - widthInches) > 0.1 ||
|
|
73
|
+
Math.abs(layoutHeight - heightInches) > 0.1) {
|
|
74
|
+
errors.push(`HTML dimensions (${widthInches.toFixed(1)}" × ${heightInches.toFixed(1)}") ` +
|
|
75
|
+
`don't match presentation layout (${layoutWidth.toFixed(1)}" × ${layoutHeight.toFixed(1)}")`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return errors;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate that text boxes do not end too close to the bottom of the slide.
|
|
82
|
+
* Text elements with fontSize > 12pt must leave at least 0.5" of bottom margin.
|
|
83
|
+
*/
|
|
84
|
+
function validateTextBoxPosition(slideData, bodyDimensions) {
|
|
85
|
+
const errors = [];
|
|
86
|
+
const slideHeightInches = bodyDimensions.height / PX_PER_IN;
|
|
87
|
+
const minBottomMargin = 0.5;
|
|
88
|
+
const epsilon = 0.01;
|
|
89
|
+
const textTypes = new Set(['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'list']);
|
|
90
|
+
for (const el of slideData.elements) {
|
|
91
|
+
if (!textTypes.has(el.type))
|
|
92
|
+
continue;
|
|
93
|
+
// At this point el is a TextElement or ListElement (all have position & style)
|
|
94
|
+
const textEl = el;
|
|
95
|
+
const fontSize = textEl.style?.fontSize || 0;
|
|
96
|
+
const bottomEdge = textEl.position.y + textEl.position.h;
|
|
97
|
+
const distanceFromBottom = slideHeightInches - bottomEdge;
|
|
98
|
+
if (fontSize > 12 && distanceFromBottom < minBottomMargin - epsilon) {
|
|
99
|
+
const getText = () => {
|
|
100
|
+
if ('text' in textEl) {
|
|
101
|
+
if (typeof textEl.text === 'string')
|
|
102
|
+
return textEl.text;
|
|
103
|
+
if (Array.isArray(textEl.text))
|
|
104
|
+
return textEl.text.find((t) => t.text)?.text || '';
|
|
105
|
+
}
|
|
106
|
+
if ('items' in textEl && Array.isArray(textEl.items))
|
|
107
|
+
return textEl.items.find((item) => item.text)?.text || '';
|
|
108
|
+
return '';
|
|
109
|
+
};
|
|
110
|
+
const rawText = getText();
|
|
111
|
+
const textPrefix = rawText.substring(0, 50) + (rawText.length > 50 ? '...' : '');
|
|
112
|
+
errors.push(`Text box "${textPrefix}" ends too close to bottom edge ` +
|
|
113
|
+
`(${distanceFromBottom.toFixed(2)}" from bottom, minimum ${minBottomMargin}" required)`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return errors;
|
|
117
|
+
}
|
|
118
|
+
// ---------------------------------------------------------------------------
|
|
119
|
+
// Iframe creation helper (ported from html2pptx.js lines 1466-1490)
|
|
120
|
+
// ---------------------------------------------------------------------------
|
|
121
|
+
/**
|
|
122
|
+
* Create a hidden iframe, load the given HTML string via a blob URL,
|
|
123
|
+
* wait for it to load (or 500ms timeout), and return the iframe and
|
|
124
|
+
* its content document.
|
|
125
|
+
*/
|
|
126
|
+
async function createIframeFromHtml(html) {
|
|
127
|
+
const iframe = document.createElement('iframe');
|
|
128
|
+
iframe.style.cssText =
|
|
129
|
+
'position:absolute;left:-9999px;width:960px;height:540px;border:none;';
|
|
130
|
+
const blob = new Blob([html], { type: 'text/html' });
|
|
131
|
+
const blobUrl = URL.createObjectURL(blob);
|
|
132
|
+
iframe.src = blobUrl;
|
|
133
|
+
document.body.appendChild(iframe);
|
|
134
|
+
// Wait for iframe to load
|
|
135
|
+
await new Promise((resolve) => {
|
|
136
|
+
let resolved = false;
|
|
137
|
+
const resolveOnce = () => {
|
|
138
|
+
if (resolved)
|
|
139
|
+
return;
|
|
140
|
+
resolved = true;
|
|
141
|
+
URL.revokeObjectURL(blobUrl);
|
|
142
|
+
resolve();
|
|
143
|
+
};
|
|
144
|
+
iframe.onload = resolveOnce;
|
|
145
|
+
// Fallback timeout in case onload doesn't fire
|
|
146
|
+
setTimeout(resolveOnce, 500);
|
|
147
|
+
});
|
|
148
|
+
const doc = iframe.contentDocument || iframe.contentWindow.document;
|
|
149
|
+
return { iframe, doc };
|
|
150
|
+
}
|
|
151
|
+
// ---------------------------------------------------------------------------
|
|
152
|
+
// addSlideFromHtml
|
|
153
|
+
// ---------------------------------------------------------------------------
|
|
154
|
+
/**
|
|
155
|
+
* Convert a single HTML slide (already in a browser DOM context) to a PptxGenJS slide.
|
|
156
|
+
* This mirrors the `html2pptx()` function from the original JS.
|
|
157
|
+
*
|
|
158
|
+
* If `source` is a string, creates a temporary iframe, loads it, and parses.
|
|
159
|
+
* If `source` is a Document, parses directly.
|
|
160
|
+
* If `source` is an HTMLIFrameElement, uses its contentDocument.
|
|
161
|
+
*/
|
|
162
|
+
export async function addSlideFromHtml(source,
|
|
163
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
164
|
+
pres, // PptxGenJS instance
|
|
165
|
+
options = {}) {
|
|
166
|
+
const { slide = null } = options;
|
|
167
|
+
let doc;
|
|
168
|
+
let cleanupIframe = null;
|
|
169
|
+
try {
|
|
170
|
+
// ---- Resolve source to a Document ----
|
|
171
|
+
if (source instanceof Document) {
|
|
172
|
+
doc = source;
|
|
173
|
+
}
|
|
174
|
+
else if (source instanceof HTMLIFrameElement) {
|
|
175
|
+
doc =
|
|
176
|
+
source.contentDocument || source.contentWindow.document;
|
|
177
|
+
}
|
|
178
|
+
else if (typeof source === 'string') {
|
|
179
|
+
const result = await createIframeFromHtml(source);
|
|
180
|
+
doc = result.doc;
|
|
181
|
+
cleanupIframe = result.iframe;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
throw new Error('Source must be a Document, HTMLIFrameElement, or HTML string');
|
|
185
|
+
}
|
|
186
|
+
// ---- Validation ----
|
|
187
|
+
const validationErrors = [];
|
|
188
|
+
const bodyDimensions = getBodyDimensions(doc);
|
|
189
|
+
const slideData = parseSlideHtml(doc);
|
|
190
|
+
// Collect body-dimension overflow errors
|
|
191
|
+
if (bodyDimensions.errors.length > 0) {
|
|
192
|
+
validationErrors.push(...bodyDimensions.errors);
|
|
193
|
+
}
|
|
194
|
+
// Validate dimensions match presentation layout
|
|
195
|
+
const dimensionErrors = validateDimensions(bodyDimensions, pres);
|
|
196
|
+
if (dimensionErrors.length > 0) {
|
|
197
|
+
validationErrors.push(...dimensionErrors);
|
|
198
|
+
}
|
|
199
|
+
// Validate text box positions (bottom margin)
|
|
200
|
+
const textBoxPositionErrors = validateTextBoxPosition(slideData, bodyDimensions);
|
|
201
|
+
if (textBoxPositionErrors.length > 0) {
|
|
202
|
+
validationErrors.push(...textBoxPositionErrors);
|
|
203
|
+
}
|
|
204
|
+
// Collect parse-level errors
|
|
205
|
+
if (slideData.errors.length > 0) {
|
|
206
|
+
validationErrors.push(...slideData.errors);
|
|
207
|
+
}
|
|
208
|
+
// Throw all errors at once if any exist
|
|
209
|
+
if (validationErrors.length > 0) {
|
|
210
|
+
const errorMessage = validationErrors.length === 1
|
|
211
|
+
? validationErrors[0]
|
|
212
|
+
: `Multiple validation errors found:\n${validationErrors
|
|
213
|
+
.map((e, i) => ` ${i + 1}. ${e}`)
|
|
214
|
+
.join('\n')}`;
|
|
215
|
+
throw new Error(errorMessage);
|
|
216
|
+
}
|
|
217
|
+
// ---- Build PptxGenJS slide ----
|
|
218
|
+
const targetSlide = slide || pres.addSlide();
|
|
219
|
+
await applyBackground(slideData.background, targetSlide);
|
|
220
|
+
await addElementsToSlide(slideData.elements, targetSlide, pres);
|
|
221
|
+
return { slide: targetSlide, placeholders: slideData.placeholders };
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
// Cleanup temporary iframe if we created one
|
|
225
|
+
if (cleanupIframe?.parentNode) {
|
|
226
|
+
cleanupIframe.parentNode.removeChild(cleanupIframe);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
// createPresentation
|
|
232
|
+
// ---------------------------------------------------------------------------
|
|
233
|
+
/**
|
|
234
|
+
* Convert multiple HTML strings into a complete PPTX presentation.
|
|
235
|
+
* Each HTML string becomes one slide.
|
|
236
|
+
*
|
|
237
|
+
* @param htmlSlides - Array of complete HTML strings, one per slide.
|
|
238
|
+
* @param PptxGenJS - The PptxGenJS constructor (passed in so this module
|
|
239
|
+
* stays free of hard dependencies on the vendor bundle).
|
|
240
|
+
* @param options - Optional presentation metadata and layout.
|
|
241
|
+
* @returns The PptxGenJS presentation instance, ready for `.write()` or
|
|
242
|
+
* `.writeFile()`.
|
|
243
|
+
*/
|
|
244
|
+
export async function createPresentation(htmlSlides,
|
|
245
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
246
|
+
PptxGenJS, // The PptxGenJS constructor
|
|
247
|
+
options = {}) {
|
|
248
|
+
const { title, author, company, subject, layout = 'LAYOUT_16x9', } = options;
|
|
249
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
250
|
+
const pres = new PptxGenJS();
|
|
251
|
+
pres.layout = layout;
|
|
252
|
+
if (title)
|
|
253
|
+
pres.title = title;
|
|
254
|
+
if (author)
|
|
255
|
+
pres.author = author;
|
|
256
|
+
if (company)
|
|
257
|
+
pres.company = company;
|
|
258
|
+
if (subject)
|
|
259
|
+
pres.subject = subject;
|
|
260
|
+
for (const html of htmlSlides) {
|
|
261
|
+
await addSlideFromHtml(html, pres);
|
|
262
|
+
}
|
|
263
|
+
return pres;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=createPresentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createPresentation.js","sourceRoot":"","sources":["../../../packages/slides/createPresentation.ts"],"names":[],"mappings":"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"}
|