file2md 1.1.9 → 1.1.10

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,65 @@
1
+ import type { ImageData } from '../types/interfaces.js';
2
+ import type { SlideLayout } from './pptx-visual-parser.js';
3
+ export interface PuppeteerRenderOptions {
4
+ readonly width?: number;
5
+ readonly height?: number;
6
+ readonly quality?: number;
7
+ readonly format?: 'png' | 'jpeg';
8
+ readonly deviceScaleFactor?: number;
9
+ readonly timeout?: number;
10
+ readonly headless?: boolean;
11
+ }
12
+ export interface PuppeteerRenderResult {
13
+ readonly slideImages: readonly ImageData[];
14
+ readonly slideCount: number;
15
+ readonly metadata: {
16
+ readonly renderMethod: 'puppeteer';
17
+ readonly width: number;
18
+ readonly height: number;
19
+ readonly quality: number;
20
+ readonly format: string;
21
+ };
22
+ }
23
+ export declare class PuppeteerRenderer {
24
+ private readonly outputDir;
25
+ private puppeteer;
26
+ private browser;
27
+ constructor(outputDir: string);
28
+ /**
29
+ * Initialize Puppeteer (lazy loading to avoid dependency issues)
30
+ */
31
+ private initializePuppeteer;
32
+ /**
33
+ * Launch browser instance
34
+ */
35
+ private launchBrowser;
36
+ /**
37
+ * Render slides using visual layouts in browser
38
+ */
39
+ renderSlidesFromLayouts(visualLayouts: readonly SlideLayout[], options?: PuppeteerRenderOptions): Promise<PuppeteerRenderResult>;
40
+ /**
41
+ * Generate HTML content for a slide
42
+ */
43
+ private generateSlideHtml;
44
+ /**
45
+ * Render individual element to HTML
46
+ */
47
+ private renderElement;
48
+ /**
49
+ * Escape HTML characters
50
+ */
51
+ private escapeHtml;
52
+ /**
53
+ * Check if Puppeteer is available
54
+ */
55
+ static isAvailable(): Promise<boolean>;
56
+ /**
57
+ * Close browser instance
58
+ */
59
+ close(): Promise<void>;
60
+ /**
61
+ * Clean up resources
62
+ */
63
+ cleanup(): Promise<void>;
64
+ }
65
+ //# sourceMappingURL=puppeteer-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/puppeteer-renderer.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC;QACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAQD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,OAAO,CAAa;gBAEhB,SAAS,EAAE,MAAM;IAI7B;;OAEG;YACW,mBAAmB;IAcjC;;OAEG;YACW,aAAa;IA8B3B;;OAEG;IACG,uBAAuB,CAC3B,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC;IAkGjC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAwIzB;;OAEG;IACH,OAAO,CAAC,aAAa;IA4FrB;;OAEG;IACH,OAAO,CAAC,UAAU;IASlB;;OAEG;WACU,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS5C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,393 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { ParseError } from '../types/errors.js';
4
+ export class PuppeteerRenderer {
5
+ outputDir;
6
+ puppeteer = null;
7
+ browser = null;
8
+ constructor(outputDir) {
9
+ this.outputDir = outputDir;
10
+ }
11
+ /**
12
+ * Initialize Puppeteer (lazy loading to avoid dependency issues)
13
+ */
14
+ async initializePuppeteer() {
15
+ if (this.puppeteer) {
16
+ return;
17
+ }
18
+ try {
19
+ const puppeteerModule = await Function('return import("puppeteer")')();
20
+ this.puppeteer = puppeteerModule;
21
+ console.log('Puppeteer initialized successfully');
22
+ }
23
+ catch (error) {
24
+ throw new ParseError('PuppeteerRenderer', 'Puppeteer not available. Install with: npm install puppeteer', error);
25
+ }
26
+ }
27
+ /**
28
+ * Launch browser instance
29
+ */
30
+ async launchBrowser(options) {
31
+ if (this.browser) {
32
+ return;
33
+ }
34
+ await this.initializePuppeteer();
35
+ try {
36
+ this.browser = await this.puppeteer.launch({
37
+ headless: options.headless !== false ? 'new' : false,
38
+ defaultViewport: {
39
+ width: options.width || 1920,
40
+ height: options.height || 1080,
41
+ deviceScaleFactor: options.deviceScaleFactor || 2
42
+ },
43
+ args: [
44
+ '--no-sandbox',
45
+ '--disable-setuid-sandbox',
46
+ '--disable-web-security',
47
+ '--disable-features=VizDisplayCompositor',
48
+ '--font-render-hinting=none'
49
+ ]
50
+ });
51
+ console.log('Puppeteer browser launched successfully');
52
+ }
53
+ catch (error) {
54
+ throw new ParseError('PuppeteerRenderer', 'Failed to launch Puppeteer browser', error);
55
+ }
56
+ }
57
+ /**
58
+ * Render slides using visual layouts in browser
59
+ */
60
+ async renderSlidesFromLayouts(visualLayouts, options = {}) {
61
+ const { width = 1920, height = 1080, quality = 90, format = 'png', deviceScaleFactor = 2, timeout = 30000 } = options;
62
+ try {
63
+ // Ensure output directory exists
64
+ await fs.mkdir(this.outputDir, { recursive: true });
65
+ console.log('Created Puppeteer output directory:', this.outputDir);
66
+ // Launch browser
67
+ await this.launchBrowser(options);
68
+ // Create a new page
69
+ const page = await this.browser.newPage();
70
+ await page.setViewport({ width, height, deviceScaleFactor });
71
+ const slideImages = [];
72
+ // Render each slide
73
+ for (let i = 0; i < visualLayouts.length; i++) {
74
+ const layout = visualLayouts[i];
75
+ const slideNumber = i + 1;
76
+ try {
77
+ console.log(`Rendering slide ${slideNumber} with Puppeteer...`);
78
+ // Generate HTML for this slide
79
+ const slideHtml = this.generateSlideHtml(layout, { width, height });
80
+ // Load HTML content
81
+ await page.setContent(slideHtml, {
82
+ waitUntil: 'networkidle0',
83
+ timeout
84
+ });
85
+ // Wait for any fonts to load
86
+ await page.waitForTimeout(1000);
87
+ // Take screenshot
88
+ const filename = `slide-${slideNumber.toString().padStart(3, '0')}.${format}`;
89
+ const savedPath = path.join(this.outputDir, filename);
90
+ const screenshotBuffer = await page.screenshot({
91
+ path: savedPath,
92
+ type: format,
93
+ quality: format === 'jpeg' ? quality : undefined,
94
+ fullPage: false,
95
+ clip: {
96
+ x: 0,
97
+ y: 0,
98
+ width,
99
+ height
100
+ }
101
+ });
102
+ // Verify file was created
103
+ const stats = await fs.stat(savedPath);
104
+ console.log(`Puppeteer rendered slide ${slideNumber}: ${savedPath} (${stats.size} bytes)`);
105
+ slideImages.push({
106
+ originalPath: `slide${slideNumber}`,
107
+ savedPath,
108
+ size: stats.size,
109
+ format
110
+ });
111
+ }
112
+ catch (slideError) {
113
+ console.warn(`Failed to render slide ${slideNumber} with Puppeteer:`, slideError);
114
+ // Continue with other slides
115
+ }
116
+ }
117
+ await page.close();
118
+ return {
119
+ slideImages,
120
+ slideCount: slideImages.length,
121
+ metadata: {
122
+ renderMethod: 'puppeteer',
123
+ width,
124
+ height,
125
+ quality,
126
+ format
127
+ }
128
+ };
129
+ }
130
+ catch (error) {
131
+ const message = error instanceof Error ? error.message : 'Unknown error';
132
+ throw new ParseError('PuppeteerRenderer', `Puppeteer rendering failed: ${message}`, error);
133
+ }
134
+ }
135
+ /**
136
+ * Generate HTML content for a slide
137
+ */
138
+ generateSlideHtml(layout, dimensions) {
139
+ const { width, height } = dimensions;
140
+ // Convert EMU to pixels (1 EMU = 1/914400 inches, assume 96 DPI)
141
+ const emuToPixels = (emu) => Math.round(emu / 914400 * 96);
142
+ const slideWidth = emuToPixels(layout.dimensions.width);
143
+ const slideHeight = emuToPixels(layout.dimensions.height);
144
+ // Scale factor to fit slide into viewport
145
+ const scaleX = width / slideWidth;
146
+ const scaleY = height / slideHeight;
147
+ const scale = Math.min(scaleX, scaleY);
148
+ const scaledWidth = slideWidth * scale;
149
+ const scaledHeight = slideHeight * scale;
150
+ let elementsHtml = '';
151
+ // Render each element
152
+ for (const element of layout.elements) {
153
+ const elementHtml = this.renderElement(element, scale);
154
+ if (elementHtml) {
155
+ elementsHtml += elementHtml;
156
+ }
157
+ }
158
+ return `
159
+ <!DOCTYPE html>
160
+ <html lang="en">
161
+ <head>
162
+ <meta charset="UTF-8">
163
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
164
+ <title>Slide ${layout.slideNumber}</title>
165
+ <style>
166
+ @import url('https://fonts.googleapis.com/css2?family=Arial:wght@400;700&family=Helvetica:wght@400;700&family=Times+New+Roman:wght@400;700&family=Calibri:wght@400;700&display=swap');
167
+
168
+ * {
169
+ margin: 0;
170
+ padding: 0;
171
+ box-sizing: border-box;
172
+ }
173
+
174
+ body {
175
+ width: ${width}px;
176
+ height: ${height}px;
177
+ background: ${layout.background?.color || '#FFFFFF'};
178
+ font-family: 'Calibri', 'Arial', sans-serif;
179
+ overflow: hidden;
180
+ position: relative;
181
+ display: flex;
182
+ align-items: center;
183
+ justify-content: center;
184
+ }
185
+
186
+ .slide-container {
187
+ width: ${scaledWidth}px;
188
+ height: ${scaledHeight}px;
189
+ position: relative;
190
+ background: ${layout.background?.color || '#FFFFFF'};
191
+ border: 1px solid #e0e0e0;
192
+ }
193
+
194
+ .slide-element {
195
+ position: absolute;
196
+ overflow: hidden;
197
+ }
198
+
199
+ .text-element {
200
+ font-size: 16px;
201
+ line-height: 1.2;
202
+ color: #000000;
203
+ word-wrap: break-word;
204
+ display: flex;
205
+ align-items: center;
206
+ padding: 4px;
207
+ }
208
+
209
+ .shape-element {
210
+ border: 1px solid #666666;
211
+ background: #f0f0f0;
212
+ }
213
+
214
+ .image-placeholder {
215
+ background: linear-gradient(45deg, #f0f0f0 25%, transparent 25%),
216
+ linear-gradient(-45deg, #f0f0f0 25%, transparent 25%),
217
+ linear-gradient(45deg, transparent 75%, #f0f0f0 75%),
218
+ linear-gradient(-45deg, transparent 75%, #f0f0f0 75%);
219
+ background-size: 20px 20px;
220
+ background-position: 0 0, 0 10px, 10px -10px, -10px 0px;
221
+ border: 2px dashed #ccc;
222
+ display: flex;
223
+ align-items: center;
224
+ justify-content: center;
225
+ color: #666;
226
+ font-size: 14px;
227
+ }
228
+
229
+ .chart-placeholder {
230
+ background: linear-gradient(135deg, #e3f2fd 0%, #bbdefb 100%);
231
+ border: 2px solid #2196f3;
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ color: #1976d2;
236
+ font-size: 14px;
237
+ font-weight: bold;
238
+ }
239
+
240
+ .table-element {
241
+ border: 1px solid #ccc;
242
+ background: #fff;
243
+ }
244
+
245
+ .table-element table {
246
+ width: 100%;
247
+ height: 100%;
248
+ border-collapse: collapse;
249
+ }
250
+
251
+ .table-element td {
252
+ border: 1px solid #ddd;
253
+ padding: 4px 8px;
254
+ font-size: 12px;
255
+ vertical-align: top;
256
+ }
257
+ </style>
258
+ </head>
259
+ <body>
260
+ <div class="slide-container">
261
+ ${elementsHtml}
262
+ </div>
263
+ </body>
264
+ </html>`;
265
+ }
266
+ /**
267
+ * Render individual element to HTML
268
+ */
269
+ renderElement(element, scale) {
270
+ const emuToPixels = (emu) => Math.round(emu / 914400 * 96 * scale);
271
+ const left = emuToPixels(element.position.x);
272
+ const top = emuToPixels(element.position.y);
273
+ const width = emuToPixels(element.size.width);
274
+ const height = emuToPixels(element.size.height);
275
+ const baseStyle = `left: ${left}px; top: ${top}px; width: ${width}px; height: ${height}px;`;
276
+ switch (element.type) {
277
+ case 'text':
278
+ const textContent = element.content?.text || '';
279
+ const fontSize = Math.max(10, Math.min(24, width / 20)); // Responsive font size
280
+ return `
281
+ <div class="slide-element text-element" style="${baseStyle} font-size: ${fontSize}px;">
282
+ ${this.escapeHtml(textContent)}
283
+ </div>
284
+ `;
285
+ case 'shape':
286
+ return `
287
+ <div class="slide-element shape-element" style="${baseStyle}">
288
+ <div style="width: 100%; height: 100%; background: ${element.style?.fill || '#f0f0f0'};"></div>
289
+ </div>
290
+ `;
291
+ case 'image':
292
+ return `
293
+ <div class="slide-element image-placeholder" style="${baseStyle}">
294
+ 📷 Image
295
+ </div>
296
+ `;
297
+ case 'chart':
298
+ const chartType = element.content?.chartType || 'Chart';
299
+ return `
300
+ <div class="slide-element chart-placeholder" style="${baseStyle}">
301
+ 📊 ${this.escapeHtml(chartType)}
302
+ </div>
303
+ `;
304
+ case 'table':
305
+ const rows = element.content?.rows || [];
306
+ let tableHtml = '<table>';
307
+ for (const row of rows.slice(0, 10)) { // Limit rows for performance
308
+ tableHtml += '<tr>';
309
+ for (const cell of row.cells.slice(0, 6)) { // Limit columns
310
+ tableHtml += `<td>${this.escapeHtml(cell.text || '')}</td>`;
311
+ }
312
+ tableHtml += '</tr>';
313
+ }
314
+ tableHtml += '</table>';
315
+ return `
316
+ <div class="slide-element table-element" style="${baseStyle}">
317
+ ${tableHtml}
318
+ </div>
319
+ `;
320
+ case 'group':
321
+ // Render child elements
322
+ let groupHtml = '';
323
+ if (element.children && Array.isArray(element.children)) {
324
+ for (const child of element.children) {
325
+ // Adjust child positions relative to group
326
+ const adjustedChild = {
327
+ ...child,
328
+ position: {
329
+ x: child.position.x + element.position.x,
330
+ y: child.position.y + element.position.y,
331
+ z: child.position.z
332
+ }
333
+ };
334
+ groupHtml += this.renderElement(adjustedChild, scale);
335
+ }
336
+ }
337
+ return groupHtml;
338
+ default:
339
+ return `
340
+ <div class="slide-element" style="${baseStyle} border: 1px dashed #ccc; background: #fafafa;">
341
+ <div style="padding: 4px; font-size: 12px; color: #666;">
342
+ ${element.type || 'Unknown'}
343
+ </div>
344
+ </div>
345
+ `;
346
+ }
347
+ }
348
+ /**
349
+ * Escape HTML characters
350
+ */
351
+ escapeHtml(text) {
352
+ return text
353
+ .replace(/&/g, '&amp;')
354
+ .replace(/</g, '&lt;')
355
+ .replace(/>/g, '&gt;')
356
+ .replace(/"/g, '&quot;')
357
+ .replace(/'/g, '&#39;');
358
+ }
359
+ /**
360
+ * Check if Puppeteer is available
361
+ */
362
+ static async isAvailable() {
363
+ try {
364
+ await Function('return import("puppeteer")')();
365
+ return true;
366
+ }
367
+ catch {
368
+ return false;
369
+ }
370
+ }
371
+ /**
372
+ * Close browser instance
373
+ */
374
+ async close() {
375
+ if (this.browser) {
376
+ try {
377
+ await this.browser.close();
378
+ this.browser = null;
379
+ console.log('Puppeteer browser closed');
380
+ }
381
+ catch (error) {
382
+ console.warn('Error closing Puppeteer browser:', error);
383
+ }
384
+ }
385
+ }
386
+ /**
387
+ * Clean up resources
388
+ */
389
+ async cleanup() {
390
+ await this.close();
391
+ }
392
+ }
393
+ //# sourceMappingURL=puppeteer-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puppeteer-renderer.js","sourceRoot":"","sources":["../../src/utils/puppeteer-renderer.ts"],"names":[],"mappings":"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"}
@@ -1,29 +1,37 @@
1
1
  import { Buffer } from 'node:buffer';
2
2
  import type { ImageData } from '../types/interfaces.js';
3
+ import { type SlideLayout } from './pptx-visual-parser.js';
4
+ import { type PuppeteerRenderOptions } from './puppeteer-renderer.js';
3
5
  export interface SlideRenderOptions {
4
6
  readonly quality?: number;
5
7
  readonly density?: number;
6
8
  readonly format?: 'png' | 'jpg';
7
9
  readonly saveBase64?: boolean;
10
+ readonly useVisualLayouts?: boolean;
11
+ readonly usePuppeteer?: boolean;
12
+ readonly puppeteerOptions?: PuppeteerRenderOptions;
8
13
  }
9
14
  export interface SlideRenderResult {
10
15
  readonly slideImages: readonly ImageData[];
11
16
  readonly slideCount: number;
17
+ readonly visualLayouts?: readonly SlideLayout[];
12
18
  readonly metadata: {
13
19
  readonly format: string;
14
20
  readonly quality: number;
15
21
  readonly density: number;
22
+ readonly hasVisualLayouts?: boolean;
16
23
  };
17
24
  }
18
25
  export declare class SlideRenderer {
19
26
  private readonly outputDir;
27
+ private readonly converter;
20
28
  constructor(outputDir: string);
21
29
  /**
22
30
  * Convert PPTX buffer to individual slide images
23
31
  */
24
32
  renderSlidesToImages(pptxBuffer: Buffer, options?: SlideRenderOptions): Promise<SlideRenderResult>;
25
33
  /**
26
- * Convert PPTX buffer to PDF buffer using multiple methods
34
+ * Convert PPTX buffer to PDF buffer using enhanced LibreOffice converter
27
35
  */
28
36
  private convertPptxToPdf;
29
37
  /**
@@ -72,20 +80,40 @@ export declare class SlideRenderer {
72
80
  */
73
81
  private createPlaceholderSlideImage;
74
82
  /**
75
- * Convert PDF buffer to individual slide images using pdf2pic or return pre-generated images
83
+ * Convert PDF buffer to individual slide images with optimization
76
84
  */
77
85
  private convertPdfToSlideImages;
86
+ /**
87
+ * Optimize PDF to image conversion settings based on quality requirements
88
+ */
89
+ private optimizePdfToImageSettings;
78
90
  /**
79
91
  * Generate markdown with slide images
80
92
  */
81
93
  generateSlideMarkdown(slideImages: readonly ImageData[], title?: string): string;
94
+ /**
95
+ * Enhance slide images using visual layout information
96
+ */
97
+ private enhanceSlideImagesWithLayouts;
98
+ /**
99
+ * Add visual enhancements based on layout information
100
+ */
101
+ private addVisualEnhancements;
82
102
  /**
83
103
  * Clean up generated image files
84
104
  */
85
105
  cleanup(): Promise<void>;
106
+ /**
107
+ * Render slides using Puppeteer browser-based rendering
108
+ */
109
+ private renderWithPuppeteer;
86
110
  /**
87
111
  * Check if LibreOffice is available on the system
88
112
  */
89
113
  static checkLibreOfficeAvailability(): Promise<boolean>;
114
+ /**
115
+ * Check if Puppeteer is available on the system
116
+ */
117
+ static checkPuppeteerAvailability(): Promise<boolean>;
90
118
  }
91
119
  //# sourceMappingURL=slide-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slide-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/slide-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAMrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAKxD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,EAAE,MAAM;IAI7B;;OAEG;IACG,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC;IAgD7B;;OAEG;YACW,gBAAgB;IAoB9B;;OAEG;YACW,4BAA4B;IAkF1C,OAAO,CAAC,oBAAoB,CAAmB;IAE/C;;OAEG;YACW,kBAAkB;IA8DhC;;OAEG;YACW,sBAAsB;IA2CpC;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAwBhB;;OAEG;YACW,yBAAyB;IAmBvC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;OAEG;YACW,eAAe;IAwB7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;OAEG;YACW,2BAA2B;IAQzC;;OAEG;YACW,uBAAuB;IA0ErC;;OAEG;IACH,qBAAqB,CAAC,WAAW,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAuBhF;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB9B;;OAEG;WACU,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC;CAU9D"}
1
+ {"version":3,"file":"slide-renderer.d.ts","sourceRoot":"","sources":["../../src/utils/slide-renderer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAMrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAqB,KAAK,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAKzF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,WAAW,EAAE,SAAS,SAAS,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;KACrC,CAAC;CACH;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;gBAErC,SAAS,EAAE,MAAM;IAK7B;;OAEG;IACG,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC;IAmG7B;;OAEG;YACW,gBAAgB;IAmE9B;;OAEG;YACW,4BAA4B;IAkF1C,OAAO,CAAC,oBAAoB,CAAmB;IAE/C;;OAEG;YACW,kBAAkB;IA8DhC;;OAEG;YACW,sBAAsB;IA2CpC;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAwBhB;;OAEG;YACW,yBAAyB;IAmBvC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsC3B;;OAEG;YACW,eAAe;IAwB7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAwCxB;;OAEG;YACW,2BAA2B;IAQzC;;OAEG;YACW,uBAAuB;IAwFrC;;OAEG;IACH,OAAO,CAAC,0BAA0B;IA6ClC;;OAEG;IACH,qBAAqB,CAAC,WAAW,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAuBhF;;OAEG;YACW,6BAA6B;IA2D3C;;OAEG;YACW,qBAAqB;IA6CnC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB9B;;OAEG;YACW,mBAAmB;IAmBjC;;OAEG;WACU,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC;IAW7D;;OAEG;WACU,0BAA0B,IAAI,OAAO,CAAC,OAAO,CAAC;CAG5D"}