json2pptx 0.3.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -42,6 +42,7 @@ __export(index_exports, {
42
42
  module.exports = __toCommonJS(index_exports);
43
43
  var import_pptxgenjs = __toESM(require("pptxgenjs"));
44
44
  var import_jszip = __toESM(require("jszip"));
45
+ var import_json2pptx_schema = require("json2pptx-schema");
45
46
 
46
47
  // src/element.ts
47
48
  var getElementRange = (element) => {
@@ -150,12 +151,6 @@ var resolveImageData = async (src) => {
150
151
  return `data:${contentType};base64,${base64}`;
151
152
  };
152
153
 
153
- // src/renderers/constants.ts
154
- var DEFAULT_WIDTH = 1e3;
155
- var DEFAULT_HEIGHT = 562.5;
156
- var DEFAULT_FONT_SIZE = 16;
157
- var DEFAULT_FONT_FACE = "\u5FAE\u8F6F\u96C5\u9ED1";
158
-
159
154
  // src/renderers/shared.ts
160
155
  var import_tinycolor2 = __toESM(require("tinycolor2"));
161
156
 
@@ -596,6 +591,10 @@ var toAST = (str) => {
596
591
  return format(nodes);
597
592
  };
598
593
 
594
+ // src/renderers/constants.ts
595
+ var DEFAULT_FONT_SIZE = 16;
596
+ var DEFAULT_FONT_FACE = "\u5FAE\u8F6F\u96C5\u9ED1";
597
+
599
598
  // src/renderers/shared.ts
600
599
  var dashTypeMap = {
601
600
  solid: "solid",
@@ -1393,20 +1392,22 @@ function parseDataUrlImage(dataUrl) {
1393
1392
  return { mime, data, ext: (_a = extMap[mime]) != null ? _a : "png" };
1394
1393
  }
1395
1394
  async function createPPTX(template) {
1396
- var _a, _b, _c, _d, _e, _f, _g;
1395
+ var _a, _b, _c, _d;
1396
+ const parsedTemplate = (0, import_json2pptx_schema.parseDocument)(template);
1397
+ const renderTemplate = parsedTemplate;
1397
1398
  const pptx = new import_pptxgenjs.default();
1398
1399
  const patternShapes = [];
1399
- const width = (_a = template.width) != null ? _a : DEFAULT_WIDTH;
1400
- const height = (_b = template.height) != null ? _b : DEFAULT_HEIGHT;
1400
+ const width = parsedTemplate.width;
1401
+ const height = parsedTemplate.height;
1401
1402
  const ratioPx2Inch = 96 * (width / 960);
1402
1403
  const ratioPx2Pt = 96 / 72 * (width / 960);
1403
1404
  const textPadding = 10 / ratioPx2Pt;
1404
1405
  applyPptxLayout(pptx, width, height);
1405
- for (const [slideIndex, slideJson] of ((_c = template.slides) != null ? _c : []).entries()) {
1406
+ for (const [slideIndex, slideJson] of ((_a = renderTemplate.slides) != null ? _a : []).entries()) {
1406
1407
  const slide = pptx.addSlide();
1407
- applySlideBackground(slide, slideJson, template.theme);
1408
- for (const [elementIndex, element] of ((_d = slideJson.elements) != null ? _d : []).entries()) {
1409
- addTextElement(slide, element, template, ratioPx2Pt, ratioPx2Inch, textPadding);
1408
+ applySlideBackground(slide, slideJson, renderTemplate.theme);
1409
+ for (const [elementIndex, element] of ((_b = slideJson.elements) != null ? _b : []).entries()) {
1410
+ addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);
1410
1411
  await addImageElement(slide, element, ratioPx2Inch);
1411
1412
  addShapeElement(
1412
1413
  slide,
@@ -1421,7 +1422,7 @@ async function createPPTX(template) {
1421
1422
  addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);
1422
1423
  }
1423
1424
  }
1424
- const fileName = `${sanitizeFileName((_e = template.title) != null ? _e : "presentation")}.pptx`;
1425
+ const fileName = `${sanitizeFileName(parsedTemplate.title || "presentation")}.pptx`;
1425
1426
  const pptxBuffer = await pptx.write({
1426
1427
  outputType: "arraybuffer",
1427
1428
  compression: true
@@ -1452,7 +1453,7 @@ async function createPPTX(template) {
1452
1453
  const slideNumber = pattern.slideIndex + 1;
1453
1454
  const slidePath = `ppt/slides/slide${slideNumber}.xml`;
1454
1455
  const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;
1455
- const relsXml = (_f = relsCache.get(slideNumber)) != null ? _f : zip.file(relsPath) ? await zip.file(relsPath).async("string") : `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>`;
1456
+ const relsXml = (_c = relsCache.get(slideNumber)) != null ? _c : zip.file(relsPath) ? await zip.file(relsPath).async("string") : `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>`;
1456
1457
  let maxRelId = 0;
1457
1458
  relsXml.replace(/Id="rId(\d+)"/g, (_, id) => {
1458
1459
  const value = Number.parseInt(id, 10);
@@ -1466,7 +1467,7 @@ async function createPPTX(template) {
1466
1467
  `${relEntry}</Relationships>`
1467
1468
  );
1468
1469
  relsCache.set(slideNumber, nextRelsXml);
1469
- const slideXml = (_g = slideCache.get(slideNumber)) != null ? _g : zip.file(slidePath) ? await zip.file(slidePath).async("string") : "";
1470
+ const slideXml = (_d = slideCache.get(slideNumber)) != null ? _d : zip.file(slidePath) ? await zip.file(slidePath).async("string") : "";
1470
1471
  const nextSlideXml = slideXml ? applyPatternFill(slideXml, pattern.objectName, relId) : slideXml;
1471
1472
  slideCache.set(slideNumber, nextSlideXml);
1472
1473
  }
@@ -1483,7 +1484,7 @@ async function createPPTX(template) {
1483
1484
  JSON.stringify(
1484
1485
  {
1485
1486
  version: PPTX_JSON_PAYLOAD_VERSION,
1486
- deck: template
1487
+ deck: parsedTemplate
1487
1488
  },
1488
1489
  null,
1489
1490
  2
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/element.ts","../src/resolveImageData.ts","../src/renderers/constants.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/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\";\n\nimport type { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from \"./renderers/constants\";\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 pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\n\n const width = template.width ?? DEFAULT_WIDTH;\n const height = template.height ?? DEFAULT_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 (template.slides ?? []).entries()) {\n const slide = pptx.addSlide();\n applySlideBackground(slide, slideJson, template.theme);\n\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, template, 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(template.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: template\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","export const DEFAULT_WIDTH = 1000;\nexport const DEFAULT_HEIGHT = 562.5;\nexport const DEFAULT_FONT_SIZE = 16;\nexport const DEFAULT_FONT_FACE = \"微软雅黑\";\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","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 = 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"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/index.ts
2
2
  import PptxGenJS from "pptxgenjs";
3
3
  import JSZip from "jszip";
4
+ import { parseDocument } from "json2pptx-schema";
4
5
 
5
6
  // src/element.ts
6
7
  var getElementRange = (element) => {
@@ -109,12 +110,6 @@ var resolveImageData = async (src) => {
109
110
  return `data:${contentType};base64,${base64}`;
110
111
  };
111
112
 
112
- // src/renderers/constants.ts
113
- var DEFAULT_WIDTH = 1e3;
114
- var DEFAULT_HEIGHT = 562.5;
115
- var DEFAULT_FONT_SIZE = 16;
116
- var DEFAULT_FONT_FACE = "\u5FAE\u8F6F\u96C5\u9ED1";
117
-
118
113
  // src/renderers/shared.ts
119
114
  import tinycolor from "tinycolor2";
120
115
 
@@ -555,6 +550,10 @@ var toAST = (str) => {
555
550
  return format(nodes);
556
551
  };
557
552
 
553
+ // src/renderers/constants.ts
554
+ var DEFAULT_FONT_SIZE = 16;
555
+ var DEFAULT_FONT_FACE = "\u5FAE\u8F6F\u96C5\u9ED1";
556
+
558
557
  // src/renderers/shared.ts
559
558
  var dashTypeMap = {
560
559
  solid: "solid",
@@ -1352,20 +1351,22 @@ function parseDataUrlImage(dataUrl) {
1352
1351
  return { mime, data, ext: (_a = extMap[mime]) != null ? _a : "png" };
1353
1352
  }
1354
1353
  async function createPPTX(template) {
1355
- var _a, _b, _c, _d, _e, _f, _g;
1354
+ var _a, _b, _c, _d;
1355
+ const parsedTemplate = parseDocument(template);
1356
+ const renderTemplate = parsedTemplate;
1356
1357
  const pptx = new PptxGenJS();
1357
1358
  const patternShapes = [];
1358
- const width = (_a = template.width) != null ? _a : DEFAULT_WIDTH;
1359
- const height = (_b = template.height) != null ? _b : DEFAULT_HEIGHT;
1359
+ const width = parsedTemplate.width;
1360
+ const height = parsedTemplate.height;
1360
1361
  const ratioPx2Inch = 96 * (width / 960);
1361
1362
  const ratioPx2Pt = 96 / 72 * (width / 960);
1362
1363
  const textPadding = 10 / ratioPx2Pt;
1363
1364
  applyPptxLayout(pptx, width, height);
1364
- for (const [slideIndex, slideJson] of ((_c = template.slides) != null ? _c : []).entries()) {
1365
+ for (const [slideIndex, slideJson] of ((_a = renderTemplate.slides) != null ? _a : []).entries()) {
1365
1366
  const slide = pptx.addSlide();
1366
- applySlideBackground(slide, slideJson, template.theme);
1367
- for (const [elementIndex, element] of ((_d = slideJson.elements) != null ? _d : []).entries()) {
1368
- addTextElement(slide, element, template, ratioPx2Pt, ratioPx2Inch, textPadding);
1367
+ applySlideBackground(slide, slideJson, renderTemplate.theme);
1368
+ for (const [elementIndex, element] of ((_b = slideJson.elements) != null ? _b : []).entries()) {
1369
+ addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);
1369
1370
  await addImageElement(slide, element, ratioPx2Inch);
1370
1371
  addShapeElement(
1371
1372
  slide,
@@ -1380,7 +1381,7 @@ async function createPPTX(template) {
1380
1381
  addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);
1381
1382
  }
1382
1383
  }
1383
- const fileName = `${sanitizeFileName((_e = template.title) != null ? _e : "presentation")}.pptx`;
1384
+ const fileName = `${sanitizeFileName(parsedTemplate.title || "presentation")}.pptx`;
1384
1385
  const pptxBuffer = await pptx.write({
1385
1386
  outputType: "arraybuffer",
1386
1387
  compression: true
@@ -1411,7 +1412,7 @@ async function createPPTX(template) {
1411
1412
  const slideNumber = pattern.slideIndex + 1;
1412
1413
  const slidePath = `ppt/slides/slide${slideNumber}.xml`;
1413
1414
  const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;
1414
- const relsXml = (_f = relsCache.get(slideNumber)) != null ? _f : zip.file(relsPath) ? await zip.file(relsPath).async("string") : `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>`;
1415
+ const relsXml = (_c = relsCache.get(slideNumber)) != null ? _c : zip.file(relsPath) ? await zip.file(relsPath).async("string") : `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>`;
1415
1416
  let maxRelId = 0;
1416
1417
  relsXml.replace(/Id="rId(\d+)"/g, (_, id) => {
1417
1418
  const value = Number.parseInt(id, 10);
@@ -1425,7 +1426,7 @@ async function createPPTX(template) {
1425
1426
  `${relEntry}</Relationships>`
1426
1427
  );
1427
1428
  relsCache.set(slideNumber, nextRelsXml);
1428
- const slideXml = (_g = slideCache.get(slideNumber)) != null ? _g : zip.file(slidePath) ? await zip.file(slidePath).async("string") : "";
1429
+ const slideXml = (_d = slideCache.get(slideNumber)) != null ? _d : zip.file(slidePath) ? await zip.file(slidePath).async("string") : "";
1429
1430
  const nextSlideXml = slideXml ? applyPatternFill(slideXml, pattern.objectName, relId) : slideXml;
1430
1431
  slideCache.set(slideNumber, nextSlideXml);
1431
1432
  }
@@ -1442,7 +1443,7 @@ async function createPPTX(template) {
1442
1443
  JSON.stringify(
1443
1444
  {
1444
1445
  version: PPTX_JSON_PAYLOAD_VERSION,
1445
- deck: template
1446
+ deck: parsedTemplate
1446
1447
  },
1447
1448
  null,
1448
1449
  2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/element.ts","../src/resolveImageData.ts","../src/renderers/constants.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/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\";\n\nimport type { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from \"./renderers/constants\";\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 pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\n\n const width = template.width ?? DEFAULT_WIDTH;\n const height = template.height ?? DEFAULT_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 (template.slides ?? []).entries()) {\n const slide = pptx.addSlide();\n applySlideBackground(slide, slideJson, template.theme);\n\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, template, 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(template.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: template\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","export const DEFAULT_WIDTH = 1000;\nexport const DEFAULT_HEIGHT = 562.5;\nexport const DEFAULT_FONT_SIZE = 16;\nexport const DEFAULT_FONT_FACE = \"微软雅黑\";\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","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 = 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "json2pptx",
3
- "version": "0.3.3",
3
+ "version": "0.4.0",
4
4
  "description": "Convert JSON slide definitions to PPTX using PptxGenJS.",
5
5
  "homepage": "https://json2pptx.henryge.com/",
6
6
  "repository": {
@@ -34,12 +34,14 @@
34
34
  "sideEffects": false,
35
35
  "scripts": {
36
36
  "build": "tsup",
37
+ "dev:watch": "tsup --watch",
37
38
  "test": "vitest run",
38
39
  "test:watch": "vitest",
39
40
  "typecheck": "tsc -p tsconfig.json --noEmit",
40
41
  "prepublishOnly": "npm run build"
41
42
  },
42
43
  "dependencies": {
44
+ "json2pptx-schema": "0.1.0",
43
45
  "jszip": "^3.10.1",
44
46
  "pptxgenjs": "^3.12.0",
45
47
  "svg-arc-to-cubic-bezier": "^3.2.0",
@@ -53,4 +55,4 @@
53
55
  "typescript": "^5.3.3",
54
56
  "vitest": "^1.6.0"
55
57
  }
56
- }
58
+ }