json2pptx 0.2.4 → 0.3.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/README.md CHANGED
@@ -11,7 +11,7 @@ npm i json2pptx
11
11
  ## 使用
12
12
 
13
13
  ```ts
14
- import { buildPptxBlob } from 'json2pptx'
14
+ import { createPPTX } from 'json2pptx'
15
15
 
16
16
  const deck = {
17
17
  title: 'Demo',
@@ -34,7 +34,7 @@ const deck = {
34
34
  ]
35
35
  }
36
36
 
37
- const { blob, fileName } = await buildPptxBlob(deck)
37
+ const { blob, fileName } = await createPPTX(deck)
38
38
  // 在浏览器中下载:
39
39
  // const url = URL.createObjectURL(blob)
40
40
  // const a = document.createElement('a')
@@ -45,7 +45,7 @@ const { blob, fileName } = await buildPptxBlob(deck)
45
45
 
46
46
  ## API
47
47
 
48
- ### `buildPptxBlob(template: Deck): Promise<{ blob: Blob; fileName: string }>`
48
+ ### `createPPTX(template: Deck): Promise<{ blob: Blob; fileName: string }>`
49
49
 
50
50
  根据 `Deck` 数据生成 PPTX 的 `Blob` 与建议文件名。
51
51
 
package/dist/index.d.mts CHANGED
@@ -125,9 +125,10 @@ declare const resolveImageData: (src: string) => Promise<string>;
125
125
  declare const ENABLE_DECK_JSON = true;
126
126
  declare const PPTX_JSON_PAYLOAD_PATH = "json2ppt-editor.json";
127
127
  declare const PPTX_JSON_PAYLOAD_VERSION = 1;
128
- declare function buildPptxBlob(template: Deck): Promise<{
128
+ declare function createPPTX(template: Deck): Promise<{
129
129
  blob: Blob;
130
130
  fileName: string;
131
131
  }>;
132
+ declare const buildPptxBlob: typeof createPPTX;
132
133
 
133
- export { type BaseElement, type Deck, type DeckTheme, ENABLE_DECK_JSON, type ElementClip, type ElementFilters, type ElementOutline, type ElementShadow, type ImageElement, type LineElement, PPTX_JSON_PAYLOAD_PATH, PPTX_JSON_PAYLOAD_VERSION, type ShapeElement, type Slide, type SlideBackground, type SlideElement, type TextContent, type TextElement, buildPptxBlob, getElementRange, getLineElementPath, resolveImageData };
134
+ export { type BaseElement, type Deck, type DeckTheme, ENABLE_DECK_JSON, type ElementClip, type ElementFilters, type ElementOutline, type ElementShadow, type ImageElement, type LineElement, PPTX_JSON_PAYLOAD_PATH, PPTX_JSON_PAYLOAD_VERSION, type ShapeElement, type Slide, type SlideBackground, type SlideElement, type TextContent, type TextElement, buildPptxBlob, createPPTX, getElementRange, getLineElementPath, resolveImageData };
package/dist/index.d.ts CHANGED
@@ -125,9 +125,10 @@ declare const resolveImageData: (src: string) => Promise<string>;
125
125
  declare const ENABLE_DECK_JSON = true;
126
126
  declare const PPTX_JSON_PAYLOAD_PATH = "json2ppt-editor.json";
127
127
  declare const PPTX_JSON_PAYLOAD_VERSION = 1;
128
- declare function buildPptxBlob(template: Deck): Promise<{
128
+ declare function createPPTX(template: Deck): Promise<{
129
129
  blob: Blob;
130
130
  fileName: string;
131
131
  }>;
132
+ declare const buildPptxBlob: typeof createPPTX;
132
133
 
133
- export { type BaseElement, type Deck, type DeckTheme, ENABLE_DECK_JSON, type ElementClip, type ElementFilters, type ElementOutline, type ElementShadow, type ImageElement, type LineElement, PPTX_JSON_PAYLOAD_PATH, PPTX_JSON_PAYLOAD_VERSION, type ShapeElement, type Slide, type SlideBackground, type SlideElement, type TextContent, type TextElement, buildPptxBlob, getElementRange, getLineElementPath, resolveImageData };
134
+ export { type BaseElement, type Deck, type DeckTheme, ENABLE_DECK_JSON, type ElementClip, type ElementFilters, type ElementOutline, type ElementShadow, type ImageElement, type LineElement, PPTX_JSON_PAYLOAD_PATH, PPTX_JSON_PAYLOAD_VERSION, type ShapeElement, type Slide, type SlideBackground, type SlideElement, type TextContent, type TextElement, buildPptxBlob, createPPTX, getElementRange, getLineElementPath, resolveImageData };
package/dist/index.js CHANGED
@@ -34,6 +34,7 @@ __export(index_exports, {
34
34
  PPTX_JSON_PAYLOAD_PATH: () => PPTX_JSON_PAYLOAD_PATH,
35
35
  PPTX_JSON_PAYLOAD_VERSION: () => PPTX_JSON_PAYLOAD_VERSION,
36
36
  buildPptxBlob: () => buildPptxBlob,
37
+ createPPTX: () => createPPTX,
37
38
  getElementRange: () => getElementRange,
38
39
  getLineElementPath: () => getLineElementPath,
39
40
  resolveImageData: () => resolveImageData
@@ -1389,7 +1390,7 @@ function parseDataUrlImage(dataUrl) {
1389
1390
  };
1390
1391
  return { mime, data, ext: (_a = extMap[mime]) != null ? _a : "png" };
1391
1392
  }
1392
- async function buildPptxBlob(template) {
1393
+ async function createPPTX(template) {
1393
1394
  var _a, _b, _c, _d, _e, _f, _g;
1394
1395
  const pptx = new import_pptxgenjs.default();
1395
1396
  const patternShapes = [];
@@ -1490,12 +1491,14 @@ async function buildPptxBlob(template) {
1490
1491
  const blob = await zip.generateAsync({ type: "blob" });
1491
1492
  return { blob, fileName };
1492
1493
  }
1494
+ var buildPptxBlob = createPPTX;
1493
1495
  // Annotate the CommonJS export names for ESM import in node:
1494
1496
  0 && (module.exports = {
1495
1497
  ENABLE_DECK_JSON,
1496
1498
  PPTX_JSON_PAYLOAD_PATH,
1497
1499
  PPTX_JSON_PAYLOAD_VERSION,
1498
1500
  buildPptxBlob,
1501
+ createPPTX,
1499
1502
  getElementRange,
1500
1503
  getLineElementPath,
1501
1504
  resolveImageData
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 buildPptxBlob(\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\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 margin: textPadding,\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/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 margin: textPadding,\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
@@ -1349,7 +1349,7 @@ function parseDataUrlImage(dataUrl) {
1349
1349
  };
1350
1350
  return { mime, data, ext: (_a = extMap[mime]) != null ? _a : "png" };
1351
1351
  }
1352
- async function buildPptxBlob(template) {
1352
+ async function createPPTX(template) {
1353
1353
  var _a, _b, _c, _d, _e, _f, _g;
1354
1354
  const pptx = new PptxGenJS();
1355
1355
  const patternShapes = [];
@@ -1450,11 +1450,13 @@ async function buildPptxBlob(template) {
1450
1450
  const blob = await zip.generateAsync({ type: "blob" });
1451
1451
  return { blob, fileName };
1452
1452
  }
1453
+ var buildPptxBlob = createPPTX;
1453
1454
  export {
1454
1455
  ENABLE_DECK_JSON,
1455
1456
  PPTX_JSON_PAYLOAD_PATH,
1456
1457
  PPTX_JSON_PAYLOAD_VERSION,
1457
1458
  buildPptxBlob,
1459
+ createPPTX,
1458
1460
  getElementRange,
1459
1461
  getLineElementPath,
1460
1462
  resolveImageData
@@ -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 buildPptxBlob(\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\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 margin: textPadding,\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/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 margin: textPadding,\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.2.4",
3
+ "version": "0.3.0",
4
4
  "description": "Convert JSON slide definitions to PPTX using PptxGenJS.",
5
5
  "homepage": "https://json2pptx.henryge.com/",
6
6
  "repository": {