json2pptx 0.5.1 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/element.ts","../src/resolveImageData.ts","../src/renderers/shared.ts","../src/htmlParser/tags.ts","../src/htmlParser/lexer.ts","../src/htmlParser/parser.ts","../src/htmlParser/format.ts","../src/htmlParser/index.ts","../src/renderers/constants.ts","../src/renderers/fill-patch.ts","../src/renderers/background.ts","../src/renderers/layout.ts","../src/svgPathParser.ts","../src/renderers/points.ts","../src/renderers/utils.ts","../src/renderers/elements.ts"],"sourcesContent":["import PptxGenJS from \"pptxgenjs\";\nimport JSZip from \"jszip\";\nimport { parseDocument } from \"json2pptx-schema\";\n\nimport type { Presentation } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport {\n applyBackgroundFillPatch,\n applyShapeFillPatch,\n fillRequiresXmlPatch\n} from \"./renderers/fill-patch\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type FillPatch } from \"./renderers/types\";\n\ntype PresentationDocument = ReturnType<typeof parseDocument>;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\n\nfunction parseDataUrlImage(\n dataUrl: string\n): { mime: string; data: string; ext: string } | null {\n const match = dataUrl.match(/^data:(image\\/[^;]+);base64,(.+)$/);\n if (!match) return null;\n const mime = match[1];\n const data = match[2];\n const extMap: Record<string, string> = {\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"image/svg+xml\": \"svg\",\n \"image/webp\": \"webp\",\n \"image/bmp\": \"bmp\"\n };\n return { mime, data, ext: extMap[mime] ?? \"png\" };\n}\n\nexport async function createPPTX(\n template: Presentation\n): Promise<{ blob: Blob; fileName: string }> {\n const parsedTemplate: PresentationDocument = parseDocument(template);\n const renderTemplate = parsedTemplate as unknown as Presentation;\n\n const pptx = new PptxGenJS();\n const fillPatches: FillPatch[] = [];\n\n const width = parsedTemplate.width;\n const height = parsedTemplate.height;\n const ratioPx2Inch = 96 * (width / 960);\n const ratioPx2Pt = (96 / 72) * (width / 960);\n const textPadding = 10 / ratioPx2Pt;\n\n applyPptxLayout(pptx, width, height);\n\n for (const [slideIndex, slideJson] of (renderTemplate.slides ?? []).entries()) {\n const slide = pptx.addSlide();\n applySlideBackground(slide, slideJson, renderTemplate.theme);\n if (slideJson.background && fillRequiresXmlPatch(slideJson.background)) {\n fillPatches.push({\n kind: \"background\",\n slideIndex,\n fill: slideJson.background\n });\n }\n\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(\n slide,\n element,\n renderTemplate,\n slideIndex,\n elementIndex,\n ratioPx2Pt,\n ratioPx2Inch,\n textPadding,\n fillPatches\n );\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n fillPatches\n );\n addLineElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n }\n }\n\n const fileName = `${sanitizeFileName(parsedTemplate.title || \"presentation\")}.pptx`;\n const pptxBuffer = (await pptx.write({\n outputType: \"arraybuffer\",\n compression: true\n })) as ArrayBuffer;\n\n if (!fillPatches.length) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n const mediaFiles = Object.keys(zip.files).filter((name) => name.startsWith(\"ppt/media/\"));\n let maxImageIndex = 0;\n for (const name of mediaFiles) {\n const match = name.match(/ppt\\/media\\/image(\\d+)/);\n if (match) {\n const index = Number.parseInt(match[1], 10);\n if (Number.isFinite(index)) maxImageIndex = Math.max(maxImageIndex, index);\n }\n }\n\n const slideCache = new Map<number, string>();\n const relsCache = new Map<number, string>();\n\n for (const patch of fillPatches) {\n const slideNumber = patch.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\n let relId: string | undefined;\n\n if (patch.fill.type === \"image\" && patch.fill.src) {\n const dataUrl = await resolveImageData(patch.fill.src);\n const parsed = parseDataUrlImage(dataUrl);\n if (!parsed) continue;\n\n maxImageIndex += 1;\n const imageName = `image${maxImageIndex}.${parsed.ext}`;\n zip.file(`ppt/media/${imageName}`, parsed.data, { base64: true });\n\n const relsXml =\n relsCache.get(slideNumber) ??\n (zip.file(relsPath)\n ? await zip.file(relsPath)!.async(\"string\")\n : `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>`);\n\n let maxRelId = 0;\n relsXml.replace(/Id=\"rId(\\d+)\"/g, (_, id) => {\n const value = Number.parseInt(id, 10);\n if (Number.isFinite(value)) maxRelId = Math.max(maxRelId, value);\n return \"\";\n });\n relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n relsCache.set(slideNumber, relsXml.replace(\"</Relationships>\", `${relEntry}</Relationships>`));\n }\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n\n if (!slideXml) {\n continue;\n }\n\n const nextSlideXml =\n patch.kind === \"background\"\n ? applyBackgroundFillPatch(slideXml, patch.fill, relId)\n : applyShapeFillPatch(slideXml, patch.objectName, patch.fill, relId);\n\n slideCache.set(slideNumber, nextSlideXml);\n }\n\n for (const [slideNumber, xml] of slideCache.entries()) {\n zip.file(`ppt/slides/slide${slideNumber}.xml`, xml);\n }\n for (const [slideNumber, xml] of relsCache.entries()) {\n zip.file(`ppt/slides/_rels/slide${slideNumber}.xml.rels`, xml);\n }\n\n const blob = await zip.generateAsync({ type: \"blob\" });\n return { blob, fileName };\n}\n\n// Backwards compatibility alias\nexport const buildPptxBlob = createPPTX;\n\nexport { getElementRange, getLineElementPath };\nexport { resolveImageData };\nexport type {\n BaseElement,\n Deck,\n DeckTheme,\n Presentation,\n PresentationData,\n PresentationTheme,\n ElementClip,\n ElementFilters,\n ElementOutline,\n ElementShadow,\n ImageElement,\n LineElement,\n ShapeElement,\n Slide,\n SlideBackground,\n SlideElement,\n TextContent,\n TextElement\n} from \"./types/ppt\";\n","import type { LineElement, SlideElement } from './types/ppt'\n\nexport const getElementRange = (element: SlideElement) => {\n let minX = 0\n let maxX = 0\n let minY = 0\n let maxY = 0\n\n if (element.type === 'line' && element.start && element.end) {\n minX = element.left ?? 0\n maxX = (element.left ?? 0) + Math.max(element.start[0], element.end[0])\n minY = element.top ?? 0\n maxY = (element.top ?? 0) + Math.max(element.start[1], element.end[1])\n } else if (element.left !== undefined && element.top !== undefined) {\n minX = element.left\n minY = element.top\n maxX = element.left + (element.width ?? 0)\n maxY = element.top + (element.height ?? 0)\n }\n\n return { minX, maxX, minY, maxY }\n}\n\nconst isLineElement = (element: SlideElement): element is LineElement =>\n element.type === 'line'\n\nexport const getLineElementPath = (element: SlideElement) => {\n if (!isLineElement(element) || !element.start || !element.end) return ''\n const start = element.start.join(',')\n const end = element.end.join(',')\n const broken = element.broken as [number, number] | undefined\n const broken2 = element.broken2 as [number, number] | undefined\n const curve = element.curve as [number, number] | undefined\n const cubic = element.cubic as [[number, number], [number, number]] | undefined\n\n if (broken) {\n const mid = broken.join(',')\n return `M${start} L${mid} L${end}`\n }\n if (broken2) {\n const { minX, maxX, minY, maxY } = getElementRange(element)\n if (maxX - minX >= maxY - minY) {\n return `M${start} L${broken2[0]},${element.start[1]} L${broken2[0]},${element.end[1]} ${end}`\n }\n return `M${start} L${element.start[0]},${broken2[1]} L${element.end[0]},${broken2[1]} ${end}`\n }\n if (curve) {\n const mid = curve.join(',')\n return `M${start} Q${mid} ${end}`\n }\n if (cubic) {\n const [c1, c2] = cubic\n const p1 = c1.join(',')\n const p2 = c2.join(',')\n return `M${start} C${p1} ${p2} ${end}`\n }\n return `M${start} L${end}`\n}\n","const dataUrlRegex = /^data:image\\/[^;]+;base64,/\nconst resolvedImageCache = new Map<string, Promise<string>>()\nconst MAX_IMAGE_CACHE_ENTRIES = 8\n\nconst mimeFromPath = (path: string) => {\n const lower = path.toLowerCase()\n if (lower.endsWith('.png')) return 'image/png'\n if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return 'image/jpeg'\n if (lower.endsWith('.gif')) return 'image/gif'\n if (lower.endsWith('.svg')) return 'image/svg+xml'\n if (lower.endsWith('.webp')) return 'image/webp'\n if (lower.endsWith('.bmp')) return 'image/bmp'\n return 'application/octet-stream'\n}\n\nconst toBase64 = (buffer: ArrayBuffer) => {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(buffer).toString('base64')\n }\n\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i += 1) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n}\n\nconst readLocalFile = async (path: string) => {\n const fs = await import('node:fs/promises')\n const buffer = await fs.readFile(path)\n return buffer.toString('base64')\n}\n\nasync function resolveImageDataUncached (src: string): Promise<string> {\n if (dataUrlRegex.test(src)) return src\n\n const isFileUrl = src.startsWith('file://')\n const isLocalPath = !src.startsWith('http') && !src.startsWith('data:')\n const isNode = typeof process !== 'undefined' && Boolean(process.versions?.node)\n\n if ((isFileUrl || isLocalPath) && isNode) {\n const filePath = isFileUrl ? src.replace('file://', '') : src\n const base64 = await readLocalFile(filePath)\n const mime = mimeFromPath(filePath)\n return `data:${mime};base64,${base64}`\n }\n\n if (typeof fetch !== 'function') {\n throw new Error('fetch is not available to resolve image data')\n }\n\n const response = await fetch(src)\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const base64 = toBase64(arrayBuffer)\n const contentType = response.headers.get('content-type') || mimeFromPath(src)\n return `data:${contentType};base64,${base64}`\n}\n\nexport const resolveImageData = async (src: string): Promise<string> => {\n if (dataUrlRegex.test(src)) return src\n\n const cached = resolvedImageCache.get(src)\n if (cached) return cached\n\n while (resolvedImageCache.size >= MAX_IMAGE_CACHE_ENTRIES) {\n const firstKey = resolvedImageCache.keys().next().value\n if (!firstKey) break\n resolvedImageCache.delete(firstKey)\n }\n\n const pending = resolveImageDataUncached(src).catch((error) => {\n resolvedImageCache.delete(src)\n throw error\n })\n\n resolvedImageCache.set(src, pending)\n return pending\n}\n","import tinycolor from \"tinycolor2\";\nimport type PptxGenJS from \"pptxgenjs\";\n\nimport type { SlideElement } from \"../types/ppt\";\nimport { toAST, type AST } from \"../htmlParser\";\nimport { DEFAULT_FONT_SIZE } from \"./constants\";\n\ntype TextSlice = {\n text: string;\n options?: PptxGenJS.TextPropsOptions;\n};\n\nconst dashTypeMap: Record<string, \"solid\" | \"dash\" | \"sysDot\"> = {\n solid: \"solid\",\n dashed: \"dash\",\n dotted: \"sysDot\"\n};\n\nexport function formatColor(input: string): { alpha: number; color: string } {\n if (!input) {\n return {\n alpha: 0,\n color: \"#000000\"\n };\n }\n\n const color = tinycolor(input);\n const alpha = color.getAlpha();\n const hex = alpha === 0 ? \"#ffffff\" : color.setAlpha(1).toHexString();\n return { alpha, color: hex };\n}\n\nexport function formatHTML(html: string, ratioPx2Pt: number): TextSlice[] {\n const ast = toAST(html);\n let bulletFlag = false;\n let indent = 0;\n\n const slices: TextSlice[] = [];\n const parse = (obj: AST[], baseStyleObj: Record<string, string> = {}) => {\n for (const item of obj) {\n const isBlockTag = \"tagName\" in item && [\"div\", \"li\", \"p\"].includes(item.tagName);\n\n if (isBlockTag && slices.length) {\n const lastSlice = slices[slices.length - 1];\n if (!lastSlice.options) lastSlice.options = {};\n lastSlice.options.breakLine = true;\n }\n\n const styleObj = { ...baseStyleObj };\n const styleAttr =\n \"attributes\" in item\n ? item.attributes.find((attr) => attr.key === \"style\")\n : null;\n if (styleAttr && styleAttr.value) {\n const styleArr = styleAttr.value.split(\";\");\n for (const styleItem of styleArr) {\n const match = styleItem.match(/([^:]+):\\s*(.+)/);\n if (match) {\n const [key, value] = [match[1].trim(), match[2].trim()];\n if (key && value) styleObj[key] = value;\n }\n }\n }\n\n if (\"tagName\" in item) {\n if (item.tagName === \"em\") {\n styleObj[\"font-style\"] = \"italic\";\n }\n if (item.tagName === \"strong\") {\n styleObj[\"font-weight\"] = \"bold\";\n }\n if (item.tagName === \"sup\") {\n styleObj[\"vertical-align\"] = \"super\";\n }\n if (item.tagName === \"sub\") {\n styleObj[\"vertical-align\"] = \"sub\";\n }\n if (item.tagName === \"a\") {\n const attr = item.attributes.find((attr) => attr.key === \"href\");\n styleObj.href = attr?.value || \"\";\n }\n if (item.tagName === \"ul\") {\n styleObj[\"list-type\"] = \"ul\";\n }\n if (item.tagName === \"ol\") {\n styleObj[\"list-type\"] = \"ol\";\n }\n if (item.tagName === \"li\") {\n bulletFlag = true;\n }\n if (item.tagName === \"p\") {\n if (\"attributes\" in item) {\n const dataIndentAttr = item.attributes.find((attr) => attr.key === \"data-indent\");\n if (dataIndentAttr && dataIndentAttr.value) indent = +dataIndentAttr.value;\n }\n }\n }\n\n if (\"tagName\" in item && item.tagName === \"br\") {\n slices.push({ text: \"\", options: { breakLine: true } });\n } else if (\"content\" in item) {\n const text = item.content\n .replace(/&nbsp;/g, \" \")\n .replace(/&gt;/g, \">\")\n .replace(/&lt;/g, \"<\")\n .replace(/&amp;/g, \"&\")\n .replace(/\\n/g, \"\");\n const options: PptxGenJS.TextPropsOptions = {};\n\n if (styleObj[\"font-size\"]) {\n options.fontSize = parseInt(styleObj[\"font-size\"], 10) / ratioPx2Pt;\n }\n if (styleObj.color) {\n options.color = formatColor(styleObj.color).color;\n }\n if (styleObj[\"background-color\"]) {\n options.highlight = formatColor(styleObj[\"background-color\"]).color;\n }\n if (styleObj[\"text-decoration-line\"]) {\n if (styleObj[\"text-decoration-line\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration-line\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"text-decoration\"]) {\n if (styleObj[\"text-decoration\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"vertical-align\"]) {\n if (styleObj[\"vertical-align\"] === \"super\") options.superscript = true;\n if (styleObj[\"vertical-align\"] === \"sub\") options.subscript = true;\n }\n if (styleObj[\"text-align\"]) options.align = styleObj[\"text-align\"] as PptxGenJS.HAlign;\n if (styleObj[\"font-weight\"]) options.bold = styleObj[\"font-weight\"] === \"bold\";\n if (styleObj[\"font-style\"]) options.italic = styleObj[\"font-style\"] === \"italic\";\n if (styleObj[\"font-family\"]) options.fontFace = styleObj[\"font-family\"];\n if (styleObj.href) options.hyperlink = { url: styleObj.href };\n\n if (bulletFlag && styleObj[\"list-type\"] === \"ol\") {\n options.bullet = {\n type: \"number\",\n indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25\n };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (bulletFlag && styleObj[\"list-type\"] === \"ul\") {\n options.bullet = { indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25 };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (indent) {\n options.indentLevel = indent;\n indent = 0;\n }\n\n slices.push({ text, options });\n } else if (\"children\" in item) parse(item.children, styleObj);\n }\n };\n parse(ast);\n return slices;\n}\n\nfunction normalizeFontName(value?: string): string | undefined {\n return value ? value.replace(/^\"+|\"+$/g, \"\") : undefined;\n}\n\nfunction clampOpacity(value?: number): number {\n if (value === undefined) return 1;\n if (!Number.isFinite(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction getOpacityRatio(value?: string): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n if (normalized.endsWith(\"%\")) {\n const percent = Number.parseFloat(normalized);\n return Number.isFinite(percent) ? Math.min(1, Math.max(0, percent / 100)) : undefined;\n }\n const numeric = Number.parseFloat(normalized);\n if (!Number.isFinite(numeric)) return undefined;\n return numeric > 1 ? Math.min(1, Math.max(0, numeric / 100)) : Math.min(1, Math.max(0, numeric));\n}\n\nfunction parseFontSize(value?: string): number | undefined {\n if (!value) return undefined;\n const size = Number.parseFloat(value);\n return Number.isFinite(size) ? size : undefined;\n}\n\nfunction parseTableColor(\n value?: string\n): { color: string; transparency: number } | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n const c = formatColor(normalized);\n return {\n color: c.color.replace(\"#\", \"\"),\n transparency: (1 - c.alpha) * 100\n };\n}\n\nfunction isPlaceholderCell(cell?: {\n colspan?: number;\n rowspan?: number;\n text?: string;\n style?: Record<string, string | undefined>;\n}): boolean {\n if (!cell) return false;\n const colspan = cell.colspan ?? 1;\n const rowspan = cell.rowspan ?? 1;\n if (colspan !== 1 || rowspan !== 1) return false;\n const text = cell.text ?? \"\";\n const style = cell.style;\n const hasStyle =\n Boolean(style?.fontname) ||\n Boolean(style?.fontsize) ||\n Boolean(style?.color) ||\n Boolean(style?.backcolor);\n return text.trim() === \"\" && !hasStyle;\n}\n\nexport function buildTableRows(\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): PptxGenJS.TableRow[] {\n const data = (element as any).data as\n | Array<Array<{ id?: string; colspan?: number; rowspan?: number; text?: string; style?: any }>>\n | undefined;\n if (!data || !data.length) return [];\n\n const colCount =\n ((element as any).colWidths as number[] | undefined)?.length ??\n Math.max(...data.map((row) => row.length));\n\n const rows: PptxGenJS.TableRow[] = [];\n const skip = new Array(colCount).fill(0);\n\n data.forEach((row) => {\n const cells: PptxGenJS.TableCell[] = [];\n let colIndex = 0;\n let cellIndex = 0;\n\n while (colIndex < colCount) {\n if (skip[colIndex] > 0) {\n skip[colIndex] -= 1;\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n colIndex += 1;\n continue;\n }\n\n const cell = row[cellIndex];\n if (!cell) break;\n cellIndex += 1;\n\n const colSpan = cell.colspan ?? 1;\n const rowSpan = cell.rowspan ?? 1;\n\n if (rowSpan > 1) {\n for (let i = 0; i < colSpan; i += 1) {\n skip[colIndex + i] = rowSpan - 1;\n }\n }\n\n if (colSpan > 1) {\n for (let i = 0; i < colSpan - 1; i += 1) {\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n }\n }\n\n const style = cell.style ?? {};\n const fontSize = parseFontSize(style.fontsize);\n const fill = parseTableColor(style.backcolor);\n const color = parseTableColor(style.color);\n const cellMargin = [\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch,\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch\n ] as [number, number, number, number];\n\n const options: PptxGenJS.TableCellProps = {\n colspan: colSpan > 1 ? colSpan : undefined,\n rowspan: rowSpan > 1 ? rowSpan : undefined,\n align: style.align as PptxGenJS.HAlign,\n valign: \"middle\",\n fontFace: normalizeFontName(style.fontname),\n fontSize: fontSize ? fontSize / ratioPx2Pt : undefined,\n color: color?.color,\n fill: fill ? { color: fill.color, transparency: fill.transparency } : undefined,\n margin: cellMargin\n };\n\n cells.push({\n text: cell.text ?? \"\",\n options\n });\n\n colIndex += colSpan;\n }\n\n rows.push(cells);\n });\n\n return rows;\n}\n\nexport function getShadowOption(\n shadow: NonNullable<SlideElement[\"shadow\"]>,\n ratioPx2Pt: number\n): PptxGenJS.ShadowProps {\n const c = formatColor(shadow.color ?? \"#000000\");\n const { h = 0, v = 0 } = shadow;\n\n let offset = 4;\n let angle = 45;\n\n if (h === 0 && v === 0) {\n offset = 4;\n angle = 45;\n } else if (h === 0) {\n if (v > 0) {\n offset = v;\n angle = 90;\n } else {\n offset = -v;\n angle = 270;\n }\n } else if (v === 0) {\n if (h > 0) {\n offset = h;\n angle = 1;\n } else {\n offset = -h;\n angle = 180;\n }\n } else if (h > 0 && v > 0) {\n offset = Math.max(h, v);\n angle = 45;\n } else if (h > 0 && v < 0) {\n offset = Math.max(h, -v);\n angle = 315;\n } else if (h < 0 && v > 0) {\n offset = Math.max(-h, v);\n angle = 135;\n } else if (h < 0 && v < 0) {\n offset = Math.max(-h, -v);\n angle = 225;\n }\n\n return {\n color: c.color,\n transparency: (1 - c.alpha) * 100,\n blur: (shadow.blur ?? 0) / ratioPx2Pt,\n offset,\n angle\n };\n}\n\nexport function getOutlineOption(\n outline: NonNullable<SlideElement[\"outline\"]>,\n ratioPx2Pt: number,\n opacity = 1\n): PptxGenJS.ShapeLineProps {\n const c = formatColor(outline.color || \"#000000\");\n const alpha = c.alpha * clampOpacity(opacity);\n return {\n color: c.color,\n transparency: (1 - alpha) * 100,\n width: (outline.width || 1) / ratioPx2Pt,\n dashType: outline.style ? dashTypeMap[outline.style] : \"solid\"\n };\n}\n\nexport function getElementOpacity(value?: number): number {\n return clampOpacity(value);\n}\n\nexport function getFilterOpacity(value?: string): number | undefined {\n return getOpacityRatio(value);\n}\n\nexport function getDashTypeMap(): Record<string, \"solid\" | \"dash\" | \"sysDot\"> {\n return dashTypeMap;\n}\n","export const childlessTags = ['style', 'script', 'template']\n\nexport const closingTags = [\n 'html',\n 'head',\n 'body',\n 'p',\n 'dt',\n 'dd',\n 'li',\n 'option',\n 'thead',\n 'th',\n 'tbody',\n 'tr',\n 'td',\n 'tfoot',\n 'colgroup'\n]\n\nexport const closingTagAncestorBreakers: Record<string, string[]> = {\n li: ['ul', 'ol', 'menu'],\n dt: ['dl'],\n dd: ['dl'],\n tbody: ['table'],\n thead: ['table'],\n tfoot: ['table'],\n tr: ['table'],\n td: ['table']\n}\n\nexport const voidTags = [\n '!doctype',\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]\n","import type { Token } from './types'\nimport { childlessTags } from './tags'\n\ninterface State {\n str: string\n position: number\n tokens: Token[]\n}\n\nconst jumpPosition = (state: State, end: number) => {\n const len = end - state.position\n movePosition(state, len)\n}\n\nconst movePosition = (state: State, len: number) => {\n state.position = state.position + len\n}\n\nconst findTextEnd = (str: string, index: number) => {\n const isEnd = false\n while (!isEnd) {\n const textEnd = str.indexOf('<', index)\n if (textEnd === -1) {\n return textEnd\n }\n const char = str.charAt(textEnd + 1)\n if (char === '/' || char === '!' || /[A-Za-z0-9]/.test(char)) {\n return textEnd\n }\n index = textEnd + 1\n }\n return -1\n}\n\nconst lexText = (state: State) => {\n const { str } = state\n let textEnd = findTextEnd(str, state.position)\n if (textEnd === state.position) return\n if (textEnd === -1) {\n textEnd = str.length\n }\n\n const content = str.slice(state.position, textEnd)\n jumpPosition(state, textEnd)\n\n state.tokens.push({\n type: 'text',\n content\n })\n}\n\nconst lexComment = (state: State) => {\n const { str } = state\n\n movePosition(state, 4)\n let contentEnd = str.indexOf('-->', state.position)\n let commentEnd = contentEnd + 3\n if (contentEnd === -1) {\n contentEnd = commentEnd = str.length\n }\n\n const content = str.slice(state.position, contentEnd)\n jumpPosition(state, commentEnd)\n\n state.tokens.push({\n type: 'comment',\n content\n })\n}\n\nconst lexTagName = (state: State) => {\n const { str } = state\n const len = str.length\n let start = state.position\n\n while (start < len) {\n const char = str.charAt(start)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (isTagChar) break\n start++\n }\n\n let end = start + 1\n while (end < len) {\n const char = str.charAt(end)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (!isTagChar) break\n end++\n }\n\n jumpPosition(state, end)\n const tagName = str.slice(start, end)\n state.tokens.push({\n type: 'tag',\n content: tagName\n })\n return tagName\n}\n\nconst lexTagAttributes = (state: State) => {\n const { str, tokens } = state\n let cursor = state.position\n let quote: string | null = null\n let wordBegin = cursor\n const words: string[] = []\n const len = str.length\n while (cursor < len) {\n const char = str.charAt(cursor)\n if (quote) {\n const isQuoteEnd = char === quote\n if (isQuoteEnd) quote = null\n cursor++\n continue\n }\n\n const isTagEnd = char === '/' || char === '>'\n if (isTagEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n break\n }\n\n const isWordEnd = /\\s/.test(char)\n if (isWordEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n wordBegin = cursor + 1\n cursor++\n continue\n }\n\n const isQuoteStart = char === '\\'' || char === '\"'\n if (isQuoteStart) {\n quote = char\n cursor++\n continue\n }\n\n cursor++\n }\n jumpPosition(state, cursor)\n\n const type = 'attribute'\n for (let i = 0; i < words.length; i++) {\n const word = words[i]\n\n const isNotPair = word.indexOf('=') === -1\n if (isNotPair) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.startsWith('=')) {\n if (secondWord.length > 1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n const thirdWord = words[i + 2]\n i += 1\n if (thirdWord) {\n const newWord = word + '=' + thirdWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n }\n }\n if (word.endsWith('=')) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.indexOf('=') === -1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n\n const newWord = word.slice(0, -1)\n tokens.push({ type, content: newWord })\n continue\n }\n\n tokens.push({ type, content: word })\n }\n}\n\nconst lexSkipTag = (tagName: string, state: State) => {\n const { str, tokens } = state\n const safeTagName = tagName.toLowerCase()\n const len = str.length\n let index = state.position\n\n while (index < len) {\n const nextTag = str.indexOf('</', index)\n if (nextTag === -1) {\n lexText(state)\n break\n }\n\n const tagState = {\n str,\n position: state.position,\n tokens: []\n }\n jumpPosition(tagState, nextTag)\n const name = lexTag(tagState)\n if (safeTagName !== name.toLowerCase()) {\n index = tagState.position\n continue\n }\n\n if (nextTag !== state.position) {\n const textStart = state.position\n jumpPosition(state, nextTag)\n tokens.push({\n type: 'text',\n content: str.slice(textStart, nextTag)\n })\n }\n\n tokens.push(...tagState.tokens)\n jumpPosition(state, tagState.position)\n break\n }\n}\n\nconst lexTag = (state: State) => {\n const { str } = state\n const secondChar = str.charAt(state.position + 1)\n const tagStartClose = secondChar === '/'\n movePosition(state, tagStartClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-start',\n close: tagStartClose\n })\n\n const tagName = lexTagName(state)\n lexTagAttributes(state)\n\n const firstChar = str.charAt(state.position)\n const tagEndClose = firstChar === '/'\n movePosition(state, tagEndClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-end',\n close: tagEndClose\n })\n return tagName\n}\n\nconst lex = (state: State) => {\n const str = state.str\n const len = str.length\n\n while (state.position < len) {\n const start = state.position\n lexText(state)\n\n if (state.position === start) {\n const isComment = str.startsWith('!--', start + 1)\n if (isComment) lexComment(state)\n else {\n const tagName = lexTag(state)\n const safeTag = tagName.toLowerCase()\n if (childlessTags.includes(safeTag)) lexSkipTag(tagName, state)\n }\n }\n }\n}\n\nexport const lexer = (str: string): Token[] => {\n const state = {\n str,\n position: 0,\n tokens: []\n }\n lex(state)\n return state.tokens\n}\n","import type {\n Token,\n HTMLNode,\n TagToken,\n NormalElement,\n TagEndToken,\n AttributeToken,\n TextToken\n} from './types'\nimport { closingTags, closingTagAncestorBreakers, voidTags } from './tags'\n\ninterface StackItem {\n tagName: string | null\n children: HTMLNode[]\n}\n\ninterface State {\n stack: StackItem[]\n cursor: number\n tokens: Token[]\n}\n\nexport const parser = (tokens: Token[]) => {\n const root: StackItem = { tagName: null, children: [] }\n const state: State = { tokens, cursor: 0, stack: [root] }\n parse(state)\n return root.children\n}\n\nexport const hasTerminalParent = (tagName: string, stack: StackItem[]) => {\n const tagParents = closingTagAncestorBreakers[tagName]\n if (tagParents) {\n let currentIndex = stack.length - 1\n while (currentIndex >= 0) {\n const parentTagName = stack[currentIndex].tagName\n if (parentTagName === tagName) break\n if (parentTagName && tagParents.includes(parentTagName)) return true\n currentIndex--\n }\n }\n return false\n}\n\nexport const rewindStack = (stack: StackItem[], newLength: number) => {\n stack.splice(newLength)\n}\n\nexport const parse = (state: State) => {\n const { stack, tokens } = state\n let { cursor } = state\n let nodes = stack[stack.length - 1].children\n const len = tokens.length\n\n while (cursor < len) {\n const token = tokens[cursor]\n if (token.type !== 'tag-start') {\n nodes.push(token as TextToken)\n cursor++\n continue\n }\n\n const tagToken = tokens[++cursor] as TagToken\n cursor++\n const tagName = tagToken.content.toLowerCase()\n if (token.close) {\n let index = stack.length\n let shouldRewind = false\n while (--index > -1) {\n if (stack[index].tagName === tagName) {\n shouldRewind = true\n break\n }\n }\n while (cursor < len) {\n if (tokens[cursor].type !== 'tag-end') break\n cursor++\n }\n if (shouldRewind) {\n rewindStack(stack, index)\n break\n } else continue\n }\n\n const isClosingTag = closingTags.includes(tagName)\n let shouldRewindToAutoClose = isClosingTag\n if (shouldRewindToAutoClose) {\n shouldRewindToAutoClose = !hasTerminalParent(tagName, stack)\n }\n\n if (shouldRewindToAutoClose) {\n let currentIndex = stack.length - 1\n while (currentIndex > 0) {\n if (tagName === stack[currentIndex].tagName) {\n rewindStack(stack, currentIndex)\n const previousIndex = currentIndex - 1\n nodes = stack[previousIndex].children\n break\n }\n currentIndex = currentIndex - 1\n }\n }\n\n const attributes = []\n let tagEndToken: TagEndToken | undefined\n while (cursor < len) {\n const _token = tokens[cursor]\n if (_token.type === 'tag-end') {\n tagEndToken = _token as TagEndToken\n break\n }\n attributes.push((_token as AttributeToken).content)\n cursor++\n }\n\n if (!tagEndToken) break\n\n cursor++\n const children: HTMLNode[] = []\n const elementNode: NormalElement = {\n type: 'element',\n tagName: tagToken.content,\n attributes,\n children\n }\n nodes.push(elementNode)\n\n const hasChildren = !(tagEndToken.close || voidTags.includes(tagName))\n if (hasChildren) {\n stack.push({ tagName, children })\n const innerState = { tokens, cursor, stack }\n parse(innerState)\n cursor = innerState.cursor\n }\n }\n state.cursor = cursor\n}\n","import type { HTMLNode, CommentOrTextAST, ElementAST, AST } from './types'\n\nexport const splitHead = (str: string, sep: string) => {\n const idx = str.indexOf(sep)\n if (idx === -1) return [str]\n return [str.slice(0, idx), str.slice(idx + sep.length)]\n}\n\nconst unquote = (str: string) => {\n const car = str.charAt(0)\n const end = str.length - 1\n const isQuoteStart = car === '\"' || car === \"'\"\n if (isQuoteStart && car === str.charAt(end)) {\n return str.slice(1, end)\n }\n return str\n}\n\nconst formatAttributes = (attributes: string[]) => {\n return attributes.map(attribute => {\n const parts = splitHead(attribute.trim(), '=')\n const key = parts[0]\n const value = typeof parts[1] === 'string' ? unquote(parts[1]) : null\n return { key, value }\n })\n}\n\nexport const format = (nodes: HTMLNode[]): AST[] => {\n return nodes.map(node => {\n if (node.type === 'element') {\n const children = format(node.children)\n const item: ElementAST = {\n type: 'element',\n tagName: node.tagName.toLowerCase(),\n attributes: formatAttributes(node.attributes),\n children\n }\n return item\n }\n\n const item: CommentOrTextAST = {\n type: node.type,\n content: node.content\n }\n return item\n })\n}\n","import { lexer } from './lexer'\nimport { parser } from './parser'\nimport { format } from './format'\nexport type { AST } from './types'\n\nexport const toAST = (str: string) => {\n const tokens = lexer(str)\n const nodes = parser(tokens)\n return format(nodes)\n}\n","export const DEFAULT_WIDTH = 1000;\nexport const DEFAULT_HEIGHT = 562.5;\nexport const DEFAULT_FONT_SIZE = 16;\nexport const DEFAULT_FONT_FACE = \"微软雅黑\";\n","import type { ElementFill, FillGradient } from '../types/ppt'\nimport { formatColor } from './shared'\n\nfunction stripFillTags(value: string): string {\n return value\n .replace(/<a:solidFill>[\\s\\S]*?<\\/a:solidFill>/g, '')\n .replace(/<a:gradFill[\\s\\S]*?<\\/a:gradFill>/g, '')\n .replace(/<a:blipFill>[\\s\\S]*?<\\/a:blipFill>/g, '')\n .replace(/<a:noFill\\s*\\/>/g, '')\n .replace(/<a:noFill><\\/a:noFill>/g, '')\n}\n\nfunction buildColorXml(color: string): string {\n const normalized = formatColor(color)\n const alphaXml =\n normalized.alpha < 1\n ? `<a:alpha val=\"${Math.round(normalized.alpha * 100000)}\"/>`\n : ''\n\n return `<a:srgbClr val=\"${normalized.color.replace('#', '').toUpperCase()}\">${alphaXml}</a:srgbClr>`\n}\n\nfunction buildGradientFillXml(gradient?: FillGradient): string {\n const stops = gradient?.colors ?? []\n const colors = stops.length\n ? stops\n : [\n { pos: 0, color: '#FFFFFF' },\n { pos: 100, color: '#FFFFFF' }\n ]\n\n const gsLst = colors\n .map((stop) => {\n const pos = Math.max(0, Math.min(100, stop.pos ?? 0))\n return `<a:gs pos=\"${Math.round(pos * 1000)}\">${buildColorXml(\n stop.color ?? '#FFFFFF'\n )}</a:gs>`\n })\n .join('')\n\n const rotate = Math.round((gradient?.rotate ?? 0) * 60000)\n\n return `<a:gradFill rotWithShape=\"1\"><a:gsLst>${gsLst}</a:gsLst><a:lin ang=\"${rotate}\" scaled=\"0\"/></a:gradFill>`\n}\n\nfunction buildImageFillXml(relId: string, opacity?: number): string {\n const alphaXml =\n opacity !== undefined && Number.isFinite(opacity) && opacity >= 0 && opacity < 1\n ? `<a:alphaModFix amt=\"${Math.round(opacity * 100000)}\"/>`\n : ''\n\n return `<a:blipFill><a:blip r:embed=\"${relId}\">${alphaXml}</a:blip><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`\n}\n\nfunction insertFillXml(spPrInner: string, fillXml: string): string {\n const cleanedInner = stripFillTags(spPrInner)\n\n if (cleanedInner.includes('</a:custGeom>')) {\n return cleanedInner.replace('</a:custGeom>', `</a:custGeom>${fillXml}`)\n }\n\n if (cleanedInner.includes('</a:prstGeom>')) {\n return cleanedInner.replace('</a:prstGeom>', `</a:prstGeom>${fillXml}`)\n }\n\n const lineIndex = cleanedInner.indexOf('<a:ln')\n if (lineIndex === -1) {\n return `${cleanedInner}${fillXml}`\n }\n\n return `${cleanedInner.slice(0, lineIndex)}${fillXml}${cleanedInner.slice(lineIndex)}`\n}\n\nfunction buildFillXml(fill: ElementFill, relId?: string): string {\n if (fill.type === 'gradient') {\n return buildGradientFillXml(fill.gradient)\n }\n\n if (fill.type === 'image') {\n if (!relId) {\n throw new Error('Image fills require a relationship id')\n }\n return buildImageFillXml(relId, fill.opacity)\n }\n\n return `<a:solidFill>${buildColorXml(fill.color ?? '#FFFFFF')}</a:solidFill>`\n}\n\nexport function fillRequiresXmlPatch(fill?: ElementFill): boolean {\n return fill?.type === 'gradient' || fill?.type === 'image'\n}\n\nexport function getFillFallbackColor(fill?: ElementFill, fallback = '#FFFFFF'): string {\n if (!fill) return fallback\n if (fill.type === 'solid') return fill.color ?? fallback\n if (fill.type === 'gradient') {\n return fill.gradient?.colors?.[0]?.color ?? fallback\n }\n return fallback\n}\n\nexport function applyShapeFillPatch(\n slideXml: string,\n objectName: string,\n fill: ElementFill,\n relId?: string\n): string {\n const nameToken = `name=\"${objectName}\"`\n let cursor = 0\n let result = slideXml\n\n while (true) {\n const nameIndex = result.indexOf(nameToken, cursor)\n if (nameIndex === -1) break\n\n const spStart = result.lastIndexOf('<p:sp', nameIndex)\n const spEnd = result.indexOf('</p:sp>', nameIndex)\n if (spStart === -1 || spEnd === -1) break\n\n const spXml = result.slice(spStart, spEnd + '</p:sp>'.length)\n const spPrStart = spXml.indexOf('<p:spPr>')\n const spPrEnd = spXml.indexOf('</p:spPr>')\n if (spPrStart === -1 || spPrEnd === -1) {\n cursor = spEnd + 1\n continue\n }\n\n const spPrOpenEnd = spXml.indexOf('>', spPrStart)\n const spPrInner = spXml.slice(spPrOpenEnd + 1, spPrEnd)\n const fillXml = buildFillXml(fill, relId)\n const nextInner = insertFillXml(spPrInner, fillXml)\n const updatedSpXml = spXml.slice(0, spPrOpenEnd + 1) + nextInner + spXml.slice(spPrEnd)\n\n result = result.slice(0, spStart) + updatedSpXml + result.slice(spEnd + '</p:sp>'.length)\n cursor = spStart + updatedSpXml.length\n }\n\n return result\n}\n\nexport function applyBackgroundFillPatch(\n slideXml: string,\n fill: ElementFill,\n relId?: string\n): string {\n const bgPrStart = slideXml.indexOf('<p:bgPr>')\n const bgPrEnd = slideXml.indexOf('</p:bgPr>')\n if (bgPrStart === -1 || bgPrEnd === -1) return slideXml\n\n const openEnd = slideXml.indexOf('>', bgPrStart)\n const bgPrInner = slideXml.slice(openEnd + 1, bgPrEnd)\n const fillXml = buildFillXml(fill, relId)\n const nextInner = `${stripFillTags(bgPrInner)}${fillXml}`\n\n return slideXml.slice(0, openEnd + 1) + nextInner + slideXml.slice(bgPrEnd)\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Presentation } from \"../types/ppt\";\nimport { getFillFallbackColor } from \"./fill-patch\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: NonNullable<Presentation[\"slides\"]>[number],\n theme: Presentation[\"theme\"]\n): void {\n const backgroundColor = slideJson.background\n ? getFillFallbackColor(slideJson.background, theme?.backgroundColor ?? \"#FFFFFF\")\n : theme?.backgroundColor;\n if (!backgroundColor) return;\n const c = formatColor(backgroundColor);\n slide.background = { color: c.color, transparency: (1 - c.alpha) * 100 };\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function applyPptxLayout(pptx: PptxGenJS, width: number, height: number): void {\n const viewportRatio = height / width;\n if (Math.abs(viewportRatio - 0.625) < 0.001) {\n pptx.layout = \"LAYOUT_16x10\";\n return;\n }\n if (Math.abs(viewportRatio - 0.75) < 0.001) {\n pptx.layout = \"LAYOUT_4x3\";\n return;\n }\n if (Math.abs(viewportRatio - 0.70710678) < 0.0001) {\n pptx.defineLayout({ name: \"A3\", width: 10, height: 7.0710678 });\n pptx.layout = \"A3\";\n return;\n }\n if (Math.abs(viewportRatio - 1.41421356) < 0.0001) {\n pptx.defineLayout({ name: \"A3_V\", width: 10, height: 14.1421356 });\n pptx.layout = \"A3_V\";\n return;\n }\n pptx.layout = \"LAYOUT_16x9\";\n}\n","import { SVGPathData } from 'svg-pathdata'\nimport arcToBezier from 'svg-arc-to-cubic-bezier'\n\nconst typeMap: Record<number, string> = {\n 1: 'Z',\n 2: 'M',\n 4: 'H',\n 8: 'V',\n 16: 'L',\n 32: 'C',\n 64: 'S',\n 128: 'Q',\n 256: 'T',\n 512: 'A'\n}\n\nexport const toPoints = (d: string) => {\n if (!d) return []\n if (d.includes('NaN') || d.includes('undefined') || d.includes('null')) return []\n\n let pathData: any\n try {\n pathData = new SVGPathData(d)\n } catch {\n return []\n }\n\n const points: any[] = []\n for (const item of pathData.commands) {\n const type = typeMap[item.type]\n\n if (item.type === 2 || item.type === 16) {\n points.push({\n x: item.x,\n y: item.y,\n relative: item.relative,\n type\n })\n }\n if (item.type === 32) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'cubic',\n x1: item.x1,\n y1: item.y1,\n x2: item.x2,\n y2: item.y2\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 128) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'quadratic',\n x1: item.x1,\n y1: item.y1\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 512) {\n const lastPoint = points[points.length - 1] as any\n if (!lastPoint || !['M', 'L', 'Q', 'C'].includes(lastPoint.type)) continue\n\n const cubicBezierPoints = arcToBezier({\n px: lastPoint.x as number,\n py: lastPoint.y as number,\n cx: item.x,\n cy: item.y,\n rx: item.rX,\n ry: item.rY,\n xAxisRotation: item.xRot,\n largeArcFlag: item.lArcFlag,\n sweepFlag: item.sweepFlag\n }) as Array<{ x: number; y: number; x1: number; y1: number; x2: number; y2: number }>\n for (const cbPoint of cubicBezierPoints) {\n points.push({\n x: cbPoint.x,\n y: cbPoint.y,\n curve: {\n type: 'cubic',\n x1: cbPoint.x1,\n y1: cbPoint.y1,\n x2: cbPoint.x2,\n y2: cbPoint.y2\n },\n relative: false,\n type: 'C'\n })\n }\n } else if (item.type === 1) {\n points.push({ close: true, type })\n } else continue\n }\n return points\n}\n\nexport type SvgPoints = ReturnType<typeof toPoints>\n","import type { SvgPoints } from \"../svgPathParser\";\n\ntype Points = Array<\n | { x: number; y: number; moveTo?: boolean }\n | { x: number; y: number; curve: { type: \"arc\"; hR: number; wR: number; stAng: number; swAng: number } }\n | { x: number; y: number; curve: { type: \"quadratic\"; x1: number; y1: number } }\n | { x: number; y: number; curve: { type: \"cubic\"; x1: number; y1: number; x2: number; y2: number } }\n | { close: true }\n>;\n\nexport function formatPoints(\n points: SvgPoints,\n ratioPx2Inch: number,\n scale = { x: 1, y: 1 }\n): Points {\n return points.map((point) => {\n if (\"close\" in point) {\n return { close: true };\n }\n if (point.type === \"M\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n moveTo: true\n };\n }\n if (point.curve) {\n if (point.curve.type === \"cubic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"cubic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y,\n x2: (point.curve.x2 as number) / ratioPx2Inch * scale.x,\n y2: (point.curve.y2 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n if (point.curve.type === \"quadratic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"quadratic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n }\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y\n };\n });\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function isBase64Image(url: string): boolean {\n const regex = /^data:image\\/[^;]+;base64,/;\n return regex.test(url);\n}\n\nexport function getLineArrowType(\n value?: unknown\n): PptxGenJS.ShapeLineProps[\"beginArrowType\"] {\n if (value === \"arrow\") return \"arrow\";\n if (value === \"dot\") return \"oval\";\n return \"none\";\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Presentation, SlideElement } from \"../types/ppt\";\nimport { resolveImageData } from \"../resolveImageData\";\nimport { toPoints } from \"../svgPathParser\";\nimport { getElementRange, getLineElementPath } from \"../element\";\nimport { DEFAULT_FONT_FACE, DEFAULT_FONT_SIZE } from \"./constants\";\nimport { fillRequiresXmlPatch } from \"./fill-patch\";\nimport { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type FillPatch } from \"./types\";\nimport {\n buildTableRows,\n formatColor,\n formatHTML,\n getDashTypeMap,\n getElementOpacity,\n getFilterOpacity,\n getOutlineOption,\n getShadowOption\n} from \"./shared\";\n\nexport function addTextElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n template: Presentation,\n slideIndex: number,\n elementIndex: number,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number,\n fillPatches: FillPatch[]\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n const objectName = `text-${slideIndex}-${element.id ?? elementIndex}`;\n const fill = element.fill;\n\n const options: PptxGenJS.TextPropsOptions & { objectName?: string } = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.defaultFontName || template.theme?.fontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n valign: \"top\",\n // pptxgenjs margin order: [left, right, bottom, top]\n // Keep horizontal padding while removing vertical inset to match preview baseline.\n margin: [textPadding, textPadding, 0, textPadding * 0.42],\n paraSpaceBefore: 0,\n lineSpacingMultiple: 1.5,\n fit: \"none\",\n objectName\n };\n if (element.rotate) options.rotate = element.rotate;\n if (element.wordSpace) options.charSpacing = element.wordSpace / ratioPx2Pt;\n if (element.lineHeight) options.lineSpacingMultiple = element.lineHeight;\n if (fill?.type === \"solid\" && fill.color) {\n const c = formatColor(fill.color);\n options.fill = {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n if (fill && fillRequiresXmlPatch(fill)) {\n fillPatches.push({\n kind: \"shape\",\n slideIndex,\n objectName,\n fill\n });\n }\n if (element.defaultColor) options.color = formatColor(element.defaultColor).color;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.opacity !== undefined) options.transparency = (1 - opacity) * 100;\n if (element.paragraphSpace !== undefined) {\n options.paraSpaceBefore = element.paragraphSpace / ratioPx2Pt;\n }\n if (element.vertical) options.vert = \"eaVert\";\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n\n slide.addText(textProps, options);\n}\n\nexport async function addImageElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Inch: number\n): Promise<void> {\n if (element.type !== \"image\" || !element.src) return;\n\n const options: PptxGenJS.ImageProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch\n };\n\n if (isBase64Image(element.src)) options.data = element.src;\n else options.data = await resolveImageData(element.src);\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.rotate) options.rotate = element.rotate;\n const filterOpacity = getFilterOpacity(element.filters?.opacity) ?? 1;\n const elementOpacity = getElementOpacity(element.opacity);\n const imageOpacity = filterOpacity * elementOpacity;\n if (imageOpacity !== 1) {\n options.transparency = (1 - imageOpacity) * 100;\n }\n if (element.clip?.range) {\n if (element.clip.shape === \"ellipse\") options.rounding = true;\n\n const [start, end] = element.clip.range;\n const [startX, startY] = start;\n const [endX, endY] = end;\n\n const originW = (element.width ?? 0) / ((endX - startX) / ratioPx2Inch);\n const originH = (element.height ?? 0) / ((endY - startY) / ratioPx2Inch);\n\n options.w = originW / ratioPx2Inch;\n options.h = originH / ratioPx2Inch;\n\n options.sizing = {\n type: \"crop\",\n x: (startX / ratioPx2Inch) * (originW / ratioPx2Inch),\n y: (startY / ratioPx2Inch) * (originH / ratioPx2Inch),\n w: ((endX - startX) / ratioPx2Inch) * (originW / ratioPx2Inch),\n h: ((endY - startY) / ratioPx2Inch) * (originH / ratioPx2Inch)\n };\n }\n\n slide.addImage(options);\n}\n\nexport function addShapeElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n slideIndex: number,\n elementIndex: number,\n fillPatches: FillPatch[]\n): void {\n if (element.type !== \"shape\" || !element.path || !element.viewBox) return;\n const scale = {\n x: (element.width ?? 0) / element.viewBox[0],\n y: (element.height ?? 0) / element.viewBox[1]\n };\n const rawPoints = toPoints(element.path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch, scale);\n const fill = element.fill;\n const opacity = getElementOpacity(element.opacity);\n const objectName = `shape-${slideIndex}-${element.id ?? elementIndex}`;\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n points,\n objectName\n };\n\n if (fill?.type === \"solid\" && fill.color) {\n const fillColor = formatColor(fill.color);\n options.fill = {\n color: fillColor.color,\n transparency: (1 - fillColor.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n if (fill && fillRequiresXmlPatch(fill)) {\n fillPatches.push({\n kind: \"shape\",\n slideIndex,\n objectName,\n fill\n });\n }\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.rotate) options.rotate = element.rotate;\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n\n if (!element.text?.content) return;\n const textProps = formatHTML(element.text.content, ratioPx2Pt);\n const textOptions: PptxGenJS.TextPropsOptions & { objectName?: string } = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.text.defaultFontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n paraSpaceBefore: 0,\n valign:\n element.text.align === \"middle\"\n ? \"mid\"\n : (element.text.align as PptxGenJS.VAlign),\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\",\n objectName: `shape-text-${slideIndex}-${element.id ?? elementIndex}`\n };\n textOptions.margin = 0;\n if (element.rotate) textOptions.rotate = element.rotate;\n if (element.text.defaultColor) {\n textOptions.color = formatColor(element.text.defaultColor).color;\n }\n if (element.opacity !== undefined) {\n textOptions.transparency = (1 - opacity) * 100;\n }\n if (element.flipH) textOptions.flipH = element.flipH;\n if (element.flipV) textOptions.flipV = element.flipV;\n\n slide.addText(textProps, textOptions);\n}\n\nexport function addLineElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"line\" || !element.start || !element.end) return;\n const path = getLineElementPath(element);\n const rawPoints = toPoints(path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch);\n const { minX, maxX, minY, maxY } = getElementRange(element);\n const c = formatColor(element.color || \"#000000\");\n const opacity = getElementOpacity(element.opacity);\n const pointsMeta = element.points ?? [];\n const dashTypeMap = getDashTypeMap();\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (maxX - minX) / ratioPx2Inch,\n h: (maxY - minY) / ratioPx2Inch,\n line: {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100,\n width: (element.width ?? 1) / ratioPx2Pt,\n dashType: element.style ? dashTypeMap[element.style] : \"solid\",\n beginArrowType: getLineArrowType(pointsMeta[0]),\n endArrowType: getLineArrowType(pointsMeta[1])\n },\n points\n };\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n}\n\nexport function addTableElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"table\") return;\n const rows = buildTableRows(element, ratioPx2Pt, ratioPx2Inch);\n if (!rows.length) return;\n\n const colWidths = (element as any).colWidths as number[] | undefined;\n const colW = colWidths\n ? colWidths.map((ratio) => ((element.width ?? 0) * ratio) / ratioPx2Inch)\n : undefined;\n\n const rowCount = rows.length || 1;\n const baseRowHeight = ((element.height ?? 0) / rowCount) / ratioPx2Inch;\n const minRowHeight = (element as any).cellMinHeight\n ? (element as any).cellMinHeight / ratioPx2Inch\n : undefined;\n const rowH = minRowHeight\n ? new Array(rowCount).fill(Math.max(minRowHeight, baseRowHeight))\n : undefined;\n\n const outline = element.outline;\n const border =\n outline?.width || outline?.color\n ? {\n pt: (outline.width ?? 1) / ratioPx2Pt,\n color: formatColor(outline.color || \"#000000\").color.replace(\"#\", \"\")\n }\n : {\n pt: 1 / ratioPx2Pt,\n color: \"DDDDDD\"\n };\n\n slide.addTable(rows, {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n colW,\n rowH,\n border,\n margin: 0\n });\n}\n"],"mappings":"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","names":["base64","newWord","item","tinycolor","parse","attr","_a","_b","_a","_b","arcToBezier","dashTypeMap","_a","PptxGenJS","JSZip"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/element.ts","../src/resolveImageData.ts","../src/renderers/shared.ts","../src/htmlParser/tags.ts","../src/htmlParser/lexer.ts","../src/htmlParser/parser.ts","../src/htmlParser/format.ts","../src/htmlParser/index.ts","../src/renderers/constants.ts","../src/renderers/fill-patch.ts","../src/renderers/background.ts","../src/renderers/layout.ts","../src/svgPathParser.ts","../src/renderers/points.ts","../src/renderers/utils.ts","../src/renderers/elements.ts"],"sourcesContent":["import PptxGenJS from \"pptxgenjs\";\nimport JSZip from \"jszip\";\nimport { parseDocument } from \"json2pptx-schema\";\n\nimport type { Presentation } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport {\n applyBackgroundFillPatch,\n applyShapeFillPatch,\n fillRequiresXmlPatch\n} from \"./renderers/fill-patch\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type FillPatch } from \"./renderers/types\";\n\ntype PresentationDocument = ReturnType<typeof parseDocument>;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\n\nfunction parseDataUrlImage(\n dataUrl: string\n): { mime: string; data: string; ext: string } | null {\n const match = dataUrl.match(/^data:(image\\/[^;]+);base64,(.+)$/);\n if (!match) return null;\n const mime = match[1];\n const data = match[2];\n const extMap: Record<string, string> = {\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"image/svg+xml\": \"svg\",\n \"image/webp\": \"webp\",\n \"image/bmp\": \"bmp\"\n };\n return { mime, data, ext: extMap[mime] ?? \"png\" };\n}\n\nexport async function createPPTX(\n presentation: Presentation\n): Promise<{ blob: Blob; fileName: string }> {\n const parsedPresentation: PresentationDocument = parseDocument(presentation);\n const normalizedPresentation = parsedPresentation as unknown as Presentation;\n\n const pptx = new PptxGenJS();\n const fillPatches: FillPatch[] = [];\n\n const width = parsedPresentation.width;\n const height = parsedPresentation.height;\n const ratioPx2Inch = 96 * (width / 960);\n const ratioPx2Pt = (96 / 72) * (width / 960);\n const textPadding = 10 / ratioPx2Pt;\n\n applyPptxLayout(pptx, width, height);\n\n for (const [slideIndex, slideJson] of (normalizedPresentation.slides ?? []).entries()) {\n const slide = pptx.addSlide();\n applySlideBackground(slide, slideJson, normalizedPresentation.theme);\n if (slideJson.background && fillRequiresXmlPatch(slideJson.background)) {\n fillPatches.push({\n kind: \"background\",\n slideIndex,\n fill: slideJson.background\n });\n }\n\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(\n slide,\n element,\n normalizedPresentation,\n slideIndex,\n elementIndex,\n ratioPx2Pt,\n ratioPx2Inch,\n textPadding,\n fillPatches\n );\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n fillPatches\n );\n addLineElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n }\n }\n\n const fileName = `${sanitizeFileName(parsedPresentation.title || \"presentation\")}.pptx`;\n const pptxBuffer = (await pptx.write({\n outputType: \"arraybuffer\",\n compression: true\n })) as ArrayBuffer;\n\n if (!fillPatches.length) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n const mediaFiles = Object.keys(zip.files).filter((name) => name.startsWith(\"ppt/media/\"));\n let maxImageIndex = 0;\n for (const name of mediaFiles) {\n const match = name.match(/ppt\\/media\\/image(\\d+)/);\n if (match) {\n const index = Number.parseInt(match[1], 10);\n if (Number.isFinite(index)) maxImageIndex = Math.max(maxImageIndex, index);\n }\n }\n\n const slideCache = new Map<number, string>();\n const relsCache = new Map<number, string>();\n\n for (const patch of fillPatches) {\n const slideNumber = patch.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\n let relId: string | undefined;\n\n if (patch.fill.type === \"image\" && patch.fill.src) {\n const dataUrl = await resolveImageData(patch.fill.src);\n const parsed = parseDataUrlImage(dataUrl);\n if (!parsed) continue;\n\n maxImageIndex += 1;\n const imageName = `image${maxImageIndex}.${parsed.ext}`;\n zip.file(`ppt/media/${imageName}`, parsed.data, { base64: true });\n\n const relsXml =\n relsCache.get(slideNumber) ??\n (zip.file(relsPath)\n ? await zip.file(relsPath)!.async(\"string\")\n : `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>`);\n\n let maxRelId = 0;\n relsXml.replace(/Id=\"rId(\\d+)\"/g, (_, id) => {\n const value = Number.parseInt(id, 10);\n if (Number.isFinite(value)) maxRelId = Math.max(maxRelId, value);\n return \"\";\n });\n relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n relsCache.set(slideNumber, relsXml.replace(\"</Relationships>\", `${relEntry}</Relationships>`));\n }\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n\n if (!slideXml) {\n continue;\n }\n\n const nextSlideXml =\n patch.kind === \"background\"\n ? applyBackgroundFillPatch(slideXml, patch.fill, relId)\n : applyShapeFillPatch(slideXml, patch.objectName, patch.fill, relId);\n\n slideCache.set(slideNumber, nextSlideXml);\n }\n\n for (const [slideNumber, xml] of slideCache.entries()) {\n zip.file(`ppt/slides/slide${slideNumber}.xml`, xml);\n }\n for (const [slideNumber, xml] of relsCache.entries()) {\n zip.file(`ppt/slides/_rels/slide${slideNumber}.xml.rels`, xml);\n }\n\n const blob = await zip.generateAsync({ type: \"blob\" });\n return { blob, fileName };\n}\n\n// Backwards compatibility alias\nexport const buildPptxBlob = createPPTX;\n\nexport { getElementRange, getLineElementPath };\nexport { resolveImageData };\nexport type {\n BaseElement,\n Presentation,\n PresentationData,\n PresentationTheme,\n ElementClip,\n ElementFilters,\n ElementOutline,\n ElementShadow,\n ImageElement,\n LineElement,\n ShapeElement,\n Slide,\n SlideBackground,\n SlideElement,\n TextContent,\n TextElement\n} from \"./types/ppt\";\nexport * from \"./type/fallback\";\n","import type { LineElement, SlideElement } from './types/ppt'\n\nexport const getElementRange = (element: SlideElement) => {\n let minX = 0\n let maxX = 0\n let minY = 0\n let maxY = 0\n\n if (element.type === 'line' && element.start && element.end) {\n minX = element.left ?? 0\n maxX = (element.left ?? 0) + Math.max(element.start[0], element.end[0])\n minY = element.top ?? 0\n maxY = (element.top ?? 0) + Math.max(element.start[1], element.end[1])\n } else if (element.left !== undefined && element.top !== undefined) {\n minX = element.left\n minY = element.top\n maxX = element.left + (element.width ?? 0)\n maxY = element.top + (element.height ?? 0)\n }\n\n return { minX, maxX, minY, maxY }\n}\n\nconst isLineElement = (element: SlideElement): element is LineElement =>\n element.type === 'line'\n\nexport const getLineElementPath = (element: SlideElement) => {\n if (!isLineElement(element) || !element.start || !element.end) return ''\n const start = element.start.join(',')\n const end = element.end.join(',')\n const broken = element.broken as [number, number] | undefined\n const broken2 = element.broken2 as [number, number] | undefined\n const curve = element.curve as [number, number] | undefined\n const cubic = element.cubic as [[number, number], [number, number]] | undefined\n\n if (broken) {\n const mid = broken.join(',')\n return `M${start} L${mid} L${end}`\n }\n if (broken2) {\n const { minX, maxX, minY, maxY } = getElementRange(element)\n if (maxX - minX >= maxY - minY) {\n return `M${start} L${broken2[0]},${element.start[1]} L${broken2[0]},${element.end[1]} ${end}`\n }\n return `M${start} L${element.start[0]},${broken2[1]} L${element.end[0]},${broken2[1]} ${end}`\n }\n if (curve) {\n const mid = curve.join(',')\n return `M${start} Q${mid} ${end}`\n }\n if (cubic) {\n const [c1, c2] = cubic\n const p1 = c1.join(',')\n const p2 = c2.join(',')\n return `M${start} C${p1} ${p2} ${end}`\n }\n return `M${start} L${end}`\n}\n","const dataUrlRegex = /^data:image\\/[^;]+;base64,/\nconst resolvedImageCache = new Map<string, Promise<string>>()\nconst MAX_IMAGE_CACHE_ENTRIES = 8\n\nconst mimeFromPath = (path: string) => {\n const lower = path.toLowerCase()\n if (lower.endsWith('.png')) return 'image/png'\n if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return 'image/jpeg'\n if (lower.endsWith('.gif')) return 'image/gif'\n if (lower.endsWith('.svg')) return 'image/svg+xml'\n if (lower.endsWith('.webp')) return 'image/webp'\n if (lower.endsWith('.bmp')) return 'image/bmp'\n return 'application/octet-stream'\n}\n\nconst toBase64 = (buffer: ArrayBuffer) => {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(buffer).toString('base64')\n }\n\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i += 1) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n}\n\nconst readLocalFile = async (path: string) => {\n const fs = await import('node:fs/promises')\n const buffer = await fs.readFile(path)\n return buffer.toString('base64')\n}\n\nasync function resolveImageDataUncached (src: string): Promise<string> {\n if (dataUrlRegex.test(src)) return src\n\n const isFileUrl = src.startsWith('file://')\n const isLocalPath = !src.startsWith('http') && !src.startsWith('data:')\n const isNode = typeof process !== 'undefined' && Boolean(process.versions?.node)\n\n if ((isFileUrl || isLocalPath) && isNode) {\n const filePath = isFileUrl ? src.replace('file://', '') : src\n const base64 = await readLocalFile(filePath)\n const mime = mimeFromPath(filePath)\n return `data:${mime};base64,${base64}`\n }\n\n if (typeof fetch !== 'function') {\n throw new Error('fetch is not available to resolve image data')\n }\n\n const response = await fetch(src)\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const base64 = toBase64(arrayBuffer)\n const contentType = response.headers.get('content-type') || mimeFromPath(src)\n return `data:${contentType};base64,${base64}`\n}\n\nexport const resolveImageData = async (src: string): Promise<string> => {\n if (dataUrlRegex.test(src)) return src\n\n const cached = resolvedImageCache.get(src)\n if (cached) return cached\n\n while (resolvedImageCache.size >= MAX_IMAGE_CACHE_ENTRIES) {\n const firstKey = resolvedImageCache.keys().next().value\n if (!firstKey) break\n resolvedImageCache.delete(firstKey)\n }\n\n const pending = resolveImageDataUncached(src).catch((error) => {\n resolvedImageCache.delete(src)\n throw error\n })\n\n resolvedImageCache.set(src, pending)\n return pending\n}\n","import tinycolor from \"tinycolor2\";\nimport type PptxGenJS from \"pptxgenjs\";\n\nimport type { SlideElement } from \"../types/ppt\";\nimport { toAST, type AST } from \"../htmlParser\";\nimport { DEFAULT_FONT_SIZE } from \"./constants\";\n\ntype TextSlice = {\n text: string;\n options?: PptxGenJS.TextPropsOptions;\n};\n\nconst dashTypeMap: Record<string, \"solid\" | \"dash\" | \"sysDot\"> = {\n solid: \"solid\",\n dashed: \"dash\",\n dotted: \"sysDot\"\n};\n\nexport function formatColor(input: string): { alpha: number; color: string } {\n if (!input) {\n return {\n alpha: 0,\n color: \"#000000\"\n };\n }\n\n const color = tinycolor(input);\n const alpha = color.getAlpha();\n const hex = alpha === 0 ? \"#ffffff\" : color.setAlpha(1).toHexString();\n return { alpha, color: hex };\n}\n\nexport function formatHTML(html: string, ratioPx2Pt: number): TextSlice[] {\n const ast = toAST(html);\n let bulletFlag = false;\n let indent = 0;\n\n const slices: TextSlice[] = [];\n const parse = (obj: AST[], baseStyleObj: Record<string, string> = {}) => {\n for (const item of obj) {\n const isBlockTag = \"tagName\" in item && [\"div\", \"li\", \"p\"].includes(item.tagName);\n\n if (isBlockTag && slices.length) {\n const lastSlice = slices[slices.length - 1];\n if (!lastSlice.options) lastSlice.options = {};\n lastSlice.options.breakLine = true;\n }\n\n const styleObj = { ...baseStyleObj };\n const styleAttr =\n \"attributes\" in item\n ? item.attributes.find((attr) => attr.key === \"style\")\n : null;\n if (styleAttr && styleAttr.value) {\n const styleArr = styleAttr.value.split(\";\");\n for (const styleItem of styleArr) {\n const match = styleItem.match(/([^:]+):\\s*(.+)/);\n if (match) {\n const [key, value] = [match[1].trim(), match[2].trim()];\n if (key && value) styleObj[key] = value;\n }\n }\n }\n\n if (\"tagName\" in item) {\n if (item.tagName === \"em\") {\n styleObj[\"font-style\"] = \"italic\";\n }\n if (item.tagName === \"strong\") {\n styleObj[\"font-weight\"] = \"bold\";\n }\n if (item.tagName === \"sup\") {\n styleObj[\"vertical-align\"] = \"super\";\n }\n if (item.tagName === \"sub\") {\n styleObj[\"vertical-align\"] = \"sub\";\n }\n if (item.tagName === \"a\") {\n const attr = item.attributes.find((attr) => attr.key === \"href\");\n styleObj.href = attr?.value || \"\";\n }\n if (item.tagName === \"ul\") {\n styleObj[\"list-type\"] = \"ul\";\n }\n if (item.tagName === \"ol\") {\n styleObj[\"list-type\"] = \"ol\";\n }\n if (item.tagName === \"li\") {\n bulletFlag = true;\n }\n if (item.tagName === \"p\") {\n if (\"attributes\" in item) {\n const dataIndentAttr = item.attributes.find((attr) => attr.key === \"data-indent\");\n if (dataIndentAttr && dataIndentAttr.value) indent = +dataIndentAttr.value;\n }\n }\n }\n\n if (\"tagName\" in item && item.tagName === \"br\") {\n slices.push({ text: \"\", options: { breakLine: true } });\n } else if (\"content\" in item) {\n const text = item.content\n .replace(/&nbsp;/g, \" \")\n .replace(/&gt;/g, \">\")\n .replace(/&lt;/g, \"<\")\n .replace(/&amp;/g, \"&\")\n .replace(/\\n/g, \"\");\n const options: PptxGenJS.TextPropsOptions = {};\n\n if (styleObj[\"font-size\"]) {\n options.fontSize = parseInt(styleObj[\"font-size\"], 10) / ratioPx2Pt;\n }\n if (styleObj.color) {\n options.color = formatColor(styleObj.color).color;\n }\n if (styleObj[\"background-color\"]) {\n options.highlight = formatColor(styleObj[\"background-color\"]).color;\n }\n if (styleObj[\"text-decoration-line\"]) {\n if (styleObj[\"text-decoration-line\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration-line\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"text-decoration\"]) {\n if (styleObj[\"text-decoration\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"vertical-align\"]) {\n if (styleObj[\"vertical-align\"] === \"super\") options.superscript = true;\n if (styleObj[\"vertical-align\"] === \"sub\") options.subscript = true;\n }\n if (styleObj[\"text-align\"]) options.align = styleObj[\"text-align\"] as PptxGenJS.HAlign;\n if (styleObj[\"font-weight\"]) options.bold = styleObj[\"font-weight\"] === \"bold\";\n if (styleObj[\"font-style\"]) options.italic = styleObj[\"font-style\"] === \"italic\";\n if (styleObj[\"font-family\"]) options.fontFace = styleObj[\"font-family\"];\n if (styleObj.href) options.hyperlink = { url: styleObj.href };\n\n if (bulletFlag && styleObj[\"list-type\"] === \"ol\") {\n options.bullet = {\n type: \"number\",\n indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25\n };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (bulletFlag && styleObj[\"list-type\"] === \"ul\") {\n options.bullet = { indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25 };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (indent) {\n options.indentLevel = indent;\n indent = 0;\n }\n\n slices.push({ text, options });\n } else if (\"children\" in item) parse(item.children, styleObj);\n }\n };\n parse(ast);\n return slices;\n}\n\nfunction normalizeFontName(value?: string): string | undefined {\n return value ? value.replace(/^\"+|\"+$/g, \"\") : undefined;\n}\n\nfunction clampOpacity(value?: number): number {\n if (value === undefined) return 1;\n if (!Number.isFinite(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction getOpacityRatio(value?: string): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n if (normalized.endsWith(\"%\")) {\n const percent = Number.parseFloat(normalized);\n return Number.isFinite(percent) ? Math.min(1, Math.max(0, percent / 100)) : undefined;\n }\n const numeric = Number.parseFloat(normalized);\n if (!Number.isFinite(numeric)) return undefined;\n return numeric > 1 ? Math.min(1, Math.max(0, numeric / 100)) : Math.min(1, Math.max(0, numeric));\n}\n\nfunction parseFontSize(value?: string): number | undefined {\n if (!value) return undefined;\n const size = Number.parseFloat(value);\n return Number.isFinite(size) ? size : undefined;\n}\n\nfunction parseTableColor(\n value?: string\n): { color: string; transparency: number } | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n const c = formatColor(normalized);\n return {\n color: c.color.replace(\"#\", \"\"),\n transparency: (1 - c.alpha) * 100\n };\n}\n\nfunction isPlaceholderCell(cell?: {\n colspan?: number;\n rowspan?: number;\n text?: string;\n style?: Record<string, string | undefined>;\n}): boolean {\n if (!cell) return false;\n const colspan = cell.colspan ?? 1;\n const rowspan = cell.rowspan ?? 1;\n if (colspan !== 1 || rowspan !== 1) return false;\n const text = cell.text ?? \"\";\n const style = cell.style;\n const hasStyle =\n Boolean(style?.fontname) ||\n Boolean(style?.fontsize) ||\n Boolean(style?.color) ||\n Boolean(style?.backcolor);\n return text.trim() === \"\" && !hasStyle;\n}\n\nexport function buildTableRows(\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): PptxGenJS.TableRow[] {\n const data = (element as any).data as\n | Array<Array<{ id?: string; colspan?: number; rowspan?: number; text?: string; style?: any }>>\n | undefined;\n if (!data || !data.length) return [];\n\n const colCount =\n ((element as any).colWidths as number[] | undefined)?.length ??\n Math.max(...data.map((row) => row.length));\n\n const rows: PptxGenJS.TableRow[] = [];\n const skip = new Array(colCount).fill(0);\n\n data.forEach((row) => {\n const cells: PptxGenJS.TableCell[] = [];\n let colIndex = 0;\n let cellIndex = 0;\n\n while (colIndex < colCount) {\n if (skip[colIndex] > 0) {\n skip[colIndex] -= 1;\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n colIndex += 1;\n continue;\n }\n\n const cell = row[cellIndex];\n if (!cell) break;\n cellIndex += 1;\n\n const colSpan = cell.colspan ?? 1;\n const rowSpan = cell.rowspan ?? 1;\n\n if (rowSpan > 1) {\n for (let i = 0; i < colSpan; i += 1) {\n skip[colIndex + i] = rowSpan - 1;\n }\n }\n\n if (colSpan > 1) {\n for (let i = 0; i < colSpan - 1; i += 1) {\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n }\n }\n\n const style = cell.style ?? {};\n const fontSize = parseFontSize(style.fontsize);\n const fill = parseTableColor(style.backcolor);\n const color = parseTableColor(style.color);\n const cellMargin = [\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch,\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch\n ] as [number, number, number, number];\n\n const options: PptxGenJS.TableCellProps = {\n colspan: colSpan > 1 ? colSpan : undefined,\n rowspan: rowSpan > 1 ? rowSpan : undefined,\n align: style.align as PptxGenJS.HAlign,\n valign: \"middle\",\n fontFace: normalizeFontName(style.fontname),\n fontSize: fontSize ? fontSize / ratioPx2Pt : undefined,\n color: color?.color,\n fill: fill ? { color: fill.color, transparency: fill.transparency } : undefined,\n margin: cellMargin\n };\n\n cells.push({\n text: cell.text ?? \"\",\n options\n });\n\n colIndex += colSpan;\n }\n\n rows.push(cells);\n });\n\n return rows;\n}\n\nexport function getShadowOption(\n shadow: NonNullable<SlideElement[\"shadow\"]>,\n ratioPx2Pt: number\n): PptxGenJS.ShadowProps {\n const c = formatColor(shadow.color ?? \"#000000\");\n const { h = 0, v = 0 } = shadow;\n\n let offset = 4;\n let angle = 45;\n\n if (h === 0 && v === 0) {\n offset = 4;\n angle = 45;\n } else if (h === 0) {\n if (v > 0) {\n offset = v;\n angle = 90;\n } else {\n offset = -v;\n angle = 270;\n }\n } else if (v === 0) {\n if (h > 0) {\n offset = h;\n angle = 1;\n } else {\n offset = -h;\n angle = 180;\n }\n } else if (h > 0 && v > 0) {\n offset = Math.max(h, v);\n angle = 45;\n } else if (h > 0 && v < 0) {\n offset = Math.max(h, -v);\n angle = 315;\n } else if (h < 0 && v > 0) {\n offset = Math.max(-h, v);\n angle = 135;\n } else if (h < 0 && v < 0) {\n offset = Math.max(-h, -v);\n angle = 225;\n }\n\n return {\n type: \"outer\",\n color: c.color,\n opacity: c.alpha,\n blur: (shadow.blur ?? 0) / ratioPx2Pt,\n offset,\n angle\n };\n}\n\nexport function getOutlineOption(\n outline: NonNullable<SlideElement[\"outline\"]>,\n ratioPx2Pt: number,\n opacity = 1\n): PptxGenJS.ShapeLineProps {\n const c = formatColor(outline.color || \"#000000\");\n const alpha = c.alpha * clampOpacity(opacity);\n return {\n color: c.color,\n transparency: (1 - alpha) * 100,\n width: (outline.width || 1) / ratioPx2Pt,\n dashType: outline.style ? dashTypeMap[outline.style] : \"solid\"\n };\n}\n\nexport function getElementOpacity(value?: number): number {\n return clampOpacity(value);\n}\n\nexport function getFilterOpacity(value?: string): number | undefined {\n return getOpacityRatio(value);\n}\n\nexport function getDashTypeMap(): Record<string, \"solid\" | \"dash\" | \"sysDot\"> {\n return dashTypeMap;\n}\n","export const childlessTags = ['style', 'script', 'template']\n\nexport const closingTags = [\n 'html',\n 'head',\n 'body',\n 'p',\n 'dt',\n 'dd',\n 'li',\n 'option',\n 'thead',\n 'th',\n 'tbody',\n 'tr',\n 'td',\n 'tfoot',\n 'colgroup'\n]\n\nexport const closingTagAncestorBreakers: Record<string, string[]> = {\n li: ['ul', 'ol', 'menu'],\n dt: ['dl'],\n dd: ['dl'],\n tbody: ['table'],\n thead: ['table'],\n tfoot: ['table'],\n tr: ['table'],\n td: ['table']\n}\n\nexport const voidTags = [\n '!doctype',\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]\n","import type { Token } from './types'\nimport { childlessTags } from './tags'\n\ninterface State {\n str: string\n position: number\n tokens: Token[]\n}\n\nconst jumpPosition = (state: State, end: number) => {\n const len = end - state.position\n movePosition(state, len)\n}\n\nconst movePosition = (state: State, len: number) => {\n state.position = state.position + len\n}\n\nconst findTextEnd = (str: string, index: number) => {\n const isEnd = false\n while (!isEnd) {\n const textEnd = str.indexOf('<', index)\n if (textEnd === -1) {\n return textEnd\n }\n const char = str.charAt(textEnd + 1)\n if (char === '/' || char === '!' || /[A-Za-z0-9]/.test(char)) {\n return textEnd\n }\n index = textEnd + 1\n }\n return -1\n}\n\nconst lexText = (state: State) => {\n const { str } = state\n let textEnd = findTextEnd(str, state.position)\n if (textEnd === state.position) return\n if (textEnd === -1) {\n textEnd = str.length\n }\n\n const content = str.slice(state.position, textEnd)\n jumpPosition(state, textEnd)\n\n state.tokens.push({\n type: 'text',\n content\n })\n}\n\nconst lexComment = (state: State) => {\n const { str } = state\n\n movePosition(state, 4)\n let contentEnd = str.indexOf('-->', state.position)\n let commentEnd = contentEnd + 3\n if (contentEnd === -1) {\n contentEnd = commentEnd = str.length\n }\n\n const content = str.slice(state.position, contentEnd)\n jumpPosition(state, commentEnd)\n\n state.tokens.push({\n type: 'comment',\n content\n })\n}\n\nconst lexTagName = (state: State) => {\n const { str } = state\n const len = str.length\n let start = state.position\n\n while (start < len) {\n const char = str.charAt(start)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (isTagChar) break\n start++\n }\n\n let end = start + 1\n while (end < len) {\n const char = str.charAt(end)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (!isTagChar) break\n end++\n }\n\n jumpPosition(state, end)\n const tagName = str.slice(start, end)\n state.tokens.push({\n type: 'tag',\n content: tagName\n })\n return tagName\n}\n\nconst lexTagAttributes = (state: State) => {\n const { str, tokens } = state\n let cursor = state.position\n let quote: string | null = null\n let wordBegin = cursor\n const words: string[] = []\n const len = str.length\n while (cursor < len) {\n const char = str.charAt(cursor)\n if (quote) {\n const isQuoteEnd = char === quote\n if (isQuoteEnd) quote = null\n cursor++\n continue\n }\n\n const isTagEnd = char === '/' || char === '>'\n if (isTagEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n break\n }\n\n const isWordEnd = /\\s/.test(char)\n if (isWordEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n wordBegin = cursor + 1\n cursor++\n continue\n }\n\n const isQuoteStart = char === '\\'' || char === '\"'\n if (isQuoteStart) {\n quote = char\n cursor++\n continue\n }\n\n cursor++\n }\n jumpPosition(state, cursor)\n\n const type = 'attribute'\n for (let i = 0; i < words.length; i++) {\n const word = words[i]\n\n const isNotPair = word.indexOf('=') === -1\n if (isNotPair) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.startsWith('=')) {\n if (secondWord.length > 1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n const thirdWord = words[i + 2]\n i += 1\n if (thirdWord) {\n const newWord = word + '=' + thirdWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n }\n }\n if (word.endsWith('=')) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.indexOf('=') === -1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n\n const newWord = word.slice(0, -1)\n tokens.push({ type, content: newWord })\n continue\n }\n\n tokens.push({ type, content: word })\n }\n}\n\nconst lexSkipTag = (tagName: string, state: State) => {\n const { str, tokens } = state\n const safeTagName = tagName.toLowerCase()\n const len = str.length\n let index = state.position\n\n while (index < len) {\n const nextTag = str.indexOf('</', index)\n if (nextTag === -1) {\n lexText(state)\n break\n }\n\n const tagState = {\n str,\n position: state.position,\n tokens: []\n }\n jumpPosition(tagState, nextTag)\n const name = lexTag(tagState)\n if (safeTagName !== name.toLowerCase()) {\n index = tagState.position\n continue\n }\n\n if (nextTag !== state.position) {\n const textStart = state.position\n jumpPosition(state, nextTag)\n tokens.push({\n type: 'text',\n content: str.slice(textStart, nextTag)\n })\n }\n\n tokens.push(...tagState.tokens)\n jumpPosition(state, tagState.position)\n break\n }\n}\n\nconst lexTag = (state: State) => {\n const { str } = state\n const secondChar = str.charAt(state.position + 1)\n const tagStartClose = secondChar === '/'\n movePosition(state, tagStartClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-start',\n close: tagStartClose\n })\n\n const tagName = lexTagName(state)\n lexTagAttributes(state)\n\n const firstChar = str.charAt(state.position)\n const tagEndClose = firstChar === '/'\n movePosition(state, tagEndClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-end',\n close: tagEndClose\n })\n return tagName\n}\n\nconst lex = (state: State) => {\n const str = state.str\n const len = str.length\n\n while (state.position < len) {\n const start = state.position\n lexText(state)\n\n if (state.position === start) {\n const isComment = str.startsWith('!--', start + 1)\n if (isComment) lexComment(state)\n else {\n const tagName = lexTag(state)\n const safeTag = tagName.toLowerCase()\n if (childlessTags.includes(safeTag)) lexSkipTag(tagName, state)\n }\n }\n }\n}\n\nexport const lexer = (str: string): Token[] => {\n const state = {\n str,\n position: 0,\n tokens: []\n }\n lex(state)\n return state.tokens\n}\n","import type {\n Token,\n HTMLNode,\n TagToken,\n NormalElement,\n TagEndToken,\n AttributeToken,\n TextToken\n} from './types'\nimport { closingTags, closingTagAncestorBreakers, voidTags } from './tags'\n\ninterface StackItem {\n tagName: string | null\n children: HTMLNode[]\n}\n\ninterface State {\n stack: StackItem[]\n cursor: number\n tokens: Token[]\n}\n\nexport const parser = (tokens: Token[]) => {\n const root: StackItem = { tagName: null, children: [] }\n const state: State = { tokens, cursor: 0, stack: [root] }\n parse(state)\n return root.children\n}\n\nexport const hasTerminalParent = (tagName: string, stack: StackItem[]) => {\n const tagParents = closingTagAncestorBreakers[tagName]\n if (tagParents) {\n let currentIndex = stack.length - 1\n while (currentIndex >= 0) {\n const parentTagName = stack[currentIndex].tagName\n if (parentTagName === tagName) break\n if (parentTagName && tagParents.includes(parentTagName)) return true\n currentIndex--\n }\n }\n return false\n}\n\nexport const rewindStack = (stack: StackItem[], newLength: number) => {\n stack.splice(newLength)\n}\n\nexport const parse = (state: State) => {\n const { stack, tokens } = state\n let { cursor } = state\n let nodes = stack[stack.length - 1].children\n const len = tokens.length\n\n while (cursor < len) {\n const token = tokens[cursor]\n if (token.type !== 'tag-start') {\n nodes.push(token as TextToken)\n cursor++\n continue\n }\n\n const tagToken = tokens[++cursor] as TagToken\n cursor++\n const tagName = tagToken.content.toLowerCase()\n if (token.close) {\n let index = stack.length\n let shouldRewind = false\n while (--index > -1) {\n if (stack[index].tagName === tagName) {\n shouldRewind = true\n break\n }\n }\n while (cursor < len) {\n if (tokens[cursor].type !== 'tag-end') break\n cursor++\n }\n if (shouldRewind) {\n rewindStack(stack, index)\n break\n } else continue\n }\n\n const isClosingTag = closingTags.includes(tagName)\n let shouldRewindToAutoClose = isClosingTag\n if (shouldRewindToAutoClose) {\n shouldRewindToAutoClose = !hasTerminalParent(tagName, stack)\n }\n\n if (shouldRewindToAutoClose) {\n let currentIndex = stack.length - 1\n while (currentIndex > 0) {\n if (tagName === stack[currentIndex].tagName) {\n rewindStack(stack, currentIndex)\n const previousIndex = currentIndex - 1\n nodes = stack[previousIndex].children\n break\n }\n currentIndex = currentIndex - 1\n }\n }\n\n const attributes = []\n let tagEndToken: TagEndToken | undefined\n while (cursor < len) {\n const _token = tokens[cursor]\n if (_token.type === 'tag-end') {\n tagEndToken = _token as TagEndToken\n break\n }\n attributes.push((_token as AttributeToken).content)\n cursor++\n }\n\n if (!tagEndToken) break\n\n cursor++\n const children: HTMLNode[] = []\n const elementNode: NormalElement = {\n type: 'element',\n tagName: tagToken.content,\n attributes,\n children\n }\n nodes.push(elementNode)\n\n const hasChildren = !(tagEndToken.close || voidTags.includes(tagName))\n if (hasChildren) {\n stack.push({ tagName, children })\n const innerState = { tokens, cursor, stack }\n parse(innerState)\n cursor = innerState.cursor\n }\n }\n state.cursor = cursor\n}\n","import type { HTMLNode, CommentOrTextAST, ElementAST, AST } from './types'\n\nexport const splitHead = (str: string, sep: string) => {\n const idx = str.indexOf(sep)\n if (idx === -1) return [str]\n return [str.slice(0, idx), str.slice(idx + sep.length)]\n}\n\nconst unquote = (str: string) => {\n const car = str.charAt(0)\n const end = str.length - 1\n const isQuoteStart = car === '\"' || car === \"'\"\n if (isQuoteStart && car === str.charAt(end)) {\n return str.slice(1, end)\n }\n return str\n}\n\nconst formatAttributes = (attributes: string[]) => {\n return attributes.map(attribute => {\n const parts = splitHead(attribute.trim(), '=')\n const key = parts[0]\n const value = typeof parts[1] === 'string' ? unquote(parts[1]) : null\n return { key, value }\n })\n}\n\nexport const format = (nodes: HTMLNode[]): AST[] => {\n return nodes.map(node => {\n if (node.type === 'element') {\n const children = format(node.children)\n const item: ElementAST = {\n type: 'element',\n tagName: node.tagName.toLowerCase(),\n attributes: formatAttributes(node.attributes),\n children\n }\n return item\n }\n\n const item: CommentOrTextAST = {\n type: node.type,\n content: node.content\n }\n return item\n })\n}\n","import { lexer } from './lexer'\nimport { parser } from './parser'\nimport { format } from './format'\nexport type { AST } from './types'\n\nexport const toAST = (str: string) => {\n const tokens = lexer(str)\n const nodes = parser(tokens)\n return format(nodes)\n}\n","export const DEFAULT_WIDTH = 1000;\nexport const DEFAULT_HEIGHT = 562.5;\nexport const DEFAULT_FONT_SIZE = 16;\nexport const DEFAULT_FONT_FACE = \"微软雅黑\";\n","import type { ElementFill, FillGradient } from '../types/ppt'\nimport { formatColor } from './shared'\n\nfunction stripFillTags(value: string): string {\n return value\n .replace(/<a:solidFill>[\\s\\S]*?<\\/a:solidFill>/g, '')\n .replace(/<a:gradFill[\\s\\S]*?<\\/a:gradFill>/g, '')\n .replace(/<a:blipFill>[\\s\\S]*?<\\/a:blipFill>/g, '')\n .replace(/<a:noFill\\s*\\/>/g, '')\n .replace(/<a:noFill><\\/a:noFill>/g, '')\n}\n\nfunction buildColorXml(color: string): string {\n const normalized = formatColor(color)\n const alphaXml =\n normalized.alpha < 1\n ? `<a:alpha val=\"${Math.round(normalized.alpha * 100000)}\"/>`\n : ''\n\n return `<a:srgbClr val=\"${normalized.color.replace('#', '').toUpperCase()}\">${alphaXml}</a:srgbClr>`\n}\n\nfunction buildGradientFillXml(gradient?: FillGradient): string {\n const stops = gradient?.colors ?? []\n const colors = stops.length\n ? stops\n : [\n { pos: 0, color: '#FFFFFF' },\n { pos: 100, color: '#FFFFFF' }\n ]\n\n const gsLst = colors\n .map((stop) => {\n const pos = Math.max(0, Math.min(100, stop.pos ?? 0))\n return `<a:gs pos=\"${Math.round(pos * 1000)}\">${buildColorXml(\n stop.color ?? '#FFFFFF'\n )}</a:gs>`\n })\n .join('')\n\n const rotate = Math.round((gradient?.rotate ?? 0) * 60000)\n\n return `<a:gradFill rotWithShape=\"1\"><a:gsLst>${gsLst}</a:gsLst><a:lin ang=\"${rotate}\" scaled=\"0\"/></a:gradFill>`\n}\n\nfunction buildImageFillXml(relId: string, opacity?: number): string {\n const alphaXml =\n opacity !== undefined && Number.isFinite(opacity) && opacity >= 0 && opacity < 1\n ? `<a:alphaModFix amt=\"${Math.round(opacity * 100000)}\"/>`\n : ''\n\n return `<a:blipFill><a:blip r:embed=\"${relId}\">${alphaXml}</a:blip><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`\n}\n\nfunction insertFillXml(spPrInner: string, fillXml: string): string {\n const cleanedInner = stripFillTags(spPrInner)\n\n if (cleanedInner.includes('</a:custGeom>')) {\n return cleanedInner.replace('</a:custGeom>', `</a:custGeom>${fillXml}`)\n }\n\n if (cleanedInner.includes('</a:prstGeom>')) {\n return cleanedInner.replace('</a:prstGeom>', `</a:prstGeom>${fillXml}`)\n }\n\n const lineIndex = cleanedInner.indexOf('<a:ln')\n if (lineIndex === -1) {\n return `${cleanedInner}${fillXml}`\n }\n\n return `${cleanedInner.slice(0, lineIndex)}${fillXml}${cleanedInner.slice(lineIndex)}`\n}\n\nfunction buildFillXml(fill: ElementFill, relId?: string): string {\n if (fill.type === 'gradient') {\n return buildGradientFillXml(fill.gradient)\n }\n\n if (fill.type === 'image') {\n if (!relId) {\n throw new Error('Image fills require a relationship id')\n }\n return buildImageFillXml(relId, fill.opacity)\n }\n\n return `<a:solidFill>${buildColorXml(fill.color ?? '#FFFFFF')}</a:solidFill>`\n}\n\nexport function fillRequiresXmlPatch(fill?: ElementFill): boolean {\n return fill?.type === 'gradient' || fill?.type === 'image'\n}\n\nexport function getFillFallbackColor(fill?: ElementFill, fallback = '#FFFFFF'): string {\n if (!fill) return fallback\n if (fill.type === 'solid') return fill.color ?? fallback\n if (fill.type === 'gradient') {\n return fill.gradient?.colors?.[0]?.color ?? fallback\n }\n return fallback\n}\n\nexport function applyShapeFillPatch(\n slideXml: string,\n objectName: string,\n fill: ElementFill,\n relId?: string\n): string {\n const nameToken = `name=\"${objectName}\"`\n let cursor = 0\n let result = slideXml\n\n while (true) {\n const nameIndex = result.indexOf(nameToken, cursor)\n if (nameIndex === -1) break\n\n const spStart = result.lastIndexOf('<p:sp', nameIndex)\n const spEnd = result.indexOf('</p:sp>', nameIndex)\n if (spStart === -1 || spEnd === -1) break\n\n const spXml = result.slice(spStart, spEnd + '</p:sp>'.length)\n const spPrStart = spXml.indexOf('<p:spPr>')\n const spPrEnd = spXml.indexOf('</p:spPr>')\n if (spPrStart === -1 || spPrEnd === -1) {\n cursor = spEnd + 1\n continue\n }\n\n const spPrOpenEnd = spXml.indexOf('>', spPrStart)\n const spPrInner = spXml.slice(spPrOpenEnd + 1, spPrEnd)\n const fillXml = buildFillXml(fill, relId)\n const nextInner = insertFillXml(spPrInner, fillXml)\n const updatedSpXml = spXml.slice(0, spPrOpenEnd + 1) + nextInner + spXml.slice(spPrEnd)\n\n result = result.slice(0, spStart) + updatedSpXml + result.slice(spEnd + '</p:sp>'.length)\n cursor = spStart + updatedSpXml.length\n }\n\n return result\n}\n\nexport function applyBackgroundFillPatch(\n slideXml: string,\n fill: ElementFill,\n relId?: string\n): string {\n const bgPrStart = slideXml.indexOf('<p:bgPr>')\n const bgPrEnd = slideXml.indexOf('</p:bgPr>')\n if (bgPrStart === -1 || bgPrEnd === -1) return slideXml\n\n const openEnd = slideXml.indexOf('>', bgPrStart)\n const bgPrInner = slideXml.slice(openEnd + 1, bgPrEnd)\n const fillXml = buildFillXml(fill, relId)\n const nextInner = `${stripFillTags(bgPrInner)}${fillXml}`\n\n return slideXml.slice(0, openEnd + 1) + nextInner + slideXml.slice(bgPrEnd)\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Presentation } from \"../types/ppt\";\nimport { getFillFallbackColor } from \"./fill-patch\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: NonNullable<Presentation[\"slides\"]>[number],\n theme: Presentation[\"theme\"]\n): void {\n const backgroundColor = slideJson.background\n ? getFillFallbackColor(slideJson.background, theme?.backgroundColor ?? \"#FFFFFF\")\n : theme?.backgroundColor;\n if (!backgroundColor) return;\n const c = formatColor(backgroundColor);\n slide.background = { color: c.color, transparency: (1 - c.alpha) * 100 };\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function applyPptxLayout(pptx: PptxGenJS, width: number, height: number): void {\n const viewportRatio = height / width;\n if (Math.abs(viewportRatio - 0.625) < 0.001) {\n pptx.layout = \"LAYOUT_16x10\";\n return;\n }\n if (Math.abs(viewportRatio - 0.75) < 0.001) {\n pptx.layout = \"LAYOUT_4x3\";\n return;\n }\n if (Math.abs(viewportRatio - 0.70710678) < 0.0001) {\n pptx.defineLayout({ name: \"A3\", width: 10, height: 7.0710678 });\n pptx.layout = \"A3\";\n return;\n }\n if (Math.abs(viewportRatio - 1.41421356) < 0.0001) {\n pptx.defineLayout({ name: \"A3_V\", width: 10, height: 14.1421356 });\n pptx.layout = \"A3_V\";\n return;\n }\n pptx.layout = \"LAYOUT_16x9\";\n}\n","import { SVGPathData } from 'svg-pathdata'\nimport arcToBezier from 'svg-arc-to-cubic-bezier'\n\nconst typeMap: Record<number, string> = {\n 1: 'Z',\n 2: 'M',\n 4: 'H',\n 8: 'V',\n 16: 'L',\n 32: 'C',\n 64: 'S',\n 128: 'Q',\n 256: 'T',\n 512: 'A'\n}\n\nexport const toPoints = (d: string) => {\n if (!d) return []\n if (d.includes('NaN') || d.includes('undefined') || d.includes('null')) return []\n\n let pathData: any\n try {\n pathData = new SVGPathData(d)\n } catch {\n return []\n }\n\n const points: any[] = []\n for (const item of pathData.commands) {\n const type = typeMap[item.type]\n\n if (item.type === 2 || item.type === 16) {\n points.push({\n x: item.x,\n y: item.y,\n relative: item.relative,\n type\n })\n }\n if (item.type === 32) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'cubic',\n x1: item.x1,\n y1: item.y1,\n x2: item.x2,\n y2: item.y2\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 128) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'quadratic',\n x1: item.x1,\n y1: item.y1\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 512) {\n const lastPoint = points[points.length - 1] as any\n if (!lastPoint || !['M', 'L', 'Q', 'C'].includes(lastPoint.type)) continue\n\n const cubicBezierPoints = arcToBezier({\n px: lastPoint.x as number,\n py: lastPoint.y as number,\n cx: item.x,\n cy: item.y,\n rx: item.rX,\n ry: item.rY,\n xAxisRotation: item.xRot,\n largeArcFlag: item.lArcFlag,\n sweepFlag: item.sweepFlag\n }) as Array<{ x: number; y: number; x1: number; y1: number; x2: number; y2: number }>\n for (const cbPoint of cubicBezierPoints) {\n points.push({\n x: cbPoint.x,\n y: cbPoint.y,\n curve: {\n type: 'cubic',\n x1: cbPoint.x1,\n y1: cbPoint.y1,\n x2: cbPoint.x2,\n y2: cbPoint.y2\n },\n relative: false,\n type: 'C'\n })\n }\n } else if (item.type === 1) {\n points.push({ close: true, type })\n } else continue\n }\n return points\n}\n\nexport type SvgPoints = ReturnType<typeof toPoints>\n","import type { SvgPoints } from \"../svgPathParser\";\n\ntype Points = Array<\n | { x: number; y: number; moveTo?: boolean }\n | { x: number; y: number; curve: { type: \"arc\"; hR: number; wR: number; stAng: number; swAng: number } }\n | { x: number; y: number; curve: { type: \"quadratic\"; x1: number; y1: number } }\n | { x: number; y: number; curve: { type: \"cubic\"; x1: number; y1: number; x2: number; y2: number } }\n | { close: true }\n>;\n\nexport function formatPoints(\n points: SvgPoints,\n ratioPx2Inch: number,\n scale = { x: 1, y: 1 }\n): Points {\n return points.map((point) => {\n if (\"close\" in point) {\n return { close: true };\n }\n if (point.type === \"M\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n moveTo: true\n };\n }\n if (point.curve) {\n if (point.curve.type === \"cubic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"cubic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y,\n x2: (point.curve.x2 as number) / ratioPx2Inch * scale.x,\n y2: (point.curve.y2 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n if (point.curve.type === \"quadratic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"quadratic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n }\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y\n };\n });\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function isBase64Image(url: string): boolean {\n const regex = /^data:image\\/[^;]+;base64,/;\n return regex.test(url);\n}\n\nexport function getLineArrowType(\n value?: unknown\n): PptxGenJS.ShapeLineProps[\"beginArrowType\"] {\n if (value === \"arrow\") return \"arrow\";\n if (value === \"dot\") return \"oval\";\n return \"none\";\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Presentation, SlideElement } from \"../types/ppt\";\nimport { resolveImageData } from \"../resolveImageData\";\nimport { toPoints } from \"../svgPathParser\";\nimport { getElementRange, getLineElementPath } from \"../element\";\nimport { DEFAULT_FONT_FACE, DEFAULT_FONT_SIZE } from \"./constants\";\nimport { fillRequiresXmlPatch } from \"./fill-patch\";\nimport { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type FillPatch } from \"./types\";\nimport {\n buildTableRows,\n formatColor,\n formatHTML,\n getDashTypeMap,\n getElementOpacity,\n getFilterOpacity,\n getOutlineOption,\n getShadowOption\n} from \"./shared\";\n\nexport function addTextElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n presentation: Presentation,\n slideIndex: number,\n elementIndex: number,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number,\n fillPatches: FillPatch[]\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n const objectName = `text-${slideIndex}-${element.id ?? elementIndex}`;\n const fill = element.fill;\n\n const options: PptxGenJS.TextPropsOptions & { objectName?: string } = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace:\n element.defaultFontName || presentation.theme?.fontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n valign: \"top\",\n // pptxgenjs margin order: [left, right, bottom, top]\n // Keep horizontal padding while removing vertical inset to match preview baseline.\n margin: [textPadding, textPadding, 0, textPadding * 0.42],\n paraSpaceBefore: 0,\n lineSpacingMultiple: 1.5,\n fit: \"none\",\n objectName\n };\n if (element.rotate) options.rotate = element.rotate;\n if (element.wordSpace) options.charSpacing = element.wordSpace / ratioPx2Pt;\n if (element.lineHeight) options.lineSpacingMultiple = element.lineHeight;\n if (fill?.type === \"solid\" && fill.color) {\n const c = formatColor(fill.color);\n options.fill = {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n if (fill && fillRequiresXmlPatch(fill)) {\n fillPatches.push({\n kind: \"shape\",\n slideIndex,\n objectName,\n fill\n });\n }\n if (element.defaultColor) options.color = formatColor(element.defaultColor).color;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.opacity !== undefined) options.transparency = (1 - opacity) * 100;\n if (element.paragraphSpace !== undefined) {\n options.paraSpaceBefore = element.paragraphSpace / ratioPx2Pt;\n }\n if (element.vertical) options.vert = \"eaVert\";\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n\n slide.addText(textProps, options);\n}\n\nexport async function addImageElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Inch: number\n): Promise<void> {\n if (element.type !== \"image\" || !element.src) return;\n\n const options: PptxGenJS.ImageProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch\n };\n\n if (isBase64Image(element.src)) options.data = element.src;\n else options.data = await resolveImageData(element.src);\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.rotate) options.rotate = element.rotate;\n const filterOpacity = getFilterOpacity(element.filters?.opacity) ?? 1;\n const elementOpacity = getElementOpacity(element.opacity);\n const imageOpacity = filterOpacity * elementOpacity;\n if (imageOpacity !== 1) {\n options.transparency = (1 - imageOpacity) * 100;\n }\n if (element.clip?.range) {\n if (element.clip.shape === \"ellipse\") options.rounding = true;\n\n const [start, end] = element.clip.range;\n const [startX, startY] = start;\n const [endX, endY] = end;\n\n const originW = (element.width ?? 0) / ((endX - startX) / ratioPx2Inch);\n const originH = (element.height ?? 0) / ((endY - startY) / ratioPx2Inch);\n\n options.w = originW / ratioPx2Inch;\n options.h = originH / ratioPx2Inch;\n\n options.sizing = {\n type: \"crop\",\n x: (startX / ratioPx2Inch) * (originW / ratioPx2Inch),\n y: (startY / ratioPx2Inch) * (originH / ratioPx2Inch),\n w: ((endX - startX) / ratioPx2Inch) * (originW / ratioPx2Inch),\n h: ((endY - startY) / ratioPx2Inch) * (originH / ratioPx2Inch)\n };\n }\n\n slide.addImage(options);\n}\n\nexport function addShapeElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n slideIndex: number,\n elementIndex: number,\n fillPatches: FillPatch[]\n): void {\n if (element.type !== \"shape\" || !element.path || !element.viewBox) return;\n const scale = {\n x: (element.width ?? 0) / element.viewBox[0],\n y: (element.height ?? 0) / element.viewBox[1]\n };\n const rawPoints = toPoints(element.path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch, scale);\n const fill = element.fill;\n const opacity = getElementOpacity(element.opacity);\n const objectName = `shape-${slideIndex}-${element.id ?? elementIndex}`;\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n points,\n objectName\n };\n\n if (fill?.type === \"solid\" && fill.color) {\n const fillColor = formatColor(fill.color);\n options.fill = {\n color: fillColor.color,\n transparency: (1 - fillColor.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n if (fill && fillRequiresXmlPatch(fill)) {\n fillPatches.push({\n kind: \"shape\",\n slideIndex,\n objectName,\n fill\n });\n }\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.rotate) options.rotate = element.rotate;\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n\n if (!element.text?.content) return;\n const textProps = formatHTML(element.text.content, ratioPx2Pt);\n const textOptions: PptxGenJS.TextPropsOptions & { objectName?: string } = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.text.defaultFontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n paraSpaceBefore: 0,\n valign:\n element.text.align === \"middle\"\n ? \"middle\"\n : (element.text.align as PptxGenJS.VAlign),\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\",\n objectName: `shape-text-${slideIndex}-${element.id ?? elementIndex}`\n };\n textOptions.margin = 0;\n if (element.rotate) textOptions.rotate = element.rotate;\n if (element.text.defaultColor) {\n textOptions.color = formatColor(element.text.defaultColor).color;\n }\n if (element.opacity !== undefined) {\n textOptions.transparency = (1 - opacity) * 100;\n }\n if (element.flipH) textOptions.flipH = element.flipH;\n if (element.flipV) textOptions.flipV = element.flipV;\n\n slide.addText(textProps, textOptions);\n}\n\nexport function addLineElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"line\" || !element.start || !element.end) return;\n const path = getLineElementPath(element);\n const rawPoints = toPoints(path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch);\n const { minX, maxX, minY, maxY } = getElementRange(element);\n const c = formatColor(element.color || \"#000000\");\n const opacity = getElementOpacity(element.opacity);\n const pointsMeta = element.points ?? [];\n const dashTypeMap = getDashTypeMap();\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (maxX - minX) / ratioPx2Inch,\n h: (maxY - minY) / ratioPx2Inch,\n line: {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100,\n width: (element.width ?? 1) / ratioPx2Pt,\n dashType: element.style ? dashTypeMap[element.style] : \"solid\",\n beginArrowType: getLineArrowType(pointsMeta[0]),\n endArrowType: getLineArrowType(pointsMeta[1])\n },\n points\n };\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n}\n\nexport function addTableElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"table\") return;\n const rows = buildTableRows(element, ratioPx2Pt, ratioPx2Inch);\n if (!rows.length) return;\n\n const colWidths = (element as any).colWidths as number[] | undefined;\n const colW = colWidths\n ? colWidths.map((ratio) => ((element.width ?? 0) * ratio) / ratioPx2Inch)\n : undefined;\n\n const rowCount = rows.length || 1;\n const baseRowHeight = ((element.height ?? 0) / rowCount) / ratioPx2Inch;\n const minRowHeight = (element as any).cellMinHeight\n ? (element as any).cellMinHeight / ratioPx2Inch\n : undefined;\n const rowH = minRowHeight\n ? new Array(rowCount).fill(Math.max(minRowHeight, baseRowHeight))\n : undefined;\n\n const outline = element.outline;\n const border =\n outline?.width || outline?.color\n ? {\n pt: (outline.width ?? 1) / ratioPx2Pt,\n color: formatColor(outline.color || \"#000000\").color.replace(\"#\", \"\")\n }\n : {\n pt: 1 / ratioPx2Pt,\n color: \"DDDDDD\"\n };\n\n slide.addTable(rows, {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n colW,\n rowH,\n border,\n margin: 0\n });\n}\n"],"mappings":"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","names":["base64","newWord","item","tinycolor","parse","attr","_a","_b","_a","_b","arcToBezier","dashTypeMap","_a","PptxGenJS","JSZip"]}
package/dist/index.mjs CHANGED
@@ -871,8 +871,9 @@ function getShadowOption(shadow, ratioPx2Pt) {
871
871
  angle = 225;
872
872
  }
873
873
  return {
874
+ type: "outer",
874
875
  color: c.color,
875
- transparency: (1 - c.alpha) * 100,
876
+ opacity: c.alpha,
876
877
  blur: ((_b = shadow.blur) != null ? _b : 0) / ratioPx2Pt,
877
878
  offset,
878
879
  angle
@@ -1193,7 +1194,7 @@ function getLineArrowType(value) {
1193
1194
  }
1194
1195
 
1195
1196
  // src/renderers/elements.ts
1196
- function addTextElement(slide, element, template, slideIndex, elementIndex, ratioPx2Pt, ratioPx2Inch, textPadding, fillPatches) {
1197
+ function addTextElement(slide, element, presentation, slideIndex, elementIndex, ratioPx2Pt, ratioPx2Inch, textPadding, fillPatches) {
1197
1198
  var _a, _b, _c, _d, _e, _f, _g;
1198
1199
  if (element.type !== "text" || !element.content) return;
1199
1200
  const textProps = formatHTML(element.content, ratioPx2Pt);
@@ -1206,7 +1207,7 @@ function addTextElement(slide, element, template, slideIndex, elementIndex, rati
1206
1207
  w: ((_d = element.width) != null ? _d : 0) / ratioPx2Inch,
1207
1208
  h: ((_e = element.height) != null ? _e : 0) / ratioPx2Inch,
1208
1209
  fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,
1209
- fontFace: element.defaultFontName || ((_f = template.theme) == null ? void 0 : _f.fontName) || DEFAULT_FONT_FACE,
1210
+ fontFace: element.defaultFontName || ((_f = presentation.theme) == null ? void 0 : _f.fontName) || DEFAULT_FONT_FACE,
1210
1211
  color: "#000000",
1211
1212
  valign: "top",
1212
1213
  // pptxgenjs margin order: [left, right, bottom, top]
@@ -1347,7 +1348,7 @@ function addShapeElement(slide, element, ratioPx2Pt, ratioPx2Inch, slideIndex, e
1347
1348
  fontFace: element.text.defaultFontName || DEFAULT_FONT_FACE,
1348
1349
  color: "#000000",
1349
1350
  paraSpaceBefore: 0,
1350
- valign: element.text.align === "middle" ? "mid" : element.text.align,
1351
+ valign: element.text.align === "middle" ? "middle" : element.text.align,
1351
1352
  fill: { color: "FFFFFF", transparency: 100 },
1352
1353
  fit: "none",
1353
1354
  objectName: `shape-text-${slideIndex}-${(_n = element.id) != null ? _n : elementIndex}`
@@ -1451,21 +1452,21 @@ function parseDataUrlImage(dataUrl) {
1451
1452
  };
1452
1453
  return { mime, data, ext: (_a = extMap[mime]) != null ? _a : "png" };
1453
1454
  }
1454
- async function createPPTX(template) {
1455
+ async function createPPTX(presentation) {
1455
1456
  var _a, _b, _c, _d;
1456
- const parsedTemplate = parseDocument(template);
1457
- const renderTemplate = parsedTemplate;
1457
+ const parsedPresentation = parseDocument(presentation);
1458
+ const normalizedPresentation = parsedPresentation;
1458
1459
  const pptx = new PptxGenJS();
1459
1460
  const fillPatches = [];
1460
- const width = parsedTemplate.width;
1461
- const height = parsedTemplate.height;
1461
+ const width = parsedPresentation.width;
1462
+ const height = parsedPresentation.height;
1462
1463
  const ratioPx2Inch = 96 * (width / 960);
1463
1464
  const ratioPx2Pt = 96 / 72 * (width / 960);
1464
1465
  const textPadding = 10 / ratioPx2Pt;
1465
1466
  applyPptxLayout(pptx, width, height);
1466
- for (const [slideIndex, slideJson] of ((_a = renderTemplate.slides) != null ? _a : []).entries()) {
1467
+ for (const [slideIndex, slideJson] of ((_a = normalizedPresentation.slides) != null ? _a : []).entries()) {
1467
1468
  const slide = pptx.addSlide();
1468
- applySlideBackground(slide, slideJson, renderTemplate.theme);
1469
+ applySlideBackground(slide, slideJson, normalizedPresentation.theme);
1469
1470
  if (slideJson.background && fillRequiresXmlPatch(slideJson.background)) {
1470
1471
  fillPatches.push({
1471
1472
  kind: "background",
@@ -1477,7 +1478,7 @@ async function createPPTX(template) {
1477
1478
  addTextElement(
1478
1479
  slide,
1479
1480
  element,
1480
- renderTemplate,
1481
+ normalizedPresentation,
1481
1482
  slideIndex,
1482
1483
  elementIndex,
1483
1484
  ratioPx2Pt,
@@ -1499,7 +1500,7 @@ async function createPPTX(template) {
1499
1500
  addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);
1500
1501
  }
1501
1502
  }
1502
- const fileName = `${sanitizeFileName(parsedTemplate.title || "presentation")}.pptx`;
1503
+ const fileName = `${sanitizeFileName(parsedPresentation.title || "presentation")}.pptx`;
1503
1504
  const pptxBuffer = await pptx.write({
1504
1505
  outputType: "arraybuffer",
1505
1506
  compression: true