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.
Files changed (88) hide show
  1. package/README.md +118 -0
  2. package/dist/bundle.js +36086 -0
  3. package/dist/bundle.min.js +197 -0
  4. package/dist/cli.js +47432 -0
  5. package/dist/index.d.ts +9 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +9 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/packages/cli/commands/export-docs.d.ts +5 -0
  10. package/dist/packages/cli/commands/export-docs.d.ts.map +1 -0
  11. package/dist/packages/cli/commands/export-docs.js +24 -0
  12. package/dist/packages/cli/commands/export-docs.js.map +1 -0
  13. package/dist/packages/cli/commands/export-slides.d.ts +5 -0
  14. package/dist/packages/cli/commands/export-slides.d.ts.map +1 -0
  15. package/dist/packages/cli/commands/export-slides.js +86 -0
  16. package/dist/packages/cli/commands/export-slides.js.map +1 -0
  17. package/dist/packages/cli/commands/import-docx.d.ts +5 -0
  18. package/dist/packages/cli/commands/import-docx.d.ts.map +1 -0
  19. package/dist/packages/cli/commands/import-docx.js +27 -0
  20. package/dist/packages/cli/commands/import-docx.js.map +1 -0
  21. package/dist/packages/cli/commands/import-pptx.d.ts +5 -0
  22. package/dist/packages/cli/commands/import-pptx.d.ts.map +1 -0
  23. package/dist/packages/cli/commands/import-pptx.js +44 -0
  24. package/dist/packages/cli/commands/import-pptx.js.map +1 -0
  25. package/dist/packages/cli/index.d.ts +11 -0
  26. package/dist/packages/cli/index.d.ts.map +1 -0
  27. package/dist/packages/cli/index.js +103 -0
  28. package/dist/packages/cli/index.js.map +1 -0
  29. package/dist/packages/docs/common.d.ts +183 -0
  30. package/dist/packages/docs/common.d.ts.map +1 -0
  31. package/dist/packages/docs/common.js +27 -0
  32. package/dist/packages/docs/common.js.map +1 -0
  33. package/dist/packages/docs/convert.d.ts +7 -0
  34. package/dist/packages/docs/convert.d.ts.map +1 -0
  35. package/dist/packages/docs/convert.js +1399 -0
  36. package/dist/packages/docs/convert.js.map +1 -0
  37. package/dist/packages/docs/create-document.d.ts +30 -0
  38. package/dist/packages/docs/create-document.d.ts.map +1 -0
  39. package/dist/packages/docs/create-document.js +170 -0
  40. package/dist/packages/docs/create-document.js.map +1 -0
  41. package/dist/packages/docs/export.d.ts +57 -0
  42. package/dist/packages/docs/export.d.ts.map +1 -0
  43. package/dist/packages/docs/export.js +430 -0
  44. package/dist/packages/docs/export.js.map +1 -0
  45. package/dist/packages/docs/import-docx.d.ts +13 -0
  46. package/dist/packages/docs/import-docx.d.ts.map +1 -0
  47. package/dist/packages/docs/import-docx.js +2299 -0
  48. package/dist/packages/docs/import-docx.js.map +1 -0
  49. package/dist/packages/docs/parse.d.ts +6 -0
  50. package/dist/packages/docs/parse.d.ts.map +1 -0
  51. package/dist/packages/docs/parse.js +4253 -0
  52. package/dist/packages/docs/parse.js.map +1 -0
  53. package/dist/packages/shared/dom-parser-shim.d.ts +30 -0
  54. package/dist/packages/shared/dom-parser-shim.d.ts.map +1 -0
  55. package/dist/packages/shared/dom-parser-shim.js +152 -0
  56. package/dist/packages/shared/dom-parser-shim.js.map +1 -0
  57. package/dist/packages/slides/common.d.ts +325 -0
  58. package/dist/packages/slides/common.d.ts.map +1 -0
  59. package/dist/packages/slides/common.js +12 -0
  60. package/dist/packages/slides/common.js.map +1 -0
  61. package/dist/packages/slides/convert.d.ts +35 -0
  62. package/dist/packages/slides/convert.d.ts.map +1 -0
  63. package/dist/packages/slides/convert.js +308 -0
  64. package/dist/packages/slides/convert.js.map +1 -0
  65. package/dist/packages/slides/createPresentation.d.ts +51 -0
  66. package/dist/packages/slides/createPresentation.d.ts.map +1 -0
  67. package/dist/packages/slides/createPresentation.js +265 -0
  68. package/dist/packages/slides/createPresentation.js.map +1 -0
  69. package/dist/packages/slides/export.d.ts +24 -0
  70. package/dist/packages/slides/export.d.ts.map +1 -0
  71. package/dist/packages/slides/export.js +52 -0
  72. package/dist/packages/slides/export.js.map +1 -0
  73. package/dist/packages/slides/import-pptx.d.ts +13 -0
  74. package/dist/packages/slides/import-pptx.d.ts.map +1 -0
  75. package/dist/packages/slides/import-pptx.js +619 -0
  76. package/dist/packages/slides/import-pptx.js.map +1 -0
  77. package/dist/packages/slides/parse.d.ts +45 -0
  78. package/dist/packages/slides/parse.d.ts.map +1 -0
  79. package/dist/packages/slides/parse.js +1185 -0
  80. package/dist/packages/slides/parse.js.map +1 -0
  81. package/dist/packages/slides/transform.d.ts +37 -0
  82. package/dist/packages/slides/transform.d.ts.map +1 -0
  83. package/dist/packages/slides/transform.js +140 -0
  84. package/dist/packages/slides/transform.js.map +1 -0
  85. package/dist/packages/slides/vendor/VENDORING.md +58 -0
  86. package/dist/packages/slides/vendor/pptxgen.d.ts +805 -0
  87. package/dist/packages/slides/vendor/pptxgen.js +7442 -0
  88. 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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"}