html-native-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/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/index.d.mts +337 -0
- package/dist/index.d.ts +337 -0
- package/dist/index.js +1090 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1037 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types/ir.ts","../src/normalizer/units.ts","../src/normalizer/styles.ts","../src/normalizer/fonts.ts","../src/harvester/traverser.ts","../src/harvester/browser.ts","../src/compiler/templates.ts","../src/compiler/shapes.ts","../src/compiler/texts.ts","../src/compiler/packager.ts","../src/index.ts"],"names":["_ttf2eot","path","fs","fs2","path2","puppeteer","harvestOptions","escapeXml","JSZip"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Intermediate Representation (IR) AST for html-native-pptx.\n * Decouples the DOM crawler (Harvester) from the PresentationML generator (Compiler).\n */\n\nexport const UNITS = {\n DPI: 96,\n PT_PER_INCH: 72,\n EMU_PER_INCH: 914400,\n SLIDE_16_9_WIDTH_INCHES: 13.333333,\n SLIDE_16_9_HEIGHT_INCHES: 7.5,\n SLIDE_16_9_WIDTH_EMU: 12192000,\n SLIDE_16_9_HEIGHT_EMU: 6858000,\n SLIDE_4_3_WIDTH_INCHES: 10,\n SLIDE_4_3_HEIGHT_INCHES: 7.5,\n SLIDE_4_3_WIDTH_EMU: 9144000,\n SLIDE_4_3_HEIGHT_EMU: 6858000,\n} as const;\n\nexport type ElementType = 'container' | 'text' | 'image' | 'table';\n\nexport type TextAlign = 'left' | 'center' | 'right' | 'justify';\n\n/**\n * Normalized bounding box in Inches.\n */\nexport interface BoundingBox {\n x: number; // Horizontal offset from slide top-left (Inches)\n y: number; // Vertical offset from slide top-left (Inches)\n w: number; // Width (Inches)\n h: number; // Height (Inches)\n}\n\n/**\n * Visual styling for rectangular containers and shapes.\n */\nexport interface ShapeStyle {\n fillColor?: string; // 6-character uppercase Hex without '#' (e.g. '1E293B')\n fillOpacity?: number; // 0.0 - 1.0\n borderColor?: string; // 6-character uppercase Hex without '#'\n borderWidth?: number; // Points (pt)\n borderStyle?: 'solid' | 'dashed' | 'dotted';\n radius?: number; // Border radius in pixels (converted to OpenXML adj in compiler)\n shadow?: {\n color: string;\n blur: number;\n offsetX: number;\n offsetY: number;\n opacity?: number;\n };\n}\n\n/**\n * Individual formatted text run inside a paragraph (maps to OpenXML <a:r>).\n */\nexport interface TextRun {\n content: string;\n fontFamily?: string;\n fontSize?: number; // Points (pt)\n color?: string; // 6-character uppercase Hex (e.g. '0F172A')\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n}\n\n/**\n * Paragraph containing one or more formatted text runs (maps to OpenXML <a:p>).\n */\nexport interface ParagraphIR {\n align?: TextAlign;\n lineHeight?: number;\n spaceBefore?: number; // Points (pt)\n spaceAfter?: number; // Points (pt)\n runs: TextRun[];\n}\n\n/**\n * Flat text style convenience interface (for simple, single-style text elements).\n */\nexport interface TextStyle {\n fontFamily: string;\n fontSize: number; // Points (pt)\n color: string; // 6-character uppercase Hex without '#'\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n align?: TextAlign;\n}\n\n/**\n * Primary Abstract Syntax Tree (AST) node.\n */\nexport interface IRNode {\n id?: string | number;\n name?: string;\n type: ElementType;\n box: BoundingBox;\n zIndex?: number;\n\n // Container shape properties\n shapeStyle?: ShapeStyle;\n\n // Single-run / flat text properties\n content?: string;\n textStyle?: TextStyle;\n\n // Structured multi-run rich text paragraphs\n paragraphs?: ParagraphIR[];\n\n // Nested elements (if grouped or container has nested AST)\n children?: IRNode[];\n}\n\n/**\n * Embedded font IR representing a portable font stream for OpenXML (.fntdata).\n */\nexport interface EmbeddedFontIR {\n typeface: string;\n fntData: Buffer;\n}\n\n/**\n * Complete Intermediate Representation for a single slide.\n */\nexport interface SlideIR {\n width: number; // Default 13.333333 inches (16:9)\n height: number; // Default 7.5 inches\n backgroundColor?: string;\n elements: IRNode[];\n fonts?: EmbeddedFontIR[];\n}\n\n/**\n * Multi-slide presentation IR container with global presentation metadata.\n */\nexport interface PresentationIR {\n slides: SlideIR[];\n fonts?: EmbeddedFontIR[];\n}\n\n","import { UNITS } from '../types/ir.js';\n\n/**\n * Convert pixels to inches given a DPI and optional coordinate scale factor.\n */\nexport function pxToInches(\n px: number,\n dpi: number = UNITS.DPI,\n scale: number = 1\n): number {\n return (px / dpi) * scale;\n}\n\n/**\n * Convert inches to English Metric Units (EMU).\n * 1 inch = 914,400 EMU.\n */\nexport function inchesToEmu(inches: number): number {\n return Math.round(inches * UNITS.EMU_PER_INCH);\n}\n\n/**\n * Direct conversion from pixels to EMU.\n */\nexport function pxToEmu(\n px: number,\n dpi: number = UNITS.DPI,\n scale: number = 1\n): number {\n return inchesToEmu(pxToInches(px, dpi, scale));\n}\n\n/**\n * Convert pixel font size to points (pt).\n * 1 inch = 72 pt = 96 px -> 1 px = 0.75 pt.\n */\nexport function pxToPt(px: number, dpi: number = UNITS.DPI): number {\n return (px * UNITS.PT_PER_INCH) / dpi;\n}\n\n/**\n * Convert points to hundredths of a point (used by OpenXML sz attribute).\n * e.g., 16pt -> 1600.\n */\nexport function ptToHundredthPt(pt: number): number {\n return Math.round(pt * 100);\n}\n\n/**\n * Convert CSS border-radius (in pixels) to OpenXML rounded rectangle adjustment guide value (0 - 50000).\n * In OpenXML, an adj value of 50000 represents a radius equal to half the shortest dimension.\n */\nexport function borderRadiusToGuide(\n radiusPx: number,\n widthPx: number,\n heightPx: number\n): number {\n const minSide = Math.min(widthPx, heightPx);\n if (minSide <= 0 || radiusPx <= 0) return 0;\n const maxRadius = minSide / 2;\n const ratio = Math.min(1, Math.max(0, radiusPx / maxRadius));\n return Math.round(ratio * 50000);\n}\n","import type { TextAlign } from '../types/ir.js';\n\nconst NAMED_COLORS: Record<string, string> = {\n black: '000000',\n white: 'FFFFFF',\n red: 'FF0000',\n green: '008000',\n blue: '0000FF',\n yellow: 'FFFF00',\n cyan: '00FFFF',\n magenta: 'FF00FF',\n silver: 'C0C0C0',\n gray: '808080',\n grey: '808080',\n maroon: '800000',\n olive: '808000',\n purple: '800080',\n teal: '008080',\n navy: '000080',\n orange: 'FFA500',\n pink: 'FFC0CB',\n};\n\nexport interface ColorResult {\n hex: string;\n opacity?: number;\n}\n\n/**\n * Normalizes any CSS color string (rgb, rgba, hex, named) into a 6-character uppercase hex string.\n * Returns undefined if transparent or invalid.\n */\nexport function normalizeHexColor(cssColor?: string): ColorResult | undefined {\n if (!cssColor) return undefined;\n const trimmed = cssColor.trim().toLowerCase();\n\n if (trimmed === 'transparent' || trimmed === 'rgba(0, 0, 0, 0)' || trimmed === 'none') {\n return undefined;\n }\n\n // 1. Check named colors\n if (NAMED_COLORS[trimmed]) {\n return { hex: NAMED_COLORS[trimmed], opacity: 1 };\n }\n\n // 2. Parse rgba(r, g, b, a) or rgb(r, g, b)\n const rgbMatch = trimmed.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)/\n );\n if (rgbMatch) {\n const r = Math.min(255, Math.max(0, parseInt(rgbMatch[1], 10)));\n const g = Math.min(255, Math.max(0, parseInt(rgbMatch[2], 10)));\n const b = Math.min(255, Math.max(0, parseInt(rgbMatch[3], 10)));\n const a = rgbMatch[4] !== undefined ? parseFloat(rgbMatch[4]) : 1;\n\n if (a <= 0) return undefined;\n\n const hex = [r, g, b]\n .map((c) => c.toString(16).padStart(2, '0'))\n .join('')\n .toUpperCase();\n\n return { hex, opacity: a };\n }\n\n // 3. Parse hex (#RGB, #RGBA, #RRGGBB, #RRGGBBAA)\n if (trimmed.startsWith('#')) {\n const raw = trimmed.slice(1);\n if (raw.length === 3) {\n // #RGB\n const hex = raw\n .split('')\n .map((c) => c + c)\n .join('')\n .toUpperCase();\n return { hex, opacity: 1 };\n }\n if (raw.length === 4) {\n // #RGBA\n const hex = raw\n .slice(0, 3)\n .split('')\n .map((c) => c + c)\n .join('')\n .toUpperCase();\n const alphaHex = raw[3] + raw[3];\n const opacity = parseInt(alphaHex, 16) / 255;\n return opacity <= 0 ? undefined : { hex, opacity };\n }\n if (raw.length === 6) {\n // #RRGGBB\n return { hex: raw.toUpperCase(), opacity: 1 };\n }\n if (raw.length === 8) {\n // #RRGGBBAA\n const hex = raw.slice(0, 6).toUpperCase();\n const opacity = parseInt(raw.slice(6, 8), 16) / 255;\n return opacity <= 0 ? undefined : { hex, opacity };\n }\n }\n\n return undefined;\n}\n\n/**\n * Normalizes CSS font-weight into a boolean representing bold.\n */\nexport function normalizeFontWeight(fontWeight?: string | number): boolean {\n if (!fontWeight) return false;\n if (typeof fontWeight === 'number') return fontWeight >= 600;\n const lower = fontWeight.trim().toLowerCase();\n if (lower === 'bold' || lower === 'bolder') return true;\n const num = parseInt(lower, 10);\n return !isNaN(num) && num >= 600;\n}\n\n/**\n * Normalizes CSS font-style into a boolean representing italic.\n */\nexport function normalizeFontStyle(fontStyle?: string): boolean {\n if (!fontStyle) return false;\n const lower = fontStyle.trim().toLowerCase();\n return lower === 'italic' || lower === 'oblique';\n}\n\n/**\n * Normalizes CSS font-family string by extracting the primary font family without quotes.\n */\nexport function normalizeFontFamily(fontFamily?: string): string {\n if (!fontFamily) return 'Arial';\n const first = fontFamily.split(',')[0].trim();\n const cleaned = first.replace(/^['\"]+|['\"]+$/g, '');\n return cleaned || 'Arial';\n}\n\n/**\n * Normalizes CSS text-align to IR TextAlign.\n */\nexport function normalizeTextAlign(textAlign?: string): TextAlign {\n if (!textAlign) return 'left';\n const lower = textAlign.trim().toLowerCase();\n if (lower === 'center') return 'center';\n if (lower === 'right') return 'right';\n if (lower === 'justify') return 'justify';\n return 'left';\n}\n\n/**\n * Normalizes CSS border-style to supported IR border types.\n */\nexport function normalizeBorderStyle(\n borderStyle?: string\n): 'solid' | 'dashed' | 'dotted' {\n if (!borderStyle) return 'solid';\n const lower = borderStyle.trim().toLowerCase();\n if (lower === 'dashed') return 'dashed';\n if (lower === 'dotted') return 'dotted';\n return 'solid';\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport _ttf2eot from 'ttf2eot';\nimport type { EmbeddedFontIR } from '../types/ir.js';\nimport type { EmbeddedFontOption } from '../types/options.js';\n\n// Resolve CJS/ESM interop for ttf2eot\nconst ttf2eot = (_ttf2eot as any).default || _ttf2eot;\n\n/**\n * Normalizes a typeface name by stripping quotes and taking the primary family.\n */\nexport function cleanTypeface(name: string): string {\n if (!name) return '';\n const first = name.split(',')[0].trim();\n return first.replace(/^['\"]+|['\"]+$/g, '').trim();\n}\n\n/**\n * Checks if a buffer contains Microsoft Embedded OpenType (EOT) binary data.\n */\nexport function isEotBuffer(buf: Buffer): boolean {\n if (!buf || buf.length < 36) return false;\n // Offset 34: MagicNumber should be 0x504C ('LP')\n const magic = buf.readUInt16LE(34);\n return magic === 0x504c;\n}\n\n/**\n * Converts TrueType (TTF) or OpenType (OTF) font buffer into Microsoft EOT format.\n */\nexport function convertTtfToEot(buf: Buffer): Buffer {\n if (isEotBuffer(buf)) {\n return buf;\n }\n try {\n const uint8 = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n const result = ttf2eot(uint8);\n return Buffer.from(result.buffer, result.byteOffset, result.byteLength);\n } catch (err) {\n // If conversion fails, return original buffer as fallback\n return buf;\n }\n}\n\n/**\n * Loads font data from a buffer, data URI, web URL, or local file path.\n */\nexport async function loadFontBuffer(\n src: string | Buffer,\n basePath?: string\n): Promise<Buffer | null> {\n if (Buffer.isBuffer(src)) {\n return src;\n }\n\n if (typeof src !== 'string' || src.trim().length === 0) {\n return null;\n }\n\n const trimmed = src.trim();\n\n // 1. Data URI (data:font/...;base64,...)\n if (trimmed.startsWith('data:')) {\n const commaIdx = trimmed.indexOf(',');\n if (commaIdx !== -1) {\n return Buffer.from(trimmed.slice(commaIdx + 1), 'base64');\n }\n return null;\n }\n\n // 2. HTTP / HTTPS URL\n if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) {\n try {\n const res = await fetch(trimmed);\n if (!res.ok) return null;\n const arrayBuf = await res.arrayBuffer();\n return Buffer.from(arrayBuf);\n } catch {\n return null;\n }\n }\n\n // 3. File path on disk\n try {\n // Strip URL query/hash if present (e.g. font.ttf?v=1.0#iefix)\n const cleanPath = trimmed.split('?')[0].split('#')[0];\n const candidatePaths = [\n path.isAbsolute(cleanPath)\n ? cleanPath\n : path.resolve(basePath || process.cwd(), cleanPath),\n basePath ? path.resolve(basePath, path.basename(cleanPath)) : null,\n path.resolve(process.cwd(), cleanPath),\n ].filter(Boolean) as string[];\n\n for (const p of candidatePaths) {\n if (fs.existsSync(p)) {\n return await fs.promises.readFile(p);\n }\n }\n } catch {\n // Failed to read file\n }\n\n return null;\n}\n\n/**\n * Extracts @font-face rules from raw HTML string or CSS text.\n */\nexport function extractFontFacesFromHtml(\n html: string\n): Array<{ typeface: string; src: string }> {\n const results: Array<{ typeface: string; src: string }> = [];\n if (!html) return results;\n\n const fontFaceRegex = /@font-face\\s*\\{([^}]+)\\}/gi;\n let match: RegExpExecArray | null;\n\n while ((match = fontFaceRegex.exec(html)) !== null) {\n const block = match[1];\n const familyMatch = block.match(/font-family\\s*:\\s*['\"]?([^'\";\\n\\r]+)['\"]?/i);\n const srcMatch = block.match(/src\\s*:\\s*[^;]*url\\((['\"]?)(.*?)\\1\\)/i);\n\n if (familyMatch && srcMatch) {\n const typeface = cleanTypeface(familyMatch[1]);\n const src = srcMatch[2].trim();\n if (typeface && src) {\n results.push({ typeface, src });\n }\n }\n }\n\n return results;\n}\n\n/**\n * Resolves, deduplicates, and converts font options and discovered @font-face rules into EmbeddedFontIR items.\n */\nexport async function resolveAndEmbedFonts(options: {\n html?: string;\n userFonts?: EmbeddedFontOption[];\n autoEmbedFonts?: boolean;\n basePath?: string;\n discoveredFonts?: Array<{ typeface: string; src: string }>;\n}): Promise<EmbeddedFontIR[]> {\n const fontMap = new Map<string, EmbeddedFontOption>();\n\n // 1. If autoEmbedFonts is enabled (default true), harvest from HTML and discovered CSS rules\n if (options.autoEmbedFonts !== false) {\n if (options.html) {\n const fromHtml = extractFontFacesFromHtml(options.html);\n for (const item of fromHtml) {\n fontMap.set(item.typeface.toLowerCase(), item);\n }\n }\n\n if (options.discoveredFonts) {\n for (const item of options.discoveredFonts) {\n const cleaned = cleanTypeface(item.typeface);\n if (cleaned && item.src) {\n fontMap.set(cleaned.toLowerCase(), { typeface: cleaned, src: item.src });\n }\n }\n }\n }\n\n // 2. User-provided fonts have highest priority (override auto-discovered)\n if (options.userFonts) {\n for (const f of options.userFonts) {\n const cleaned = cleanTypeface(f.typeface);\n if (cleaned) {\n fontMap.set(cleaned.toLowerCase(), { typeface: cleaned, src: f.src });\n }\n }\n }\n\n const results: EmbeddedFontIR[] = [];\n\n for (const fontOpt of fontMap.values()) {\n try {\n const buf = await loadFontBuffer(fontOpt.src, options.basePath);\n if (!buf || buf.length === 0) continue;\n\n const fntData = convertTtfToEot(buf);\n results.push({\n typeface: fontOpt.typeface,\n fntData,\n });\n } catch {\n // Gracefully continue on font resolution error\n }\n }\n\n return results;\n}\n","import type { IRNode, SlideIR, TextRun, ParagraphIR } from '../types/ir.js';\n\nexport interface HarvestOptions {\n selector?: string;\n viewportWidth: number;\n viewportHeight: number;\n aspect?: '16:9' | '4:3';\n}\n\n/**\n * In-browser evaluation function to harvest DOM tree and compile it to SlideIR.\n * Designed to execute inside Puppeteer's page.evaluate().\n */\nexport function extractDomToSlideIR(options: HarvestOptions): SlideIR {\n const DPI = 96;\n const is16_9 = options.aspect !== '4:3';\n const SLIDE_W = is16_9 ? 13.333333 : 10;\n const SLIDE_H = 7.5;\n\n const SCALE_X = SLIDE_W / (options.viewportWidth / DPI);\n const SCALE_Y = SLIDE_H / (options.viewportHeight / DPI);\n\n const nodes: IRNode[] = [];\n let nodeIdCounter = 1;\n\n function toHex(cssColor?: string): string | undefined {\n if (!cssColor) return undefined;\n const trimmed = cssColor.trim().toLowerCase();\n if (trimmed === 'transparent' || trimmed === 'rgba(0, 0, 0, 0)' || trimmed === 'none') {\n return undefined;\n }\n\n // Parse rgb(r, g, b) or rgba(r, g, b, a)\n const rgbMatch = trimmed.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+))?\\s*\\)/\n );\n if (rgbMatch) {\n const a = rgbMatch[4] !== undefined ? parseFloat(rgbMatch[4]) : 1;\n if (a <= 0) return undefined;\n const r = parseInt(rgbMatch[1], 10);\n const g = parseInt(rgbMatch[2], 10);\n const b = parseInt(rgbMatch[3], 10);\n return ((1 << 24) + (r << 16) + (g << 8) + b)\n .toString(16)\n .slice(1)\n .toUpperCase();\n }\n\n // Parse #hex\n if (trimmed.startsWith('#')) {\n const raw = trimmed.slice(1);\n if (raw.length === 3) {\n return raw.split('').map((c) => c + c).join('').toUpperCase();\n }\n if (raw.length >= 6) {\n return raw.slice(0, 6).toUpperCase();\n }\n }\n\n return undefined;\n }\n\n function cleanFontFamily(fontFamily: string): string {\n const first = fontFamily.split(',')[0].trim();\n return first.replace(/^['\"]+|['\"]+$/g, '') || 'Arial';\n }\n\n function isBold(weight: string): boolean {\n if (weight === 'bold' || weight === 'bolder') return true;\n const num = parseInt(weight, 10);\n return !isNaN(num) && num >= 600;\n }\n\n function isInlineFormattingTag(tagName: string): boolean {\n return ['SPAN', 'B', 'STRONG', 'I', 'EM', 'U', 'S', 'A', 'CODE', 'MARK', 'SMALL'].includes(\n tagName\n );\n }\n\n function isTextBlockTag(tagName: string): boolean {\n return ['P', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'LI', 'BLOCKQUOTE'].includes(\n tagName\n );\n }\n\n // Root selector\n const root =\n (options.selector ? document.querySelector(options.selector) : null) ||\n document.body;\n\n const rootStyle = window.getComputedStyle(root);\n const slideBg = toHex(rootStyle.backgroundColor);\n\n const rootRect = root.getBoundingClientRect();\n const rootW = rootRect.width > 0 ? rootRect.width : options.viewportWidth;\n const rootH = rootRect.height > 0 ? rootRect.height : options.viewportHeight;\n\n // Extract text runs from a text block\n function collectTextRuns(parentEl: HTMLElement): TextRun[] {\n const runs: TextRun[] = [];\n\n function traverseNodes(node: Node) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent;\n if (text && text.length > 0) {\n const parent = node.parentElement || parentEl;\n const style = window.getComputedStyle(parent);\n runs.push({\n content: text,\n fontFamily: cleanFontFamily(style.fontFamily),\n fontSize: (parseFloat(style.fontSize) * 72) / DPI,\n color: toHex(style.color) || '000000',\n bold: isBold(style.fontWeight),\n italic: style.fontStyle === 'italic' || style.fontStyle === 'oblique',\n underline: style.textDecorationLine?.includes('underline'),\n strikethrough: style.textDecorationLine?.includes('line-through'),\n });\n }\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n const style = window.getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden') return;\n Array.from(node.childNodes).forEach(traverseNodes);\n }\n }\n\n Array.from(parentEl.childNodes).forEach(traverseNodes);\n return runs;\n }\n\n function walk(el: HTMLElement) {\n if (el === root) {\n Array.from(el.children).forEach((child) => walk(child as HTMLElement));\n return;\n }\n\n const style = window.getComputedStyle(el);\n if (\n style.display === 'none' ||\n style.visibility === 'hidden' ||\n style.opacity === '0'\n ) {\n return;\n }\n\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n\n // Normalisasi koordinat ke Inches relatif terhadap root container\n const box = {\n x: ((rect.left - rootRect.left) / rootW) * SLIDE_W,\n y: ((rect.top - rootRect.top) / rootH) * SLIDE_H,\n w: (rect.width / rootW) * SLIDE_W,\n h: (rect.height / rootH) * SLIDE_H,\n };\n\n const hasBg =\n style.backgroundColor &&\n style.backgroundColor !== 'transparent' &&\n style.backgroundColor !== 'rgba(0, 0, 0, 0)';\n\n const hasBorder =\n parseFloat(style.borderWidth) > 0 && style.borderStyle !== 'none';\n\n // 1. Jika elemen memiliki visual background atau border -> Petakan sebagai Container\n if (hasBg || hasBorder) {\n nodes.push({\n id: nodeIdCounter++,\n name: `${el.tagName.toLowerCase()}-box`,\n type: 'container',\n box,\n shapeStyle: {\n fillColor: hasBg ? toHex(style.backgroundColor) : undefined,\n borderColor: hasBorder ? toHex(style.borderColor) : undefined,\n borderWidth: hasBorder ? (parseFloat(style.borderWidth) * 72) / DPI : 0,\n radius: parseFloat(style.borderRadius) || 0,\n },\n });\n }\n\n // 2. Jika elemen adalah Image <img>\n if (el.tagName === 'IMG') {\n const img = el as HTMLImageElement;\n if (img.src) {\n nodes.push({\n id: nodeIdCounter++,\n name: 'image',\n type: 'image',\n box,\n content: img.src,\n });\n return; // Leaf image\n }\n }\n\n // 3. Deteksi apakah elemen ini adalah Text Block\n const hasText = (el.textContent || '').trim().length > 0;\n const isExplicitTextBlock = isTextBlockTag(el.tagName);\n const hasOnlyInlineChildren =\n el.childElementCount > 0 &&\n Array.from(el.children).every((c) => isInlineFormattingTag(c.tagName));\n const isLeafText = el.childElementCount === 0 && hasText;\n\n if (hasText && (isExplicitTextBlock || isLeafText || hasOnlyInlineChildren)) {\n const runs = collectTextRuns(el);\n if (runs.length > 0) {\n const primaryRun = runs[0];\n const textAlign = (style.textAlign as any) || 'left';\n\n nodes.push({\n id: nodeIdCounter++,\n name: `${el.tagName.toLowerCase()}-text`,\n type: 'text',\n box,\n content: el.textContent?.trim() || '',\n textStyle: {\n fontFamily: primaryRun.fontFamily || 'Arial',\n fontSize: primaryRun.fontSize || 16,\n color: primaryRun.color || '000000',\n bold: primaryRun.bold || false,\n italic: primaryRun.italic || false,\n underline: primaryRun.underline || false,\n align: textAlign,\n },\n paragraphs: [\n {\n align: textAlign,\n runs,\n },\n ],\n });\n return; // Text block selesai diproses\n }\n }\n\n // Rekursif ke anak elemen\n Array.from(el.children).forEach((child) => walk(child as HTMLElement));\n }\n\n if (root) {\n walk(root as HTMLElement);\n }\n\n return {\n width: SLIDE_W,\n height: SLIDE_H,\n backgroundColor: slideBg,\n elements: nodes,\n };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport puppeteer, { type Browser, type Page } from 'puppeteer';\nimport type { SlideIR } from '../types/ir.js';\nimport type { ConvertOptions } from '../types/options.js';\nimport { extractDomToSlideIR, type HarvestOptions } from './traverser.js';\nimport { resolveAndEmbedFonts } from '../normalizer/fonts.js';\n\nexport async function harvestHtmlToIR(\n htmlOrUrl: string,\n options: ConvertOptions = {}\n): Promise<SlideIR | SlideIR[]> {\n const is16_9 = options.aspect !== '4:3';\n const defaultViewport = is16_9\n ? { width: 1920, height: 1080, deviceScaleFactor: 1 }\n : { width: 1024, height: 768, deviceScaleFactor: 1 };\n\n const viewport = {\n ...defaultViewport,\n ...(options.viewport || {}),\n };\n\n let effectiveBasePath = options.basePath;\n let contentToRender = htmlOrUrl;\n\n try {\n if (\n !htmlOrUrl.startsWith('http://') &&\n !htmlOrUrl.startsWith('https://') &&\n !htmlOrUrl.startsWith('file://') &&\n !htmlOrUrl.trim().startsWith('<') &&\n fs.existsSync(htmlOrUrl) &&\n fs.statSync(htmlOrUrl).isFile()\n ) {\n if (!effectiveBasePath) {\n effectiveBasePath = path.dirname(path.resolve(htmlOrUrl));\n }\n contentToRender = await fs.promises.readFile(htmlOrUrl, 'utf-8');\n }\n } catch {\n // Proceed with original input\n }\n\n let browser: Browser | null = null;\n let shouldCloseBrowser = false;\n\n try {\n if (options.browser) {\n browser = options.browser;\n } else if (options.browserWSEndpoint) {\n browser = await puppeteer.connect({\n browserWSEndpoint: options.browserWSEndpoint,\n });\n shouldCloseBrowser = true;\n } else {\n browser = await puppeteer.launch({\n headless: true,\n args: [\n '--no-sandbox',\n '--disable-setuid-sandbox',\n '--disable-dev-shm-usage',\n '--disable-gpu',\n ],\n });\n shouldCloseBrowser = true;\n }\n\n const page: Page = await browser.newPage();\n await page.setViewport(viewport);\n\n const isUrl =\n contentToRender.startsWith('http://') ||\n contentToRender.startsWith('https://') ||\n contentToRender.startsWith('file://');\n\n const waitUntil = options.waitUntil || 'load';\n const timeout = options.timeout || 30000;\n\n if (isUrl) {\n await page.goto(contentToRender, { waitUntil: waitUntil as any, timeout });\n } else {\n await page.setContent(contentToRender, { waitUntil: waitUntil as any, timeout });\n }\n\n // Ensure esbuild helper __name is defined in browser context\n await page.evaluate(() => {\n (window as any).__name = (t: any) => t;\n (globalThis as any).__name = (t: any) => t;\n });\n\n // Check if multi-slide mode is active or auto-detectable\n const slideSelector = options.slideSelector;\n let slideElementsCount = 0;\n\n if (slideSelector) {\n slideElementsCount = await page.evaluate((sel) => {\n return document.querySelectorAll(sel).length;\n }, slideSelector);\n }\n\n // Discover @font-face rules from page stylesheets\n let discoveredFonts: Array<{ typeface: string; src: string }> = [];\n if (options.autoEmbedFonts !== false) {\n try {\n discoveredFonts = await page.evaluate(() => {\n const results: Array<{ typeface: string; src: string }> = [];\n for (const sheet of Array.from(document.styleSheets)) {\n try {\n for (const rule of Array.from(sheet.cssRules || [])) {\n if (rule instanceof CSSFontFaceRule) {\n const family = rule.style.fontFamily.replace(/^['\"]+|['\"]+$/g, '');\n const styleAny = rule.style as any;\n const srcVal = styleAny.src || rule.style.getPropertyValue('src') || '';\n const srcMatch = srcVal.match(/url\\((['\"]?)(.*?)\\1\\)/);\n if (srcMatch && srcMatch[2]) {\n results.push({ typeface: family, src: srcMatch[2] });\n }\n }\n }\n } catch {\n // Ignore CORS errors on external sheets\n }\n }\n return results;\n });\n } catch {\n // Ignore evaluation errors\n }\n }\n\n const embeddedFonts = await resolveAndEmbedFonts({\n html: isUrl ? undefined : contentToRender,\n userFonts: options.fonts,\n autoEmbedFonts: options.autoEmbedFonts,\n basePath: effectiveBasePath,\n discoveredFonts,\n });\n\n if (slideSelector && slideElementsCount > 1) {\n const slides: SlideIR[] = [];\n\n for (let i = 0; i < slideElementsCount; i++) {\n // Activate slide i and hide others\n await page.evaluate(\n ({ sel, activeIdx }: { sel: string; activeIdx: number }) => {\n const allSlides = document.querySelectorAll(sel);\n allSlides.forEach((el, idx) => {\n const htmlEl = el as HTMLElement;\n if (idx === activeIdx) {\n htmlEl.classList.add('active');\n htmlEl.style.display = 'flex';\n htmlEl.style.visibility = 'visible';\n htmlEl.setAttribute('data-current-harvest', 'true');\n } else {\n htmlEl.classList.remove('active');\n htmlEl.style.display = 'none';\n htmlEl.removeAttribute('data-current-harvest');\n }\n });\n },\n { sel: slideSelector, activeIdx: i }\n );\n\n const harvestOptions: HarvestOptions = {\n selector: `${slideSelector}[data-current-harvest=\"true\"]`,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n aspect: options.aspect || '16:9',\n };\n\n const slideIR = await page.evaluate(extractDomToSlideIR, harvestOptions);\n slides.push(slideIR);\n }\n\n if (slides.length > 0) {\n slides[0].fonts = embeddedFonts;\n }\n\n await page.close();\n return slides;\n }\n\n // Single-slide mode\n const harvestOptions: HarvestOptions = {\n selector: options.selector || 'body',\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n aspect: options.aspect || '16:9',\n };\n\n const singleSlideIR = await page.evaluate(extractDomToSlideIR, harvestOptions);\n singleSlideIR.fonts = embeddedFonts;\n\n await page.close();\n return singleSlideIR;\n } finally {\n if (shouldCloseBrowser && browser) {\n await browser.close().catch(() => {});\n }\n }\n}\n","export const ROOT_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"ppt/presentation.xml\"/>\n</Relationships>`;\n\nexport const SLIDE_LAYOUT_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sldLayout xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\" type=\"blank\" preserve=\"1\">\n <p:cSld name=\"Blank\">\n <p:spTree>\n <p:nvGrpSpPr>\n <p:cNvPr id=\"1\" name=\"\"/>\n <p:cNvGrpSpPr/>\n <p:nvPr/>\n </p:nvGrpSpPr>\n <p:grpSpPr>\n <a:xfrm>\n <a:off x=\"0\" y=\"0\"/>\n <a:ext cx=\"0\" cy=\"0\"/>\n <a:chOff x=\"0\" y=\"0\"/>\n <a:chExt cx=\"0\" cy=\"0\"/>\n </a:xfrm>\n </p:grpSpPr>\n </p:spTree>\n </p:cSld>\n <p:clrMapOvr>\n <a:masterClrMapping/>\n </p:clrMapOvr>\n</p:sldLayout>`;\n\nexport const SLIDE_LAYOUT_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster\" Target=\"../slideMasters/slideMaster1.xml\"/>\n</Relationships>`;\n\nexport const SLIDE_MASTER_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sldMaster xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\n <p:cSld name=\"Master\">\n <p:spTree>\n <p:nvGrpSpPr>\n <p:cNvPr id=\"1\" name=\"\"/>\n <p:cNvGrpSpPr/>\n <p:nvPr/>\n </p:nvGrpSpPr>\n <p:grpSpPr>\n <a:xfrm>\n <a:off x=\"0\" y=\"0\"/>\n <a:ext cx=\"0\" cy=\"0\"/>\n <a:chOff x=\"0\" y=\"0\"/>\n <a:chExt cx=\"0\" cy=\"0\"/>\n </a:xfrm>\n </p:grpSpPr>\n </p:spTree>\n </p:cSld>\n <p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/>\n <p:sldLayoutIdLst>\n <p:sldLayoutId id=\"2147483649\" r:id=\"rId1\"/>\n </p:sldLayoutIdLst>\n <p:txStyles>\n <p:titleStyle/>\n <p:bodyStyle/>\n <p:otherStyle/>\n </p:txStyles>\n</p:sldMaster>`;\n\nexport const SLIDE_MASTER_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"../theme/theme1.xml\"/>\n</Relationships>`;\n\nexport const THEME_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\"><a:dk1><a:srgbClr val=\"000000\"/></a:dk1><a:lt1><a:srgbClr val=\"FFFFFF\"/></a:lt1><a:dk2><a:srgbClr val=\"0E2841\"/></a:dk2><a:lt2><a:srgbClr val=\"E8E8E8\"/></a:lt2><a:accent1><a:srgbClr val=\"156082\"/></a:accent1><a:accent2><a:srgbClr val=\"E97132\"/></a:accent2><a:accent3><a:srgbClr val=\"196B24\"/></a:accent3><a:accent4><a:srgbClr val=\"0F9ED5\"/></a:accent4><a:accent5><a:srgbClr val=\"A02B93\"/></a:accent5><a:accent6><a:srgbClr val=\"4EA72E\"/></a:accent6><a:hlink><a:srgbClr val=\"467886\"/></a:hlink><a:folHlink><a:srgbClr val=\"96607D\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\"><a:majorFont><a:latin typeface=\"Calibri Light\"/><a:ea typeface=\"Calibri Light\"/><a:cs typeface=\"Calibri Light\"/></a:majorFont><a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"Calibri\"/><a:cs typeface=\"Calibri\"/></a:minorFont></a:fontScheme><a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"dk1\"/></a:solidFill><a:solidFill><a:schemeClr val=\"accent1\"/></a:solidFill></a:fillStyleLst><a:lnStyleLst><a:ln w=\"12700\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"19050\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln><a:ln w=\"25400\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:prstDash val=\"solid\"/></a:ln></a:lnStyleLst><a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\"><a:srgbClr val=\"000000\"><a:alpha val=\"16000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"19050\" dist=\"9525\" dir=\"5400000\"><a:srgbClr val=\"000000\"><a:alpha val=\"6000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"28575\" dist=\"9525\" dir=\"5400000\"><a:srgbClr val=\"000000\"><a:alpha val=\"8000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"57150\" dist=\"19050\" dir=\"5400000\"><a:srgbClr val=\"000000\"><a:alpha val=\"10000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"114300\" dist=\"38100\" dir=\"5400000\"><a:srgbClr val=\"000000\"><a:alpha val=\"12000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"171450\" dist=\"57150\" dir=\"5400000\"><a:srgbClr val=\"000000\"><a:alpha val=\"16000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle><a:effectStyle><a:effectLst><a:outerShdw blurRad=\"266700\" dist=\"95250\" dir=\"5400000\"><a:srgbClr val=\"000000\"><a:alpha val=\"24000\"/></a:srgbClr></a:outerShdw></a:effectLst></a:effectStyle></a:effectStyleLst><a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/><a:satMod val=\"170000\"/></a:schemeClr></a:solidFill><a:gradFill><a:gsLst><a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:tint val=\"93000\"/><a:shade val=\"98000\"/><a:lumMod val=\"102000\"/><a:satMod val=\"150000\"/></a:schemeClr></a:gs><a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:tint val=\"98000\"/><a:shade val=\"90000\"/><a:lumMod val=\"103000\"/><a:satMod val=\"130000\"/></a:schemeClr></a:gs><a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:shade val=\"63000\"/><a:satMod val=\"120000\"/></a:schemeClr></a:gs></a:gsLst><a:lin ang=\"5400000\" scaled=\"0\"/></a:gradFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements><a:objectDefaults/><a:extraClrSchemeLst/></a:theme>`;\n\nexport const SLIDE_RELS_XML = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/>\n</Relationships>`;\n\nimport type { EmbeddedFontIR } from '../types/ir.js';\n\nfunction escapeXml(unsafe: string): string {\n return unsafe\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nexport function createPresentationXml(\n widthEmu: number,\n heightEmu: number,\n is16_9: boolean = true,\n slideCount: number = 1,\n fonts?: EmbeddedFontIR[]\n): string {\n const typeAttr = is16_9 ? 'screen16x9' : 'screen4x3';\n const sldIdLst = Array.from({ length: slideCount }, (_, idx) => {\n return ` <p:sldId id=\"${256 + idx}\" r:id=\"rId${idx + 1}\"/>`;\n }).join('\\n');\n\n const hasFonts = fonts && fonts.length > 0;\n const embedAttr = hasFonts ? ' embedTrueTypeFonts=\"true\"' : '';\n\n let embeddedFontLstXml = '';\n if (hasFonts) {\n const fontItems = fonts\n .map(\n (f, idx) => ` <p:embeddedFont>\n <p:font typeface=\"${escapeXml(f.typeface)}\"/>\n <p:regular r:id=\"rIdFont${idx + 1}\"/>\n </p:embeddedFont>`\n )\n .join('\\n');\n\n embeddedFontLstXml = `\\n <p:embeddedFontLst>\\n${fontItems}\\n </p:embeddedFontLst>`;\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:presentation${embedAttr} xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"\n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"\n xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\n <p:sldMasterIdLst><p:sldMasterId id=\"2147483648\" r:id=\"rIdMaster1\"/></p:sldMasterIdLst>\n <p:sldIdLst>\n${sldIdLst}\n </p:sldIdLst>\n <p:sldSz cx=\"${widthEmu}\" cy=\"${heightEmu}\" type=\"${typeAttr}\"/>\n <p:notesSz cx=\"6858000\" cy=\"9144000\"/>${embeddedFontLstXml}\n</p:presentation>`;\n}\n\nexport function createPresentationRelsXml(\n slideCount: number = 1,\n fonts?: EmbeddedFontIR[]\n): string {\n const slideRels = Array.from({ length: slideCount }, (_, idx) => {\n return ` <Relationship Id=\"rId${idx + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide\" Target=\"slides/slide${idx + 1}.xml\"/>`;\n }).join('\\n');\n\n let fontRels = '';\n if (fonts && fonts.length > 0) {\n fontRels =\n '\\n' +\n fonts\n .map(\n (_, idx) =>\n ` <Relationship Id=\"rIdFont${idx + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/font\" Target=\"fonts/font${idx + 1}.fntdata\"/>`\n )\n .join('\\n');\n }\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rIdMaster1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideMaster\" Target=\"slideMasters/slideMaster1.xml\"/>\n${slideRels}${fontRels}\n</Relationships>`;\n}\n\nexport function createContentTypesXml(\n slideCount: number = 1,\n hasFonts: boolean = false\n): string {\n const slideOverrides = Array.from({ length: slideCount }, (_, idx) => {\n return ` <Override PartName=\"/ppt/slides/slide${idx + 1}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\"/>`;\n }).join('\\n');\n\n const fontExtension = hasFonts\n ? ' <Default Extension=\"fntdata\" ContentType=\"application/x-fontdata\"/>\\n'\n : '';\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n${fontExtension} <Override PartName=\"/ppt/presentation.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\"/>\n <Override PartName=\"/ppt/slideMasters/slideMaster1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml\"/>\n <Override PartName=\"/ppt/slideLayouts/slideLayout1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml\"/>\n <Override PartName=\"/ppt/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>\n${slideOverrides}\n</Types>`;\n}\n\n","import type { IRNode } from '../types/ir.js';\nimport { inchesToEmu } from '../normalizer/units.js';\nimport { UNITS } from '../types/ir.js';\n\nfunction escapeXml(unsafe: string): string {\n return unsafe\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Compiles a container IRNode into OpenXML <p:sp> element.\n */\nexport function compileContainerShape(node: IRNode, id: number): string {\n const x = inchesToEmu(node.box.x);\n const y = inchesToEmu(node.box.y);\n const cx = inchesToEmu(node.box.w);\n const cy = inchesToEmu(node.box.h);\n const name = escapeXml(node.name || `Box ${id}`);\n\n const shapeStyle = node.shapeStyle || {};\n\n // Geometry: check border-radius\n let geometry = 'rect';\n let avLst = '<a:avLst/>';\n\n if (shapeStyle.radius && shapeStyle.radius > 0) {\n geometry = 'roundRect';\n const minDimensionInches = Math.min(node.box.w, node.box.h);\n if (minDimensionInches > 0) {\n const radiusInches = shapeStyle.radius / UNITS.DPI;\n const maxRadiusInches = minDimensionInches / 2;\n const ratio = Math.min(1, Math.max(0, radiusInches / maxRadiusInches));\n const adj = Math.round(ratio * 50000);\n avLst = `<a:avLst><a:gd name=\"adj\" fmla=\"val ${adj}\"/></a:avLst>`;\n }\n }\n\n // Fill\n let fillXml = '<a:noFill/>';\n if (shapeStyle.fillColor) {\n const opacityVal =\n shapeStyle.fillOpacity !== undefined && shapeStyle.fillOpacity < 1\n ? `<a:alpha val=\"${Math.round(shapeStyle.fillOpacity * 100000)}\"/>`\n : '';\n fillXml = `<a:solidFill><a:srgbClr val=\"${shapeStyle.fillColor}\">${opacityVal}</a:srgbClr></a:solidFill>`;\n }\n\n // Border (Line)\n let borderXml = '';\n if (shapeStyle.borderColor && shapeStyle.borderWidth && shapeStyle.borderWidth > 0) {\n const borderEmu = Math.round(shapeStyle.borderWidth * 12700); // 1 pt = 12,700 EMU\n borderXml = `<a:ln w=\"${borderEmu}\"><a:solidFill><a:srgbClr val=\"${shapeStyle.borderColor}\"/></a:solidFill></a:ln>`;\n }\n\n return `\n<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${id}\" name=\"${name}\"/>\n <p:cNvSpPr/>\n <p:nvPr/>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm>\n <a:off x=\"${x}\" y=\"${y}\"/>\n <a:ext cx=\"${cx}\" cy=\"${cy}\"/>\n </a:xfrm>\n <a:prstGeom prst=\"${geometry}\">\n ${avLst}\n </a:prstGeom>\n ${fillXml}\n ${borderXml}\n </p:spPr>\n</p:sp>`.trim();\n}\n","import type { IRNode, ParagraphIR, TextRun } from '../types/ir.js';\nimport { inchesToEmu, ptToHundredthPt } from '../normalizer/units.js';\n\nfunction escapeXml(unsafe: string): string {\n return unsafe\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction mapAlign(align?: string): string {\n switch (align) {\n case 'center':\n return 'ctr';\n case 'right':\n return 'r';\n case 'justify':\n return 'just';\n case 'left':\n default:\n return 'l';\n }\n}\n\nfunction compileRun(run: TextRun, fallbackFont: string, fallbackColor: string, fallbackSize: number): string {\n const font = escapeXml(run.fontFamily || fallbackFont);\n const color = run.color || fallbackColor;\n const sz = ptToHundredthPt(run.fontSize || fallbackSize);\n const b = run.bold ? ' b=\"1\"' : ' b=\"0\"';\n const i = run.italic ? ' i=\"1\"' : ' i=\"0\"';\n const u = run.underline ? ' u=\"sng\"' : '';\n const strike = run.strikethrough ? ' strike=\"sngStrike\"' : '';\n const text = escapeXml(run.content);\n\n return `\n <a:r>\n <a:rPr${b}${i}${u}${strike} sz=\"${sz}\">\n <a:solidFill>\n <a:srgbClr val=\"${color}\"/>\n </a:solidFill>\n <a:latin typeface=\"${font}\"/>\n </a:rPr>\n <a:t>${text}</a:t>\n </a:r>`.trim();\n}\n\nfunction compileParagraph(\n para: ParagraphIR,\n fallbackFont: string,\n fallbackColor: string,\n fallbackSize: number\n): string {\n const algn = mapAlign(para.align);\n const runsXml = para.runs\n .map((run) => compileRun(run, fallbackFont, fallbackColor, fallbackSize))\n .join('\\n');\n\n return `\n <a:p>\n <a:pPr algn=\"${algn}\"/>\n ${runsXml}\n </a:p>`.trim();\n}\n\n/**\n * Compiles a text IRNode into an OpenXML <p:sp> textbox element with zero internal margins.\n */\nexport function compileTextShape(node: IRNode, id: number): string {\n const x = inchesToEmu(node.box.x);\n const y = inchesToEmu(node.box.y);\n const cx = inchesToEmu(node.box.w);\n const cy = inchesToEmu(node.box.h);\n const name = escapeXml(node.name || `Text ${id}`);\n\n const defaultFont = node.textStyle?.fontFamily || 'Arial';\n const defaultColor = node.textStyle?.color || '000000';\n const defaultSize = node.textStyle?.fontSize || 16;\n const defaultAlign = node.textStyle?.align || 'left';\n\n let paragraphsXml = '';\n\n if (node.paragraphs && node.paragraphs.length > 0) {\n paragraphsXml = node.paragraphs\n .map((p) => compileParagraph(p, defaultFont, defaultColor, defaultSize))\n .join('\\n');\n } else {\n // Fallback if only flat content / textStyle is provided\n const singleRun: TextRun = {\n content: node.content || '',\n fontFamily: defaultFont,\n fontSize: defaultSize,\n color: defaultColor,\n bold: node.textStyle?.bold,\n italic: node.textStyle?.italic,\n underline: node.textStyle?.underline,\n };\n paragraphsXml = compileParagraph(\n { align: defaultAlign, runs: [singleRun] },\n defaultFont,\n defaultColor,\n defaultSize\n );\n }\n\n return `\n<p:sp>\n <p:nvSpPr>\n <p:cNvPr id=\"${id}\" name=\"${name}\"/>\n <p:cNvSpPr txBox=\"1\"/>\n <p:nvPr/>\n </p:nvSpPr>\n <p:spPr>\n <a:xfrm>\n <a:off x=\"${x}\" y=\"${y}\"/>\n <a:ext cx=\"${cx}\" cy=\"${cy}\"/>\n </a:xfrm>\n <a:prstGeom prst=\"rect\">\n <a:avLst/>\n </a:prstGeom>\n <a:noFill/>\n </p:spPr>\n <p:txBody>\n <a:bodyPr wrap=\"square\" rtlCol=\"0\" lIns=\"0\" tIns=\"0\" rIns=\"0\" bIns=\"0\">\n <a:spAutoFit/>\n </a:bodyPr>\n <a:lstStyle/>\n ${paragraphsXml}\n </p:txBody>\n</p:sp>`.trim();\n}\n","import JSZip from 'jszip';\nimport type { SlideIR, PresentationIR, EmbeddedFontIR } from '../types/ir.js';\nimport { inchesToEmu } from '../normalizer/units.js';\nimport {\n ROOT_RELS_XML,\n SLIDE_LAYOUT_XML,\n SLIDE_LAYOUT_RELS_XML,\n SLIDE_MASTER_XML,\n SLIDE_MASTER_RELS_XML,\n THEME_XML,\n SLIDE_RELS_XML,\n createPresentationXml,\n createPresentationRelsXml,\n createContentTypesXml,\n} from './templates.js';\nimport { compileContainerShape } from './shapes.js';\nimport { compileTextShape } from './texts.js';\n\nexport interface CompileOptions {\n fonts?: EmbeddedFontIR[];\n}\n\n/**\n * Compiles a single SlideIR, an array of SlideIRs, or a PresentationIR into a valid PowerPoint (.pptx) file Buffer using OpenXML and JSZip.\n */\nexport async function compileSlideToPptx(\n slideOrSlidesOrPres: SlideIR | SlideIR[] | PresentationIR,\n options?: CompileOptions\n): Promise<Buffer> {\n let slides: SlideIR[];\n let irFonts: EmbeddedFontIR[] = [];\n\n if ('slides' in slideOrSlidesOrPres) {\n slides = slideOrSlidesOrPres.slides;\n irFonts = slideOrSlidesOrPres.fonts || [];\n } else if (Array.isArray(slideOrSlidesOrPres)) {\n slides = slideOrSlidesOrPres;\n irFonts = slides.flatMap((s) => s.fonts || []);\n } else {\n slides = [slideOrSlidesOrPres];\n irFonts = slideOrSlidesOrPres.fonts || [];\n }\n\n if (slides.length === 0) {\n throw new Error('Cannot compile empty presentation without slides.');\n }\n\n // Deduplicate embedded fonts by typeface\n const fontMap = new Map<string, EmbeddedFontIR>();\n for (const f of [...irFonts, ...(options?.fonts || [])]) {\n if (f && f.typeface && f.fntData) {\n fontMap.set(f.typeface.toLowerCase(), f);\n }\n }\n const fonts = Array.from(fontMap.values());\n const hasFonts = fonts.length > 0;\n\n const primarySlide = slides[0];\n const widthEmu = inchesToEmu(primarySlide.width);\n const heightEmu = inchesToEmu(primarySlide.height);\n const is16_9 = Math.abs(primarySlide.width / primarySlide.height - 16 / 9) < 0.1;\n const slideCount = slides.length;\n\n const zip = new JSZip();\n\n // 1. [Content_Types].xml\n zip.file('[Content_Types].xml', createContentTypesXml(slideCount, hasFonts));\n\n // 2. _rels/.rels\n zip.folder('_rels')?.file('.rels', ROOT_RELS_XML);\n\n // 3. ppt/ presentation, theme, master, and layout\n const pptFolder = zip.folder('ppt');\n pptFolder?.file(\n 'presentation.xml',\n createPresentationXml(widthEmu, heightEmu, is16_9, slideCount, fonts)\n );\n pptFolder\n ?.folder('_rels')\n ?.file('presentation.xml.rels', createPresentationRelsXml(slideCount, fonts));\n\n // Embedded fonts\n if (hasFonts) {\n const fontsFolder = pptFolder?.folder('fonts');\n fonts.forEach((font, idx) => {\n fontsFolder?.file(`font${idx + 1}.fntdata`, font.fntData);\n });\n }\n\n // Theme\n pptFolder?.folder('theme')?.file('theme1.xml', THEME_XML);\n\n // Slide Master\n const masterFolder = pptFolder?.folder('slideMasters');\n masterFolder?.file('slideMaster1.xml', SLIDE_MASTER_XML);\n masterFolder?.folder('_rels')?.file('slideMaster1.xml.rels', SLIDE_MASTER_RELS_XML);\n\n // Slide Layout\n const layoutFolder = pptFolder?.folder('slideLayouts');\n layoutFolder?.file('slideLayout1.xml', SLIDE_LAYOUT_XML);\n layoutFolder?.folder('_rels')?.file('slideLayout1.xml.rels', SLIDE_LAYOUT_RELS_XML);\n\n // 4. Slides\n const slidesFolder = pptFolder?.folder('slides');\n const slidesRelsFolder = slidesFolder?.folder('_rels');\n\n slides.forEach((slide, idx) => {\n let shapeIdCounter = 2;\n const shapesXmlArray: string[] = [];\n\n for (const node of slide.elements) {\n if (node.type === 'container') {\n shapesXmlArray.push(compileContainerShape(node, shapeIdCounter++));\n } else if (node.type === 'text') {\n shapesXmlArray.push(compileTextShape(node, shapeIdCounter++));\n }\n }\n\n const shapesXml = shapesXmlArray.join('\\n');\n\n let bgXml = '';\n if (slide.backgroundColor) {\n bgXml = `\n <p:bg>\n <p:bgPr>\n <a:solidFill>\n <a:srgbClr val=\"${slide.backgroundColor}\"/>\n </a:solidFill>\n <a:effectLst/>\n </p:bgPr>\n </p:bg>`;\n }\n\n const slideXml = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<p:sld xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" \n xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" \n xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">\n <p:cSld>${bgXml}\n <p:spTree>\n <p:nvGrpSpPr>\n <p:cNvPr id=\"1\" name=\"\"/>\n <p:cNvGrpSpPr/>\n <p:nvPr/>\n </p:nvGrpSpPr>\n <p:grpSpPr>\n <a:xfrm>\n <a:off x=\"0\" y=\"0\"/>\n <a:ext cx=\"0\" cy=\"0\"/>\n <a:chOff x=\"0\" y=\"0\"/>\n <a:chExt cx=\"0\" cy=\"0\"/>\n </a:xfrm>\n </p:grpSpPr>\n ${shapesXml}\n </p:spTree>\n </p:cSld>\n <p:clrMapOvr>\n <a:masterClrMapping/>\n </p:clrMapOvr>\n</p:sld>`;\n\n slidesFolder?.file(`slide${idx + 1}.xml`, slideXml);\n slidesRelsFolder?.file(`slide${idx + 1}.xml.rels`, SLIDE_RELS_XML);\n });\n\n // 5. Generate PPTX buffer\n const buffer = await zip.generateAsync({\n type: 'nodebuffer',\n compression: 'DEFLATE',\n compressionOptions: { level: 6 },\n });\n\n return buffer;\n}\n","export * from './types/ir.js';\nexport * from './types/options.js';\nexport * from './normalizer/units.js';\nexport * from './normalizer/styles.js';\nexport * from './normalizer/fonts.js';\nexport { harvestHtmlToIR } from './harvester/browser.js';\nexport { extractDomToSlideIR } from './harvester/traverser.js';\nexport { compileSlideToPptx } from './compiler/packager.js';\nexport { compileContainerShape } from './compiler/shapes.js';\nexport { compileTextShape } from './compiler/texts.js';\n\nimport type { SlideIR } from './types/ir.js';\nimport type { ConvertOptions } from './types/options.js';\nimport { harvestHtmlToIR } from './harvester/browser.js';\nimport { compileSlideToPptx } from './compiler/packager.js';\n\n/**\n * Main conversion API: Converts an HTML string or URL into a native, editable PowerPoint (.pptx) buffer.\n *\n * @param html - Raw HTML string or valid http(s) URL.\n * @param options - Configuration options for viewport, aspect ratio, or browser instance.\n * @returns Promise resolving to a Node.js Buffer representing the .pptx file.\n */\nexport async function convertHtmlToPptx(\n html: string,\n options?: ConvertOptions\n): Promise<Buffer> {\n if (!html || typeof html !== 'string' || html.trim().length === 0) {\n throw new Error('Input HTML string or URL cannot be empty.');\n }\n\n // 1. Harvest DOM to SlideIR via Headless Chromium\n const slideIR = await harvestHtmlToIR(html, options);\n\n // 2. Compile SlideIR to OpenXML DrawingML presentation archive\n const pptxBuffer = await compileSlideToPptx(slideIR);\n\n return pptxBuffer;\n}\n\n/**\n * Helper to construct a blank SlideIR with standard 16:9 or 4:3 dimensions.\n */\nexport function createSlideIR(aspect: '16:9' | '4:3' = '16:9'): SlideIR {\n const is16_9 = aspect === '16:9';\n return {\n width: is16_9 ? 13.333333 : 10,\n height: 7.5,\n elements: [],\n };\n}\n"]}
|