json2pptx 0.4.0 → 0.4.2

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.d.mts CHANGED
@@ -122,7 +122,7 @@ declare const getLineElementPath: (element: SlideElement) => string;
122
122
 
123
123
  declare const resolveImageData: (src: string) => Promise<string>;
124
124
 
125
- declare const ENABLE_DECK_JSON = true;
125
+ declare const ENABLE_DECK_JSON = false;
126
126
  declare const PPTX_JSON_PAYLOAD_PATH = "json2ppt-editor.json";
127
127
  declare const PPTX_JSON_PAYLOAD_VERSION = 1;
128
128
  declare function createPPTX(template: Deck): Promise<{
package/dist/index.d.ts CHANGED
@@ -122,7 +122,7 @@ declare const getLineElementPath: (element: SlideElement) => string;
122
122
 
123
123
  declare const resolveImageData: (src: string) => Promise<string>;
124
124
 
125
- declare const ENABLE_DECK_JSON = true;
125
+ declare const ENABLE_DECK_JSON = false;
126
126
  declare const PPTX_JSON_PAYLOAD_PATH = "json2ppt-editor.json";
127
127
  declare const PPTX_JSON_PAYLOAD_VERSION = 1;
128
128
  declare function createPPTX(template: Deck): Promise<{
package/dist/index.js CHANGED
@@ -99,6 +99,8 @@ var getLineElementPath = (element) => {
99
99
 
100
100
  // src/resolveImageData.ts
101
101
  var dataUrlRegex = /^data:image\/[^;]+;base64,/;
102
+ var resolvedImageCache = /* @__PURE__ */ new Map();
103
+ var MAX_IMAGE_CACHE_ENTRIES = 8;
102
104
  var mimeFromPath = (path) => {
103
105
  const lower = path.toLowerCase();
104
106
  if (lower.endsWith(".png")) return "image/png";
@@ -126,7 +128,7 @@ var readLocalFile = async (path) => {
126
128
  const buffer = await fs.readFile(path);
127
129
  return buffer.toString("base64");
128
130
  };
129
- var resolveImageData = async (src) => {
131
+ async function resolveImageDataUncached(src) {
130
132
  var _a;
131
133
  if (dataUrlRegex.test(src)) return src;
132
134
  const isFileUrl = src.startsWith("file://");
@@ -149,6 +151,22 @@ var resolveImageData = async (src) => {
149
151
  const base64 = toBase64(arrayBuffer);
150
152
  const contentType = response.headers.get("content-type") || mimeFromPath(src);
151
153
  return `data:${contentType};base64,${base64}`;
154
+ }
155
+ var resolveImageData = async (src) => {
156
+ if (dataUrlRegex.test(src)) return src;
157
+ const cached = resolvedImageCache.get(src);
158
+ if (cached) return cached;
159
+ while (resolvedImageCache.size >= MAX_IMAGE_CACHE_ENTRIES) {
160
+ const firstKey = resolvedImageCache.keys().next().value;
161
+ if (!firstKey) break;
162
+ resolvedImageCache.delete(firstKey);
163
+ }
164
+ const pending = resolveImageDataUncached(src).catch((error) => {
165
+ resolvedImageCache.delete(src);
166
+ throw error;
167
+ });
168
+ resolvedImageCache.set(src, pending);
169
+ return pending;
152
170
  };
153
171
 
154
172
  // src/renderers/shared.ts
@@ -1331,7 +1349,7 @@ function addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch) {
1331
1349
  }
1332
1350
 
1333
1351
  // src/index.ts
1334
- var ENABLE_DECK_JSON = true;
1352
+ var ENABLE_DECK_JSON = false;
1335
1353
  var PPTX_JSON_PAYLOAD_PATH = "json2ppt-editor.json";
1336
1354
  var PPTX_JSON_PAYLOAD_VERSION = 1;
1337
1355
  function sanitizeFileName(name) {
@@ -1427,7 +1445,7 @@ async function createPPTX(template) {
1427
1445
  outputType: "arraybuffer",
1428
1446
  compression: true
1429
1447
  });
1430
- const needsZip = ENABLE_DECK_JSON || patternShapes.length > 0;
1448
+ const needsZip = patternShapes.length > 0;
1431
1449
  if (!needsZip) {
1432
1450
  return { blob: new Blob([pptxBuffer]), fileName };
1433
1451
  }
@@ -1478,19 +1496,6 @@ async function createPPTX(template) {
1478
1496
  zip.file(`ppt/slides/_rels/slide${slideNumber}.xml.rels`, xml);
1479
1497
  }
1480
1498
  }
1481
- if (ENABLE_DECK_JSON) {
1482
- zip.file(
1483
- PPTX_JSON_PAYLOAD_PATH,
1484
- JSON.stringify(
1485
- {
1486
- version: PPTX_JSON_PAYLOAD_VERSION,
1487
- deck: parsedTemplate
1488
- },
1489
- null,
1490
- 2
1491
- )
1492
- );
1493
- }
1494
1499
  const blob = await zip.generateAsync({ type: "blob" });
1495
1500
  return { blob, fileName };
1496
1501
  }
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/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 { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type PatternShape } from \"./renderers/types\";\nexport const ENABLE_DECK_JSON = true;\nexport const PPTX_JSON_PAYLOAD_PATH = \"json2ppt-editor.json\";\nexport const PPTX_JSON_PAYLOAD_VERSION = 1;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\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 applyPatternFill(slideXml: string, objectName: string, relId: string): 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 cleanedInner = stripFillTags(spPrInner);\n const blipFill = `<a:blipFill><a:blip r:embed=\"${relId}\"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`;\n let nextInner = cleanedInner;\n\n if (cleanedInner.includes(\"</a:custGeom>\")) {\n nextInner = cleanedInner.replace(\"</a:custGeom>\", `</a:custGeom>${blipFill}`);\n } else {\n const lnIndex = cleanedInner.indexOf(\"<a:ln\");\n nextInner =\n lnIndex === -1\n ? `${cleanedInner}${blipFill}`\n : `${cleanedInner.slice(0, lnIndex)}${blipFill}${cleanedInner.slice(lnIndex)}`;\n }\n\n const updatedSpXml =\n spXml.slice(0, spPrOpenEnd + 1) +\n nextInner +\n 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\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: Deck\n): Promise<{ blob: Blob; fileName: string }> {\n const parsedTemplate = parseDocument(template);\n const renderTemplate = parsedTemplate as unknown as Deck;\n\n const pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\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\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n patternShapes\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 const needsZip = ENABLE_DECK_JSON || patternShapes.length > 0;\n if (!needsZip) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n if (patternShapes.length) {\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 pattern of patternShapes) {\n const parsed = parseDataUrlImage(pattern.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 slideNumber = pattern.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\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 const relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n const nextRelsXml = relsXml.replace(\n \"</Relationships>\",\n `${relEntry}</Relationships>`\n );\n relsCache.set(slideNumber, nextRelsXml);\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n const nextSlideXml = slideXml\n ? applyPatternFill(slideXml, pattern.objectName, relId)\n : slideXml;\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\n if (ENABLE_DECK_JSON) {\n zip.file(\n PPTX_JSON_PAYLOAD_PATH,\n JSON.stringify(\n {\n version: PPTX_JSON_PAYLOAD_VERSION,\n deck: parsedTemplate\n },\n null,\n 2\n )\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 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,/\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\nexport const resolveImageData = async (src: 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","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 PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck } from \"../types/ppt\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: Deck[\"slides\"][number],\n theme: Deck[\"theme\"]\n): void {\n const backgroundColor = slideJson.background?.color ?? 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 { Deck, 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 { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type PatternShape } 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: Deck,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.TextPropsOptions = {\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 };\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 (element.fill) {\n const c = formatColor(element.fill);\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 (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 patternShapes: PatternShape[]\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 pattern = (element as any).pattern as string | undefined;\n const hasFill = typeof element.fill === \"string\" ? element.fill.trim().length > 0 : false;\n const opacity = getElementOpacity(element.opacity);\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 };\n\n if (pattern) {\n const objectName = `pattern-${slideIndex}-${element.id ?? elementIndex}`;\n options.objectName = objectName;\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n patternShapes.push({ slideIndex, objectName, dataUrl: pattern });\n } else if (hasFill) {\n const fillColor = formatColor(element.fill || \"#000000\");\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\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 = {\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: element.text.align as PptxGenJS.VAlign,\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\"\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","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/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 { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type PatternShape } from \"./renderers/types\";\nexport const ENABLE_DECK_JSON = false;\nexport const PPTX_JSON_PAYLOAD_PATH = \"json2ppt-editor.json\";\nexport const PPTX_JSON_PAYLOAD_VERSION = 1;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\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 applyPatternFill(slideXml: string, objectName: string, relId: string): 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 cleanedInner = stripFillTags(spPrInner);\n const blipFill = `<a:blipFill><a:blip r:embed=\"${relId}\"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`;\n let nextInner = cleanedInner;\n\n if (cleanedInner.includes(\"</a:custGeom>\")) {\n nextInner = cleanedInner.replace(\"</a:custGeom>\", `</a:custGeom>${blipFill}`);\n } else {\n const lnIndex = cleanedInner.indexOf(\"<a:ln\");\n nextInner =\n lnIndex === -1\n ? `${cleanedInner}${blipFill}`\n : `${cleanedInner.slice(0, lnIndex)}${blipFill}${cleanedInner.slice(lnIndex)}`;\n }\n\n const updatedSpXml =\n spXml.slice(0, spPrOpenEnd + 1) +\n nextInner +\n 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\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: Deck\n): Promise<{ blob: Blob; fileName: string }> {\n const parsedTemplate = parseDocument(template);\n const renderTemplate = parsedTemplate as unknown as Deck;\n\n const pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\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\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n patternShapes\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 const needsZip = patternShapes.length > 0;\n if (!needsZip) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n if (patternShapes.length) {\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 pattern of patternShapes) {\n const parsed = parseDataUrlImage(pattern.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 slideNumber = pattern.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\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 const relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n const nextRelsXml = relsXml.replace(\n \"</Relationships>\",\n `${relEntry}</Relationships>`\n );\n relsCache.set(slideNumber, nextRelsXml);\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n const nextSlideXml = slideXml\n ? applyPatternFill(slideXml, pattern.objectName, relId)\n : slideXml;\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\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 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 PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck } from \"../types/ppt\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: Deck[\"slides\"][number],\n theme: Deck[\"theme\"]\n): void {\n const backgroundColor = slideJson.background?.color ?? 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 { Deck, 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 { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type PatternShape } 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: Deck,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.TextPropsOptions = {\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 };\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 (element.fill) {\n const c = formatColor(element.fill);\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 (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 patternShapes: PatternShape[]\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 pattern = (element as any).pattern as string | undefined;\n const hasFill = typeof element.fill === \"string\" ? element.fill.trim().length > 0 : false;\n const opacity = getElementOpacity(element.opacity);\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 };\n\n if (pattern) {\n const objectName = `pattern-${slideIndex}-${element.id ?? elementIndex}`;\n options.objectName = objectName;\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n patternShapes.push({ slideIndex, objectName, dataUrl: pattern });\n } else if (hasFill) {\n const fillColor = formatColor(element.fill || \"#000000\");\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\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 = {\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: element.text.align as PptxGenJS.VAlign,\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\"\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","arcToBezier","dashTypeMap","_a","PptxGenJS","JSZip"]}
package/dist/index.mjs CHANGED
@@ -58,6 +58,8 @@ var getLineElementPath = (element) => {
58
58
 
59
59
  // src/resolveImageData.ts
60
60
  var dataUrlRegex = /^data:image\/[^;]+;base64,/;
61
+ var resolvedImageCache = /* @__PURE__ */ new Map();
62
+ var MAX_IMAGE_CACHE_ENTRIES = 8;
61
63
  var mimeFromPath = (path) => {
62
64
  const lower = path.toLowerCase();
63
65
  if (lower.endsWith(".png")) return "image/png";
@@ -85,7 +87,7 @@ var readLocalFile = async (path) => {
85
87
  const buffer = await fs.readFile(path);
86
88
  return buffer.toString("base64");
87
89
  };
88
- var resolveImageData = async (src) => {
90
+ async function resolveImageDataUncached(src) {
89
91
  var _a;
90
92
  if (dataUrlRegex.test(src)) return src;
91
93
  const isFileUrl = src.startsWith("file://");
@@ -108,6 +110,22 @@ var resolveImageData = async (src) => {
108
110
  const base64 = toBase64(arrayBuffer);
109
111
  const contentType = response.headers.get("content-type") || mimeFromPath(src);
110
112
  return `data:${contentType};base64,${base64}`;
113
+ }
114
+ var resolveImageData = async (src) => {
115
+ if (dataUrlRegex.test(src)) return src;
116
+ const cached = resolvedImageCache.get(src);
117
+ if (cached) return cached;
118
+ while (resolvedImageCache.size >= MAX_IMAGE_CACHE_ENTRIES) {
119
+ const firstKey = resolvedImageCache.keys().next().value;
120
+ if (!firstKey) break;
121
+ resolvedImageCache.delete(firstKey);
122
+ }
123
+ const pending = resolveImageDataUncached(src).catch((error) => {
124
+ resolvedImageCache.delete(src);
125
+ throw error;
126
+ });
127
+ resolvedImageCache.set(src, pending);
128
+ return pending;
111
129
  };
112
130
 
113
131
  // src/renderers/shared.ts
@@ -1290,7 +1308,7 @@ function addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch) {
1290
1308
  }
1291
1309
 
1292
1310
  // src/index.ts
1293
- var ENABLE_DECK_JSON = true;
1311
+ var ENABLE_DECK_JSON = false;
1294
1312
  var PPTX_JSON_PAYLOAD_PATH = "json2ppt-editor.json";
1295
1313
  var PPTX_JSON_PAYLOAD_VERSION = 1;
1296
1314
  function sanitizeFileName(name) {
@@ -1386,7 +1404,7 @@ async function createPPTX(template) {
1386
1404
  outputType: "arraybuffer",
1387
1405
  compression: true
1388
1406
  });
1389
- const needsZip = ENABLE_DECK_JSON || patternShapes.length > 0;
1407
+ const needsZip = patternShapes.length > 0;
1390
1408
  if (!needsZip) {
1391
1409
  return { blob: new Blob([pptxBuffer]), fileName };
1392
1410
  }
@@ -1437,19 +1455,6 @@ async function createPPTX(template) {
1437
1455
  zip.file(`ppt/slides/_rels/slide${slideNumber}.xml.rels`, xml);
1438
1456
  }
1439
1457
  }
1440
- if (ENABLE_DECK_JSON) {
1441
- zip.file(
1442
- PPTX_JSON_PAYLOAD_PATH,
1443
- JSON.stringify(
1444
- {
1445
- version: PPTX_JSON_PAYLOAD_VERSION,
1446
- deck: parsedTemplate
1447
- },
1448
- null,
1449
- 2
1450
- )
1451
- );
1452
- }
1453
1458
  const blob = await zip.generateAsync({ type: "blob" });
1454
1459
  return { blob, fileName };
1455
1460
  }
@@ -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/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 { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type PatternShape } from \"./renderers/types\";\nexport const ENABLE_DECK_JSON = true;\nexport const PPTX_JSON_PAYLOAD_PATH = \"json2ppt-editor.json\";\nexport const PPTX_JSON_PAYLOAD_VERSION = 1;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\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 applyPatternFill(slideXml: string, objectName: string, relId: string): 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 cleanedInner = stripFillTags(spPrInner);\n const blipFill = `<a:blipFill><a:blip r:embed=\"${relId}\"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`;\n let nextInner = cleanedInner;\n\n if (cleanedInner.includes(\"</a:custGeom>\")) {\n nextInner = cleanedInner.replace(\"</a:custGeom>\", `</a:custGeom>${blipFill}`);\n } else {\n const lnIndex = cleanedInner.indexOf(\"<a:ln\");\n nextInner =\n lnIndex === -1\n ? `${cleanedInner}${blipFill}`\n : `${cleanedInner.slice(0, lnIndex)}${blipFill}${cleanedInner.slice(lnIndex)}`;\n }\n\n const updatedSpXml =\n spXml.slice(0, spPrOpenEnd + 1) +\n nextInner +\n 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\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: Deck\n): Promise<{ blob: Blob; fileName: string }> {\n const parsedTemplate = parseDocument(template);\n const renderTemplate = parsedTemplate as unknown as Deck;\n\n const pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\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\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n patternShapes\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 const needsZip = ENABLE_DECK_JSON || patternShapes.length > 0;\n if (!needsZip) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n if (patternShapes.length) {\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 pattern of patternShapes) {\n const parsed = parseDataUrlImage(pattern.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 slideNumber = pattern.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\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 const relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n const nextRelsXml = relsXml.replace(\n \"</Relationships>\",\n `${relEntry}</Relationships>`\n );\n relsCache.set(slideNumber, nextRelsXml);\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n const nextSlideXml = slideXml\n ? applyPatternFill(slideXml, pattern.objectName, relId)\n : slideXml;\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\n if (ENABLE_DECK_JSON) {\n zip.file(\n PPTX_JSON_PAYLOAD_PATH,\n JSON.stringify(\n {\n version: PPTX_JSON_PAYLOAD_VERSION,\n deck: parsedTemplate\n },\n null,\n 2\n )\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 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,/\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\nexport const resolveImageData = async (src: 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","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 PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck } from \"../types/ppt\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: Deck[\"slides\"][number],\n theme: Deck[\"theme\"]\n): void {\n const backgroundColor = slideJson.background?.color ?? 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 { Deck, 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 { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type PatternShape } 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: Deck,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.TextPropsOptions = {\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 };\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 (element.fill) {\n const c = formatColor(element.fill);\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 (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 patternShapes: PatternShape[]\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 pattern = (element as any).pattern as string | undefined;\n const hasFill = typeof element.fill === \"string\" ? element.fill.trim().length > 0 : false;\n const opacity = getElementOpacity(element.opacity);\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 };\n\n if (pattern) {\n const objectName = `pattern-${slideIndex}-${element.id ?? elementIndex}`;\n options.objectName = objectName;\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n patternShapes.push({ slideIndex, objectName, dataUrl: pattern });\n } else if (hasFill) {\n const fillColor = formatColor(element.fill || \"#000000\");\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\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 = {\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: element.text.align as PptxGenJS.VAlign,\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\"\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","parse","attr","_a","_b","dashTypeMap","_a"]}
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/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 { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type PatternShape } from \"./renderers/types\";\nexport const ENABLE_DECK_JSON = false;\nexport const PPTX_JSON_PAYLOAD_PATH = \"json2ppt-editor.json\";\nexport const PPTX_JSON_PAYLOAD_VERSION = 1;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\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 applyPatternFill(slideXml: string, objectName: string, relId: string): 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 cleanedInner = stripFillTags(spPrInner);\n const blipFill = `<a:blipFill><a:blip r:embed=\"${relId}\"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`;\n let nextInner = cleanedInner;\n\n if (cleanedInner.includes(\"</a:custGeom>\")) {\n nextInner = cleanedInner.replace(\"</a:custGeom>\", `</a:custGeom>${blipFill}`);\n } else {\n const lnIndex = cleanedInner.indexOf(\"<a:ln\");\n nextInner =\n lnIndex === -1\n ? `${cleanedInner}${blipFill}`\n : `${cleanedInner.slice(0, lnIndex)}${blipFill}${cleanedInner.slice(lnIndex)}`;\n }\n\n const updatedSpXml =\n spXml.slice(0, spPrOpenEnd + 1) +\n nextInner +\n 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\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: Deck\n): Promise<{ blob: Blob; fileName: string }> {\n const parsedTemplate = parseDocument(template);\n const renderTemplate = parsedTemplate as unknown as Deck;\n\n const pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\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\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n patternShapes\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 const needsZip = patternShapes.length > 0;\n if (!needsZip) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n if (patternShapes.length) {\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 pattern of patternShapes) {\n const parsed = parseDataUrlImage(pattern.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 slideNumber = pattern.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\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 const relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n const nextRelsXml = relsXml.replace(\n \"</Relationships>\",\n `${relEntry}</Relationships>`\n );\n relsCache.set(slideNumber, nextRelsXml);\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n const nextSlideXml = slideXml\n ? applyPatternFill(slideXml, pattern.objectName, relId)\n : slideXml;\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\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 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 PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck } from \"../types/ppt\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: Deck[\"slides\"][number],\n theme: Deck[\"theme\"]\n): void {\n const backgroundColor = slideJson.background?.color ?? 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 { Deck, 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 { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type PatternShape } 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: Deck,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.TextPropsOptions = {\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 };\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 (element.fill) {\n const c = formatColor(element.fill);\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 (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 patternShapes: PatternShape[]\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 pattern = (element as any).pattern as string | undefined;\n const hasFill = typeof element.fill === \"string\" ? element.fill.trim().length > 0 : false;\n const opacity = getElementOpacity(element.opacity);\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 };\n\n if (pattern) {\n const objectName = `pattern-${slideIndex}-${element.id ?? elementIndex}`;\n options.objectName = objectName;\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n patternShapes.push({ slideIndex, objectName, dataUrl: pattern });\n } else if (hasFill) {\n const fillColor = formatColor(element.fill || \"#000000\");\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\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 = {\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: element.text.align as PptxGenJS.VAlign,\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\"\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","parse","attr","_a","_b","dashTypeMap","_a"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json2pptx",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "Convert JSON slide definitions to PPTX using PptxGenJS.",
5
5
  "homepage": "https://json2pptx.henryge.com/",
6
6
  "repository": {
@@ -41,7 +41,7 @@
41
41
  "prepublishOnly": "npm run build"
42
42
  },
43
43
  "dependencies": {
44
- "json2pptx-schema": "0.1.0",
44
+ "json2pptx-schema": "0.1.1",
45
45
  "jszip": "^3.10.1",
46
46
  "pptxgenjs": "^3.12.0",
47
47
  "svg-arc-to-cubic-bezier": "^3.2.0",