json2pptx 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.js +18 -17
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -17
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@ npm i json2pptx
|
|
|
13
13
|
```ts
|
|
14
14
|
import { createPPTX } from 'json2pptx'
|
|
15
15
|
|
|
16
|
-
const
|
|
16
|
+
const slide = {
|
|
17
17
|
title: 'Demo',
|
|
18
18
|
width: 1000,
|
|
19
19
|
height: 562.5,
|
|
@@ -34,7 +34,7 @@ const deck = {
|
|
|
34
34
|
]
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
const { blob, fileName } = await createPPTX(
|
|
37
|
+
const { blob, fileName } = await createPPTX(slide)
|
|
38
38
|
// 在浏览器中下载:
|
|
39
39
|
// const url = URL.createObjectURL(blob)
|
|
40
40
|
// const a = document.createElement('a')
|
package/dist/index.js
CHANGED
|
@@ -42,6 +42,7 @@ __export(index_exports, {
|
|
|
42
42
|
module.exports = __toCommonJS(index_exports);
|
|
43
43
|
var import_pptxgenjs = __toESM(require("pptxgenjs"));
|
|
44
44
|
var import_jszip = __toESM(require("jszip"));
|
|
45
|
+
var import_json2pptx_schema = require("json2pptx-schema");
|
|
45
46
|
|
|
46
47
|
// src/element.ts
|
|
47
48
|
var getElementRange = (element) => {
|
|
@@ -150,12 +151,6 @@ var resolveImageData = async (src) => {
|
|
|
150
151
|
return `data:${contentType};base64,${base64}`;
|
|
151
152
|
};
|
|
152
153
|
|
|
153
|
-
// src/renderers/constants.ts
|
|
154
|
-
var DEFAULT_WIDTH = 1e3;
|
|
155
|
-
var DEFAULT_HEIGHT = 562.5;
|
|
156
|
-
var DEFAULT_FONT_SIZE = 16;
|
|
157
|
-
var DEFAULT_FONT_FACE = "\u5FAE\u8F6F\u96C5\u9ED1";
|
|
158
|
-
|
|
159
154
|
// src/renderers/shared.ts
|
|
160
155
|
var import_tinycolor2 = __toESM(require("tinycolor2"));
|
|
161
156
|
|
|
@@ -596,6 +591,10 @@ var toAST = (str) => {
|
|
|
596
591
|
return format(nodes);
|
|
597
592
|
};
|
|
598
593
|
|
|
594
|
+
// src/renderers/constants.ts
|
|
595
|
+
var DEFAULT_FONT_SIZE = 16;
|
|
596
|
+
var DEFAULT_FONT_FACE = "\u5FAE\u8F6F\u96C5\u9ED1";
|
|
597
|
+
|
|
599
598
|
// src/renderers/shared.ts
|
|
600
599
|
var dashTypeMap = {
|
|
601
600
|
solid: "solid",
|
|
@@ -1393,20 +1392,22 @@ function parseDataUrlImage(dataUrl) {
|
|
|
1393
1392
|
return { mime, data, ext: (_a = extMap[mime]) != null ? _a : "png" };
|
|
1394
1393
|
}
|
|
1395
1394
|
async function createPPTX(template) {
|
|
1396
|
-
var _a, _b, _c, _d
|
|
1395
|
+
var _a, _b, _c, _d;
|
|
1396
|
+
const parsedTemplate = (0, import_json2pptx_schema.parseDocument)(template);
|
|
1397
|
+
const renderTemplate = parsedTemplate;
|
|
1397
1398
|
const pptx = new import_pptxgenjs.default();
|
|
1398
1399
|
const patternShapes = [];
|
|
1399
|
-
const width =
|
|
1400
|
-
const height =
|
|
1400
|
+
const width = parsedTemplate.width;
|
|
1401
|
+
const height = parsedTemplate.height;
|
|
1401
1402
|
const ratioPx2Inch = 96 * (width / 960);
|
|
1402
1403
|
const ratioPx2Pt = 96 / 72 * (width / 960);
|
|
1403
1404
|
const textPadding = 10 / ratioPx2Pt;
|
|
1404
1405
|
applyPptxLayout(pptx, width, height);
|
|
1405
|
-
for (const [slideIndex, slideJson] of ((
|
|
1406
|
+
for (const [slideIndex, slideJson] of ((_a = renderTemplate.slides) != null ? _a : []).entries()) {
|
|
1406
1407
|
const slide = pptx.addSlide();
|
|
1407
|
-
applySlideBackground(slide, slideJson,
|
|
1408
|
-
for (const [elementIndex, element] of ((
|
|
1409
|
-
addTextElement(slide, element,
|
|
1408
|
+
applySlideBackground(slide, slideJson, renderTemplate.theme);
|
|
1409
|
+
for (const [elementIndex, element] of ((_b = slideJson.elements) != null ? _b : []).entries()) {
|
|
1410
|
+
addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);
|
|
1410
1411
|
await addImageElement(slide, element, ratioPx2Inch);
|
|
1411
1412
|
addShapeElement(
|
|
1412
1413
|
slide,
|
|
@@ -1421,7 +1422,7 @@ async function createPPTX(template) {
|
|
|
1421
1422
|
addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);
|
|
1422
1423
|
}
|
|
1423
1424
|
}
|
|
1424
|
-
const fileName = `${sanitizeFileName(
|
|
1425
|
+
const fileName = `${sanitizeFileName(parsedTemplate.title || "presentation")}.pptx`;
|
|
1425
1426
|
const pptxBuffer = await pptx.write({
|
|
1426
1427
|
outputType: "arraybuffer",
|
|
1427
1428
|
compression: true
|
|
@@ -1452,7 +1453,7 @@ async function createPPTX(template) {
|
|
|
1452
1453
|
const slideNumber = pattern.slideIndex + 1;
|
|
1453
1454
|
const slidePath = `ppt/slides/slide${slideNumber}.xml`;
|
|
1454
1455
|
const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;
|
|
1455
|
-
const relsXml = (
|
|
1456
|
+
const relsXml = (_c = relsCache.get(slideNumber)) != null ? _c : zip.file(relsPath) ? await zip.file(relsPath).async("string") : `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>`;
|
|
1456
1457
|
let maxRelId = 0;
|
|
1457
1458
|
relsXml.replace(/Id="rId(\d+)"/g, (_, id) => {
|
|
1458
1459
|
const value = Number.parseInt(id, 10);
|
|
@@ -1466,7 +1467,7 @@ async function createPPTX(template) {
|
|
|
1466
1467
|
`${relEntry}</Relationships>`
|
|
1467
1468
|
);
|
|
1468
1469
|
relsCache.set(slideNumber, nextRelsXml);
|
|
1469
|
-
const slideXml = (
|
|
1470
|
+
const slideXml = (_d = slideCache.get(slideNumber)) != null ? _d : zip.file(slidePath) ? await zip.file(slidePath).async("string") : "";
|
|
1470
1471
|
const nextSlideXml = slideXml ? applyPatternFill(slideXml, pattern.objectName, relId) : slideXml;
|
|
1471
1472
|
slideCache.set(slideNumber, nextSlideXml);
|
|
1472
1473
|
}
|
|
@@ -1483,7 +1484,7 @@ async function createPPTX(template) {
|
|
|
1483
1484
|
JSON.stringify(
|
|
1484
1485
|
{
|
|
1485
1486
|
version: PPTX_JSON_PAYLOAD_VERSION,
|
|
1486
|
-
deck:
|
|
1487
|
+
deck: parsedTemplate
|
|
1487
1488
|
},
|
|
1488
1489
|
null,
|
|
1489
1490
|
2
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/element.ts","../src/resolveImageData.ts","../src/renderers/constants.ts","../src/renderers/shared.ts","../src/htmlParser/tags.ts","../src/htmlParser/lexer.ts","../src/htmlParser/parser.ts","../src/htmlParser/format.ts","../src/htmlParser/index.ts","../src/renderers/background.ts","../src/renderers/layout.ts","../src/svgPathParser.ts","../src/renderers/points.ts","../src/renderers/utils.ts","../src/renderers/elements.ts"],"sourcesContent":["import PptxGenJS from \"pptxgenjs\";\nimport JSZip from \"jszip\";\n\nimport type { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from \"./renderers/constants\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type PatternShape } from \"./renderers/types\";\nexport const ENABLE_DECK_JSON = true;\nexport const PPTX_JSON_PAYLOAD_PATH = \"json2ppt-editor.json\";\nexport const PPTX_JSON_PAYLOAD_VERSION = 1;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\n\nfunction stripFillTags(value: string): string {\n return value\n .replace(/<a:solidFill>[\\s\\S]*?<\\/a:solidFill>/g, \"\")\n .replace(/<a:gradFill>[\\s\\S]*?<\\/a:gradFill>/g, \"\")\n .replace(/<a:blipFill>[\\s\\S]*?<\\/a:blipFill>/g, \"\")\n .replace(/<a:noFill\\s*\\/>/g, \"\")\n .replace(/<a:noFill><\\/a:noFill>/g, \"\");\n}\n\nfunction applyPatternFill(slideXml: string, objectName: string, relId: string): string {\n const nameToken = `name=\"${objectName}\"`;\n let cursor = 0;\n let result = slideXml;\n\n while (true) {\n const nameIndex = result.indexOf(nameToken, cursor);\n if (nameIndex === -1) break;\n\n const spStart = result.lastIndexOf(\"<p:sp\", nameIndex);\n const spEnd = result.indexOf(\"</p:sp>\", nameIndex);\n if (spStart === -1 || spEnd === -1) break;\n\n const spXml = result.slice(spStart, spEnd + \"</p:sp>\".length);\n const spPrStart = spXml.indexOf(\"<p:spPr>\");\n const spPrEnd = spXml.indexOf(\"</p:spPr>\");\n if (spPrStart === -1 || spPrEnd === -1) {\n cursor = spEnd + 1;\n continue;\n }\n\n const spPrOpenEnd = spXml.indexOf(\">\", spPrStart);\n const spPrInner = spXml.slice(spPrOpenEnd + 1, spPrEnd);\n const cleanedInner = stripFillTags(spPrInner);\n const blipFill = `<a:blipFill><a:blip r:embed=\"${relId}\"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`;\n let nextInner = cleanedInner;\n\n if (cleanedInner.includes(\"</a:custGeom>\")) {\n nextInner = cleanedInner.replace(\"</a:custGeom>\", `</a:custGeom>${blipFill}`);\n } else {\n const lnIndex = cleanedInner.indexOf(\"<a:ln\");\n nextInner =\n lnIndex === -1\n ? `${cleanedInner}${blipFill}`\n : `${cleanedInner.slice(0, lnIndex)}${blipFill}${cleanedInner.slice(lnIndex)}`;\n }\n\n const updatedSpXml =\n spXml.slice(0, spPrOpenEnd + 1) +\n nextInner +\n spXml.slice(spPrEnd);\n\n result = result.slice(0, spStart) + updatedSpXml + result.slice(spEnd + \"</p:sp>\".length);\n cursor = spStart + updatedSpXml.length;\n }\n\n return result;\n}\n\nfunction parseDataUrlImage(\n dataUrl: string\n): { mime: string; data: string; ext: string } | null {\n const match = dataUrl.match(/^data:(image\\/[^;]+);base64,(.+)$/);\n if (!match) return null;\n const mime = match[1];\n const data = match[2];\n const extMap: Record<string, string> = {\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"image/svg+xml\": \"svg\",\n \"image/webp\": \"webp\",\n \"image/bmp\": \"bmp\"\n };\n return { mime, data, ext: extMap[mime] ?? \"png\" };\n}\n\nexport async function createPPTX(\n template: Deck\n): Promise<{ blob: Blob; fileName: string }> {\n const pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\n\n const width = template.width ?? DEFAULT_WIDTH;\n const height = template.height ?? DEFAULT_HEIGHT;\n const ratioPx2Inch = 96 * (width / 960);\n const ratioPx2Pt = (96 / 72) * (width / 960);\n const textPadding = 10 / ratioPx2Pt;\n\n applyPptxLayout(pptx, width, height);\n\n for (const [slideIndex, slideJson] of (template.slides ?? []).entries()) {\n const slide = pptx.addSlide();\n applySlideBackground(slide, slideJson, template.theme);\n\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, template, ratioPx2Pt, ratioPx2Inch, textPadding);\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n patternShapes\n );\n addLineElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n }\n }\n\n const fileName = `${sanitizeFileName(template.title ?? \"presentation\")}.pptx`;\n const pptxBuffer = (await pptx.write({\n outputType: \"arraybuffer\",\n compression: true\n })) as ArrayBuffer;\n\n const needsZip = ENABLE_DECK_JSON || patternShapes.length > 0;\n if (!needsZip) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n if (patternShapes.length) {\n const mediaFiles = Object.keys(zip.files).filter((name) => name.startsWith(\"ppt/media/\"));\n let maxImageIndex = 0;\n for (const name of mediaFiles) {\n const match = name.match(/ppt\\/media\\/image(\\d+)/);\n if (match) {\n const index = Number.parseInt(match[1], 10);\n if (Number.isFinite(index)) maxImageIndex = Math.max(maxImageIndex, index);\n }\n }\n\n const slideCache = new Map<number, string>();\n const relsCache = new Map<number, string>();\n\n for (const pattern of patternShapes) {\n const parsed = parseDataUrlImage(pattern.dataUrl);\n if (!parsed) continue;\n\n maxImageIndex += 1;\n const imageName = `image${maxImageIndex}.${parsed.ext}`;\n zip.file(`ppt/media/${imageName}`, parsed.data, { base64: true });\n\n const slideNumber = pattern.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\n\n const relsXml =\n relsCache.get(slideNumber) ??\n (zip.file(relsPath)\n ? await zip.file(relsPath)!.async(\"string\")\n : `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>`);\n\n let maxRelId = 0;\n relsXml.replace(/Id=\"rId(\\d+)\"/g, (_, id) => {\n const value = Number.parseInt(id, 10);\n if (Number.isFinite(value)) maxRelId = Math.max(maxRelId, value);\n return \"\";\n });\n const relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n const nextRelsXml = relsXml.replace(\n \"</Relationships>\",\n `${relEntry}</Relationships>`\n );\n relsCache.set(slideNumber, nextRelsXml);\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n const nextSlideXml = slideXml\n ? applyPatternFill(slideXml, pattern.objectName, relId)\n : slideXml;\n slideCache.set(slideNumber, nextSlideXml);\n }\n\n for (const [slideNumber, xml] of slideCache.entries()) {\n zip.file(`ppt/slides/slide${slideNumber}.xml`, xml);\n }\n for (const [slideNumber, xml] of relsCache.entries()) {\n zip.file(`ppt/slides/_rels/slide${slideNumber}.xml.rels`, xml);\n }\n }\n\n if (ENABLE_DECK_JSON) {\n zip.file(\n PPTX_JSON_PAYLOAD_PATH,\n JSON.stringify(\n {\n version: PPTX_JSON_PAYLOAD_VERSION,\n deck: template\n },\n null,\n 2\n )\n );\n }\n const blob = await zip.generateAsync({ type: \"blob\" });\n return { blob, fileName };\n}\n\n// Backwards compatibility alias\nexport const buildPptxBlob = createPPTX;\n\nexport { getElementRange, getLineElementPath };\nexport { resolveImageData };\nexport type {\n BaseElement,\n Deck,\n DeckTheme,\n ElementClip,\n ElementFilters,\n ElementOutline,\n ElementShadow,\n ImageElement,\n LineElement,\n ShapeElement,\n Slide,\n SlideBackground,\n SlideElement,\n TextContent,\n TextElement\n} from \"./types/ppt\";\n","import type { LineElement, SlideElement } from './types/ppt'\n\nexport const getElementRange = (element: SlideElement) => {\n let minX = 0\n let maxX = 0\n let minY = 0\n let maxY = 0\n\n if (element.type === 'line' && element.start && element.end) {\n minX = element.left ?? 0\n maxX = (element.left ?? 0) + Math.max(element.start[0], element.end[0])\n minY = element.top ?? 0\n maxY = (element.top ?? 0) + Math.max(element.start[1], element.end[1])\n } else if (element.left !== undefined && element.top !== undefined) {\n minX = element.left\n minY = element.top\n maxX = element.left + (element.width ?? 0)\n maxY = element.top + (element.height ?? 0)\n }\n\n return { minX, maxX, minY, maxY }\n}\n\nconst isLineElement = (element: SlideElement): element is LineElement =>\n element.type === 'line'\n\nexport const getLineElementPath = (element: SlideElement) => {\n if (!isLineElement(element) || !element.start || !element.end) return ''\n const start = element.start.join(',')\n const end = element.end.join(',')\n const broken = element.broken as [number, number] | undefined\n const broken2 = element.broken2 as [number, number] | undefined\n const curve = element.curve as [number, number] | undefined\n const cubic = element.cubic as [[number, number], [number, number]] | undefined\n\n if (broken) {\n const mid = broken.join(',')\n return `M${start} L${mid} L${end}`\n }\n if (broken2) {\n const { minX, maxX, minY, maxY } = getElementRange(element)\n if (maxX - minX >= maxY - minY) {\n return `M${start} L${broken2[0]},${element.start[1]} L${broken2[0]},${element.end[1]} ${end}`\n }\n return `M${start} L${element.start[0]},${broken2[1]} L${element.end[0]},${broken2[1]} ${end}`\n }\n if (curve) {\n const mid = curve.join(',')\n return `M${start} Q${mid} ${end}`\n }\n if (cubic) {\n const [c1, c2] = cubic\n const p1 = c1.join(',')\n const p2 = c2.join(',')\n return `M${start} C${p1} ${p2} ${end}`\n }\n return `M${start} L${end}`\n}\n","const dataUrlRegex = /^data:image\\/[^;]+;base64,/\n\nconst mimeFromPath = (path: string) => {\n const lower = path.toLowerCase()\n if (lower.endsWith('.png')) return 'image/png'\n if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return 'image/jpeg'\n if (lower.endsWith('.gif')) return 'image/gif'\n if (lower.endsWith('.svg')) return 'image/svg+xml'\n if (lower.endsWith('.webp')) return 'image/webp'\n if (lower.endsWith('.bmp')) return 'image/bmp'\n return 'application/octet-stream'\n}\n\nconst toBase64 = (buffer: ArrayBuffer) => {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(buffer).toString('base64')\n }\n\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i += 1) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n}\n\nconst readLocalFile = async (path: string) => {\n const fs = await import('node:fs/promises')\n const buffer = await fs.readFile(path)\n return buffer.toString('base64')\n}\n\nexport const resolveImageData = async (src: string) => {\n if (dataUrlRegex.test(src)) return src\n\n const isFileUrl = src.startsWith('file://')\n const isLocalPath = !src.startsWith('http') && !src.startsWith('data:')\n const isNode = typeof process !== 'undefined' && Boolean(process.versions?.node)\n\n if ((isFileUrl || isLocalPath) && isNode) {\n const filePath = isFileUrl ? src.replace('file://', '') : src\n const base64 = await readLocalFile(filePath)\n const mime = mimeFromPath(filePath)\n return `data:${mime};base64,${base64}`\n }\n\n if (typeof fetch !== 'function') {\n throw new Error('fetch is not available to resolve image data')\n }\n\n const response = await fetch(src)\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const base64 = toBase64(arrayBuffer)\n const contentType = response.headers.get('content-type') || mimeFromPath(src)\n return `data:${contentType};base64,${base64}`\n}\n","export const DEFAULT_WIDTH = 1000;\nexport const DEFAULT_HEIGHT = 562.5;\nexport const DEFAULT_FONT_SIZE = 16;\nexport const DEFAULT_FONT_FACE = \"微软雅黑\";\n","import tinycolor from \"tinycolor2\";\nimport type PptxGenJS from \"pptxgenjs\";\n\nimport type { SlideElement } from \"../types/ppt\";\nimport { toAST, type AST } from \"../htmlParser\";\nimport { DEFAULT_FONT_SIZE } from \"./constants\";\n\ntype TextSlice = {\n text: string;\n options?: PptxGenJS.TextPropsOptions;\n};\n\nconst dashTypeMap: Record<string, \"solid\" | \"dash\" | \"sysDot\"> = {\n solid: \"solid\",\n dashed: \"dash\",\n dotted: \"sysDot\"\n};\n\nexport function formatColor(input: string): { alpha: number; color: string } {\n if (!input) {\n return {\n alpha: 0,\n color: \"#000000\"\n };\n }\n\n const color = tinycolor(input);\n const alpha = color.getAlpha();\n const hex = alpha === 0 ? \"#ffffff\" : color.setAlpha(1).toHexString();\n return { alpha, color: hex };\n}\n\nexport function formatHTML(html: string, ratioPx2Pt: number): TextSlice[] {\n const ast = toAST(html);\n let bulletFlag = false;\n let indent = 0;\n\n const slices: TextSlice[] = [];\n const parse = (obj: AST[], baseStyleObj: Record<string, string> = {}) => {\n for (const item of obj) {\n const isBlockTag = \"tagName\" in item && [\"div\", \"li\", \"p\"].includes(item.tagName);\n\n if (isBlockTag && slices.length) {\n const lastSlice = slices[slices.length - 1];\n if (!lastSlice.options) lastSlice.options = {};\n lastSlice.options.breakLine = true;\n }\n\n const styleObj = { ...baseStyleObj };\n const styleAttr =\n \"attributes\" in item\n ? item.attributes.find((attr) => attr.key === \"style\")\n : null;\n if (styleAttr && styleAttr.value) {\n const styleArr = styleAttr.value.split(\";\");\n for (const styleItem of styleArr) {\n const match = styleItem.match(/([^:]+):\\s*(.+)/);\n if (match) {\n const [key, value] = [match[1].trim(), match[2].trim()];\n if (key && value) styleObj[key] = value;\n }\n }\n }\n\n if (\"tagName\" in item) {\n if (item.tagName === \"em\") {\n styleObj[\"font-style\"] = \"italic\";\n }\n if (item.tagName === \"strong\") {\n styleObj[\"font-weight\"] = \"bold\";\n }\n if (item.tagName === \"sup\") {\n styleObj[\"vertical-align\"] = \"super\";\n }\n if (item.tagName === \"sub\") {\n styleObj[\"vertical-align\"] = \"sub\";\n }\n if (item.tagName === \"a\") {\n const attr = item.attributes.find((attr) => attr.key === \"href\");\n styleObj.href = attr?.value || \"\";\n }\n if (item.tagName === \"ul\") {\n styleObj[\"list-type\"] = \"ul\";\n }\n if (item.tagName === \"ol\") {\n styleObj[\"list-type\"] = \"ol\";\n }\n if (item.tagName === \"li\") {\n bulletFlag = true;\n }\n if (item.tagName === \"p\") {\n if (\"attributes\" in item) {\n const dataIndentAttr = item.attributes.find((attr) => attr.key === \"data-indent\");\n if (dataIndentAttr && dataIndentAttr.value) indent = +dataIndentAttr.value;\n }\n }\n }\n\n if (\"tagName\" in item && item.tagName === \"br\") {\n slices.push({ text: \"\", options: { breakLine: true } });\n } else if (\"content\" in item) {\n const text = item.content\n .replace(/ /g, \" \")\n .replace(/>/g, \">\")\n .replace(/</g, \"<\")\n .replace(/&/g, \"&\")\n .replace(/\\n/g, \"\");\n const options: PptxGenJS.TextPropsOptions = {};\n\n if (styleObj[\"font-size\"]) {\n options.fontSize = parseInt(styleObj[\"font-size\"], 10) / ratioPx2Pt;\n }\n if (styleObj.color) {\n options.color = formatColor(styleObj.color).color;\n }\n if (styleObj[\"background-color\"]) {\n options.highlight = formatColor(styleObj[\"background-color\"]).color;\n }\n if (styleObj[\"text-decoration-line\"]) {\n if (styleObj[\"text-decoration-line\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration-line\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"text-decoration\"]) {\n if (styleObj[\"text-decoration\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"vertical-align\"]) {\n if (styleObj[\"vertical-align\"] === \"super\") options.superscript = true;\n if (styleObj[\"vertical-align\"] === \"sub\") options.subscript = true;\n }\n if (styleObj[\"text-align\"]) options.align = styleObj[\"text-align\"] as PptxGenJS.HAlign;\n if (styleObj[\"font-weight\"]) options.bold = styleObj[\"font-weight\"] === \"bold\";\n if (styleObj[\"font-style\"]) options.italic = styleObj[\"font-style\"] === \"italic\";\n if (styleObj[\"font-family\"]) options.fontFace = styleObj[\"font-family\"];\n if (styleObj.href) options.hyperlink = { url: styleObj.href };\n\n if (bulletFlag && styleObj[\"list-type\"] === \"ol\") {\n options.bullet = {\n type: \"number\",\n indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25\n };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (bulletFlag && styleObj[\"list-type\"] === \"ul\") {\n options.bullet = { indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25 };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (indent) {\n options.indentLevel = indent;\n indent = 0;\n }\n\n slices.push({ text, options });\n } else if (\"children\" in item) parse(item.children, styleObj);\n }\n };\n parse(ast);\n return slices;\n}\n\nfunction normalizeFontName(value?: string): string | undefined {\n return value ? value.replace(/^\"+|\"+$/g, \"\") : undefined;\n}\n\nfunction clampOpacity(value?: number): number {\n if (value === undefined) return 1;\n if (!Number.isFinite(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction getOpacityRatio(value?: string): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n if (normalized.endsWith(\"%\")) {\n const percent = Number.parseFloat(normalized);\n return Number.isFinite(percent) ? Math.min(1, Math.max(0, percent / 100)) : undefined;\n }\n const numeric = Number.parseFloat(normalized);\n if (!Number.isFinite(numeric)) return undefined;\n return numeric > 1 ? Math.min(1, Math.max(0, numeric / 100)) : Math.min(1, Math.max(0, numeric));\n}\n\nfunction parseFontSize(value?: string): number | undefined {\n if (!value) return undefined;\n const size = Number.parseFloat(value);\n return Number.isFinite(size) ? size : undefined;\n}\n\nfunction parseTableColor(\n value?: string\n): { color: string; transparency: number } | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n const c = formatColor(normalized);\n return {\n color: c.color.replace(\"#\", \"\"),\n transparency: (1 - c.alpha) * 100\n };\n}\n\nfunction isPlaceholderCell(cell?: {\n colspan?: number;\n rowspan?: number;\n text?: string;\n style?: Record<string, string | undefined>;\n}): boolean {\n if (!cell) return false;\n const colspan = cell.colspan ?? 1;\n const rowspan = cell.rowspan ?? 1;\n if (colspan !== 1 || rowspan !== 1) return false;\n const text = cell.text ?? \"\";\n const style = cell.style;\n const hasStyle =\n Boolean(style?.fontname) ||\n Boolean(style?.fontsize) ||\n Boolean(style?.color) ||\n Boolean(style?.backcolor);\n return text.trim() === \"\" && !hasStyle;\n}\n\nexport function buildTableRows(\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): PptxGenJS.TableRow[] {\n const data = (element as any).data as\n | Array<Array<{ id?: string; colspan?: number; rowspan?: number; text?: string; style?: any }>>\n | undefined;\n if (!data || !data.length) return [];\n\n const colCount =\n ((element as any).colWidths as number[] | undefined)?.length ??\n Math.max(...data.map((row) => row.length));\n\n const rows: PptxGenJS.TableRow[] = [];\n const skip = new Array(colCount).fill(0);\n\n data.forEach((row) => {\n const cells: PptxGenJS.TableCell[] = [];\n let colIndex = 0;\n let cellIndex = 0;\n\n while (colIndex < colCount) {\n if (skip[colIndex] > 0) {\n skip[colIndex] -= 1;\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n colIndex += 1;\n continue;\n }\n\n const cell = row[cellIndex];\n if (!cell) break;\n cellIndex += 1;\n\n const colSpan = cell.colspan ?? 1;\n const rowSpan = cell.rowspan ?? 1;\n\n if (rowSpan > 1) {\n for (let i = 0; i < colSpan; i += 1) {\n skip[colIndex + i] = rowSpan - 1;\n }\n }\n\n if (colSpan > 1) {\n for (let i = 0; i < colSpan - 1; i += 1) {\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n }\n }\n\n const style = cell.style ?? {};\n const fontSize = parseFontSize(style.fontsize);\n const fill = parseTableColor(style.backcolor);\n const color = parseTableColor(style.color);\n const cellMargin = [\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch,\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch\n ] as [number, number, number, number];\n\n const options: PptxGenJS.TableCellProps = {\n colspan: colSpan > 1 ? colSpan : undefined,\n rowspan: rowSpan > 1 ? rowSpan : undefined,\n align: style.align as PptxGenJS.HAlign,\n valign: \"middle\",\n fontFace: normalizeFontName(style.fontname),\n fontSize: fontSize ? fontSize / ratioPx2Pt : undefined,\n color: color?.color,\n fill: fill ? { color: fill.color, transparency: fill.transparency } : undefined,\n margin: cellMargin\n };\n\n cells.push({\n text: cell.text ?? \"\",\n options\n });\n\n colIndex += colSpan;\n }\n\n rows.push(cells);\n });\n\n return rows;\n}\n\nexport function getShadowOption(\n shadow: NonNullable<SlideElement[\"shadow\"]>,\n ratioPx2Pt: number\n): PptxGenJS.ShadowProps {\n const c = formatColor(shadow.color ?? \"#000000\");\n const { h = 0, v = 0 } = shadow;\n\n let offset = 4;\n let angle = 45;\n\n if (h === 0 && v === 0) {\n offset = 4;\n angle = 45;\n } else if (h === 0) {\n if (v > 0) {\n offset = v;\n angle = 90;\n } else {\n offset = -v;\n angle = 270;\n }\n } else if (v === 0) {\n if (h > 0) {\n offset = h;\n angle = 1;\n } else {\n offset = -h;\n angle = 180;\n }\n } else if (h > 0 && v > 0) {\n offset = Math.max(h, v);\n angle = 45;\n } else if (h > 0 && v < 0) {\n offset = Math.max(h, -v);\n angle = 315;\n } else if (h < 0 && v > 0) {\n offset = Math.max(-h, v);\n angle = 135;\n } else if (h < 0 && v < 0) {\n offset = Math.max(-h, -v);\n angle = 225;\n }\n\n return {\n color: c.color,\n transparency: (1 - c.alpha) * 100,\n blur: (shadow.blur ?? 0) / ratioPx2Pt,\n offset,\n angle\n };\n}\n\nexport function getOutlineOption(\n outline: NonNullable<SlideElement[\"outline\"]>,\n ratioPx2Pt: number,\n opacity = 1\n): PptxGenJS.ShapeLineProps {\n const c = formatColor(outline.color || \"#000000\");\n const alpha = c.alpha * clampOpacity(opacity);\n return {\n color: c.color,\n transparency: (1 - alpha) * 100,\n width: (outline.width || 1) / ratioPx2Pt,\n dashType: outline.style ? dashTypeMap[outline.style] : \"solid\"\n };\n}\n\nexport function getElementOpacity(value?: number): number {\n return clampOpacity(value);\n}\n\nexport function getFilterOpacity(value?: string): number | undefined {\n return getOpacityRatio(value);\n}\n\nexport function getDashTypeMap(): Record<string, \"solid\" | \"dash\" | \"sysDot\"> {\n return dashTypeMap;\n}\n","export const childlessTags = ['style', 'script', 'template']\n\nexport const closingTags = [\n 'html',\n 'head',\n 'body',\n 'p',\n 'dt',\n 'dd',\n 'li',\n 'option',\n 'thead',\n 'th',\n 'tbody',\n 'tr',\n 'td',\n 'tfoot',\n 'colgroup'\n]\n\nexport const closingTagAncestorBreakers: Record<string, string[]> = {\n li: ['ul', 'ol', 'menu'],\n dt: ['dl'],\n dd: ['dl'],\n tbody: ['table'],\n thead: ['table'],\n tfoot: ['table'],\n tr: ['table'],\n td: ['table']\n}\n\nexport const voidTags = [\n '!doctype',\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]\n","import type { Token } from './types'\nimport { childlessTags } from './tags'\n\ninterface State {\n str: string\n position: number\n tokens: Token[]\n}\n\nconst jumpPosition = (state: State, end: number) => {\n const len = end - state.position\n movePosition(state, len)\n}\n\nconst movePosition = (state: State, len: number) => {\n state.position = state.position + len\n}\n\nconst findTextEnd = (str: string, index: number) => {\n const isEnd = false\n while (!isEnd) {\n const textEnd = str.indexOf('<', index)\n if (textEnd === -1) {\n return textEnd\n }\n const char = str.charAt(textEnd + 1)\n if (char === '/' || char === '!' || /[A-Za-z0-9]/.test(char)) {\n return textEnd\n }\n index = textEnd + 1\n }\n return -1\n}\n\nconst lexText = (state: State) => {\n const { str } = state\n let textEnd = findTextEnd(str, state.position)\n if (textEnd === state.position) return\n if (textEnd === -1) {\n textEnd = str.length\n }\n\n const content = str.slice(state.position, textEnd)\n jumpPosition(state, textEnd)\n\n state.tokens.push({\n type: 'text',\n content\n })\n}\n\nconst lexComment = (state: State) => {\n const { str } = state\n\n movePosition(state, 4)\n let contentEnd = str.indexOf('-->', state.position)\n let commentEnd = contentEnd + 3\n if (contentEnd === -1) {\n contentEnd = commentEnd = str.length\n }\n\n const content = str.slice(state.position, contentEnd)\n jumpPosition(state, commentEnd)\n\n state.tokens.push({\n type: 'comment',\n content\n })\n}\n\nconst lexTagName = (state: State) => {\n const { str } = state\n const len = str.length\n let start = state.position\n\n while (start < len) {\n const char = str.charAt(start)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (isTagChar) break\n start++\n }\n\n let end = start + 1\n while (end < len) {\n const char = str.charAt(end)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (!isTagChar) break\n end++\n }\n\n jumpPosition(state, end)\n const tagName = str.slice(start, end)\n state.tokens.push({\n type: 'tag',\n content: tagName\n })\n return tagName\n}\n\nconst lexTagAttributes = (state: State) => {\n const { str, tokens } = state\n let cursor = state.position\n let quote: string | null = null\n let wordBegin = cursor\n const words: string[] = []\n const len = str.length\n while (cursor < len) {\n const char = str.charAt(cursor)\n if (quote) {\n const isQuoteEnd = char === quote\n if (isQuoteEnd) quote = null\n cursor++\n continue\n }\n\n const isTagEnd = char === '/' || char === '>'\n if (isTagEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n break\n }\n\n const isWordEnd = /\\s/.test(char)\n if (isWordEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n wordBegin = cursor + 1\n cursor++\n continue\n }\n\n const isQuoteStart = char === '\\'' || char === '\"'\n if (isQuoteStart) {\n quote = char\n cursor++\n continue\n }\n\n cursor++\n }\n jumpPosition(state, cursor)\n\n const type = 'attribute'\n for (let i = 0; i < words.length; i++) {\n const word = words[i]\n\n const isNotPair = word.indexOf('=') === -1\n if (isNotPair) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.startsWith('=')) {\n if (secondWord.length > 1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n const thirdWord = words[i + 2]\n i += 1\n if (thirdWord) {\n const newWord = word + '=' + thirdWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n }\n }\n if (word.endsWith('=')) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.indexOf('=') === -1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n\n const newWord = word.slice(0, -1)\n tokens.push({ type, content: newWord })\n continue\n }\n\n tokens.push({ type, content: word })\n }\n}\n\nconst lexSkipTag = (tagName: string, state: State) => {\n const { str, tokens } = state\n const safeTagName = tagName.toLowerCase()\n const len = str.length\n let index = state.position\n\n while (index < len) {\n const nextTag = str.indexOf('</', index)\n if (nextTag === -1) {\n lexText(state)\n break\n }\n\n const tagState = {\n str,\n position: state.position,\n tokens: []\n }\n jumpPosition(tagState, nextTag)\n const name = lexTag(tagState)\n if (safeTagName !== name.toLowerCase()) {\n index = tagState.position\n continue\n }\n\n if (nextTag !== state.position) {\n const textStart = state.position\n jumpPosition(state, nextTag)\n tokens.push({\n type: 'text',\n content: str.slice(textStart, nextTag)\n })\n }\n\n tokens.push(...tagState.tokens)\n jumpPosition(state, tagState.position)\n break\n }\n}\n\nconst lexTag = (state: State) => {\n const { str } = state\n const secondChar = str.charAt(state.position + 1)\n const tagStartClose = secondChar === '/'\n movePosition(state, tagStartClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-start',\n close: tagStartClose\n })\n\n const tagName = lexTagName(state)\n lexTagAttributes(state)\n\n const firstChar = str.charAt(state.position)\n const tagEndClose = firstChar === '/'\n movePosition(state, tagEndClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-end',\n close: tagEndClose\n })\n return tagName\n}\n\nconst lex = (state: State) => {\n const str = state.str\n const len = str.length\n\n while (state.position < len) {\n const start = state.position\n lexText(state)\n\n if (state.position === start) {\n const isComment = str.startsWith('!--', start + 1)\n if (isComment) lexComment(state)\n else {\n const tagName = lexTag(state)\n const safeTag = tagName.toLowerCase()\n if (childlessTags.includes(safeTag)) lexSkipTag(tagName, state)\n }\n }\n }\n}\n\nexport const lexer = (str: string): Token[] => {\n const state = {\n str,\n position: 0,\n tokens: []\n }\n lex(state)\n return state.tokens\n}\n","import type {\n Token,\n HTMLNode,\n TagToken,\n NormalElement,\n TagEndToken,\n AttributeToken,\n TextToken\n} from './types'\nimport { closingTags, closingTagAncestorBreakers, voidTags } from './tags'\n\ninterface StackItem {\n tagName: string | null\n children: HTMLNode[]\n}\n\ninterface State {\n stack: StackItem[]\n cursor: number\n tokens: Token[]\n}\n\nexport const parser = (tokens: Token[]) => {\n const root: StackItem = { tagName: null, children: [] }\n const state: State = { tokens, cursor: 0, stack: [root] }\n parse(state)\n return root.children\n}\n\nexport const hasTerminalParent = (tagName: string, stack: StackItem[]) => {\n const tagParents = closingTagAncestorBreakers[tagName]\n if (tagParents) {\n let currentIndex = stack.length - 1\n while (currentIndex >= 0) {\n const parentTagName = stack[currentIndex].tagName\n if (parentTagName === tagName) break\n if (parentTagName && tagParents.includes(parentTagName)) return true\n currentIndex--\n }\n }\n return false\n}\n\nexport const rewindStack = (stack: StackItem[], newLength: number) => {\n stack.splice(newLength)\n}\n\nexport const parse = (state: State) => {\n const { stack, tokens } = state\n let { cursor } = state\n let nodes = stack[stack.length - 1].children\n const len = tokens.length\n\n while (cursor < len) {\n const token = tokens[cursor]\n if (token.type !== 'tag-start') {\n nodes.push(token as TextToken)\n cursor++\n continue\n }\n\n const tagToken = tokens[++cursor] as TagToken\n cursor++\n const tagName = tagToken.content.toLowerCase()\n if (token.close) {\n let index = stack.length\n let shouldRewind = false\n while (--index > -1) {\n if (stack[index].tagName === tagName) {\n shouldRewind = true\n break\n }\n }\n while (cursor < len) {\n if (tokens[cursor].type !== 'tag-end') break\n cursor++\n }\n if (shouldRewind) {\n rewindStack(stack, index)\n break\n } else continue\n }\n\n const isClosingTag = closingTags.includes(tagName)\n let shouldRewindToAutoClose = isClosingTag\n if (shouldRewindToAutoClose) {\n shouldRewindToAutoClose = !hasTerminalParent(tagName, stack)\n }\n\n if (shouldRewindToAutoClose) {\n let currentIndex = stack.length - 1\n while (currentIndex > 0) {\n if (tagName === stack[currentIndex].tagName) {\n rewindStack(stack, currentIndex)\n const previousIndex = currentIndex - 1\n nodes = stack[previousIndex].children\n break\n }\n currentIndex = currentIndex - 1\n }\n }\n\n const attributes = []\n let tagEndToken: TagEndToken | undefined\n while (cursor < len) {\n const _token = tokens[cursor]\n if (_token.type === 'tag-end') {\n tagEndToken = _token as TagEndToken\n break\n }\n attributes.push((_token as AttributeToken).content)\n cursor++\n }\n\n if (!tagEndToken) break\n\n cursor++\n const children: HTMLNode[] = []\n const elementNode: NormalElement = {\n type: 'element',\n tagName: tagToken.content,\n attributes,\n children\n }\n nodes.push(elementNode)\n\n const hasChildren = !(tagEndToken.close || voidTags.includes(tagName))\n if (hasChildren) {\n stack.push({ tagName, children })\n const innerState = { tokens, cursor, stack }\n parse(innerState)\n cursor = innerState.cursor\n }\n }\n state.cursor = cursor\n}\n","import type { HTMLNode, CommentOrTextAST, ElementAST, AST } from './types'\n\nexport const splitHead = (str: string, sep: string) => {\n const idx = str.indexOf(sep)\n if (idx === -1) return [str]\n return [str.slice(0, idx), str.slice(idx + sep.length)]\n}\n\nconst unquote = (str: string) => {\n const car = str.charAt(0)\n const end = str.length - 1\n const isQuoteStart = car === '\"' || car === \"'\"\n if (isQuoteStart && car === str.charAt(end)) {\n return str.slice(1, end)\n }\n return str\n}\n\nconst formatAttributes = (attributes: string[]) => {\n return attributes.map(attribute => {\n const parts = splitHead(attribute.trim(), '=')\n const key = parts[0]\n const value = typeof parts[1] === 'string' ? unquote(parts[1]) : null\n return { key, value }\n })\n}\n\nexport const format = (nodes: HTMLNode[]): AST[] => {\n return nodes.map(node => {\n if (node.type === 'element') {\n const children = format(node.children)\n const item: ElementAST = {\n type: 'element',\n tagName: node.tagName.toLowerCase(),\n attributes: formatAttributes(node.attributes),\n children\n }\n return item\n }\n\n const item: CommentOrTextAST = {\n type: node.type,\n content: node.content\n }\n return item\n })\n}\n","import { lexer } from './lexer'\nimport { parser } from './parser'\nimport { format } from './format'\nexport type { AST } from './types'\n\nexport const toAST = (str: string) => {\n const tokens = lexer(str)\n const nodes = parser(tokens)\n return format(nodes)\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck } from \"../types/ppt\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: Deck[\"slides\"][number],\n theme: Deck[\"theme\"]\n): void {\n const backgroundColor = slideJson.background?.color ?? theme?.backgroundColor;\n if (!backgroundColor) return;\n const c = formatColor(backgroundColor);\n slide.background = { color: c.color, transparency: (1 - c.alpha) * 100 };\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function applyPptxLayout(pptx: PptxGenJS, width: number, height: number): void {\n const viewportRatio = height / width;\n if (Math.abs(viewportRatio - 0.625) < 0.001) {\n pptx.layout = \"LAYOUT_16x10\";\n return;\n }\n if (Math.abs(viewportRatio - 0.75) < 0.001) {\n pptx.layout = \"LAYOUT_4x3\";\n return;\n }\n if (Math.abs(viewportRatio - 0.70710678) < 0.0001) {\n pptx.defineLayout({ name: \"A3\", width: 10, height: 7.0710678 });\n pptx.layout = \"A3\";\n return;\n }\n if (Math.abs(viewportRatio - 1.41421356) < 0.0001) {\n pptx.defineLayout({ name: \"A3_V\", width: 10, height: 14.1421356 });\n pptx.layout = \"A3_V\";\n return;\n }\n pptx.layout = \"LAYOUT_16x9\";\n}\n","import { SVGPathData } from 'svg-pathdata'\nimport arcToBezier from 'svg-arc-to-cubic-bezier'\n\nconst typeMap: Record<number, string> = {\n 1: 'Z',\n 2: 'M',\n 4: 'H',\n 8: 'V',\n 16: 'L',\n 32: 'C',\n 64: 'S',\n 128: 'Q',\n 256: 'T',\n 512: 'A'\n}\n\nexport const toPoints = (d: string) => {\n if (!d) return []\n if (d.includes('NaN') || d.includes('undefined') || d.includes('null')) return []\n\n let pathData: any\n try {\n pathData = new SVGPathData(d)\n } catch {\n return []\n }\n\n const points: any[] = []\n for (const item of pathData.commands) {\n const type = typeMap[item.type]\n\n if (item.type === 2 || item.type === 16) {\n points.push({\n x: item.x,\n y: item.y,\n relative: item.relative,\n type\n })\n }\n if (item.type === 32) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'cubic',\n x1: item.x1,\n y1: item.y1,\n x2: item.x2,\n y2: item.y2\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 128) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'quadratic',\n x1: item.x1,\n y1: item.y1\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 512) {\n const lastPoint = points[points.length - 1] as any\n if (!lastPoint || !['M', 'L', 'Q', 'C'].includes(lastPoint.type)) continue\n\n const cubicBezierPoints = arcToBezier({\n px: lastPoint.x as number,\n py: lastPoint.y as number,\n cx: item.x,\n cy: item.y,\n rx: item.rX,\n ry: item.rY,\n xAxisRotation: item.xRot,\n largeArcFlag: item.lArcFlag,\n sweepFlag: item.sweepFlag\n }) as Array<{ x: number; y: number; x1: number; y1: number; x2: number; y2: number }>\n for (const cbPoint of cubicBezierPoints) {\n points.push({\n x: cbPoint.x,\n y: cbPoint.y,\n curve: {\n type: 'cubic',\n x1: cbPoint.x1,\n y1: cbPoint.y1,\n x2: cbPoint.x2,\n y2: cbPoint.y2\n },\n relative: false,\n type: 'C'\n })\n }\n } else if (item.type === 1) {\n points.push({ close: true, type })\n } else continue\n }\n return points\n}\n\nexport type SvgPoints = ReturnType<typeof toPoints>\n","import type { SvgPoints } from \"../svgPathParser\";\n\ntype Points = Array<\n | { x: number; y: number; moveTo?: boolean }\n | { x: number; y: number; curve: { type: \"arc\"; hR: number; wR: number; stAng: number; swAng: number } }\n | { x: number; y: number; curve: { type: \"quadratic\"; x1: number; y1: number } }\n | { x: number; y: number; curve: { type: \"cubic\"; x1: number; y1: number; x2: number; y2: number } }\n | { close: true }\n>;\n\nexport function formatPoints(\n points: SvgPoints,\n ratioPx2Inch: number,\n scale = { x: 1, y: 1 }\n): Points {\n return points.map((point) => {\n if (\"close\" in point) {\n return { close: true };\n }\n if (point.type === \"M\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n moveTo: true\n };\n }\n if (point.curve) {\n if (point.curve.type === \"cubic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"cubic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y,\n x2: (point.curve.x2 as number) / ratioPx2Inch * scale.x,\n y2: (point.curve.y2 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n if (point.curve.type === \"quadratic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"quadratic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n }\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y\n };\n });\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function isBase64Image(url: string): boolean {\n const regex = /^data:image\\/[^;]+;base64,/;\n return regex.test(url);\n}\n\nexport function getLineArrowType(\n value?: unknown\n): PptxGenJS.ShapeLineProps[\"beginArrowType\"] {\n if (value === \"arrow\") return \"arrow\";\n if (value === \"dot\") return \"oval\";\n return \"none\";\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck, SlideElement } from \"../types/ppt\";\nimport { resolveImageData } from \"../resolveImageData\";\nimport { toPoints } from \"../svgPathParser\";\nimport { getElementRange, getLineElementPath } from \"../element\";\nimport { DEFAULT_FONT_FACE, DEFAULT_FONT_SIZE } from \"./constants\";\nimport { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type PatternShape } from \"./types\";\nimport {\n buildTableRows,\n formatColor,\n formatHTML,\n getDashTypeMap,\n getElementOpacity,\n getFilterOpacity,\n getOutlineOption,\n getShadowOption\n} from \"./shared\";\n\nexport function addTextElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n template: Deck,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.TextPropsOptions = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.defaultFontName || template.theme?.fontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n valign: \"top\",\n // pptxgenjs margin order: [left, right, bottom, top]\n // Keep horizontal padding while removing vertical inset to match preview baseline.\n margin: [textPadding, textPadding, 0, textPadding * 0.42],\n paraSpaceBefore: 0,\n lineSpacingMultiple: 1.5,\n fit: \"none\"\n };\n if (element.rotate) options.rotate = element.rotate;\n if (element.wordSpace) options.charSpacing = element.wordSpace / ratioPx2Pt;\n if (element.lineHeight) options.lineSpacingMultiple = element.lineHeight;\n if (element.fill) {\n const c = formatColor(element.fill);\n options.fill = {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n if (element.defaultColor) options.color = formatColor(element.defaultColor).color;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.opacity !== undefined) options.transparency = (1 - opacity) * 100;\n if (element.paragraphSpace !== undefined) {\n options.paraSpaceBefore = element.paragraphSpace / ratioPx2Pt;\n }\n if (element.vertical) options.vert = \"eaVert\";\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n\n slide.addText(textProps, options);\n}\n\nexport async function addImageElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Inch: number\n): Promise<void> {\n if (element.type !== \"image\" || !element.src) return;\n\n const options: PptxGenJS.ImageProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch\n };\n\n if (isBase64Image(element.src)) options.data = element.src;\n else options.data = await resolveImageData(element.src);\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.rotate) options.rotate = element.rotate;\n const filterOpacity = getFilterOpacity(element.filters?.opacity) ?? 1;\n const elementOpacity = getElementOpacity(element.opacity);\n const imageOpacity = filterOpacity * elementOpacity;\n if (imageOpacity !== 1) {\n options.transparency = (1 - imageOpacity) * 100;\n }\n if (element.clip?.range) {\n if (element.clip.shape === \"ellipse\") options.rounding = true;\n\n const [start, end] = element.clip.range;\n const [startX, startY] = start;\n const [endX, endY] = end;\n\n const originW = (element.width ?? 0) / ((endX - startX) / ratioPx2Inch);\n const originH = (element.height ?? 0) / ((endY - startY) / ratioPx2Inch);\n\n options.w = originW / ratioPx2Inch;\n options.h = originH / ratioPx2Inch;\n\n options.sizing = {\n type: \"crop\",\n x: (startX / ratioPx2Inch) * (originW / ratioPx2Inch),\n y: (startY / ratioPx2Inch) * (originH / ratioPx2Inch),\n w: ((endX - startX) / ratioPx2Inch) * (originW / ratioPx2Inch),\n h: ((endY - startY) / ratioPx2Inch) * (originH / ratioPx2Inch)\n };\n }\n\n slide.addImage(options);\n}\n\nexport function addShapeElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n slideIndex: number,\n elementIndex: number,\n patternShapes: PatternShape[]\n): void {\n if (element.type !== \"shape\" || !element.path || !element.viewBox) return;\n const scale = {\n x: (element.width ?? 0) / element.viewBox[0],\n y: (element.height ?? 0) / element.viewBox[1]\n };\n const rawPoints = toPoints(element.path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch, scale);\n const pattern = (element as any).pattern as string | undefined;\n const hasFill = typeof element.fill === \"string\" ? element.fill.trim().length > 0 : false;\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n points\n };\n\n if (pattern) {\n const objectName = `pattern-${slideIndex}-${element.id ?? elementIndex}`;\n options.objectName = objectName;\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n patternShapes.push({ slideIndex, objectName, dataUrl: pattern });\n } else if (hasFill) {\n const fillColor = formatColor(element.fill || \"#000000\");\n options.fill = {\n color: fillColor.color,\n transparency: (1 - fillColor.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.rotate) options.rotate = element.rotate;\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n\n if (!element.text?.content) return;\n const textProps = formatHTML(element.text.content, ratioPx2Pt);\n const textOptions: PptxGenJS.TextPropsOptions = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.text.defaultFontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n paraSpaceBefore: 0,\n valign: element.text.align as PptxGenJS.VAlign,\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\"\n };\n textOptions.margin = 0;\n if (element.rotate) textOptions.rotate = element.rotate;\n if (element.text.defaultColor) {\n textOptions.color = formatColor(element.text.defaultColor).color;\n }\n if (element.opacity !== undefined) {\n textOptions.transparency = (1 - opacity) * 100;\n }\n if (element.flipH) textOptions.flipH = element.flipH;\n if (element.flipV) textOptions.flipV = element.flipV;\n\n slide.addText(textProps, textOptions);\n}\n\nexport function addLineElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"line\" || !element.start || !element.end) return;\n const path = getLineElementPath(element);\n const rawPoints = toPoints(path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch);\n const { minX, maxX, minY, maxY } = getElementRange(element);\n const c = formatColor(element.color || \"#000000\");\n const opacity = getElementOpacity(element.opacity);\n const pointsMeta = element.points ?? [];\n const dashTypeMap = getDashTypeMap();\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (maxX - minX) / ratioPx2Inch,\n h: (maxY - minY) / ratioPx2Inch,\n line: {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100,\n width: (element.width ?? 1) / ratioPx2Pt,\n dashType: element.style ? dashTypeMap[element.style] : \"solid\",\n beginArrowType: getLineArrowType(pointsMeta[0]),\n endArrowType: getLineArrowType(pointsMeta[1])\n },\n points\n };\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n}\n\nexport function addTableElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"table\") return;\n const rows = buildTableRows(element, ratioPx2Pt, ratioPx2Inch);\n if (!rows.length) return;\n\n const colWidths = (element as any).colWidths as number[] | undefined;\n const colW = colWidths\n ? colWidths.map((ratio) => ((element.width ?? 0) * ratio) / ratioPx2Inch)\n : undefined;\n\n const rowCount = rows.length || 1;\n const baseRowHeight = ((element.height ?? 0) / rowCount) / ratioPx2Inch;\n const minRowHeight = (element as any).cellMinHeight\n ? (element as any).cellMinHeight / ratioPx2Inch\n : undefined;\n const rowH = minRowHeight\n ? new Array(rowCount).fill(Math.max(minRowHeight, baseRowHeight))\n : undefined;\n\n const outline = element.outline;\n const border =\n outline?.width || outline?.color\n ? {\n pt: (outline.width ?? 1) / ratioPx2Pt,\n color: formatColor(outline.color || \"#000000\").color.replace(\"#\", \"\")\n }\n : {\n pt: 1 / ratioPx2Pt,\n color: \"DDDDDD\"\n };\n\n slide.addTable(rows, {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n colW,\n rowH,\n border,\n margin: 0\n });\n}\n"],"mappings":"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","names":["base64","newWord","item","tinycolor","parse","attr","_a","_b","arcToBezier","dashTypeMap","_a","PptxGenJS","JSZip"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/element.ts","../src/resolveImageData.ts","../src/renderers/shared.ts","../src/htmlParser/tags.ts","../src/htmlParser/lexer.ts","../src/htmlParser/parser.ts","../src/htmlParser/format.ts","../src/htmlParser/index.ts","../src/renderers/constants.ts","../src/renderers/background.ts","../src/renderers/layout.ts","../src/svgPathParser.ts","../src/renderers/points.ts","../src/renderers/utils.ts","../src/renderers/elements.ts"],"sourcesContent":["import PptxGenJS from \"pptxgenjs\";\nimport JSZip from \"jszip\";\nimport { parseDocument } from \"json2pptx-schema\";\n\nimport type { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type PatternShape } from \"./renderers/types\";\nexport const ENABLE_DECK_JSON = true;\nexport const PPTX_JSON_PAYLOAD_PATH = \"json2ppt-editor.json\";\nexport const PPTX_JSON_PAYLOAD_VERSION = 1;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\n\nfunction stripFillTags(value: string): string {\n return value\n .replace(/<a:solidFill>[\\s\\S]*?<\\/a:solidFill>/g, \"\")\n .replace(/<a:gradFill>[\\s\\S]*?<\\/a:gradFill>/g, \"\")\n .replace(/<a:blipFill>[\\s\\S]*?<\\/a:blipFill>/g, \"\")\n .replace(/<a:noFill\\s*\\/>/g, \"\")\n .replace(/<a:noFill><\\/a:noFill>/g, \"\");\n}\n\nfunction applyPatternFill(slideXml: string, objectName: string, relId: string): string {\n const nameToken = `name=\"${objectName}\"`;\n let cursor = 0;\n let result = slideXml;\n\n while (true) {\n const nameIndex = result.indexOf(nameToken, cursor);\n if (nameIndex === -1) break;\n\n const spStart = result.lastIndexOf(\"<p:sp\", nameIndex);\n const spEnd = result.indexOf(\"</p:sp>\", nameIndex);\n if (spStart === -1 || spEnd === -1) break;\n\n const spXml = result.slice(spStart, spEnd + \"</p:sp>\".length);\n const spPrStart = spXml.indexOf(\"<p:spPr>\");\n const spPrEnd = spXml.indexOf(\"</p:spPr>\");\n if (spPrStart === -1 || spPrEnd === -1) {\n cursor = spEnd + 1;\n continue;\n }\n\n const spPrOpenEnd = spXml.indexOf(\">\", spPrStart);\n const spPrInner = spXml.slice(spPrOpenEnd + 1, spPrEnd);\n const cleanedInner = stripFillTags(spPrInner);\n const blipFill = `<a:blipFill><a:blip r:embed=\"${relId}\"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`;\n let nextInner = cleanedInner;\n\n if (cleanedInner.includes(\"</a:custGeom>\")) {\n nextInner = cleanedInner.replace(\"</a:custGeom>\", `</a:custGeom>${blipFill}`);\n } else {\n const lnIndex = cleanedInner.indexOf(\"<a:ln\");\n nextInner =\n lnIndex === -1\n ? `${cleanedInner}${blipFill}`\n : `${cleanedInner.slice(0, lnIndex)}${blipFill}${cleanedInner.slice(lnIndex)}`;\n }\n\n const updatedSpXml =\n spXml.slice(0, spPrOpenEnd + 1) +\n nextInner +\n spXml.slice(spPrEnd);\n\n result = result.slice(0, spStart) + updatedSpXml + result.slice(spEnd + \"</p:sp>\".length);\n cursor = spStart + updatedSpXml.length;\n }\n\n return result;\n}\n\nfunction parseDataUrlImage(\n dataUrl: string\n): { mime: string; data: string; ext: string } | null {\n const match = dataUrl.match(/^data:(image\\/[^;]+);base64,(.+)$/);\n if (!match) return null;\n const mime = match[1];\n const data = match[2];\n const extMap: Record<string, string> = {\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"image/svg+xml\": \"svg\",\n \"image/webp\": \"webp\",\n \"image/bmp\": \"bmp\"\n };\n return { mime, data, ext: extMap[mime] ?? \"png\" };\n}\n\nexport async function createPPTX(\n template: Deck\n): Promise<{ blob: Blob; fileName: string }> {\n const parsedTemplate = parseDocument(template);\n const renderTemplate = parsedTemplate as unknown as Deck;\n\n const pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\n\n const width = parsedTemplate.width;\n const height = parsedTemplate.height;\n const ratioPx2Inch = 96 * (width / 960);\n const ratioPx2Pt = (96 / 72) * (width / 960);\n const textPadding = 10 / ratioPx2Pt;\n\n applyPptxLayout(pptx, width, height);\n\n for (const [slideIndex, slideJson] of (renderTemplate.slides ?? []).entries()) {\n const slide = pptx.addSlide();\n applySlideBackground(slide, slideJson, renderTemplate.theme);\n\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n patternShapes\n );\n addLineElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n }\n }\n\n const fileName = `${sanitizeFileName(parsedTemplate.title || \"presentation\")}.pptx`;\n const pptxBuffer = (await pptx.write({\n outputType: \"arraybuffer\",\n compression: true\n })) as ArrayBuffer;\n\n const needsZip = ENABLE_DECK_JSON || patternShapes.length > 0;\n if (!needsZip) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n if (patternShapes.length) {\n const mediaFiles = Object.keys(zip.files).filter((name) => name.startsWith(\"ppt/media/\"));\n let maxImageIndex = 0;\n for (const name of mediaFiles) {\n const match = name.match(/ppt\\/media\\/image(\\d+)/);\n if (match) {\n const index = Number.parseInt(match[1], 10);\n if (Number.isFinite(index)) maxImageIndex = Math.max(maxImageIndex, index);\n }\n }\n\n const slideCache = new Map<number, string>();\n const relsCache = new Map<number, string>();\n\n for (const pattern of patternShapes) {\n const parsed = parseDataUrlImage(pattern.dataUrl);\n if (!parsed) continue;\n\n maxImageIndex += 1;\n const imageName = `image${maxImageIndex}.${parsed.ext}`;\n zip.file(`ppt/media/${imageName}`, parsed.data, { base64: true });\n\n const slideNumber = pattern.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\n\n const relsXml =\n relsCache.get(slideNumber) ??\n (zip.file(relsPath)\n ? await zip.file(relsPath)!.async(\"string\")\n : `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>`);\n\n let maxRelId = 0;\n relsXml.replace(/Id=\"rId(\\d+)\"/g, (_, id) => {\n const value = Number.parseInt(id, 10);\n if (Number.isFinite(value)) maxRelId = Math.max(maxRelId, value);\n return \"\";\n });\n const relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n const nextRelsXml = relsXml.replace(\n \"</Relationships>\",\n `${relEntry}</Relationships>`\n );\n relsCache.set(slideNumber, nextRelsXml);\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n const nextSlideXml = slideXml\n ? applyPatternFill(slideXml, pattern.objectName, relId)\n : slideXml;\n slideCache.set(slideNumber, nextSlideXml);\n }\n\n for (const [slideNumber, xml] of slideCache.entries()) {\n zip.file(`ppt/slides/slide${slideNumber}.xml`, xml);\n }\n for (const [slideNumber, xml] of relsCache.entries()) {\n zip.file(`ppt/slides/_rels/slide${slideNumber}.xml.rels`, xml);\n }\n }\n\n if (ENABLE_DECK_JSON) {\n zip.file(\n PPTX_JSON_PAYLOAD_PATH,\n JSON.stringify(\n {\n version: PPTX_JSON_PAYLOAD_VERSION,\n deck: parsedTemplate\n },\n null,\n 2\n )\n );\n }\n const blob = await zip.generateAsync({ type: \"blob\" });\n return { blob, fileName };\n}\n\n// Backwards compatibility alias\nexport const buildPptxBlob = createPPTX;\n\nexport { getElementRange, getLineElementPath };\nexport { resolveImageData };\nexport type {\n BaseElement,\n Deck,\n DeckTheme,\n ElementClip,\n ElementFilters,\n ElementOutline,\n ElementShadow,\n ImageElement,\n LineElement,\n ShapeElement,\n Slide,\n SlideBackground,\n SlideElement,\n TextContent,\n TextElement\n} from \"./types/ppt\";\n","import type { LineElement, SlideElement } from './types/ppt'\n\nexport const getElementRange = (element: SlideElement) => {\n let minX = 0\n let maxX = 0\n let minY = 0\n let maxY = 0\n\n if (element.type === 'line' && element.start && element.end) {\n minX = element.left ?? 0\n maxX = (element.left ?? 0) + Math.max(element.start[0], element.end[0])\n minY = element.top ?? 0\n maxY = (element.top ?? 0) + Math.max(element.start[1], element.end[1])\n } else if (element.left !== undefined && element.top !== undefined) {\n minX = element.left\n minY = element.top\n maxX = element.left + (element.width ?? 0)\n maxY = element.top + (element.height ?? 0)\n }\n\n return { minX, maxX, minY, maxY }\n}\n\nconst isLineElement = (element: SlideElement): element is LineElement =>\n element.type === 'line'\n\nexport const getLineElementPath = (element: SlideElement) => {\n if (!isLineElement(element) || !element.start || !element.end) return ''\n const start = element.start.join(',')\n const end = element.end.join(',')\n const broken = element.broken as [number, number] | undefined\n const broken2 = element.broken2 as [number, number] | undefined\n const curve = element.curve as [number, number] | undefined\n const cubic = element.cubic as [[number, number], [number, number]] | undefined\n\n if (broken) {\n const mid = broken.join(',')\n return `M${start} L${mid} L${end}`\n }\n if (broken2) {\n const { minX, maxX, minY, maxY } = getElementRange(element)\n if (maxX - minX >= maxY - minY) {\n return `M${start} L${broken2[0]},${element.start[1]} L${broken2[0]},${element.end[1]} ${end}`\n }\n return `M${start} L${element.start[0]},${broken2[1]} L${element.end[0]},${broken2[1]} ${end}`\n }\n if (curve) {\n const mid = curve.join(',')\n return `M${start} Q${mid} ${end}`\n }\n if (cubic) {\n const [c1, c2] = cubic\n const p1 = c1.join(',')\n const p2 = c2.join(',')\n return `M${start} C${p1} ${p2} ${end}`\n }\n return `M${start} L${end}`\n}\n","const dataUrlRegex = /^data:image\\/[^;]+;base64,/\n\nconst mimeFromPath = (path: string) => {\n const lower = path.toLowerCase()\n if (lower.endsWith('.png')) return 'image/png'\n if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return 'image/jpeg'\n if (lower.endsWith('.gif')) return 'image/gif'\n if (lower.endsWith('.svg')) return 'image/svg+xml'\n if (lower.endsWith('.webp')) return 'image/webp'\n if (lower.endsWith('.bmp')) return 'image/bmp'\n return 'application/octet-stream'\n}\n\nconst toBase64 = (buffer: ArrayBuffer) => {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(buffer).toString('base64')\n }\n\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i += 1) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n}\n\nconst readLocalFile = async (path: string) => {\n const fs = await import('node:fs/promises')\n const buffer = await fs.readFile(path)\n return buffer.toString('base64')\n}\n\nexport const resolveImageData = async (src: string) => {\n if (dataUrlRegex.test(src)) return src\n\n const isFileUrl = src.startsWith('file://')\n const isLocalPath = !src.startsWith('http') && !src.startsWith('data:')\n const isNode = typeof process !== 'undefined' && Boolean(process.versions?.node)\n\n if ((isFileUrl || isLocalPath) && isNode) {\n const filePath = isFileUrl ? src.replace('file://', '') : src\n const base64 = await readLocalFile(filePath)\n const mime = mimeFromPath(filePath)\n return `data:${mime};base64,${base64}`\n }\n\n if (typeof fetch !== 'function') {\n throw new Error('fetch is not available to resolve image data')\n }\n\n const response = await fetch(src)\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const base64 = toBase64(arrayBuffer)\n const contentType = response.headers.get('content-type') || mimeFromPath(src)\n return `data:${contentType};base64,${base64}`\n}\n","import tinycolor from \"tinycolor2\";\nimport type PptxGenJS from \"pptxgenjs\";\n\nimport type { SlideElement } from \"../types/ppt\";\nimport { toAST, type AST } from \"../htmlParser\";\nimport { DEFAULT_FONT_SIZE } from \"./constants\";\n\ntype TextSlice = {\n text: string;\n options?: PptxGenJS.TextPropsOptions;\n};\n\nconst dashTypeMap: Record<string, \"solid\" | \"dash\" | \"sysDot\"> = {\n solid: \"solid\",\n dashed: \"dash\",\n dotted: \"sysDot\"\n};\n\nexport function formatColor(input: string): { alpha: number; color: string } {\n if (!input) {\n return {\n alpha: 0,\n color: \"#000000\"\n };\n }\n\n const color = tinycolor(input);\n const alpha = color.getAlpha();\n const hex = alpha === 0 ? \"#ffffff\" : color.setAlpha(1).toHexString();\n return { alpha, color: hex };\n}\n\nexport function formatHTML(html: string, ratioPx2Pt: number): TextSlice[] {\n const ast = toAST(html);\n let bulletFlag = false;\n let indent = 0;\n\n const slices: TextSlice[] = [];\n const parse = (obj: AST[], baseStyleObj: Record<string, string> = {}) => {\n for (const item of obj) {\n const isBlockTag = \"tagName\" in item && [\"div\", \"li\", \"p\"].includes(item.tagName);\n\n if (isBlockTag && slices.length) {\n const lastSlice = slices[slices.length - 1];\n if (!lastSlice.options) lastSlice.options = {};\n lastSlice.options.breakLine = true;\n }\n\n const styleObj = { ...baseStyleObj };\n const styleAttr =\n \"attributes\" in item\n ? item.attributes.find((attr) => attr.key === \"style\")\n : null;\n if (styleAttr && styleAttr.value) {\n const styleArr = styleAttr.value.split(\";\");\n for (const styleItem of styleArr) {\n const match = styleItem.match(/([^:]+):\\s*(.+)/);\n if (match) {\n const [key, value] = [match[1].trim(), match[2].trim()];\n if (key && value) styleObj[key] = value;\n }\n }\n }\n\n if (\"tagName\" in item) {\n if (item.tagName === \"em\") {\n styleObj[\"font-style\"] = \"italic\";\n }\n if (item.tagName === \"strong\") {\n styleObj[\"font-weight\"] = \"bold\";\n }\n if (item.tagName === \"sup\") {\n styleObj[\"vertical-align\"] = \"super\";\n }\n if (item.tagName === \"sub\") {\n styleObj[\"vertical-align\"] = \"sub\";\n }\n if (item.tagName === \"a\") {\n const attr = item.attributes.find((attr) => attr.key === \"href\");\n styleObj.href = attr?.value || \"\";\n }\n if (item.tagName === \"ul\") {\n styleObj[\"list-type\"] = \"ul\";\n }\n if (item.tagName === \"ol\") {\n styleObj[\"list-type\"] = \"ol\";\n }\n if (item.tagName === \"li\") {\n bulletFlag = true;\n }\n if (item.tagName === \"p\") {\n if (\"attributes\" in item) {\n const dataIndentAttr = item.attributes.find((attr) => attr.key === \"data-indent\");\n if (dataIndentAttr && dataIndentAttr.value) indent = +dataIndentAttr.value;\n }\n }\n }\n\n if (\"tagName\" in item && item.tagName === \"br\") {\n slices.push({ text: \"\", options: { breakLine: true } });\n } else if (\"content\" in item) {\n const text = item.content\n .replace(/ /g, \" \")\n .replace(/>/g, \">\")\n .replace(/</g, \"<\")\n .replace(/&/g, \"&\")\n .replace(/\\n/g, \"\");\n const options: PptxGenJS.TextPropsOptions = {};\n\n if (styleObj[\"font-size\"]) {\n options.fontSize = parseInt(styleObj[\"font-size\"], 10) / ratioPx2Pt;\n }\n if (styleObj.color) {\n options.color = formatColor(styleObj.color).color;\n }\n if (styleObj[\"background-color\"]) {\n options.highlight = formatColor(styleObj[\"background-color\"]).color;\n }\n if (styleObj[\"text-decoration-line\"]) {\n if (styleObj[\"text-decoration-line\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration-line\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"text-decoration\"]) {\n if (styleObj[\"text-decoration\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"vertical-align\"]) {\n if (styleObj[\"vertical-align\"] === \"super\") options.superscript = true;\n if (styleObj[\"vertical-align\"] === \"sub\") options.subscript = true;\n }\n if (styleObj[\"text-align\"]) options.align = styleObj[\"text-align\"] as PptxGenJS.HAlign;\n if (styleObj[\"font-weight\"]) options.bold = styleObj[\"font-weight\"] === \"bold\";\n if (styleObj[\"font-style\"]) options.italic = styleObj[\"font-style\"] === \"italic\";\n if (styleObj[\"font-family\"]) options.fontFace = styleObj[\"font-family\"];\n if (styleObj.href) options.hyperlink = { url: styleObj.href };\n\n if (bulletFlag && styleObj[\"list-type\"] === \"ol\") {\n options.bullet = {\n type: \"number\",\n indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25\n };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (bulletFlag && styleObj[\"list-type\"] === \"ul\") {\n options.bullet = { indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25 };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (indent) {\n options.indentLevel = indent;\n indent = 0;\n }\n\n slices.push({ text, options });\n } else if (\"children\" in item) parse(item.children, styleObj);\n }\n };\n parse(ast);\n return slices;\n}\n\nfunction normalizeFontName(value?: string): string | undefined {\n return value ? value.replace(/^\"+|\"+$/g, \"\") : undefined;\n}\n\nfunction clampOpacity(value?: number): number {\n if (value === undefined) return 1;\n if (!Number.isFinite(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction getOpacityRatio(value?: string): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n if (normalized.endsWith(\"%\")) {\n const percent = Number.parseFloat(normalized);\n return Number.isFinite(percent) ? Math.min(1, Math.max(0, percent / 100)) : undefined;\n }\n const numeric = Number.parseFloat(normalized);\n if (!Number.isFinite(numeric)) return undefined;\n return numeric > 1 ? Math.min(1, Math.max(0, numeric / 100)) : Math.min(1, Math.max(0, numeric));\n}\n\nfunction parseFontSize(value?: string): number | undefined {\n if (!value) return undefined;\n const size = Number.parseFloat(value);\n return Number.isFinite(size) ? size : undefined;\n}\n\nfunction parseTableColor(\n value?: string\n): { color: string; transparency: number } | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n const c = formatColor(normalized);\n return {\n color: c.color.replace(\"#\", \"\"),\n transparency: (1 - c.alpha) * 100\n };\n}\n\nfunction isPlaceholderCell(cell?: {\n colspan?: number;\n rowspan?: number;\n text?: string;\n style?: Record<string, string | undefined>;\n}): boolean {\n if (!cell) return false;\n const colspan = cell.colspan ?? 1;\n const rowspan = cell.rowspan ?? 1;\n if (colspan !== 1 || rowspan !== 1) return false;\n const text = cell.text ?? \"\";\n const style = cell.style;\n const hasStyle =\n Boolean(style?.fontname) ||\n Boolean(style?.fontsize) ||\n Boolean(style?.color) ||\n Boolean(style?.backcolor);\n return text.trim() === \"\" && !hasStyle;\n}\n\nexport function buildTableRows(\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): PptxGenJS.TableRow[] {\n const data = (element as any).data as\n | Array<Array<{ id?: string; colspan?: number; rowspan?: number; text?: string; style?: any }>>\n | undefined;\n if (!data || !data.length) return [];\n\n const colCount =\n ((element as any).colWidths as number[] | undefined)?.length ??\n Math.max(...data.map((row) => row.length));\n\n const rows: PptxGenJS.TableRow[] = [];\n const skip = new Array(colCount).fill(0);\n\n data.forEach((row) => {\n const cells: PptxGenJS.TableCell[] = [];\n let colIndex = 0;\n let cellIndex = 0;\n\n while (colIndex < colCount) {\n if (skip[colIndex] > 0) {\n skip[colIndex] -= 1;\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n colIndex += 1;\n continue;\n }\n\n const cell = row[cellIndex];\n if (!cell) break;\n cellIndex += 1;\n\n const colSpan = cell.colspan ?? 1;\n const rowSpan = cell.rowspan ?? 1;\n\n if (rowSpan > 1) {\n for (let i = 0; i < colSpan; i += 1) {\n skip[colIndex + i] = rowSpan - 1;\n }\n }\n\n if (colSpan > 1) {\n for (let i = 0; i < colSpan - 1; i += 1) {\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n }\n }\n\n const style = cell.style ?? {};\n const fontSize = parseFontSize(style.fontsize);\n const fill = parseTableColor(style.backcolor);\n const color = parseTableColor(style.color);\n const cellMargin = [\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch,\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch\n ] as [number, number, number, number];\n\n const options: PptxGenJS.TableCellProps = {\n colspan: colSpan > 1 ? colSpan : undefined,\n rowspan: rowSpan > 1 ? rowSpan : undefined,\n align: style.align as PptxGenJS.HAlign,\n valign: \"middle\",\n fontFace: normalizeFontName(style.fontname),\n fontSize: fontSize ? fontSize / ratioPx2Pt : undefined,\n color: color?.color,\n fill: fill ? { color: fill.color, transparency: fill.transparency } : undefined,\n margin: cellMargin\n };\n\n cells.push({\n text: cell.text ?? \"\",\n options\n });\n\n colIndex += colSpan;\n }\n\n rows.push(cells);\n });\n\n return rows;\n}\n\nexport function getShadowOption(\n shadow: NonNullable<SlideElement[\"shadow\"]>,\n ratioPx2Pt: number\n): PptxGenJS.ShadowProps {\n const c = formatColor(shadow.color ?? \"#000000\");\n const { h = 0, v = 0 } = shadow;\n\n let offset = 4;\n let angle = 45;\n\n if (h === 0 && v === 0) {\n offset = 4;\n angle = 45;\n } else if (h === 0) {\n if (v > 0) {\n offset = v;\n angle = 90;\n } else {\n offset = -v;\n angle = 270;\n }\n } else if (v === 0) {\n if (h > 0) {\n offset = h;\n angle = 1;\n } else {\n offset = -h;\n angle = 180;\n }\n } else if (h > 0 && v > 0) {\n offset = Math.max(h, v);\n angle = 45;\n } else if (h > 0 && v < 0) {\n offset = Math.max(h, -v);\n angle = 315;\n } else if (h < 0 && v > 0) {\n offset = Math.max(-h, v);\n angle = 135;\n } else if (h < 0 && v < 0) {\n offset = Math.max(-h, -v);\n angle = 225;\n }\n\n return {\n color: c.color,\n transparency: (1 - c.alpha) * 100,\n blur: (shadow.blur ?? 0) / ratioPx2Pt,\n offset,\n angle\n };\n}\n\nexport function getOutlineOption(\n outline: NonNullable<SlideElement[\"outline\"]>,\n ratioPx2Pt: number,\n opacity = 1\n): PptxGenJS.ShapeLineProps {\n const c = formatColor(outline.color || \"#000000\");\n const alpha = c.alpha * clampOpacity(opacity);\n return {\n color: c.color,\n transparency: (1 - alpha) * 100,\n width: (outline.width || 1) / ratioPx2Pt,\n dashType: outline.style ? dashTypeMap[outline.style] : \"solid\"\n };\n}\n\nexport function getElementOpacity(value?: number): number {\n return clampOpacity(value);\n}\n\nexport function getFilterOpacity(value?: string): number | undefined {\n return getOpacityRatio(value);\n}\n\nexport function getDashTypeMap(): Record<string, \"solid\" | \"dash\" | \"sysDot\"> {\n return dashTypeMap;\n}\n","export const childlessTags = ['style', 'script', 'template']\n\nexport const closingTags = [\n 'html',\n 'head',\n 'body',\n 'p',\n 'dt',\n 'dd',\n 'li',\n 'option',\n 'thead',\n 'th',\n 'tbody',\n 'tr',\n 'td',\n 'tfoot',\n 'colgroup'\n]\n\nexport const closingTagAncestorBreakers: Record<string, string[]> = {\n li: ['ul', 'ol', 'menu'],\n dt: ['dl'],\n dd: ['dl'],\n tbody: ['table'],\n thead: ['table'],\n tfoot: ['table'],\n tr: ['table'],\n td: ['table']\n}\n\nexport const voidTags = [\n '!doctype',\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]\n","import type { Token } from './types'\nimport { childlessTags } from './tags'\n\ninterface State {\n str: string\n position: number\n tokens: Token[]\n}\n\nconst jumpPosition = (state: State, end: number) => {\n const len = end - state.position\n movePosition(state, len)\n}\n\nconst movePosition = (state: State, len: number) => {\n state.position = state.position + len\n}\n\nconst findTextEnd = (str: string, index: number) => {\n const isEnd = false\n while (!isEnd) {\n const textEnd = str.indexOf('<', index)\n if (textEnd === -1) {\n return textEnd\n }\n const char = str.charAt(textEnd + 1)\n if (char === '/' || char === '!' || /[A-Za-z0-9]/.test(char)) {\n return textEnd\n }\n index = textEnd + 1\n }\n return -1\n}\n\nconst lexText = (state: State) => {\n const { str } = state\n let textEnd = findTextEnd(str, state.position)\n if (textEnd === state.position) return\n if (textEnd === -1) {\n textEnd = str.length\n }\n\n const content = str.slice(state.position, textEnd)\n jumpPosition(state, textEnd)\n\n state.tokens.push({\n type: 'text',\n content\n })\n}\n\nconst lexComment = (state: State) => {\n const { str } = state\n\n movePosition(state, 4)\n let contentEnd = str.indexOf('-->', state.position)\n let commentEnd = contentEnd + 3\n if (contentEnd === -1) {\n contentEnd = commentEnd = str.length\n }\n\n const content = str.slice(state.position, contentEnd)\n jumpPosition(state, commentEnd)\n\n state.tokens.push({\n type: 'comment',\n content\n })\n}\n\nconst lexTagName = (state: State) => {\n const { str } = state\n const len = str.length\n let start = state.position\n\n while (start < len) {\n const char = str.charAt(start)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (isTagChar) break\n start++\n }\n\n let end = start + 1\n while (end < len) {\n const char = str.charAt(end)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (!isTagChar) break\n end++\n }\n\n jumpPosition(state, end)\n const tagName = str.slice(start, end)\n state.tokens.push({\n type: 'tag',\n content: tagName\n })\n return tagName\n}\n\nconst lexTagAttributes = (state: State) => {\n const { str, tokens } = state\n let cursor = state.position\n let quote: string | null = null\n let wordBegin = cursor\n const words: string[] = []\n const len = str.length\n while (cursor < len) {\n const char = str.charAt(cursor)\n if (quote) {\n const isQuoteEnd = char === quote\n if (isQuoteEnd) quote = null\n cursor++\n continue\n }\n\n const isTagEnd = char === '/' || char === '>'\n if (isTagEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n break\n }\n\n const isWordEnd = /\\s/.test(char)\n if (isWordEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n wordBegin = cursor + 1\n cursor++\n continue\n }\n\n const isQuoteStart = char === '\\'' || char === '\"'\n if (isQuoteStart) {\n quote = char\n cursor++\n continue\n }\n\n cursor++\n }\n jumpPosition(state, cursor)\n\n const type = 'attribute'\n for (let i = 0; i < words.length; i++) {\n const word = words[i]\n\n const isNotPair = word.indexOf('=') === -1\n if (isNotPair) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.startsWith('=')) {\n if (secondWord.length > 1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n const thirdWord = words[i + 2]\n i += 1\n if (thirdWord) {\n const newWord = word + '=' + thirdWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n }\n }\n if (word.endsWith('=')) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.indexOf('=') === -1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n\n const newWord = word.slice(0, -1)\n tokens.push({ type, content: newWord })\n continue\n }\n\n tokens.push({ type, content: word })\n }\n}\n\nconst lexSkipTag = (tagName: string, state: State) => {\n const { str, tokens } = state\n const safeTagName = tagName.toLowerCase()\n const len = str.length\n let index = state.position\n\n while (index < len) {\n const nextTag = str.indexOf('</', index)\n if (nextTag === -1) {\n lexText(state)\n break\n }\n\n const tagState = {\n str,\n position: state.position,\n tokens: []\n }\n jumpPosition(tagState, nextTag)\n const name = lexTag(tagState)\n if (safeTagName !== name.toLowerCase()) {\n index = tagState.position\n continue\n }\n\n if (nextTag !== state.position) {\n const textStart = state.position\n jumpPosition(state, nextTag)\n tokens.push({\n type: 'text',\n content: str.slice(textStart, nextTag)\n })\n }\n\n tokens.push(...tagState.tokens)\n jumpPosition(state, tagState.position)\n break\n }\n}\n\nconst lexTag = (state: State) => {\n const { str } = state\n const secondChar = str.charAt(state.position + 1)\n const tagStartClose = secondChar === '/'\n movePosition(state, tagStartClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-start',\n close: tagStartClose\n })\n\n const tagName = lexTagName(state)\n lexTagAttributes(state)\n\n const firstChar = str.charAt(state.position)\n const tagEndClose = firstChar === '/'\n movePosition(state, tagEndClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-end',\n close: tagEndClose\n })\n return tagName\n}\n\nconst lex = (state: State) => {\n const str = state.str\n const len = str.length\n\n while (state.position < len) {\n const start = state.position\n lexText(state)\n\n if (state.position === start) {\n const isComment = str.startsWith('!--', start + 1)\n if (isComment) lexComment(state)\n else {\n const tagName = lexTag(state)\n const safeTag = tagName.toLowerCase()\n if (childlessTags.includes(safeTag)) lexSkipTag(tagName, state)\n }\n }\n }\n}\n\nexport const lexer = (str: string): Token[] => {\n const state = {\n str,\n position: 0,\n tokens: []\n }\n lex(state)\n return state.tokens\n}\n","import type {\n Token,\n HTMLNode,\n TagToken,\n NormalElement,\n TagEndToken,\n AttributeToken,\n TextToken\n} from './types'\nimport { closingTags, closingTagAncestorBreakers, voidTags } from './tags'\n\ninterface StackItem {\n tagName: string | null\n children: HTMLNode[]\n}\n\ninterface State {\n stack: StackItem[]\n cursor: number\n tokens: Token[]\n}\n\nexport const parser = (tokens: Token[]) => {\n const root: StackItem = { tagName: null, children: [] }\n const state: State = { tokens, cursor: 0, stack: [root] }\n parse(state)\n return root.children\n}\n\nexport const hasTerminalParent = (tagName: string, stack: StackItem[]) => {\n const tagParents = closingTagAncestorBreakers[tagName]\n if (tagParents) {\n let currentIndex = stack.length - 1\n while (currentIndex >= 0) {\n const parentTagName = stack[currentIndex].tagName\n if (parentTagName === tagName) break\n if (parentTagName && tagParents.includes(parentTagName)) return true\n currentIndex--\n }\n }\n return false\n}\n\nexport const rewindStack = (stack: StackItem[], newLength: number) => {\n stack.splice(newLength)\n}\n\nexport const parse = (state: State) => {\n const { stack, tokens } = state\n let { cursor } = state\n let nodes = stack[stack.length - 1].children\n const len = tokens.length\n\n while (cursor < len) {\n const token = tokens[cursor]\n if (token.type !== 'tag-start') {\n nodes.push(token as TextToken)\n cursor++\n continue\n }\n\n const tagToken = tokens[++cursor] as TagToken\n cursor++\n const tagName = tagToken.content.toLowerCase()\n if (token.close) {\n let index = stack.length\n let shouldRewind = false\n while (--index > -1) {\n if (stack[index].tagName === tagName) {\n shouldRewind = true\n break\n }\n }\n while (cursor < len) {\n if (tokens[cursor].type !== 'tag-end') break\n cursor++\n }\n if (shouldRewind) {\n rewindStack(stack, index)\n break\n } else continue\n }\n\n const isClosingTag = closingTags.includes(tagName)\n let shouldRewindToAutoClose = isClosingTag\n if (shouldRewindToAutoClose) {\n shouldRewindToAutoClose = !hasTerminalParent(tagName, stack)\n }\n\n if (shouldRewindToAutoClose) {\n let currentIndex = stack.length - 1\n while (currentIndex > 0) {\n if (tagName === stack[currentIndex].tagName) {\n rewindStack(stack, currentIndex)\n const previousIndex = currentIndex - 1\n nodes = stack[previousIndex].children\n break\n }\n currentIndex = currentIndex - 1\n }\n }\n\n const attributes = []\n let tagEndToken: TagEndToken | undefined\n while (cursor < len) {\n const _token = tokens[cursor]\n if (_token.type === 'tag-end') {\n tagEndToken = _token as TagEndToken\n break\n }\n attributes.push((_token as AttributeToken).content)\n cursor++\n }\n\n if (!tagEndToken) break\n\n cursor++\n const children: HTMLNode[] = []\n const elementNode: NormalElement = {\n type: 'element',\n tagName: tagToken.content,\n attributes,\n children\n }\n nodes.push(elementNode)\n\n const hasChildren = !(tagEndToken.close || voidTags.includes(tagName))\n if (hasChildren) {\n stack.push({ tagName, children })\n const innerState = { tokens, cursor, stack }\n parse(innerState)\n cursor = innerState.cursor\n }\n }\n state.cursor = cursor\n}\n","import type { HTMLNode, CommentOrTextAST, ElementAST, AST } from './types'\n\nexport const splitHead = (str: string, sep: string) => {\n const idx = str.indexOf(sep)\n if (idx === -1) return [str]\n return [str.slice(0, idx), str.slice(idx + sep.length)]\n}\n\nconst unquote = (str: string) => {\n const car = str.charAt(0)\n const end = str.length - 1\n const isQuoteStart = car === '\"' || car === \"'\"\n if (isQuoteStart && car === str.charAt(end)) {\n return str.slice(1, end)\n }\n return str\n}\n\nconst formatAttributes = (attributes: string[]) => {\n return attributes.map(attribute => {\n const parts = splitHead(attribute.trim(), '=')\n const key = parts[0]\n const value = typeof parts[1] === 'string' ? unquote(parts[1]) : null\n return { key, value }\n })\n}\n\nexport const format = (nodes: HTMLNode[]): AST[] => {\n return nodes.map(node => {\n if (node.type === 'element') {\n const children = format(node.children)\n const item: ElementAST = {\n type: 'element',\n tagName: node.tagName.toLowerCase(),\n attributes: formatAttributes(node.attributes),\n children\n }\n return item\n }\n\n const item: CommentOrTextAST = {\n type: node.type,\n content: node.content\n }\n return item\n })\n}\n","import { lexer } from './lexer'\nimport { parser } from './parser'\nimport { format } from './format'\nexport type { AST } from './types'\n\nexport const toAST = (str: string) => {\n const tokens = lexer(str)\n const nodes = parser(tokens)\n return format(nodes)\n}\n","export const DEFAULT_WIDTH = 1000;\nexport const DEFAULT_HEIGHT = 562.5;\nexport const DEFAULT_FONT_SIZE = 16;\nexport const DEFAULT_FONT_FACE = \"微软雅黑\";\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck } from \"../types/ppt\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: Deck[\"slides\"][number],\n theme: Deck[\"theme\"]\n): void {\n const backgroundColor = slideJson.background?.color ?? theme?.backgroundColor;\n if (!backgroundColor) return;\n const c = formatColor(backgroundColor);\n slide.background = { color: c.color, transparency: (1 - c.alpha) * 100 };\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function applyPptxLayout(pptx: PptxGenJS, width: number, height: number): void {\n const viewportRatio = height / width;\n if (Math.abs(viewportRatio - 0.625) < 0.001) {\n pptx.layout = \"LAYOUT_16x10\";\n return;\n }\n if (Math.abs(viewportRatio - 0.75) < 0.001) {\n pptx.layout = \"LAYOUT_4x3\";\n return;\n }\n if (Math.abs(viewportRatio - 0.70710678) < 0.0001) {\n pptx.defineLayout({ name: \"A3\", width: 10, height: 7.0710678 });\n pptx.layout = \"A3\";\n return;\n }\n if (Math.abs(viewportRatio - 1.41421356) < 0.0001) {\n pptx.defineLayout({ name: \"A3_V\", width: 10, height: 14.1421356 });\n pptx.layout = \"A3_V\";\n return;\n }\n pptx.layout = \"LAYOUT_16x9\";\n}\n","import { SVGPathData } from 'svg-pathdata'\nimport arcToBezier from 'svg-arc-to-cubic-bezier'\n\nconst typeMap: Record<number, string> = {\n 1: 'Z',\n 2: 'M',\n 4: 'H',\n 8: 'V',\n 16: 'L',\n 32: 'C',\n 64: 'S',\n 128: 'Q',\n 256: 'T',\n 512: 'A'\n}\n\nexport const toPoints = (d: string) => {\n if (!d) return []\n if (d.includes('NaN') || d.includes('undefined') || d.includes('null')) return []\n\n let pathData: any\n try {\n pathData = new SVGPathData(d)\n } catch {\n return []\n }\n\n const points: any[] = []\n for (const item of pathData.commands) {\n const type = typeMap[item.type]\n\n if (item.type === 2 || item.type === 16) {\n points.push({\n x: item.x,\n y: item.y,\n relative: item.relative,\n type\n })\n }\n if (item.type === 32) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'cubic',\n x1: item.x1,\n y1: item.y1,\n x2: item.x2,\n y2: item.y2\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 128) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'quadratic',\n x1: item.x1,\n y1: item.y1\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 512) {\n const lastPoint = points[points.length - 1] as any\n if (!lastPoint || !['M', 'L', 'Q', 'C'].includes(lastPoint.type)) continue\n\n const cubicBezierPoints = arcToBezier({\n px: lastPoint.x as number,\n py: lastPoint.y as number,\n cx: item.x,\n cy: item.y,\n rx: item.rX,\n ry: item.rY,\n xAxisRotation: item.xRot,\n largeArcFlag: item.lArcFlag,\n sweepFlag: item.sweepFlag\n }) as Array<{ x: number; y: number; x1: number; y1: number; x2: number; y2: number }>\n for (const cbPoint of cubicBezierPoints) {\n points.push({\n x: cbPoint.x,\n y: cbPoint.y,\n curve: {\n type: 'cubic',\n x1: cbPoint.x1,\n y1: cbPoint.y1,\n x2: cbPoint.x2,\n y2: cbPoint.y2\n },\n relative: false,\n type: 'C'\n })\n }\n } else if (item.type === 1) {\n points.push({ close: true, type })\n } else continue\n }\n return points\n}\n\nexport type SvgPoints = ReturnType<typeof toPoints>\n","import type { SvgPoints } from \"../svgPathParser\";\n\ntype Points = Array<\n | { x: number; y: number; moveTo?: boolean }\n | { x: number; y: number; curve: { type: \"arc\"; hR: number; wR: number; stAng: number; swAng: number } }\n | { x: number; y: number; curve: { type: \"quadratic\"; x1: number; y1: number } }\n | { x: number; y: number; curve: { type: \"cubic\"; x1: number; y1: number; x2: number; y2: number } }\n | { close: true }\n>;\n\nexport function formatPoints(\n points: SvgPoints,\n ratioPx2Inch: number,\n scale = { x: 1, y: 1 }\n): Points {\n return points.map((point) => {\n if (\"close\" in point) {\n return { close: true };\n }\n if (point.type === \"M\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n moveTo: true\n };\n }\n if (point.curve) {\n if (point.curve.type === \"cubic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"cubic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y,\n x2: (point.curve.x2 as number) / ratioPx2Inch * scale.x,\n y2: (point.curve.y2 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n if (point.curve.type === \"quadratic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"quadratic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n }\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y\n };\n });\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function isBase64Image(url: string): boolean {\n const regex = /^data:image\\/[^;]+;base64,/;\n return regex.test(url);\n}\n\nexport function getLineArrowType(\n value?: unknown\n): PptxGenJS.ShapeLineProps[\"beginArrowType\"] {\n if (value === \"arrow\") return \"arrow\";\n if (value === \"dot\") return \"oval\";\n return \"none\";\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck, SlideElement } from \"../types/ppt\";\nimport { resolveImageData } from \"../resolveImageData\";\nimport { toPoints } from \"../svgPathParser\";\nimport { getElementRange, getLineElementPath } from \"../element\";\nimport { DEFAULT_FONT_FACE, DEFAULT_FONT_SIZE } from \"./constants\";\nimport { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type PatternShape } from \"./types\";\nimport {\n buildTableRows,\n formatColor,\n formatHTML,\n getDashTypeMap,\n getElementOpacity,\n getFilterOpacity,\n getOutlineOption,\n getShadowOption\n} from \"./shared\";\n\nexport function addTextElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n template: Deck,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.TextPropsOptions = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.defaultFontName || template.theme?.fontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n valign: \"top\",\n // pptxgenjs margin order: [left, right, bottom, top]\n // Keep horizontal padding while removing vertical inset to match preview baseline.\n margin: [textPadding, textPadding, 0, textPadding * 0.42],\n paraSpaceBefore: 0,\n lineSpacingMultiple: 1.5,\n fit: \"none\"\n };\n if (element.rotate) options.rotate = element.rotate;\n if (element.wordSpace) options.charSpacing = element.wordSpace / ratioPx2Pt;\n if (element.lineHeight) options.lineSpacingMultiple = element.lineHeight;\n if (element.fill) {\n const c = formatColor(element.fill);\n options.fill = {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n if (element.defaultColor) options.color = formatColor(element.defaultColor).color;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.opacity !== undefined) options.transparency = (1 - opacity) * 100;\n if (element.paragraphSpace !== undefined) {\n options.paraSpaceBefore = element.paragraphSpace / ratioPx2Pt;\n }\n if (element.vertical) options.vert = \"eaVert\";\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n\n slide.addText(textProps, options);\n}\n\nexport async function addImageElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Inch: number\n): Promise<void> {\n if (element.type !== \"image\" || !element.src) return;\n\n const options: PptxGenJS.ImageProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch\n };\n\n if (isBase64Image(element.src)) options.data = element.src;\n else options.data = await resolveImageData(element.src);\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.rotate) options.rotate = element.rotate;\n const filterOpacity = getFilterOpacity(element.filters?.opacity) ?? 1;\n const elementOpacity = getElementOpacity(element.opacity);\n const imageOpacity = filterOpacity * elementOpacity;\n if (imageOpacity !== 1) {\n options.transparency = (1 - imageOpacity) * 100;\n }\n if (element.clip?.range) {\n if (element.clip.shape === \"ellipse\") options.rounding = true;\n\n const [start, end] = element.clip.range;\n const [startX, startY] = start;\n const [endX, endY] = end;\n\n const originW = (element.width ?? 0) / ((endX - startX) / ratioPx2Inch);\n const originH = (element.height ?? 0) / ((endY - startY) / ratioPx2Inch);\n\n options.w = originW / ratioPx2Inch;\n options.h = originH / ratioPx2Inch;\n\n options.sizing = {\n type: \"crop\",\n x: (startX / ratioPx2Inch) * (originW / ratioPx2Inch),\n y: (startY / ratioPx2Inch) * (originH / ratioPx2Inch),\n w: ((endX - startX) / ratioPx2Inch) * (originW / ratioPx2Inch),\n h: ((endY - startY) / ratioPx2Inch) * (originH / ratioPx2Inch)\n };\n }\n\n slide.addImage(options);\n}\n\nexport function addShapeElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n slideIndex: number,\n elementIndex: number,\n patternShapes: PatternShape[]\n): void {\n if (element.type !== \"shape\" || !element.path || !element.viewBox) return;\n const scale = {\n x: (element.width ?? 0) / element.viewBox[0],\n y: (element.height ?? 0) / element.viewBox[1]\n };\n const rawPoints = toPoints(element.path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch, scale);\n const pattern = (element as any).pattern as string | undefined;\n const hasFill = typeof element.fill === \"string\" ? element.fill.trim().length > 0 : false;\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n points\n };\n\n if (pattern) {\n const objectName = `pattern-${slideIndex}-${element.id ?? elementIndex}`;\n options.objectName = objectName;\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n patternShapes.push({ slideIndex, objectName, dataUrl: pattern });\n } else if (hasFill) {\n const fillColor = formatColor(element.fill || \"#000000\");\n options.fill = {\n color: fillColor.color,\n transparency: (1 - fillColor.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.rotate) options.rotate = element.rotate;\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n\n if (!element.text?.content) return;\n const textProps = formatHTML(element.text.content, ratioPx2Pt);\n const textOptions: PptxGenJS.TextPropsOptions = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.text.defaultFontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n paraSpaceBefore: 0,\n valign: element.text.align as PptxGenJS.VAlign,\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\"\n };\n textOptions.margin = 0;\n if (element.rotate) textOptions.rotate = element.rotate;\n if (element.text.defaultColor) {\n textOptions.color = formatColor(element.text.defaultColor).color;\n }\n if (element.opacity !== undefined) {\n textOptions.transparency = (1 - opacity) * 100;\n }\n if (element.flipH) textOptions.flipH = element.flipH;\n if (element.flipV) textOptions.flipV = element.flipV;\n\n slide.addText(textProps, textOptions);\n}\n\nexport function addLineElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"line\" || !element.start || !element.end) return;\n const path = getLineElementPath(element);\n const rawPoints = toPoints(path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch);\n const { minX, maxX, minY, maxY } = getElementRange(element);\n const c = formatColor(element.color || \"#000000\");\n const opacity = getElementOpacity(element.opacity);\n const pointsMeta = element.points ?? [];\n const dashTypeMap = getDashTypeMap();\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (maxX - minX) / ratioPx2Inch,\n h: (maxY - minY) / ratioPx2Inch,\n line: {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100,\n width: (element.width ?? 1) / ratioPx2Pt,\n dashType: element.style ? dashTypeMap[element.style] : \"solid\",\n beginArrowType: getLineArrowType(pointsMeta[0]),\n endArrowType: getLineArrowType(pointsMeta[1])\n },\n points\n };\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n}\n\nexport function addTableElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"table\") return;\n const rows = buildTableRows(element, ratioPx2Pt, ratioPx2Inch);\n if (!rows.length) return;\n\n const colWidths = (element as any).colWidths as number[] | undefined;\n const colW = colWidths\n ? colWidths.map((ratio) => ((element.width ?? 0) * ratio) / ratioPx2Inch)\n : undefined;\n\n const rowCount = rows.length || 1;\n const baseRowHeight = ((element.height ?? 0) / rowCount) / ratioPx2Inch;\n const minRowHeight = (element as any).cellMinHeight\n ? (element as any).cellMinHeight / ratioPx2Inch\n : undefined;\n const rowH = minRowHeight\n ? new Array(rowCount).fill(Math.max(minRowHeight, baseRowHeight))\n : undefined;\n\n const outline = element.outline;\n const border =\n outline?.width || outline?.color\n ? {\n pt: (outline.width ?? 1) / ratioPx2Pt,\n color: formatColor(outline.color || \"#000000\").color.replace(\"#\", \"\")\n }\n : {\n pt: 1 / ratioPx2Pt,\n color: \"DDDDDD\"\n };\n\n slide.addTable(rows, {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n colW,\n rowH,\n border,\n margin: 0\n });\n}\n"],"mappings":"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","names":["base64","newWord","item","tinycolor","parse","attr","_a","_b","arcToBezier","dashTypeMap","_a","PptxGenJS","JSZip"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import PptxGenJS from "pptxgenjs";
|
|
3
3
|
import JSZip from "jszip";
|
|
4
|
+
import { parseDocument } from "json2pptx-schema";
|
|
4
5
|
|
|
5
6
|
// src/element.ts
|
|
6
7
|
var getElementRange = (element) => {
|
|
@@ -109,12 +110,6 @@ var resolveImageData = async (src) => {
|
|
|
109
110
|
return `data:${contentType};base64,${base64}`;
|
|
110
111
|
};
|
|
111
112
|
|
|
112
|
-
// src/renderers/constants.ts
|
|
113
|
-
var DEFAULT_WIDTH = 1e3;
|
|
114
|
-
var DEFAULT_HEIGHT = 562.5;
|
|
115
|
-
var DEFAULT_FONT_SIZE = 16;
|
|
116
|
-
var DEFAULT_FONT_FACE = "\u5FAE\u8F6F\u96C5\u9ED1";
|
|
117
|
-
|
|
118
113
|
// src/renderers/shared.ts
|
|
119
114
|
import tinycolor from "tinycolor2";
|
|
120
115
|
|
|
@@ -555,6 +550,10 @@ var toAST = (str) => {
|
|
|
555
550
|
return format(nodes);
|
|
556
551
|
};
|
|
557
552
|
|
|
553
|
+
// src/renderers/constants.ts
|
|
554
|
+
var DEFAULT_FONT_SIZE = 16;
|
|
555
|
+
var DEFAULT_FONT_FACE = "\u5FAE\u8F6F\u96C5\u9ED1";
|
|
556
|
+
|
|
558
557
|
// src/renderers/shared.ts
|
|
559
558
|
var dashTypeMap = {
|
|
560
559
|
solid: "solid",
|
|
@@ -1352,20 +1351,22 @@ function parseDataUrlImage(dataUrl) {
|
|
|
1352
1351
|
return { mime, data, ext: (_a = extMap[mime]) != null ? _a : "png" };
|
|
1353
1352
|
}
|
|
1354
1353
|
async function createPPTX(template) {
|
|
1355
|
-
var _a, _b, _c, _d
|
|
1354
|
+
var _a, _b, _c, _d;
|
|
1355
|
+
const parsedTemplate = parseDocument(template);
|
|
1356
|
+
const renderTemplate = parsedTemplate;
|
|
1356
1357
|
const pptx = new PptxGenJS();
|
|
1357
1358
|
const patternShapes = [];
|
|
1358
|
-
const width =
|
|
1359
|
-
const height =
|
|
1359
|
+
const width = parsedTemplate.width;
|
|
1360
|
+
const height = parsedTemplate.height;
|
|
1360
1361
|
const ratioPx2Inch = 96 * (width / 960);
|
|
1361
1362
|
const ratioPx2Pt = 96 / 72 * (width / 960);
|
|
1362
1363
|
const textPadding = 10 / ratioPx2Pt;
|
|
1363
1364
|
applyPptxLayout(pptx, width, height);
|
|
1364
|
-
for (const [slideIndex, slideJson] of ((
|
|
1365
|
+
for (const [slideIndex, slideJson] of ((_a = renderTemplate.slides) != null ? _a : []).entries()) {
|
|
1365
1366
|
const slide = pptx.addSlide();
|
|
1366
|
-
applySlideBackground(slide, slideJson,
|
|
1367
|
-
for (const [elementIndex, element] of ((
|
|
1368
|
-
addTextElement(slide, element,
|
|
1367
|
+
applySlideBackground(slide, slideJson, renderTemplate.theme);
|
|
1368
|
+
for (const [elementIndex, element] of ((_b = slideJson.elements) != null ? _b : []).entries()) {
|
|
1369
|
+
addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);
|
|
1369
1370
|
await addImageElement(slide, element, ratioPx2Inch);
|
|
1370
1371
|
addShapeElement(
|
|
1371
1372
|
slide,
|
|
@@ -1380,7 +1381,7 @@ async function createPPTX(template) {
|
|
|
1380
1381
|
addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);
|
|
1381
1382
|
}
|
|
1382
1383
|
}
|
|
1383
|
-
const fileName = `${sanitizeFileName(
|
|
1384
|
+
const fileName = `${sanitizeFileName(parsedTemplate.title || "presentation")}.pptx`;
|
|
1384
1385
|
const pptxBuffer = await pptx.write({
|
|
1385
1386
|
outputType: "arraybuffer",
|
|
1386
1387
|
compression: true
|
|
@@ -1411,7 +1412,7 @@ async function createPPTX(template) {
|
|
|
1411
1412
|
const slideNumber = pattern.slideIndex + 1;
|
|
1412
1413
|
const slidePath = `ppt/slides/slide${slideNumber}.xml`;
|
|
1413
1414
|
const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;
|
|
1414
|
-
const relsXml = (
|
|
1415
|
+
const relsXml = (_c = relsCache.get(slideNumber)) != null ? _c : zip.file(relsPath) ? await zip.file(relsPath).async("string") : `<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>`;
|
|
1415
1416
|
let maxRelId = 0;
|
|
1416
1417
|
relsXml.replace(/Id="rId(\d+)"/g, (_, id) => {
|
|
1417
1418
|
const value = Number.parseInt(id, 10);
|
|
@@ -1425,7 +1426,7 @@ async function createPPTX(template) {
|
|
|
1425
1426
|
`${relEntry}</Relationships>`
|
|
1426
1427
|
);
|
|
1427
1428
|
relsCache.set(slideNumber, nextRelsXml);
|
|
1428
|
-
const slideXml = (
|
|
1429
|
+
const slideXml = (_d = slideCache.get(slideNumber)) != null ? _d : zip.file(slidePath) ? await zip.file(slidePath).async("string") : "";
|
|
1429
1430
|
const nextSlideXml = slideXml ? applyPatternFill(slideXml, pattern.objectName, relId) : slideXml;
|
|
1430
1431
|
slideCache.set(slideNumber, nextSlideXml);
|
|
1431
1432
|
}
|
|
@@ -1442,7 +1443,7 @@ async function createPPTX(template) {
|
|
|
1442
1443
|
JSON.stringify(
|
|
1443
1444
|
{
|
|
1444
1445
|
version: PPTX_JSON_PAYLOAD_VERSION,
|
|
1445
|
-
deck:
|
|
1446
|
+
deck: parsedTemplate
|
|
1446
1447
|
},
|
|
1447
1448
|
null,
|
|
1448
1449
|
2
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/element.ts","../src/resolveImageData.ts","../src/renderers/constants.ts","../src/renderers/shared.ts","../src/htmlParser/tags.ts","../src/htmlParser/lexer.ts","../src/htmlParser/parser.ts","../src/htmlParser/format.ts","../src/htmlParser/index.ts","../src/renderers/background.ts","../src/renderers/layout.ts","../src/svgPathParser.ts","../src/renderers/points.ts","../src/renderers/utils.ts","../src/renderers/elements.ts"],"sourcesContent":["import PptxGenJS from \"pptxgenjs\";\nimport JSZip from \"jszip\";\n\nimport type { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { DEFAULT_HEIGHT, DEFAULT_WIDTH } from \"./renderers/constants\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type PatternShape } from \"./renderers/types\";\nexport const ENABLE_DECK_JSON = true;\nexport const PPTX_JSON_PAYLOAD_PATH = \"json2ppt-editor.json\";\nexport const PPTX_JSON_PAYLOAD_VERSION = 1;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\n\nfunction stripFillTags(value: string): string {\n return value\n .replace(/<a:solidFill>[\\s\\S]*?<\\/a:solidFill>/g, \"\")\n .replace(/<a:gradFill>[\\s\\S]*?<\\/a:gradFill>/g, \"\")\n .replace(/<a:blipFill>[\\s\\S]*?<\\/a:blipFill>/g, \"\")\n .replace(/<a:noFill\\s*\\/>/g, \"\")\n .replace(/<a:noFill><\\/a:noFill>/g, \"\");\n}\n\nfunction applyPatternFill(slideXml: string, objectName: string, relId: string): string {\n const nameToken = `name=\"${objectName}\"`;\n let cursor = 0;\n let result = slideXml;\n\n while (true) {\n const nameIndex = result.indexOf(nameToken, cursor);\n if (nameIndex === -1) break;\n\n const spStart = result.lastIndexOf(\"<p:sp\", nameIndex);\n const spEnd = result.indexOf(\"</p:sp>\", nameIndex);\n if (spStart === -1 || spEnd === -1) break;\n\n const spXml = result.slice(spStart, spEnd + \"</p:sp>\".length);\n const spPrStart = spXml.indexOf(\"<p:spPr>\");\n const spPrEnd = spXml.indexOf(\"</p:spPr>\");\n if (spPrStart === -1 || spPrEnd === -1) {\n cursor = spEnd + 1;\n continue;\n }\n\n const spPrOpenEnd = spXml.indexOf(\">\", spPrStart);\n const spPrInner = spXml.slice(spPrOpenEnd + 1, spPrEnd);\n const cleanedInner = stripFillTags(spPrInner);\n const blipFill = `<a:blipFill><a:blip r:embed=\"${relId}\"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`;\n let nextInner = cleanedInner;\n\n if (cleanedInner.includes(\"</a:custGeom>\")) {\n nextInner = cleanedInner.replace(\"</a:custGeom>\", `</a:custGeom>${blipFill}`);\n } else {\n const lnIndex = cleanedInner.indexOf(\"<a:ln\");\n nextInner =\n lnIndex === -1\n ? `${cleanedInner}${blipFill}`\n : `${cleanedInner.slice(0, lnIndex)}${blipFill}${cleanedInner.slice(lnIndex)}`;\n }\n\n const updatedSpXml =\n spXml.slice(0, spPrOpenEnd + 1) +\n nextInner +\n spXml.slice(spPrEnd);\n\n result = result.slice(0, spStart) + updatedSpXml + result.slice(spEnd + \"</p:sp>\".length);\n cursor = spStart + updatedSpXml.length;\n }\n\n return result;\n}\n\nfunction parseDataUrlImage(\n dataUrl: string\n): { mime: string; data: string; ext: string } | null {\n const match = dataUrl.match(/^data:(image\\/[^;]+);base64,(.+)$/);\n if (!match) return null;\n const mime = match[1];\n const data = match[2];\n const extMap: Record<string, string> = {\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"image/svg+xml\": \"svg\",\n \"image/webp\": \"webp\",\n \"image/bmp\": \"bmp\"\n };\n return { mime, data, ext: extMap[mime] ?? \"png\" };\n}\n\nexport async function createPPTX(\n template: Deck\n): Promise<{ blob: Blob; fileName: string }> {\n const pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\n\n const width = template.width ?? DEFAULT_WIDTH;\n const height = template.height ?? DEFAULT_HEIGHT;\n const ratioPx2Inch = 96 * (width / 960);\n const ratioPx2Pt = (96 / 72) * (width / 960);\n const textPadding = 10 / ratioPx2Pt;\n\n applyPptxLayout(pptx, width, height);\n\n for (const [slideIndex, slideJson] of (template.slides ?? []).entries()) {\n const slide = pptx.addSlide();\n applySlideBackground(slide, slideJson, template.theme);\n\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, template, ratioPx2Pt, ratioPx2Inch, textPadding);\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n patternShapes\n );\n addLineElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n }\n }\n\n const fileName = `${sanitizeFileName(template.title ?? \"presentation\")}.pptx`;\n const pptxBuffer = (await pptx.write({\n outputType: \"arraybuffer\",\n compression: true\n })) as ArrayBuffer;\n\n const needsZip = ENABLE_DECK_JSON || patternShapes.length > 0;\n if (!needsZip) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n if (patternShapes.length) {\n const mediaFiles = Object.keys(zip.files).filter((name) => name.startsWith(\"ppt/media/\"));\n let maxImageIndex = 0;\n for (const name of mediaFiles) {\n const match = name.match(/ppt\\/media\\/image(\\d+)/);\n if (match) {\n const index = Number.parseInt(match[1], 10);\n if (Number.isFinite(index)) maxImageIndex = Math.max(maxImageIndex, index);\n }\n }\n\n const slideCache = new Map<number, string>();\n const relsCache = new Map<number, string>();\n\n for (const pattern of patternShapes) {\n const parsed = parseDataUrlImage(pattern.dataUrl);\n if (!parsed) continue;\n\n maxImageIndex += 1;\n const imageName = `image${maxImageIndex}.${parsed.ext}`;\n zip.file(`ppt/media/${imageName}`, parsed.data, { base64: true });\n\n const slideNumber = pattern.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\n\n const relsXml =\n relsCache.get(slideNumber) ??\n (zip.file(relsPath)\n ? await zip.file(relsPath)!.async(\"string\")\n : `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>`);\n\n let maxRelId = 0;\n relsXml.replace(/Id=\"rId(\\d+)\"/g, (_, id) => {\n const value = Number.parseInt(id, 10);\n if (Number.isFinite(value)) maxRelId = Math.max(maxRelId, value);\n return \"\";\n });\n const relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n const nextRelsXml = relsXml.replace(\n \"</Relationships>\",\n `${relEntry}</Relationships>`\n );\n relsCache.set(slideNumber, nextRelsXml);\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n const nextSlideXml = slideXml\n ? applyPatternFill(slideXml, pattern.objectName, relId)\n : slideXml;\n slideCache.set(slideNumber, nextSlideXml);\n }\n\n for (const [slideNumber, xml] of slideCache.entries()) {\n zip.file(`ppt/slides/slide${slideNumber}.xml`, xml);\n }\n for (const [slideNumber, xml] of relsCache.entries()) {\n zip.file(`ppt/slides/_rels/slide${slideNumber}.xml.rels`, xml);\n }\n }\n\n if (ENABLE_DECK_JSON) {\n zip.file(\n PPTX_JSON_PAYLOAD_PATH,\n JSON.stringify(\n {\n version: PPTX_JSON_PAYLOAD_VERSION,\n deck: template\n },\n null,\n 2\n )\n );\n }\n const blob = await zip.generateAsync({ type: \"blob\" });\n return { blob, fileName };\n}\n\n// Backwards compatibility alias\nexport const buildPptxBlob = createPPTX;\n\nexport { getElementRange, getLineElementPath };\nexport { resolveImageData };\nexport type {\n BaseElement,\n Deck,\n DeckTheme,\n ElementClip,\n ElementFilters,\n ElementOutline,\n ElementShadow,\n ImageElement,\n LineElement,\n ShapeElement,\n Slide,\n SlideBackground,\n SlideElement,\n TextContent,\n TextElement\n} from \"./types/ppt\";\n","import type { LineElement, SlideElement } from './types/ppt'\n\nexport const getElementRange = (element: SlideElement) => {\n let minX = 0\n let maxX = 0\n let minY = 0\n let maxY = 0\n\n if (element.type === 'line' && element.start && element.end) {\n minX = element.left ?? 0\n maxX = (element.left ?? 0) + Math.max(element.start[0], element.end[0])\n minY = element.top ?? 0\n maxY = (element.top ?? 0) + Math.max(element.start[1], element.end[1])\n } else if (element.left !== undefined && element.top !== undefined) {\n minX = element.left\n minY = element.top\n maxX = element.left + (element.width ?? 0)\n maxY = element.top + (element.height ?? 0)\n }\n\n return { minX, maxX, minY, maxY }\n}\n\nconst isLineElement = (element: SlideElement): element is LineElement =>\n element.type === 'line'\n\nexport const getLineElementPath = (element: SlideElement) => {\n if (!isLineElement(element) || !element.start || !element.end) return ''\n const start = element.start.join(',')\n const end = element.end.join(',')\n const broken = element.broken as [number, number] | undefined\n const broken2 = element.broken2 as [number, number] | undefined\n const curve = element.curve as [number, number] | undefined\n const cubic = element.cubic as [[number, number], [number, number]] | undefined\n\n if (broken) {\n const mid = broken.join(',')\n return `M${start} L${mid} L${end}`\n }\n if (broken2) {\n const { minX, maxX, minY, maxY } = getElementRange(element)\n if (maxX - minX >= maxY - minY) {\n return `M${start} L${broken2[0]},${element.start[1]} L${broken2[0]},${element.end[1]} ${end}`\n }\n return `M${start} L${element.start[0]},${broken2[1]} L${element.end[0]},${broken2[1]} ${end}`\n }\n if (curve) {\n const mid = curve.join(',')\n return `M${start} Q${mid} ${end}`\n }\n if (cubic) {\n const [c1, c2] = cubic\n const p1 = c1.join(',')\n const p2 = c2.join(',')\n return `M${start} C${p1} ${p2} ${end}`\n }\n return `M${start} L${end}`\n}\n","const dataUrlRegex = /^data:image\\/[^;]+;base64,/\n\nconst mimeFromPath = (path: string) => {\n const lower = path.toLowerCase()\n if (lower.endsWith('.png')) return 'image/png'\n if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return 'image/jpeg'\n if (lower.endsWith('.gif')) return 'image/gif'\n if (lower.endsWith('.svg')) return 'image/svg+xml'\n if (lower.endsWith('.webp')) return 'image/webp'\n if (lower.endsWith('.bmp')) return 'image/bmp'\n return 'application/octet-stream'\n}\n\nconst toBase64 = (buffer: ArrayBuffer) => {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(buffer).toString('base64')\n }\n\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i += 1) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n}\n\nconst readLocalFile = async (path: string) => {\n const fs = await import('node:fs/promises')\n const buffer = await fs.readFile(path)\n return buffer.toString('base64')\n}\n\nexport const resolveImageData = async (src: string) => {\n if (dataUrlRegex.test(src)) return src\n\n const isFileUrl = src.startsWith('file://')\n const isLocalPath = !src.startsWith('http') && !src.startsWith('data:')\n const isNode = typeof process !== 'undefined' && Boolean(process.versions?.node)\n\n if ((isFileUrl || isLocalPath) && isNode) {\n const filePath = isFileUrl ? src.replace('file://', '') : src\n const base64 = await readLocalFile(filePath)\n const mime = mimeFromPath(filePath)\n return `data:${mime};base64,${base64}`\n }\n\n if (typeof fetch !== 'function') {\n throw new Error('fetch is not available to resolve image data')\n }\n\n const response = await fetch(src)\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const base64 = toBase64(arrayBuffer)\n const contentType = response.headers.get('content-type') || mimeFromPath(src)\n return `data:${contentType};base64,${base64}`\n}\n","export const DEFAULT_WIDTH = 1000;\nexport const DEFAULT_HEIGHT = 562.5;\nexport const DEFAULT_FONT_SIZE = 16;\nexport const DEFAULT_FONT_FACE = \"微软雅黑\";\n","import tinycolor from \"tinycolor2\";\nimport type PptxGenJS from \"pptxgenjs\";\n\nimport type { SlideElement } from \"../types/ppt\";\nimport { toAST, type AST } from \"../htmlParser\";\nimport { DEFAULT_FONT_SIZE } from \"./constants\";\n\ntype TextSlice = {\n text: string;\n options?: PptxGenJS.TextPropsOptions;\n};\n\nconst dashTypeMap: Record<string, \"solid\" | \"dash\" | \"sysDot\"> = {\n solid: \"solid\",\n dashed: \"dash\",\n dotted: \"sysDot\"\n};\n\nexport function formatColor(input: string): { alpha: number; color: string } {\n if (!input) {\n return {\n alpha: 0,\n color: \"#000000\"\n };\n }\n\n const color = tinycolor(input);\n const alpha = color.getAlpha();\n const hex = alpha === 0 ? \"#ffffff\" : color.setAlpha(1).toHexString();\n return { alpha, color: hex };\n}\n\nexport function formatHTML(html: string, ratioPx2Pt: number): TextSlice[] {\n const ast = toAST(html);\n let bulletFlag = false;\n let indent = 0;\n\n const slices: TextSlice[] = [];\n const parse = (obj: AST[], baseStyleObj: Record<string, string> = {}) => {\n for (const item of obj) {\n const isBlockTag = \"tagName\" in item && [\"div\", \"li\", \"p\"].includes(item.tagName);\n\n if (isBlockTag && slices.length) {\n const lastSlice = slices[slices.length - 1];\n if (!lastSlice.options) lastSlice.options = {};\n lastSlice.options.breakLine = true;\n }\n\n const styleObj = { ...baseStyleObj };\n const styleAttr =\n \"attributes\" in item\n ? item.attributes.find((attr) => attr.key === \"style\")\n : null;\n if (styleAttr && styleAttr.value) {\n const styleArr = styleAttr.value.split(\";\");\n for (const styleItem of styleArr) {\n const match = styleItem.match(/([^:]+):\\s*(.+)/);\n if (match) {\n const [key, value] = [match[1].trim(), match[2].trim()];\n if (key && value) styleObj[key] = value;\n }\n }\n }\n\n if (\"tagName\" in item) {\n if (item.tagName === \"em\") {\n styleObj[\"font-style\"] = \"italic\";\n }\n if (item.tagName === \"strong\") {\n styleObj[\"font-weight\"] = \"bold\";\n }\n if (item.tagName === \"sup\") {\n styleObj[\"vertical-align\"] = \"super\";\n }\n if (item.tagName === \"sub\") {\n styleObj[\"vertical-align\"] = \"sub\";\n }\n if (item.tagName === \"a\") {\n const attr = item.attributes.find((attr) => attr.key === \"href\");\n styleObj.href = attr?.value || \"\";\n }\n if (item.tagName === \"ul\") {\n styleObj[\"list-type\"] = \"ul\";\n }\n if (item.tagName === \"ol\") {\n styleObj[\"list-type\"] = \"ol\";\n }\n if (item.tagName === \"li\") {\n bulletFlag = true;\n }\n if (item.tagName === \"p\") {\n if (\"attributes\" in item) {\n const dataIndentAttr = item.attributes.find((attr) => attr.key === \"data-indent\");\n if (dataIndentAttr && dataIndentAttr.value) indent = +dataIndentAttr.value;\n }\n }\n }\n\n if (\"tagName\" in item && item.tagName === \"br\") {\n slices.push({ text: \"\", options: { breakLine: true } });\n } else if (\"content\" in item) {\n const text = item.content\n .replace(/ /g, \" \")\n .replace(/>/g, \">\")\n .replace(/</g, \"<\")\n .replace(/&/g, \"&\")\n .replace(/\\n/g, \"\");\n const options: PptxGenJS.TextPropsOptions = {};\n\n if (styleObj[\"font-size\"]) {\n options.fontSize = parseInt(styleObj[\"font-size\"], 10) / ratioPx2Pt;\n }\n if (styleObj.color) {\n options.color = formatColor(styleObj.color).color;\n }\n if (styleObj[\"background-color\"]) {\n options.highlight = formatColor(styleObj[\"background-color\"]).color;\n }\n if (styleObj[\"text-decoration-line\"]) {\n if (styleObj[\"text-decoration-line\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration-line\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"text-decoration\"]) {\n if (styleObj[\"text-decoration\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"vertical-align\"]) {\n if (styleObj[\"vertical-align\"] === \"super\") options.superscript = true;\n if (styleObj[\"vertical-align\"] === \"sub\") options.subscript = true;\n }\n if (styleObj[\"text-align\"]) options.align = styleObj[\"text-align\"] as PptxGenJS.HAlign;\n if (styleObj[\"font-weight\"]) options.bold = styleObj[\"font-weight\"] === \"bold\";\n if (styleObj[\"font-style\"]) options.italic = styleObj[\"font-style\"] === \"italic\";\n if (styleObj[\"font-family\"]) options.fontFace = styleObj[\"font-family\"];\n if (styleObj.href) options.hyperlink = { url: styleObj.href };\n\n if (bulletFlag && styleObj[\"list-type\"] === \"ol\") {\n options.bullet = {\n type: \"number\",\n indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25\n };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (bulletFlag && styleObj[\"list-type\"] === \"ul\") {\n options.bullet = { indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25 };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (indent) {\n options.indentLevel = indent;\n indent = 0;\n }\n\n slices.push({ text, options });\n } else if (\"children\" in item) parse(item.children, styleObj);\n }\n };\n parse(ast);\n return slices;\n}\n\nfunction normalizeFontName(value?: string): string | undefined {\n return value ? value.replace(/^\"+|\"+$/g, \"\") : undefined;\n}\n\nfunction clampOpacity(value?: number): number {\n if (value === undefined) return 1;\n if (!Number.isFinite(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction getOpacityRatio(value?: string): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n if (normalized.endsWith(\"%\")) {\n const percent = Number.parseFloat(normalized);\n return Number.isFinite(percent) ? Math.min(1, Math.max(0, percent / 100)) : undefined;\n }\n const numeric = Number.parseFloat(normalized);\n if (!Number.isFinite(numeric)) return undefined;\n return numeric > 1 ? Math.min(1, Math.max(0, numeric / 100)) : Math.min(1, Math.max(0, numeric));\n}\n\nfunction parseFontSize(value?: string): number | undefined {\n if (!value) return undefined;\n const size = Number.parseFloat(value);\n return Number.isFinite(size) ? size : undefined;\n}\n\nfunction parseTableColor(\n value?: string\n): { color: string; transparency: number } | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n const c = formatColor(normalized);\n return {\n color: c.color.replace(\"#\", \"\"),\n transparency: (1 - c.alpha) * 100\n };\n}\n\nfunction isPlaceholderCell(cell?: {\n colspan?: number;\n rowspan?: number;\n text?: string;\n style?: Record<string, string | undefined>;\n}): boolean {\n if (!cell) return false;\n const colspan = cell.colspan ?? 1;\n const rowspan = cell.rowspan ?? 1;\n if (colspan !== 1 || rowspan !== 1) return false;\n const text = cell.text ?? \"\";\n const style = cell.style;\n const hasStyle =\n Boolean(style?.fontname) ||\n Boolean(style?.fontsize) ||\n Boolean(style?.color) ||\n Boolean(style?.backcolor);\n return text.trim() === \"\" && !hasStyle;\n}\n\nexport function buildTableRows(\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): PptxGenJS.TableRow[] {\n const data = (element as any).data as\n | Array<Array<{ id?: string; colspan?: number; rowspan?: number; text?: string; style?: any }>>\n | undefined;\n if (!data || !data.length) return [];\n\n const colCount =\n ((element as any).colWidths as number[] | undefined)?.length ??\n Math.max(...data.map((row) => row.length));\n\n const rows: PptxGenJS.TableRow[] = [];\n const skip = new Array(colCount).fill(0);\n\n data.forEach((row) => {\n const cells: PptxGenJS.TableCell[] = [];\n let colIndex = 0;\n let cellIndex = 0;\n\n while (colIndex < colCount) {\n if (skip[colIndex] > 0) {\n skip[colIndex] -= 1;\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n colIndex += 1;\n continue;\n }\n\n const cell = row[cellIndex];\n if (!cell) break;\n cellIndex += 1;\n\n const colSpan = cell.colspan ?? 1;\n const rowSpan = cell.rowspan ?? 1;\n\n if (rowSpan > 1) {\n for (let i = 0; i < colSpan; i += 1) {\n skip[colIndex + i] = rowSpan - 1;\n }\n }\n\n if (colSpan > 1) {\n for (let i = 0; i < colSpan - 1; i += 1) {\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n }\n }\n\n const style = cell.style ?? {};\n const fontSize = parseFontSize(style.fontsize);\n const fill = parseTableColor(style.backcolor);\n const color = parseTableColor(style.color);\n const cellMargin = [\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch,\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch\n ] as [number, number, number, number];\n\n const options: PptxGenJS.TableCellProps = {\n colspan: colSpan > 1 ? colSpan : undefined,\n rowspan: rowSpan > 1 ? rowSpan : undefined,\n align: style.align as PptxGenJS.HAlign,\n valign: \"middle\",\n fontFace: normalizeFontName(style.fontname),\n fontSize: fontSize ? fontSize / ratioPx2Pt : undefined,\n color: color?.color,\n fill: fill ? { color: fill.color, transparency: fill.transparency } : undefined,\n margin: cellMargin\n };\n\n cells.push({\n text: cell.text ?? \"\",\n options\n });\n\n colIndex += colSpan;\n }\n\n rows.push(cells);\n });\n\n return rows;\n}\n\nexport function getShadowOption(\n shadow: NonNullable<SlideElement[\"shadow\"]>,\n ratioPx2Pt: number\n): PptxGenJS.ShadowProps {\n const c = formatColor(shadow.color ?? \"#000000\");\n const { h = 0, v = 0 } = shadow;\n\n let offset = 4;\n let angle = 45;\n\n if (h === 0 && v === 0) {\n offset = 4;\n angle = 45;\n } else if (h === 0) {\n if (v > 0) {\n offset = v;\n angle = 90;\n } else {\n offset = -v;\n angle = 270;\n }\n } else if (v === 0) {\n if (h > 0) {\n offset = h;\n angle = 1;\n } else {\n offset = -h;\n angle = 180;\n }\n } else if (h > 0 && v > 0) {\n offset = Math.max(h, v);\n angle = 45;\n } else if (h > 0 && v < 0) {\n offset = Math.max(h, -v);\n angle = 315;\n } else if (h < 0 && v > 0) {\n offset = Math.max(-h, v);\n angle = 135;\n } else if (h < 0 && v < 0) {\n offset = Math.max(-h, -v);\n angle = 225;\n }\n\n return {\n color: c.color,\n transparency: (1 - c.alpha) * 100,\n blur: (shadow.blur ?? 0) / ratioPx2Pt,\n offset,\n angle\n };\n}\n\nexport function getOutlineOption(\n outline: NonNullable<SlideElement[\"outline\"]>,\n ratioPx2Pt: number,\n opacity = 1\n): PptxGenJS.ShapeLineProps {\n const c = formatColor(outline.color || \"#000000\");\n const alpha = c.alpha * clampOpacity(opacity);\n return {\n color: c.color,\n transparency: (1 - alpha) * 100,\n width: (outline.width || 1) / ratioPx2Pt,\n dashType: outline.style ? dashTypeMap[outline.style] : \"solid\"\n };\n}\n\nexport function getElementOpacity(value?: number): number {\n return clampOpacity(value);\n}\n\nexport function getFilterOpacity(value?: string): number | undefined {\n return getOpacityRatio(value);\n}\n\nexport function getDashTypeMap(): Record<string, \"solid\" | \"dash\" | \"sysDot\"> {\n return dashTypeMap;\n}\n","export const childlessTags = ['style', 'script', 'template']\n\nexport const closingTags = [\n 'html',\n 'head',\n 'body',\n 'p',\n 'dt',\n 'dd',\n 'li',\n 'option',\n 'thead',\n 'th',\n 'tbody',\n 'tr',\n 'td',\n 'tfoot',\n 'colgroup'\n]\n\nexport const closingTagAncestorBreakers: Record<string, string[]> = {\n li: ['ul', 'ol', 'menu'],\n dt: ['dl'],\n dd: ['dl'],\n tbody: ['table'],\n thead: ['table'],\n tfoot: ['table'],\n tr: ['table'],\n td: ['table']\n}\n\nexport const voidTags = [\n '!doctype',\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]\n","import type { Token } from './types'\nimport { childlessTags } from './tags'\n\ninterface State {\n str: string\n position: number\n tokens: Token[]\n}\n\nconst jumpPosition = (state: State, end: number) => {\n const len = end - state.position\n movePosition(state, len)\n}\n\nconst movePosition = (state: State, len: number) => {\n state.position = state.position + len\n}\n\nconst findTextEnd = (str: string, index: number) => {\n const isEnd = false\n while (!isEnd) {\n const textEnd = str.indexOf('<', index)\n if (textEnd === -1) {\n return textEnd\n }\n const char = str.charAt(textEnd + 1)\n if (char === '/' || char === '!' || /[A-Za-z0-9]/.test(char)) {\n return textEnd\n }\n index = textEnd + 1\n }\n return -1\n}\n\nconst lexText = (state: State) => {\n const { str } = state\n let textEnd = findTextEnd(str, state.position)\n if (textEnd === state.position) return\n if (textEnd === -1) {\n textEnd = str.length\n }\n\n const content = str.slice(state.position, textEnd)\n jumpPosition(state, textEnd)\n\n state.tokens.push({\n type: 'text',\n content\n })\n}\n\nconst lexComment = (state: State) => {\n const { str } = state\n\n movePosition(state, 4)\n let contentEnd = str.indexOf('-->', state.position)\n let commentEnd = contentEnd + 3\n if (contentEnd === -1) {\n contentEnd = commentEnd = str.length\n }\n\n const content = str.slice(state.position, contentEnd)\n jumpPosition(state, commentEnd)\n\n state.tokens.push({\n type: 'comment',\n content\n })\n}\n\nconst lexTagName = (state: State) => {\n const { str } = state\n const len = str.length\n let start = state.position\n\n while (start < len) {\n const char = str.charAt(start)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (isTagChar) break\n start++\n }\n\n let end = start + 1\n while (end < len) {\n const char = str.charAt(end)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (!isTagChar) break\n end++\n }\n\n jumpPosition(state, end)\n const tagName = str.slice(start, end)\n state.tokens.push({\n type: 'tag',\n content: tagName\n })\n return tagName\n}\n\nconst lexTagAttributes = (state: State) => {\n const { str, tokens } = state\n let cursor = state.position\n let quote: string | null = null\n let wordBegin = cursor\n const words: string[] = []\n const len = str.length\n while (cursor < len) {\n const char = str.charAt(cursor)\n if (quote) {\n const isQuoteEnd = char === quote\n if (isQuoteEnd) quote = null\n cursor++\n continue\n }\n\n const isTagEnd = char === '/' || char === '>'\n if (isTagEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n break\n }\n\n const isWordEnd = /\\s/.test(char)\n if (isWordEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n wordBegin = cursor + 1\n cursor++\n continue\n }\n\n const isQuoteStart = char === '\\'' || char === '\"'\n if (isQuoteStart) {\n quote = char\n cursor++\n continue\n }\n\n cursor++\n }\n jumpPosition(state, cursor)\n\n const type = 'attribute'\n for (let i = 0; i < words.length; i++) {\n const word = words[i]\n\n const isNotPair = word.indexOf('=') === -1\n if (isNotPair) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.startsWith('=')) {\n if (secondWord.length > 1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n const thirdWord = words[i + 2]\n i += 1\n if (thirdWord) {\n const newWord = word + '=' + thirdWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n }\n }\n if (word.endsWith('=')) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.indexOf('=') === -1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n\n const newWord = word.slice(0, -1)\n tokens.push({ type, content: newWord })\n continue\n }\n\n tokens.push({ type, content: word })\n }\n}\n\nconst lexSkipTag = (tagName: string, state: State) => {\n const { str, tokens } = state\n const safeTagName = tagName.toLowerCase()\n const len = str.length\n let index = state.position\n\n while (index < len) {\n const nextTag = str.indexOf('</', index)\n if (nextTag === -1) {\n lexText(state)\n break\n }\n\n const tagState = {\n str,\n position: state.position,\n tokens: []\n }\n jumpPosition(tagState, nextTag)\n const name = lexTag(tagState)\n if (safeTagName !== name.toLowerCase()) {\n index = tagState.position\n continue\n }\n\n if (nextTag !== state.position) {\n const textStart = state.position\n jumpPosition(state, nextTag)\n tokens.push({\n type: 'text',\n content: str.slice(textStart, nextTag)\n })\n }\n\n tokens.push(...tagState.tokens)\n jumpPosition(state, tagState.position)\n break\n }\n}\n\nconst lexTag = (state: State) => {\n const { str } = state\n const secondChar = str.charAt(state.position + 1)\n const tagStartClose = secondChar === '/'\n movePosition(state, tagStartClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-start',\n close: tagStartClose\n })\n\n const tagName = lexTagName(state)\n lexTagAttributes(state)\n\n const firstChar = str.charAt(state.position)\n const tagEndClose = firstChar === '/'\n movePosition(state, tagEndClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-end',\n close: tagEndClose\n })\n return tagName\n}\n\nconst lex = (state: State) => {\n const str = state.str\n const len = str.length\n\n while (state.position < len) {\n const start = state.position\n lexText(state)\n\n if (state.position === start) {\n const isComment = str.startsWith('!--', start + 1)\n if (isComment) lexComment(state)\n else {\n const tagName = lexTag(state)\n const safeTag = tagName.toLowerCase()\n if (childlessTags.includes(safeTag)) lexSkipTag(tagName, state)\n }\n }\n }\n}\n\nexport const lexer = (str: string): Token[] => {\n const state = {\n str,\n position: 0,\n tokens: []\n }\n lex(state)\n return state.tokens\n}\n","import type {\n Token,\n HTMLNode,\n TagToken,\n NormalElement,\n TagEndToken,\n AttributeToken,\n TextToken\n} from './types'\nimport { closingTags, closingTagAncestorBreakers, voidTags } from './tags'\n\ninterface StackItem {\n tagName: string | null\n children: HTMLNode[]\n}\n\ninterface State {\n stack: StackItem[]\n cursor: number\n tokens: Token[]\n}\n\nexport const parser = (tokens: Token[]) => {\n const root: StackItem = { tagName: null, children: [] }\n const state: State = { tokens, cursor: 0, stack: [root] }\n parse(state)\n return root.children\n}\n\nexport const hasTerminalParent = (tagName: string, stack: StackItem[]) => {\n const tagParents = closingTagAncestorBreakers[tagName]\n if (tagParents) {\n let currentIndex = stack.length - 1\n while (currentIndex >= 0) {\n const parentTagName = stack[currentIndex].tagName\n if (parentTagName === tagName) break\n if (parentTagName && tagParents.includes(parentTagName)) return true\n currentIndex--\n }\n }\n return false\n}\n\nexport const rewindStack = (stack: StackItem[], newLength: number) => {\n stack.splice(newLength)\n}\n\nexport const parse = (state: State) => {\n const { stack, tokens } = state\n let { cursor } = state\n let nodes = stack[stack.length - 1].children\n const len = tokens.length\n\n while (cursor < len) {\n const token = tokens[cursor]\n if (token.type !== 'tag-start') {\n nodes.push(token as TextToken)\n cursor++\n continue\n }\n\n const tagToken = tokens[++cursor] as TagToken\n cursor++\n const tagName = tagToken.content.toLowerCase()\n if (token.close) {\n let index = stack.length\n let shouldRewind = false\n while (--index > -1) {\n if (stack[index].tagName === tagName) {\n shouldRewind = true\n break\n }\n }\n while (cursor < len) {\n if (tokens[cursor].type !== 'tag-end') break\n cursor++\n }\n if (shouldRewind) {\n rewindStack(stack, index)\n break\n } else continue\n }\n\n const isClosingTag = closingTags.includes(tagName)\n let shouldRewindToAutoClose = isClosingTag\n if (shouldRewindToAutoClose) {\n shouldRewindToAutoClose = !hasTerminalParent(tagName, stack)\n }\n\n if (shouldRewindToAutoClose) {\n let currentIndex = stack.length - 1\n while (currentIndex > 0) {\n if (tagName === stack[currentIndex].tagName) {\n rewindStack(stack, currentIndex)\n const previousIndex = currentIndex - 1\n nodes = stack[previousIndex].children\n break\n }\n currentIndex = currentIndex - 1\n }\n }\n\n const attributes = []\n let tagEndToken: TagEndToken | undefined\n while (cursor < len) {\n const _token = tokens[cursor]\n if (_token.type === 'tag-end') {\n tagEndToken = _token as TagEndToken\n break\n }\n attributes.push((_token as AttributeToken).content)\n cursor++\n }\n\n if (!tagEndToken) break\n\n cursor++\n const children: HTMLNode[] = []\n const elementNode: NormalElement = {\n type: 'element',\n tagName: tagToken.content,\n attributes,\n children\n }\n nodes.push(elementNode)\n\n const hasChildren = !(tagEndToken.close || voidTags.includes(tagName))\n if (hasChildren) {\n stack.push({ tagName, children })\n const innerState = { tokens, cursor, stack }\n parse(innerState)\n cursor = innerState.cursor\n }\n }\n state.cursor = cursor\n}\n","import type { HTMLNode, CommentOrTextAST, ElementAST, AST } from './types'\n\nexport const splitHead = (str: string, sep: string) => {\n const idx = str.indexOf(sep)\n if (idx === -1) return [str]\n return [str.slice(0, idx), str.slice(idx + sep.length)]\n}\n\nconst unquote = (str: string) => {\n const car = str.charAt(0)\n const end = str.length - 1\n const isQuoteStart = car === '\"' || car === \"'\"\n if (isQuoteStart && car === str.charAt(end)) {\n return str.slice(1, end)\n }\n return str\n}\n\nconst formatAttributes = (attributes: string[]) => {\n return attributes.map(attribute => {\n const parts = splitHead(attribute.trim(), '=')\n const key = parts[0]\n const value = typeof parts[1] === 'string' ? unquote(parts[1]) : null\n return { key, value }\n })\n}\n\nexport const format = (nodes: HTMLNode[]): AST[] => {\n return nodes.map(node => {\n if (node.type === 'element') {\n const children = format(node.children)\n const item: ElementAST = {\n type: 'element',\n tagName: node.tagName.toLowerCase(),\n attributes: formatAttributes(node.attributes),\n children\n }\n return item\n }\n\n const item: CommentOrTextAST = {\n type: node.type,\n content: node.content\n }\n return item\n })\n}\n","import { lexer } from './lexer'\nimport { parser } from './parser'\nimport { format } from './format'\nexport type { AST } from './types'\n\nexport const toAST = (str: string) => {\n const tokens = lexer(str)\n const nodes = parser(tokens)\n return format(nodes)\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck } from \"../types/ppt\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: Deck[\"slides\"][number],\n theme: Deck[\"theme\"]\n): void {\n const backgroundColor = slideJson.background?.color ?? theme?.backgroundColor;\n if (!backgroundColor) return;\n const c = formatColor(backgroundColor);\n slide.background = { color: c.color, transparency: (1 - c.alpha) * 100 };\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function applyPptxLayout(pptx: PptxGenJS, width: number, height: number): void {\n const viewportRatio = height / width;\n if (Math.abs(viewportRatio - 0.625) < 0.001) {\n pptx.layout = \"LAYOUT_16x10\";\n return;\n }\n if (Math.abs(viewportRatio - 0.75) < 0.001) {\n pptx.layout = \"LAYOUT_4x3\";\n return;\n }\n if (Math.abs(viewportRatio - 0.70710678) < 0.0001) {\n pptx.defineLayout({ name: \"A3\", width: 10, height: 7.0710678 });\n pptx.layout = \"A3\";\n return;\n }\n if (Math.abs(viewportRatio - 1.41421356) < 0.0001) {\n pptx.defineLayout({ name: \"A3_V\", width: 10, height: 14.1421356 });\n pptx.layout = \"A3_V\";\n return;\n }\n pptx.layout = \"LAYOUT_16x9\";\n}\n","import { SVGPathData } from 'svg-pathdata'\nimport arcToBezier from 'svg-arc-to-cubic-bezier'\n\nconst typeMap: Record<number, string> = {\n 1: 'Z',\n 2: 'M',\n 4: 'H',\n 8: 'V',\n 16: 'L',\n 32: 'C',\n 64: 'S',\n 128: 'Q',\n 256: 'T',\n 512: 'A'\n}\n\nexport const toPoints = (d: string) => {\n if (!d) return []\n if (d.includes('NaN') || d.includes('undefined') || d.includes('null')) return []\n\n let pathData: any\n try {\n pathData = new SVGPathData(d)\n } catch {\n return []\n }\n\n const points: any[] = []\n for (const item of pathData.commands) {\n const type = typeMap[item.type]\n\n if (item.type === 2 || item.type === 16) {\n points.push({\n x: item.x,\n y: item.y,\n relative: item.relative,\n type\n })\n }\n if (item.type === 32) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'cubic',\n x1: item.x1,\n y1: item.y1,\n x2: item.x2,\n y2: item.y2\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 128) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'quadratic',\n x1: item.x1,\n y1: item.y1\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 512) {\n const lastPoint = points[points.length - 1] as any\n if (!lastPoint || !['M', 'L', 'Q', 'C'].includes(lastPoint.type)) continue\n\n const cubicBezierPoints = arcToBezier({\n px: lastPoint.x as number,\n py: lastPoint.y as number,\n cx: item.x,\n cy: item.y,\n rx: item.rX,\n ry: item.rY,\n xAxisRotation: item.xRot,\n largeArcFlag: item.lArcFlag,\n sweepFlag: item.sweepFlag\n }) as Array<{ x: number; y: number; x1: number; y1: number; x2: number; y2: number }>\n for (const cbPoint of cubicBezierPoints) {\n points.push({\n x: cbPoint.x,\n y: cbPoint.y,\n curve: {\n type: 'cubic',\n x1: cbPoint.x1,\n y1: cbPoint.y1,\n x2: cbPoint.x2,\n y2: cbPoint.y2\n },\n relative: false,\n type: 'C'\n })\n }\n } else if (item.type === 1) {\n points.push({ close: true, type })\n } else continue\n }\n return points\n}\n\nexport type SvgPoints = ReturnType<typeof toPoints>\n","import type { SvgPoints } from \"../svgPathParser\";\n\ntype Points = Array<\n | { x: number; y: number; moveTo?: boolean }\n | { x: number; y: number; curve: { type: \"arc\"; hR: number; wR: number; stAng: number; swAng: number } }\n | { x: number; y: number; curve: { type: \"quadratic\"; x1: number; y1: number } }\n | { x: number; y: number; curve: { type: \"cubic\"; x1: number; y1: number; x2: number; y2: number } }\n | { close: true }\n>;\n\nexport function formatPoints(\n points: SvgPoints,\n ratioPx2Inch: number,\n scale = { x: 1, y: 1 }\n): Points {\n return points.map((point) => {\n if (\"close\" in point) {\n return { close: true };\n }\n if (point.type === \"M\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n moveTo: true\n };\n }\n if (point.curve) {\n if (point.curve.type === \"cubic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"cubic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y,\n x2: (point.curve.x2 as number) / ratioPx2Inch * scale.x,\n y2: (point.curve.y2 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n if (point.curve.type === \"quadratic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"quadratic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n }\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y\n };\n });\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function isBase64Image(url: string): boolean {\n const regex = /^data:image\\/[^;]+;base64,/;\n return regex.test(url);\n}\n\nexport function getLineArrowType(\n value?: unknown\n): PptxGenJS.ShapeLineProps[\"beginArrowType\"] {\n if (value === \"arrow\") return \"arrow\";\n if (value === \"dot\") return \"oval\";\n return \"none\";\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck, SlideElement } from \"../types/ppt\";\nimport { resolveImageData } from \"../resolveImageData\";\nimport { toPoints } from \"../svgPathParser\";\nimport { getElementRange, getLineElementPath } from \"../element\";\nimport { DEFAULT_FONT_FACE, DEFAULT_FONT_SIZE } from \"./constants\";\nimport { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type PatternShape } from \"./types\";\nimport {\n buildTableRows,\n formatColor,\n formatHTML,\n getDashTypeMap,\n getElementOpacity,\n getFilterOpacity,\n getOutlineOption,\n getShadowOption\n} from \"./shared\";\n\nexport function addTextElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n template: Deck,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.TextPropsOptions = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.defaultFontName || template.theme?.fontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n valign: \"top\",\n // pptxgenjs margin order: [left, right, bottom, top]\n // Keep horizontal padding while removing vertical inset to match preview baseline.\n margin: [textPadding, textPadding, 0, textPadding * 0.42],\n paraSpaceBefore: 0,\n lineSpacingMultiple: 1.5,\n fit: \"none\"\n };\n if (element.rotate) options.rotate = element.rotate;\n if (element.wordSpace) options.charSpacing = element.wordSpace / ratioPx2Pt;\n if (element.lineHeight) options.lineSpacingMultiple = element.lineHeight;\n if (element.fill) {\n const c = formatColor(element.fill);\n options.fill = {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n if (element.defaultColor) options.color = formatColor(element.defaultColor).color;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.opacity !== undefined) options.transparency = (1 - opacity) * 100;\n if (element.paragraphSpace !== undefined) {\n options.paraSpaceBefore = element.paragraphSpace / ratioPx2Pt;\n }\n if (element.vertical) options.vert = \"eaVert\";\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n\n slide.addText(textProps, options);\n}\n\nexport async function addImageElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Inch: number\n): Promise<void> {\n if (element.type !== \"image\" || !element.src) return;\n\n const options: PptxGenJS.ImageProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch\n };\n\n if (isBase64Image(element.src)) options.data = element.src;\n else options.data = await resolveImageData(element.src);\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.rotate) options.rotate = element.rotate;\n const filterOpacity = getFilterOpacity(element.filters?.opacity) ?? 1;\n const elementOpacity = getElementOpacity(element.opacity);\n const imageOpacity = filterOpacity * elementOpacity;\n if (imageOpacity !== 1) {\n options.transparency = (1 - imageOpacity) * 100;\n }\n if (element.clip?.range) {\n if (element.clip.shape === \"ellipse\") options.rounding = true;\n\n const [start, end] = element.clip.range;\n const [startX, startY] = start;\n const [endX, endY] = end;\n\n const originW = (element.width ?? 0) / ((endX - startX) / ratioPx2Inch);\n const originH = (element.height ?? 0) / ((endY - startY) / ratioPx2Inch);\n\n options.w = originW / ratioPx2Inch;\n options.h = originH / ratioPx2Inch;\n\n options.sizing = {\n type: \"crop\",\n x: (startX / ratioPx2Inch) * (originW / ratioPx2Inch),\n y: (startY / ratioPx2Inch) * (originH / ratioPx2Inch),\n w: ((endX - startX) / ratioPx2Inch) * (originW / ratioPx2Inch),\n h: ((endY - startY) / ratioPx2Inch) * (originH / ratioPx2Inch)\n };\n }\n\n slide.addImage(options);\n}\n\nexport function addShapeElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n slideIndex: number,\n elementIndex: number,\n patternShapes: PatternShape[]\n): void {\n if (element.type !== \"shape\" || !element.path || !element.viewBox) return;\n const scale = {\n x: (element.width ?? 0) / element.viewBox[0],\n y: (element.height ?? 0) / element.viewBox[1]\n };\n const rawPoints = toPoints(element.path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch, scale);\n const pattern = (element as any).pattern as string | undefined;\n const hasFill = typeof element.fill === \"string\" ? element.fill.trim().length > 0 : false;\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n points\n };\n\n if (pattern) {\n const objectName = `pattern-${slideIndex}-${element.id ?? elementIndex}`;\n options.objectName = objectName;\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n patternShapes.push({ slideIndex, objectName, dataUrl: pattern });\n } else if (hasFill) {\n const fillColor = formatColor(element.fill || \"#000000\");\n options.fill = {\n color: fillColor.color,\n transparency: (1 - fillColor.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.rotate) options.rotate = element.rotate;\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n\n if (!element.text?.content) return;\n const textProps = formatHTML(element.text.content, ratioPx2Pt);\n const textOptions: PptxGenJS.TextPropsOptions = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.text.defaultFontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n paraSpaceBefore: 0,\n valign: element.text.align as PptxGenJS.VAlign,\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\"\n };\n textOptions.margin = 0;\n if (element.rotate) textOptions.rotate = element.rotate;\n if (element.text.defaultColor) {\n textOptions.color = formatColor(element.text.defaultColor).color;\n }\n if (element.opacity !== undefined) {\n textOptions.transparency = (1 - opacity) * 100;\n }\n if (element.flipH) textOptions.flipH = element.flipH;\n if (element.flipV) textOptions.flipV = element.flipV;\n\n slide.addText(textProps, textOptions);\n}\n\nexport function addLineElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"line\" || !element.start || !element.end) return;\n const path = getLineElementPath(element);\n const rawPoints = toPoints(path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch);\n const { minX, maxX, minY, maxY } = getElementRange(element);\n const c = formatColor(element.color || \"#000000\");\n const opacity = getElementOpacity(element.opacity);\n const pointsMeta = element.points ?? [];\n const dashTypeMap = getDashTypeMap();\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (maxX - minX) / ratioPx2Inch,\n h: (maxY - minY) / ratioPx2Inch,\n line: {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100,\n width: (element.width ?? 1) / ratioPx2Pt,\n dashType: element.style ? dashTypeMap[element.style] : \"solid\",\n beginArrowType: getLineArrowType(pointsMeta[0]),\n endArrowType: getLineArrowType(pointsMeta[1])\n },\n points\n };\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n}\n\nexport function addTableElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"table\") return;\n const rows = buildTableRows(element, ratioPx2Pt, ratioPx2Inch);\n if (!rows.length) return;\n\n const colWidths = (element as any).colWidths as number[] | undefined;\n const colW = colWidths\n ? colWidths.map((ratio) => ((element.width ?? 0) * ratio) / ratioPx2Inch)\n : undefined;\n\n const rowCount = rows.length || 1;\n const baseRowHeight = ((element.height ?? 0) / rowCount) / ratioPx2Inch;\n const minRowHeight = (element as any).cellMinHeight\n ? (element as any).cellMinHeight / ratioPx2Inch\n : undefined;\n const rowH = minRowHeight\n ? new Array(rowCount).fill(Math.max(minRowHeight, baseRowHeight))\n : undefined;\n\n const outline = element.outline;\n const border =\n outline?.width || outline?.color\n ? {\n pt: (outline.width ?? 1) / ratioPx2Pt,\n color: formatColor(outline.color || \"#000000\").color.replace(\"#\", \"\")\n }\n : {\n pt: 1 / ratioPx2Pt,\n color: \"DDDDDD\"\n };\n\n slide.addTable(rows, {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n colW,\n rowH,\n border,\n margin: 0\n });\n}\n"],"mappings":";AAAA,OAAO,eAAe;AACtB,OAAO,WAAW;;;ACCX,IAAM,kBAAkB,CAAC,YAA0B;AAF1D;AAGE,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,OAAO;AAEX,MAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,QAAQ,KAAK;AAC3D,YAAO,aAAQ,SAAR,YAAgB;AACvB,aAAQ,aAAQ,SAAR,YAAgB,KAAK,KAAK,IAAI,QAAQ,MAAM,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;AACtE,YAAO,aAAQ,QAAR,YAAe;AACtB,aAAQ,aAAQ,QAAR,YAAe,KAAK,KAAK,IAAI,QAAQ,MAAM,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;AAAA,EACvE,WAAW,QAAQ,SAAS,UAAa,QAAQ,QAAQ,QAAW;AAClE,WAAO,QAAQ;AACf,WAAO,QAAQ;AACf,WAAO,QAAQ,SAAQ,aAAQ,UAAR,YAAiB;AACxC,WAAO,QAAQ,QAAO,aAAQ,WAAR,YAAkB;AAAA,EAC1C;AAEA,SAAO,EAAE,MAAM,MAAM,MAAM,KAAK;AAClC;AAEA,IAAM,gBAAgB,CAAC,YACrB,QAAQ,SAAS;AAEZ,IAAM,qBAAqB,CAAC,YAA0B;AAC3D,MAAI,CAAC,cAAc,OAAO,KAAK,CAAC,QAAQ,SAAS,CAAC,QAAQ,IAAK,QAAO;AACtE,QAAM,QAAQ,QAAQ,MAAM,KAAK,GAAG;AACpC,QAAM,MAAM,QAAQ,IAAI,KAAK,GAAG;AAChC,QAAM,SAAS,QAAQ;AACvB,QAAM,UAAU,QAAQ;AACxB,QAAM,QAAQ,QAAQ;AACtB,QAAM,QAAQ,QAAQ;AAEtB,MAAI,QAAQ;AACV,UAAM,MAAM,OAAO,KAAK,GAAG;AAC3B,WAAO,IAAI,KAAK,KAAK,GAAG,KAAK,GAAG;AAAA,EAClC;AACA,MAAI,SAAS;AACX,UAAM,EAAE,MAAM,MAAM,MAAM,KAAK,IAAI,gBAAgB,OAAO;AAC1D,QAAI,OAAO,QAAQ,OAAO,MAAM;AAC9B,aAAO,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,IAAI,QAAQ,MAAM,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,QAAQ,IAAI,CAAC,CAAC,IAAI,GAAG;AAAA,IAC7F;AACA,WAAO,IAAI,KAAK,KAAK,QAAQ,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,GAAG;AAAA,EAC7F;AACA,MAAI,OAAO;AACT,UAAM,MAAM,MAAM,KAAK,GAAG;AAC1B,WAAO,IAAI,KAAK,KAAK,GAAG,IAAI,GAAG;AAAA,EACjC;AACA,MAAI,OAAO;AACT,UAAM,CAAC,IAAI,EAAE,IAAI;AACjB,UAAM,KAAK,GAAG,KAAK,GAAG;AACtB,UAAM,KAAK,GAAG,KAAK,GAAG;AACtB,WAAO,IAAI,KAAK,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG;AAAA,EACtC;AACA,SAAO,IAAI,KAAK,KAAK,GAAG;AAC1B;;;ACzDA,IAAM,eAAe;AAErB,IAAM,eAAe,CAAC,SAAiB;AACrC,QAAM,QAAQ,KAAK,YAAY;AAC/B,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAC9D,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,MAAI,MAAM,SAAS,OAAO,EAAG,QAAO;AACpC,MAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,WAAwB;AACxC,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,OAAO,KAAK,MAAM,EAAE,SAAS,QAAQ;AAAA,EAC9C;AAEA,MAAI,SAAS;AACb,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,QAAM,MAAM,MAAM;AAClB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK,GAAG;AAC/B,cAAU,OAAO,aAAa,MAAM,CAAC,CAAC;AAAA,EACxC;AACA,SAAO,KAAK,MAAM;AACpB;AAEA,IAAM,gBAAgB,OAAO,SAAiB;AAC5C,QAAM,KAAK,MAAM,OAAO,aAAkB;AAC1C,QAAM,SAAS,MAAM,GAAG,SAAS,IAAI;AACrC,SAAO,OAAO,SAAS,QAAQ;AACjC;AAEO,IAAM,mBAAmB,OAAO,QAAgB;AAjCvD;AAkCE,MAAI,aAAa,KAAK,GAAG,EAAG,QAAO;AAEnC,QAAM,YAAY,IAAI,WAAW,SAAS;AAC1C,QAAM,cAAc,CAAC,IAAI,WAAW,MAAM,KAAK,CAAC,IAAI,WAAW,OAAO;AACtE,QAAM,SAAS,OAAO,YAAY,eAAe,SAAQ,aAAQ,aAAR,mBAAkB,IAAI;AAE/E,OAAK,aAAa,gBAAgB,QAAQ;AACxC,UAAM,WAAW,YAAY,IAAI,QAAQ,WAAW,EAAE,IAAI;AAC1D,UAAMA,UAAS,MAAM,cAAc,QAAQ;AAC3C,UAAM,OAAO,aAAa,QAAQ;AAClC,WAAO,QAAQ,IAAI,WAAWA,OAAM;AAAA,EACtC;AAEA,MAAI,OAAO,UAAU,YAAY;AAC/B,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG;AAChC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI,MAAM,0BAA0B,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAAA,EACpF;AAEA,QAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,QAAM,SAAS,SAAS,WAAW;AACnC,QAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK,aAAa,GAAG;AAC5E,SAAO,QAAQ,WAAW,WAAW,MAAM;AAC7C;;;AC5DO,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;;;ACHjC,OAAO,eAAe;;;ACAf,IAAM,gBAAgB,CAAC,SAAS,UAAU,UAAU;AAEpD,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,6BAAuD;AAAA,EAClE,IAAI,CAAC,MAAM,MAAM,MAAM;AAAA,EACvB,IAAI,CAAC,IAAI;AAAA,EACT,IAAI,CAAC,IAAI;AAAA,EACT,OAAO,CAAC,OAAO;AAAA,EACf,OAAO,CAAC,OAAO;AAAA,EACf,OAAO,CAAC,OAAO;AAAA,EACf,IAAI,CAAC,OAAO;AAAA,EACZ,IAAI,CAAC,OAAO;AACd;AAEO,IAAM,WAAW;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACxCA,IAAM,eAAe,CAAC,OAAc,QAAgB;AAClD,QAAM,MAAM,MAAM,MAAM;AACxB,eAAa,OAAO,GAAG;AACzB;AAEA,IAAM,eAAe,CAAC,OAAc,QAAgB;AAClD,QAAM,WAAW,MAAM,WAAW;AACpC;AAEA,IAAM,cAAc,CAAC,KAAa,UAAkB;AAClD,QAAM,QAAQ;AACd,SAAO,CAAC,OAAO;AACb,UAAM,UAAU,IAAI,QAAQ,KAAK,KAAK;AACtC,QAAI,YAAY,IAAI;AAClB,aAAO;AAAA,IACT;AACA,UAAM,OAAO,IAAI,OAAO,UAAU,CAAC;AACnC,QAAI,SAAS,OAAO,SAAS,OAAO,cAAc,KAAK,IAAI,GAAG;AAC5D,aAAO;AAAA,IACT;AACA,YAAQ,UAAU;AAAA,EACpB;AACA,SAAO;AACT;AAEA,IAAM,UAAU,CAAC,UAAiB;AAChC,QAAM,EAAE,IAAI,IAAI;AAChB,MAAI,UAAU,YAAY,KAAK,MAAM,QAAQ;AAC7C,MAAI,YAAY,MAAM,SAAU;AAChC,MAAI,YAAY,IAAI;AAClB,cAAU,IAAI;AAAA,EAChB;AAEA,QAAM,UAAU,IAAI,MAAM,MAAM,UAAU,OAAO;AACjD,eAAa,OAAO,OAAO;AAE3B,QAAM,OAAO,KAAK;AAAA,IAChB,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,IAAM,aAAa,CAAC,UAAiB;AACnC,QAAM,EAAE,IAAI,IAAI;AAEhB,eAAa,OAAO,CAAC;AACrB,MAAI,aAAa,IAAI,QAAQ,OAAO,MAAM,QAAQ;AAClD,MAAI,aAAa,aAAa;AAC9B,MAAI,eAAe,IAAI;AACrB,iBAAa,aAAa,IAAI;AAAA,EAChC;AAEA,QAAM,UAAU,IAAI,MAAM,MAAM,UAAU,UAAU;AACpD,eAAa,OAAO,UAAU;AAE9B,QAAM,OAAO,KAAK;AAAA,IAChB,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AACH;AAEA,IAAM,aAAa,CAAC,UAAiB;AACnC,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,MAAM,IAAI;AAChB,MAAI,QAAQ,MAAM;AAElB,SAAO,QAAQ,KAAK;AAClB,UAAM,OAAO,IAAI,OAAO,KAAK;AAC7B,UAAM,YAAY,EAAE,KAAK,KAAK,IAAI,KAAK,SAAS,OAAO,SAAS;AAChE,QAAI,UAAW;AACf;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ;AAClB,SAAO,MAAM,KAAK;AAChB,UAAM,OAAO,IAAI,OAAO,GAAG;AAC3B,UAAM,YAAY,EAAE,KAAK,KAAK,IAAI,KAAK,SAAS,OAAO,SAAS;AAChE,QAAI,CAAC,UAAW;AAChB;AAAA,EACF;AAEA,eAAa,OAAO,GAAG;AACvB,QAAM,UAAU,IAAI,MAAM,OAAO,GAAG;AACpC,QAAM,OAAO,KAAK;AAAA,IAChB,MAAM;AAAA,IACN,SAAS;AAAA,EACX,CAAC;AACD,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,UAAiB;AACzC,QAAM,EAAE,KAAK,OAAO,IAAI;AACxB,MAAI,SAAS,MAAM;AACnB,MAAI,QAAuB;AAC3B,MAAI,YAAY;AAChB,QAAM,QAAkB,CAAC;AACzB,QAAM,MAAM,IAAI;AAChB,SAAO,SAAS,KAAK;AACnB,UAAM,OAAO,IAAI,OAAO,MAAM;AAC9B,QAAI,OAAO;AACT,YAAM,aAAa,SAAS;AAC5B,UAAI,WAAY,SAAQ;AACxB;AACA;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,OAAO,SAAS;AAC1C,QAAI,UAAU;AACZ,UAAI,WAAW,UAAW,OAAM,KAAK,IAAI,MAAM,WAAW,MAAM,CAAC;AACjE;AAAA,IACF;AAEA,UAAM,YAAY,KAAK,KAAK,IAAI;AAChC,QAAI,WAAW;AACb,UAAI,WAAW,UAAW,OAAM,KAAK,IAAI,MAAM,WAAW,MAAM,CAAC;AACjE,kBAAY,SAAS;AACrB;AACA;AAAA,IACF;AAEA,UAAM,eAAe,SAAS,OAAQ,SAAS;AAC/C,QAAI,cAAc;AAChB,cAAQ;AACR;AACA;AAAA,IACF;AAEA;AAAA,EACF;AACA,eAAa,OAAO,MAAM;AAE1B,QAAM,OAAO;AACb,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AAEpB,UAAM,YAAY,KAAK,QAAQ,GAAG,MAAM;AACxC,QAAI,WAAW;AACb,YAAM,aAAa,MAAM,IAAI,CAAC;AAC9B,UAAI,cAAc,WAAW,WAAW,GAAG,GAAG;AAC5C,YAAI,WAAW,SAAS,GAAG;AACzB,gBAAM,UAAU,OAAO;AACvB,iBAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,CAAC;AACtC,eAAK;AACL;AAAA,QACF;AACA,cAAM,YAAY,MAAM,IAAI,CAAC;AAC7B,aAAK;AACL,YAAI,WAAW;AACb,gBAAM,UAAU,OAAO,MAAM;AAC7B,iBAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,CAAC;AACtC,eAAK;AACL;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI,KAAK,SAAS,GAAG,GAAG;AACtB,YAAM,aAAa,MAAM,IAAI,CAAC;AAC9B,UAAI,cAAc,WAAW,QAAQ,GAAG,MAAM,IAAI;AAChD,cAAMC,WAAU,OAAO;AACvB,eAAO,KAAK,EAAE,MAAM,SAASA,SAAQ,CAAC;AACtC,aAAK;AACL;AAAA,MACF;AAEA,YAAM,UAAU,KAAK,MAAM,GAAG,EAAE;AAChC,aAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,CAAC;AACtC;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,MAAM,SAAS,KAAK,CAAC;AAAA,EACrC;AACF;AAEA,IAAM,aAAa,CAAC,SAAiB,UAAiB;AACpD,QAAM,EAAE,KAAK,OAAO,IAAI;AACxB,QAAM,cAAc,QAAQ,YAAY;AACxC,QAAM,MAAM,IAAI;AAChB,MAAI,QAAQ,MAAM;AAElB,SAAO,QAAQ,KAAK;AAClB,UAAM,UAAU,IAAI,QAAQ,MAAM,KAAK;AACvC,QAAI,YAAY,IAAI;AAClB,cAAQ,KAAK;AACb;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,QAAQ,CAAC;AAAA,IACX;AACA,iBAAa,UAAU,OAAO;AAC9B,UAAM,OAAO,OAAO,QAAQ;AAC5B,QAAI,gBAAgB,KAAK,YAAY,GAAG;AACtC,cAAQ,SAAS;AACjB;AAAA,IACF;AAEA,QAAI,YAAY,MAAM,UAAU;AAC9B,YAAM,YAAY,MAAM;AACxB,mBAAa,OAAO,OAAO;AAC3B,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,IAAI,MAAM,WAAW,OAAO;AAAA,MACvC,CAAC;AAAA,IACH;AAEA,WAAO,KAAK,GAAG,SAAS,MAAM;AAC9B,iBAAa,OAAO,SAAS,QAAQ;AACrC;AAAA,EACF;AACF;AAEA,IAAM,SAAS,CAAC,UAAiB;AAC/B,QAAM,EAAE,IAAI,IAAI;AAChB,QAAM,aAAa,IAAI,OAAO,MAAM,WAAW,CAAC;AAChD,QAAM,gBAAgB,eAAe;AACrC,eAAa,OAAO,gBAAgB,IAAI,CAAC;AACzC,QAAM,OAAO,KAAK;AAAA,IAChB,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AAED,QAAM,UAAU,WAAW,KAAK;AAChC,mBAAiB,KAAK;AAEtB,QAAM,YAAY,IAAI,OAAO,MAAM,QAAQ;AAC3C,QAAM,cAAc,cAAc;AAClC,eAAa,OAAO,cAAc,IAAI,CAAC;AACvC,QAAM,OAAO,KAAK;AAAA,IAChB,MAAM;AAAA,IACN,OAAO;AAAA,EACT,CAAC;AACD,SAAO;AACT;AAEA,IAAM,MAAM,CAAC,UAAiB;AAC5B,QAAM,MAAM,MAAM;AAClB,QAAM,MAAM,IAAI;AAEhB,SAAO,MAAM,WAAW,KAAK;AAC3B,UAAM,QAAQ,MAAM;AACpB,YAAQ,KAAK;AAEb,QAAI,MAAM,aAAa,OAAO;AAC5B,YAAM,YAAY,IAAI,WAAW,OAAO,QAAQ,CAAC;AACjD,UAAI,UAAW,YAAW,KAAK;AAAA,WAC1B;AACH,cAAM,UAAU,OAAO,KAAK;AAC5B,cAAM,UAAU,QAAQ,YAAY;AACpC,YAAI,cAAc,SAAS,OAAO,EAAG,YAAW,SAAS,KAAK;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,QAAQ,CAAC,QAAyB;AAC7C,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,EACX;AACA,MAAI,KAAK;AACT,SAAO,MAAM;AACf;;;AC3PO,IAAM,SAAS,CAAC,WAAoB;AACzC,QAAM,OAAkB,EAAE,SAAS,MAAM,UAAU,CAAC,EAAE;AACtD,QAAM,QAAe,EAAE,QAAQ,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE;AACxD,QAAM,KAAK;AACX,SAAO,KAAK;AACd;AAEO,IAAM,oBAAoB,CAAC,SAAiB,UAAuB;AACxE,QAAM,aAAa,2BAA2B,OAAO;AACrD,MAAI,YAAY;AACd,QAAI,eAAe,MAAM,SAAS;AAClC,WAAO,gBAAgB,GAAG;AACxB,YAAM,gBAAgB,MAAM,YAAY,EAAE;AAC1C,UAAI,kBAAkB,QAAS;AAC/B,UAAI,iBAAiB,WAAW,SAAS,aAAa,EAAG,QAAO;AAChE;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,cAAc,CAAC,OAAoB,cAAsB;AACpE,QAAM,OAAO,SAAS;AACxB;AAEO,IAAM,QAAQ,CAAC,UAAiB;AACrC,QAAM,EAAE,OAAO,OAAO,IAAI;AAC1B,MAAI,EAAE,OAAO,IAAI;AACjB,MAAI,QAAQ,MAAM,MAAM,SAAS,CAAC,EAAE;AACpC,QAAM,MAAM,OAAO;AAEnB,SAAO,SAAS,KAAK;AACnB,UAAM,QAAQ,OAAO,MAAM;AAC3B,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,KAAK,KAAkB;AAC7B;AACA;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,EAAE,MAAM;AAChC;AACA,UAAM,UAAU,SAAS,QAAQ,YAAY;AAC7C,QAAI,MAAM,OAAO;AACf,UAAI,QAAQ,MAAM;AAClB,UAAI,eAAe;AACnB,aAAO,EAAE,QAAQ,IAAI;AACnB,YAAI,MAAM,KAAK,EAAE,YAAY,SAAS;AACpC,yBAAe;AACf;AAAA,QACF;AAAA,MACF;AACA,aAAO,SAAS,KAAK;AACnB,YAAI,OAAO,MAAM,EAAE,SAAS,UAAW;AACvC;AAAA,MACF;AACA,UAAI,cAAc;AAChB,oBAAY,OAAO,KAAK;AACxB;AAAA,MACF,MAAO;AAAA,IACT;AAEA,UAAM,eAAe,YAAY,SAAS,OAAO;AACjD,QAAI,0BAA0B;AAC9B,QAAI,yBAAyB;AAC3B,gCAA0B,CAAC,kBAAkB,SAAS,KAAK;AAAA,IAC7D;AAEA,QAAI,yBAAyB;AAC3B,UAAI,eAAe,MAAM,SAAS;AAClC,aAAO,eAAe,GAAG;AACvB,YAAI,YAAY,MAAM,YAAY,EAAE,SAAS;AAC3C,sBAAY,OAAO,YAAY;AAC/B,gBAAM,gBAAgB,eAAe;AACrC,kBAAQ,MAAM,aAAa,EAAE;AAC7B;AAAA,QACF;AACA,uBAAe,eAAe;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,aAAa,CAAC;AACpB,QAAI;AACJ,WAAO,SAAS,KAAK;AACnB,YAAM,SAAS,OAAO,MAAM;AAC5B,UAAI,OAAO,SAAS,WAAW;AAC7B,sBAAc;AACd;AAAA,MACF;AACA,iBAAW,KAAM,OAA0B,OAAO;AAClD;AAAA,IACF;AAEA,QAAI,CAAC,YAAa;AAElB;AACA,UAAM,WAAuB,CAAC;AAC9B,UAAM,cAA6B;AAAA,MACjC,MAAM;AAAA,MACN,SAAS,SAAS;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AACA,UAAM,KAAK,WAAW;AAEtB,UAAM,cAAc,EAAE,YAAY,SAAS,SAAS,SAAS,OAAO;AACpE,QAAI,aAAa;AACf,YAAM,KAAK,EAAE,SAAS,SAAS,CAAC;AAChC,YAAM,aAAa,EAAE,QAAQ,QAAQ,MAAM;AAC3C,YAAM,UAAU;AAChB,eAAS,WAAW;AAAA,IACtB;AAAA,EACF;AACA,QAAM,SAAS;AACjB;;;ACrIO,IAAM,YAAY,CAAC,KAAa,QAAgB;AACrD,QAAM,MAAM,IAAI,QAAQ,GAAG;AAC3B,MAAI,QAAQ,GAAI,QAAO,CAAC,GAAG;AAC3B,SAAO,CAAC,IAAI,MAAM,GAAG,GAAG,GAAG,IAAI,MAAM,MAAM,IAAI,MAAM,CAAC;AACxD;AAEA,IAAM,UAAU,CAAC,QAAgB;AAC/B,QAAM,MAAM,IAAI,OAAO,CAAC;AACxB,QAAM,MAAM,IAAI,SAAS;AACzB,QAAM,eAAe,QAAQ,OAAO,QAAQ;AAC5C,MAAI,gBAAgB,QAAQ,IAAI,OAAO,GAAG,GAAG;AAC3C,WAAO,IAAI,MAAM,GAAG,GAAG;AAAA,EACzB;AACA,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,eAAyB;AACjD,SAAO,WAAW,IAAI,eAAa;AACjC,UAAM,QAAQ,UAAU,UAAU,KAAK,GAAG,GAAG;AAC7C,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,OAAO,MAAM,CAAC,MAAM,WAAW,QAAQ,MAAM,CAAC,CAAC,IAAI;AACjE,WAAO,EAAE,KAAK,MAAM;AAAA,EACtB,CAAC;AACH;AAEO,IAAM,SAAS,CAAC,UAA6B;AAClD,SAAO,MAAM,IAAI,UAAQ;AACvB,QAAI,KAAK,SAAS,WAAW;AAC3B,YAAM,WAAW,OAAO,KAAK,QAAQ;AACrC,YAAMC,QAAmB;AAAA,QACvB,MAAM;AAAA,QACN,SAAS,KAAK,QAAQ,YAAY;AAAA,QAClC,YAAY,iBAAiB,KAAK,UAAU;AAAA,QAC5C;AAAA,MACF;AACA,aAAOA;AAAA,IACT;AAEA,UAAM,OAAyB;AAAA,MAC7B,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,IAChB;AACA,WAAO;AAAA,EACT,CAAC;AACH;;;ACzCO,IAAM,QAAQ,CAAC,QAAgB;AACpC,QAAM,SAAS,MAAM,GAAG;AACxB,QAAM,QAAQ,OAAO,MAAM;AAC3B,SAAO,OAAO,KAAK;AACrB;;;ALGA,IAAM,cAA2D;AAAA,EAC/D,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,YAAY,OAAiD;AAC3E,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,QAAQ,UAAU,KAAK;AAC7B,QAAM,QAAQ,MAAM,SAAS;AAC7B,QAAM,MAAM,UAAU,IAAI,YAAY,MAAM,SAAS,CAAC,EAAE,YAAY;AACpE,SAAO,EAAE,OAAO,OAAO,IAAI;AAC7B;AAEO,SAAS,WAAW,MAAc,YAAiC;AACxE,QAAM,MAAM,MAAM,IAAI;AACtB,MAAI,aAAa;AACjB,MAAI,SAAS;AAEb,QAAM,SAAsB,CAAC;AAC7B,QAAMC,SAAQ,CAAC,KAAY,eAAuC,CAAC,MAAM;AACvE,eAAW,QAAQ,KAAK;AACtB,YAAM,aAAa,aAAa,QAAQ,CAAC,OAAO,MAAM,GAAG,EAAE,SAAS,KAAK,OAAO;AAEhF,UAAI,cAAc,OAAO,QAAQ;AAC/B,cAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAC1C,YAAI,CAAC,UAAU,QAAS,WAAU,UAAU,CAAC;AAC7C,kBAAU,QAAQ,YAAY;AAAA,MAChC;AAEA,YAAM,WAAW,EAAE,GAAG,aAAa;AACnC,YAAM,YACJ,gBAAgB,OACZ,KAAK,WAAW,KAAK,CAAC,SAAS,KAAK,QAAQ,OAAO,IACnD;AACN,UAAI,aAAa,UAAU,OAAO;AAChC,cAAM,WAAW,UAAU,MAAM,MAAM,GAAG;AAC1C,mBAAW,aAAa,UAAU;AAChC,gBAAM,QAAQ,UAAU,MAAM,iBAAiB;AAC/C,cAAI,OAAO;AACT,kBAAM,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,EAAE,KAAK,CAAC;AACtD,gBAAI,OAAO,MAAO,UAAS,GAAG,IAAI;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAEA,UAAI,aAAa,MAAM;AACrB,YAAI,KAAK,YAAY,MAAM;AACzB,mBAAS,YAAY,IAAI;AAAA,QAC3B;AACA,YAAI,KAAK,YAAY,UAAU;AAC7B,mBAAS,aAAa,IAAI;AAAA,QAC5B;AACA,YAAI,KAAK,YAAY,OAAO;AAC1B,mBAAS,gBAAgB,IAAI;AAAA,QAC/B;AACA,YAAI,KAAK,YAAY,OAAO;AAC1B,mBAAS,gBAAgB,IAAI;AAAA,QAC/B;AACA,YAAI,KAAK,YAAY,KAAK;AACxB,gBAAM,OAAO,KAAK,WAAW,KAAK,CAACC,UAASA,MAAK,QAAQ,MAAM;AAC/D,mBAAS,QAAO,6BAAM,UAAS;AAAA,QACjC;AACA,YAAI,KAAK,YAAY,MAAM;AACzB,mBAAS,WAAW,IAAI;AAAA,QAC1B;AACA,YAAI,KAAK,YAAY,MAAM;AACzB,mBAAS,WAAW,IAAI;AAAA,QAC1B;AACA,YAAI,KAAK,YAAY,MAAM;AACzB,uBAAa;AAAA,QACf;AACA,YAAI,KAAK,YAAY,KAAK;AACxB,cAAI,gBAAgB,MAAM;AACxB,kBAAM,iBAAiB,KAAK,WAAW,KAAK,CAAC,SAAS,KAAK,QAAQ,aAAa;AAChF,gBAAI,kBAAkB,eAAe,MAAO,UAAS,CAAC,eAAe;AAAA,UACvE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,aAAa,QAAQ,KAAK,YAAY,MAAM;AAC9C,eAAO,KAAK,EAAE,MAAM,IAAI,SAAS,EAAE,WAAW,KAAK,EAAE,CAAC;AAAA,MACxD,WAAW,aAAa,MAAM;AAC5B,cAAM,OAAO,KAAK,QACf,QAAQ,WAAW,GAAG,EACtB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG,EACrB,QAAQ,OAAO,EAAE;AACpB,cAAM,UAAsC,CAAC;AAE7C,YAAI,SAAS,WAAW,GAAG;AACzB,kBAAQ,WAAW,SAAS,SAAS,WAAW,GAAG,EAAE,IAAI;AAAA,QAC3D;AACA,YAAI,SAAS,OAAO;AAClB,kBAAQ,QAAQ,YAAY,SAAS,KAAK,EAAE;AAAA,QAC9C;AACA,YAAI,SAAS,kBAAkB,GAAG;AAChC,kBAAQ,YAAY,YAAY,SAAS,kBAAkB,CAAC,EAAE;AAAA,QAChE;AACA,YAAI,SAAS,sBAAsB,GAAG;AACpC,cAAI,SAAS,sBAAsB,EAAE,QAAQ,WAAW,MAAM,IAAI;AAChE,oBAAQ,YAAY;AAAA,cAClB,OAAO,QAAQ,SAAS;AAAA,cACxB,OAAO;AAAA,YACT;AAAA,UACF;AACA,cAAI,SAAS,sBAAsB,EAAE,QAAQ,cAAc,MAAM,IAAI;AACnE,oBAAQ,SAAS;AAAA,UACnB;AAAA,QACF;AACA,YAAI,SAAS,iBAAiB,GAAG;AAC/B,cAAI,SAAS,iBAAiB,EAAE,QAAQ,WAAW,MAAM,IAAI;AAC3D,oBAAQ,YAAY;AAAA,cAClB,OAAO,QAAQ,SAAS;AAAA,cACxB,OAAO;AAAA,YACT;AAAA,UACF;AACA,cAAI,SAAS,iBAAiB,EAAE,QAAQ,cAAc,MAAM,IAAI;AAC9D,oBAAQ,SAAS;AAAA,UACnB;AAAA,QACF;AACA,YAAI,SAAS,gBAAgB,GAAG;AAC9B,cAAI,SAAS,gBAAgB,MAAM,QAAS,SAAQ,cAAc;AAClE,cAAI,SAAS,gBAAgB,MAAM,MAAO,SAAQ,YAAY;AAAA,QAChE;AACA,YAAI,SAAS,YAAY,EAAG,SAAQ,QAAQ,SAAS,YAAY;AACjE,YAAI,SAAS,aAAa,EAAG,SAAQ,OAAO,SAAS,aAAa,MAAM;AACxE,YAAI,SAAS,YAAY,EAAG,SAAQ,SAAS,SAAS,YAAY,MAAM;AACxE,YAAI,SAAS,aAAa,EAAG,SAAQ,WAAW,SAAS,aAAa;AACtE,YAAI,SAAS,KAAM,SAAQ,YAAY,EAAE,KAAK,SAAS,KAAK;AAE5D,YAAI,cAAc,SAAS,WAAW,MAAM,MAAM;AAChD,kBAAQ,SAAS;AAAA,YACf,MAAM;AAAA,YACN,SAAS,QAAQ,YAAY,qBAAqB;AAAA,UACpD;AACA,kBAAQ,kBAAkB;AAC1B,uBAAa;AAAA,QACf;AACA,YAAI,cAAc,SAAS,WAAW,MAAM,MAAM;AAChD,kBAAQ,SAAS,EAAE,SAAS,QAAQ,YAAY,qBAAqB,KAAK;AAC1E,kBAAQ,kBAAkB;AAC1B,uBAAa;AAAA,QACf;AACA,YAAI,QAAQ;AACV,kBAAQ,cAAc;AACtB,mBAAS;AAAA,QACX;AAEA,eAAO,KAAK,EAAE,MAAM,QAAQ,CAAC;AAAA,MAC/B,WAAW,cAAc,KAAM,CAAAD,OAAM,KAAK,UAAU,QAAQ;AAAA,IAC9D;AAAA,EACF;AACA,EAAAA,OAAM,GAAG;AACT,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAoC;AAC7D,SAAO,QAAQ,MAAM,QAAQ,YAAY,EAAE,IAAI;AACjD;AAEA,SAAS,aAAa,OAAwB;AAC5C,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,CAAC,OAAO,SAAS,KAAK,EAAG,QAAO;AACpC,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACvC;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI,WAAW,SAAS,GAAG,GAAG;AAC5B,UAAM,UAAU,OAAO,WAAW,UAAU;AAC5C,WAAO,OAAO,SAAS,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI;AAAA,EAC9E;AACA,QAAM,UAAU,OAAO,WAAW,UAAU;AAC5C,MAAI,CAAC,OAAO,SAAS,OAAO,EAAG,QAAO;AACtC,SAAO,UAAU,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,UAAU,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC;AACjG;AAEA,SAAS,cAAc,OAAoC;AACzD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,OAAO,WAAW,KAAK;AACpC,SAAO,OAAO,SAAS,IAAI,IAAI,OAAO;AACxC;AAEA,SAAS,gBACP,OACqD;AACrD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,aAAa,MAAM,KAAK;AAC9B,MAAI,CAAC,WAAY,QAAO;AACxB,QAAM,IAAI,YAAY,UAAU;AAChC,SAAO;AAAA,IACL,OAAO,EAAE,MAAM,QAAQ,KAAK,EAAE;AAAA,IAC9B,eAAe,IAAI,EAAE,SAAS;AAAA,EAChC;AACF;AAEA,SAAS,kBAAkB,MAKf;AA/NZ;AAgOE,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,WAAU,UAAK,YAAL,YAAgB;AAChC,QAAM,WAAU,UAAK,YAAL,YAAgB;AAChC,MAAI,YAAY,KAAK,YAAY,EAAG,QAAO;AAC3C,QAAM,QAAO,UAAK,SAAL,YAAa;AAC1B,QAAM,QAAQ,KAAK;AACnB,QAAM,WACJ,QAAQ,+BAAO,QAAQ,KACvB,QAAQ,+BAAO,QAAQ,KACvB,QAAQ,+BAAO,KAAK,KACpB,QAAQ,+BAAO,SAAS;AAC1B,SAAO,KAAK,KAAK,MAAM,MAAM,CAAC;AAChC;AAEO,SAAS,eACd,SACA,YACA,cACsB;AAlPxB;AAmPE,QAAM,OAAQ,QAAgB;AAG9B,MAAI,CAAC,QAAQ,CAAC,KAAK,OAAQ,QAAO,CAAC;AAEnC,QAAM,YACF,mBAAgB,cAAhB,mBAAoD,WAApD,YACF,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;AAE3C,QAAM,OAA6B,CAAC;AACpC,QAAM,OAAO,IAAI,MAAM,QAAQ,EAAE,KAAK,CAAC;AAEvC,OAAK,QAAQ,CAAC,QAAQ;AA/PxB,QAAAE,KAAAC,KAAA;AAgQI,UAAM,QAA+B,CAAC;AACtC,QAAI,WAAW;AACf,QAAI,YAAY;AAEhB,WAAO,WAAW,UAAU;AAC1B,UAAI,KAAK,QAAQ,IAAI,GAAG;AACtB,aAAK,QAAQ,KAAK;AAClB,YAAI,kBAAkB,IAAI,SAAS,CAAC,GAAG;AACrC,uBAAa;AAAA,QACf;AACA,oBAAY;AACZ;AAAA,MACF;AAEA,YAAM,OAAO,IAAI,SAAS;AAC1B,UAAI,CAAC,KAAM;AACX,mBAAa;AAEb,YAAM,WAAUD,MAAA,KAAK,YAAL,OAAAA,MAAgB;AAChC,YAAM,WAAUC,MAAA,KAAK,YAAL,OAAAA,MAAgB;AAEhC,UAAI,UAAU,GAAG;AACf,iBAAS,IAAI,GAAG,IAAI,SAAS,KAAK,GAAG;AACnC,eAAK,WAAW,CAAC,IAAI,UAAU;AAAA,QACjC;AAAA,MACF;AAEA,UAAI,UAAU,GAAG;AACf,iBAAS,IAAI,GAAG,IAAI,UAAU,GAAG,KAAK,GAAG;AACvC,cAAI,kBAAkB,IAAI,SAAS,CAAC,GAAG;AACrC,yBAAa;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAEA,YAAM,SAAQ,UAAK,UAAL,YAAc,CAAC;AAC7B,YAAM,WAAW,cAAc,MAAM,QAAQ;AAC7C,YAAM,OAAO,gBAAgB,MAAM,SAAS;AAC5C,YAAM,QAAQ,gBAAgB,MAAM,KAAK;AACzC,YAAM,aAAa;AAAA,QACjB,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,QACJ,IAAI;AAAA,MACN;AAEA,YAAM,UAAoC;AAAA,QACxC,SAAS,UAAU,IAAI,UAAU;AAAA,QACjC,SAAS,UAAU,IAAI,UAAU;AAAA,QACjC,OAAO,MAAM;AAAA,QACb,QAAQ;AAAA,QACR,UAAU,kBAAkB,MAAM,QAAQ;AAAA,QAC1C,UAAU,WAAW,WAAW,aAAa;AAAA,QAC7C,OAAO,+BAAO;AAAA,QACd,MAAM,OAAO,EAAE,OAAO,KAAK,OAAO,cAAc,KAAK,aAAa,IAAI;AAAA,QACtE,QAAQ;AAAA,MACV;AAEA,YAAM,KAAK;AAAA,QACT,OAAM,UAAK,SAAL,YAAa;AAAA,QACnB;AAAA,MACF,CAAC;AAED,kBAAY;AAAA,IACd;AAEA,SAAK,KAAK,KAAK;AAAA,EACjB,CAAC;AAED,SAAO;AACT;AAEO,SAAS,gBACd,QACA,YACuB;AA3UzB;AA4UE,QAAM,IAAI,aAAY,YAAO,UAAP,YAAgB,SAAS;AAC/C,QAAM,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI;AAEzB,MAAI,SAAS;AACb,MAAI,QAAQ;AAEZ,MAAI,MAAM,KAAK,MAAM,GAAG;AACtB,aAAS;AACT,YAAQ;AAAA,EACV,WAAW,MAAM,GAAG;AAClB,QAAI,IAAI,GAAG;AACT,eAAS;AACT,cAAQ;AAAA,IACV,OAAO;AACL,eAAS,CAAC;AACV,cAAQ;AAAA,IACV;AAAA,EACF,WAAW,MAAM,GAAG;AAClB,QAAI,IAAI,GAAG;AACT,eAAS;AACT,cAAQ;AAAA,IACV,OAAO;AACL,eAAS,CAAC;AACV,cAAQ;AAAA,IACV;AAAA,EACF,WAAW,IAAI,KAAK,IAAI,GAAG;AACzB,aAAS,KAAK,IAAI,GAAG,CAAC;AACtB,YAAQ;AAAA,EACV,WAAW,IAAI,KAAK,IAAI,GAAG;AACzB,aAAS,KAAK,IAAI,GAAG,CAAC,CAAC;AACvB,YAAQ;AAAA,EACV,WAAW,IAAI,KAAK,IAAI,GAAG;AACzB,aAAS,KAAK,IAAI,CAAC,GAAG,CAAC;AACvB,YAAQ;AAAA,EACV,WAAW,IAAI,KAAK,IAAI,GAAG;AACzB,aAAS,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;AACxB,YAAQ;AAAA,EACV;AAEA,SAAO;AAAA,IACL,OAAO,EAAE;AAAA,IACT,eAAe,IAAI,EAAE,SAAS;AAAA,IAC9B,QAAO,YAAO,SAAP,YAAe,KAAK;AAAA,IAC3B;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iBACd,SACA,YACA,UAAU,GACgB;AAC1B,QAAM,IAAI,YAAY,QAAQ,SAAS,SAAS;AAChD,QAAM,QAAQ,EAAE,QAAQ,aAAa,OAAO;AAC5C,SAAO;AAAA,IACL,OAAO,EAAE;AAAA,IACT,eAAe,IAAI,SAAS;AAAA,IAC5B,QAAQ,QAAQ,SAAS,KAAK;AAAA,IAC9B,UAAU,QAAQ,QAAQ,YAAY,QAAQ,KAAK,IAAI;AAAA,EACzD;AACF;AAEO,SAAS,kBAAkB,OAAwB;AACxD,SAAO,aAAa,KAAK;AAC3B;AAEO,SAAS,iBAAiB,OAAoC;AACnE,SAAO,gBAAgB,KAAK;AAC9B;AAEO,SAAS,iBAA8D;AAC5E,SAAO;AACT;;;AMhZO,SAAS,qBACd,OACA,WACA,OACM;AATR;AAUE,QAAM,mBAAkB,qBAAU,eAAV,mBAAsB,UAAtB,YAA+B,+BAAO;AAC9D,MAAI,CAAC,gBAAiB;AACtB,QAAM,IAAI,YAAY,eAAe;AACrC,QAAM,aAAa,EAAE,OAAO,EAAE,OAAO,eAAe,IAAI,EAAE,SAAS,IAAI;AACzE;;;ACZO,SAAS,gBAAgB,MAAiB,OAAe,QAAsB;AACpF,QAAM,gBAAgB,SAAS;AAC/B,MAAI,KAAK,IAAI,gBAAgB,KAAK,IAAI,MAAO;AAC3C,SAAK,SAAS;AACd;AAAA,EACF;AACA,MAAI,KAAK,IAAI,gBAAgB,IAAI,IAAI,MAAO;AAC1C,SAAK,SAAS;AACd;AAAA,EACF;AACA,MAAI,KAAK,IAAI,gBAAgB,UAAU,IAAI,MAAQ;AACjD,SAAK,aAAa,EAAE,MAAM,MAAM,OAAO,IAAI,QAAQ,UAAU,CAAC;AAC9D,SAAK,SAAS;AACd;AAAA,EACF;AACA,MAAI,KAAK,IAAI,gBAAgB,UAAU,IAAI,MAAQ;AACjD,SAAK,aAAa,EAAE,MAAM,QAAQ,OAAO,IAAI,QAAQ,WAAW,CAAC;AACjE,SAAK,SAAS;AACd;AAAA,EACF;AACA,OAAK,SAAS;AAChB;;;ACvBA,SAAS,mBAAmB;AAC5B,OAAO,iBAAiB;AAExB,IAAM,UAAkC;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAEO,IAAM,WAAW,CAAC,MAAc;AACrC,MAAI,CAAC,EAAG,QAAO,CAAC;AAChB,MAAI,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,MAAM,EAAG,QAAO,CAAC;AAEhF,MAAI;AACJ,MAAI;AACF,eAAW,IAAI,YAAY,CAAC;AAAA,EAC9B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAgB,CAAC;AACvB,aAAW,QAAQ,SAAS,UAAU;AACpC,UAAM,OAAO,QAAQ,KAAK,IAAI;AAE9B,QAAI,KAAK,SAAS,KAAK,KAAK,SAAS,IAAI;AACvC,aAAO,KAAK;AAAA,QACV,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA,QACR,UAAU,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,KAAK,SAAS,IAAI;AACpB,aAAO,KAAK;AAAA,QACV,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA,QACR,OAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,QACX;AAAA,QACA,UAAU,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH,WAAW,KAAK,SAAS,KAAK;AAC5B,aAAO,KAAK;AAAA,QACV,GAAG,KAAK;AAAA,QACR,GAAG,KAAK;AAAA,QACR,OAAO;AAAA,UACL,MAAM;AAAA,UACN,IAAI,KAAK;AAAA,UACT,IAAI,KAAK;AAAA,QACX;AAAA,QACA,UAAU,KAAK;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH,WAAW,KAAK,SAAS,KAAK;AAC5B,YAAM,YAAY,OAAO,OAAO,SAAS,CAAC;AAC1C,UAAI,CAAC,aAAa,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,SAAS,UAAU,IAAI,EAAG;AAElE,YAAM,oBAAoB,YAAY;AAAA,QACpC,IAAI,UAAU;AAAA,QACd,IAAI,UAAU;AAAA,QACd,IAAI,KAAK;AAAA,QACT,IAAI,KAAK;AAAA,QACT,IAAI,KAAK;AAAA,QACT,IAAI,KAAK;AAAA,QACT,eAAe,KAAK;AAAA,QACpB,cAAc,KAAK;AAAA,QACnB,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,iBAAW,WAAW,mBAAmB;AACvC,eAAO,KAAK;AAAA,UACV,GAAG,QAAQ;AAAA,UACX,GAAG,QAAQ;AAAA,UACX,OAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,YACZ,IAAI,QAAQ;AAAA,UACd;AAAA,UACA,UAAU;AAAA,UACV,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF,WAAW,KAAK,SAAS,GAAG;AAC1B,aAAO,KAAK,EAAE,OAAO,MAAM,KAAK,CAAC;AAAA,IACnC,MAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC1FO,SAAS,aACd,QACA,cACA,QAAQ,EAAE,GAAG,GAAG,GAAG,EAAE,GACb;AACR,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,QAAI,WAAW,OAAO;AACpB,aAAO,EAAE,OAAO,KAAK;AAAA,IACvB;AACA,QAAI,MAAM,SAAS,KAAK;AACtB,aAAO;AAAA,QACL,GAAI,MAAM,IAAe,eAAe,MAAM;AAAA,QAC9C,GAAI,MAAM,IAAe,eAAe,MAAM;AAAA,QAC9C,QAAQ;AAAA,MACV;AAAA,IACF;AACA,QAAI,MAAM,OAAO;AACf,UAAI,MAAM,MAAM,SAAS,SAAS;AAChC,eAAO;AAAA,UACL,GAAI,MAAM,IAAe,eAAe,MAAM;AAAA,UAC9C,GAAI,MAAM,IAAe,eAAe,MAAM;AAAA,UAC9C,OAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAK,MAAM,MAAM,KAAgB,eAAe,MAAM;AAAA,YACtD,IAAK,MAAM,MAAM,KAAgB,eAAe,MAAM;AAAA,YACtD,IAAK,MAAM,MAAM,KAAgB,eAAe,MAAM;AAAA,YACtD,IAAK,MAAM,MAAM,KAAgB,eAAe,MAAM;AAAA,UACxD;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM,MAAM,SAAS,aAAa;AACpC,eAAO;AAAA,UACL,GAAI,MAAM,IAAe,eAAe,MAAM;AAAA,UAC9C,GAAI,MAAM,IAAe,eAAe,MAAM;AAAA,UAC9C,OAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAK,MAAM,MAAM,KAAgB,eAAe,MAAM;AAAA,YACtD,IAAK,MAAM,MAAM,KAAgB,eAAe,MAAM;AAAA,UACxD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,MACL,GAAI,MAAM,IAAe,eAAe,MAAM;AAAA,MAC9C,GAAI,MAAM,IAAe,eAAe,MAAM;AAAA,IAChD;AAAA,EACF,CAAC;AACH;;;ACvDO,SAAS,cAAc,KAAsB;AAClD,QAAM,QAAQ;AACd,SAAO,MAAM,KAAK,GAAG;AACvB;AAEO,SAAS,iBACd,OAC4C;AAC5C,MAAI,UAAU,QAAS,QAAO;AAC9B,MAAI,UAAU,MAAO,QAAO;AAC5B,SAAO;AACT;;;ACQO,SAAS,eACd,OACA,SACA,UACA,YACA,cACA,aACM;AA5BR;AA6BE,MAAI,QAAQ,SAAS,UAAU,CAAC,QAAQ,QAAS;AACjD,QAAM,YAAY,WAAW,QAAQ,SAAS,UAAU;AACxD,QAAM,UAAU,kBAAkB,QAAQ,OAAO;AAEjD,QAAM,UAAsC;AAAA,IAC1C,KAAI,aAAQ,SAAR,YAAgB,KAAK;AAAA,IACzB,KAAI,aAAQ,QAAR,YAAe,KAAK;AAAA,IACxB,KAAI,aAAQ,UAAR,YAAiB,KAAK;AAAA,IAC1B,KAAI,aAAQ,WAAR,YAAkB,KAAK;AAAA,IAC3B,UAAU,oBAAoB;AAAA,IAC9B,UAAU,QAAQ,qBAAmB,cAAS,UAAT,mBAAgB,aAAY;AAAA,IACjE,OAAO;AAAA,IACP,QAAQ;AAAA;AAAA;AAAA,IAGR,QAAQ,CAAC,aAAa,aAAa,GAAG,cAAc,IAAI;AAAA,IACxD,iBAAiB;AAAA,IACjB,qBAAqB;AAAA,IACrB,KAAK;AAAA,EACP;AACA,MAAI,QAAQ,OAAQ,SAAQ,SAAS,QAAQ;AAC7C,MAAI,QAAQ,UAAW,SAAQ,cAAc,QAAQ,YAAY;AACjE,MAAI,QAAQ,WAAY,SAAQ,sBAAsB,QAAQ;AAC9D,MAAI,QAAQ,MAAM;AAChB,UAAM,IAAI,YAAY,QAAQ,IAAI;AAClC,YAAQ,OAAO;AAAA,MACb,OAAO,EAAE;AAAA,MACT,eAAe,IAAI,EAAE,QAAQ,WAAW;AAAA,IAC1C;AAAA,EACF,OAAO;AACL,YAAQ,OAAO,EAAE,OAAO,UAAU,cAAc,IAAI;AAAA,EACtD;AACA,MAAI,QAAQ,aAAc,SAAQ,QAAQ,YAAY,QAAQ,YAAY,EAAE;AAC5E,MAAI,QAAQ,OAAQ,SAAQ,SAAS,gBAAgB,QAAQ,QAAQ,UAAU;AAC/E,OAAI,aAAQ,YAAR,mBAAiB,OAAO;AAC1B,YAAQ,OAAO,iBAAiB,QAAQ,SAAS,YAAY,OAAO;AAAA,EACtE;AACA,MAAI,QAAQ,YAAY,OAAW,SAAQ,gBAAgB,IAAI,WAAW;AAC1E,MAAI,QAAQ,mBAAmB,QAAW;AACxC,YAAQ,kBAAkB,QAAQ,iBAAiB;AAAA,EACrD;AACA,MAAI,QAAQ,SAAU,SAAQ,OAAO;AACrC,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAC3C,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAE3C,QAAM,QAAQ,WAAW,OAAO;AAClC;AAEA,eAAsB,gBACpB,OACA,SACA,cACe;AAjFjB;AAkFE,MAAI,QAAQ,SAAS,WAAW,CAAC,QAAQ,IAAK;AAE9C,QAAM,UAAgC;AAAA,IACpC,KAAI,aAAQ,SAAR,YAAgB,KAAK;AAAA,IACzB,KAAI,aAAQ,QAAR,YAAe,KAAK;AAAA,IACxB,KAAI,aAAQ,UAAR,YAAiB,KAAK;AAAA,IAC1B,KAAI,aAAQ,WAAR,YAAkB,KAAK;AAAA,EAC7B;AAEA,MAAI,cAAc,QAAQ,GAAG,EAAG,SAAQ,OAAO,QAAQ;AAAA,MAClD,SAAQ,OAAO,MAAM,iBAAiB,QAAQ,GAAG;AAEtD,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAC3C,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAC3C,MAAI,QAAQ,OAAQ,SAAQ,SAAS,QAAQ;AAC7C,QAAM,iBAAgB,uBAAiB,aAAQ,YAAR,mBAAiB,OAAO,MAAzC,YAA8C;AACpE,QAAM,iBAAiB,kBAAkB,QAAQ,OAAO;AACxD,QAAM,eAAe,gBAAgB;AACrC,MAAI,iBAAiB,GAAG;AACtB,YAAQ,gBAAgB,IAAI,gBAAgB;AAAA,EAC9C;AACA,OAAI,aAAQ,SAAR,mBAAc,OAAO;AACvB,QAAI,QAAQ,KAAK,UAAU,UAAW,SAAQ,WAAW;AAEzD,UAAM,CAAC,OAAO,GAAG,IAAI,QAAQ,KAAK;AAClC,UAAM,CAAC,QAAQ,MAAM,IAAI;AACzB,UAAM,CAAC,MAAM,IAAI,IAAI;AAErB,UAAM,YAAW,aAAQ,UAAR,YAAiB,OAAO,OAAO,UAAU;AAC1D,UAAM,YAAW,aAAQ,WAAR,YAAkB,OAAO,OAAO,UAAU;AAE3D,YAAQ,IAAI,UAAU;AACtB,YAAQ,IAAI,UAAU;AAEtB,YAAQ,SAAS;AAAA,MACf,MAAM;AAAA,MACN,GAAI,SAAS,gBAAiB,UAAU;AAAA,MACxC,GAAI,SAAS,gBAAiB,UAAU;AAAA,MACxC,IAAK,OAAO,UAAU,gBAAiB,UAAU;AAAA,MACjD,IAAK,OAAO,UAAU,gBAAiB,UAAU;AAAA,IACnD;AAAA,EACF;AAEA,QAAM,SAAS,OAAO;AACxB;AAEO,SAAS,gBACd,OACA,SACA,YACA,cACA,YACA,cACA,eACM;AAxIR;AAyIE,MAAI,QAAQ,SAAS,WAAW,CAAC,QAAQ,QAAQ,CAAC,QAAQ,QAAS;AACnE,QAAM,QAAQ;AAAA,IACZ,KAAI,aAAQ,UAAR,YAAiB,KAAK,QAAQ,QAAQ,CAAC;AAAA,IAC3C,KAAI,aAAQ,WAAR,YAAkB,KAAK,QAAQ,QAAQ,CAAC;AAAA,EAC9C;AACA,QAAM,YAAY,SAAS,QAAQ,IAAI;AACvC,MAAI,CAAC,UAAU,OAAQ;AACvB,QAAM,SAAS,aAAa,WAAW,cAAc,KAAK;AAC1D,QAAM,UAAW,QAAgB;AACjC,QAAM,UAAU,OAAO,QAAQ,SAAS,WAAW,QAAQ,KAAK,KAAK,EAAE,SAAS,IAAI;AACpF,QAAM,UAAU,kBAAkB,QAAQ,OAAO;AAEjD,QAAM,UAAgC;AAAA,IACpC,KAAI,aAAQ,SAAR,YAAgB,KAAK;AAAA,IACzB,KAAI,aAAQ,QAAR,YAAe,KAAK;AAAA,IACxB,KAAI,aAAQ,UAAR,YAAiB,KAAK;AAAA,IAC1B,KAAI,aAAQ,WAAR,YAAkB,KAAK;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,SAAS;AACX,UAAM,aAAa,WAAW,UAAU,KAAI,aAAQ,OAAR,YAAc,YAAY;AACtE,YAAQ,aAAa;AACrB,YAAQ,OAAO,EAAE,OAAO,UAAU,cAAc,IAAI;AACpD,kBAAc,KAAK,EAAE,YAAY,YAAY,SAAS,QAAQ,CAAC;AAAA,EACjE,WAAW,SAAS;AAClB,UAAM,YAAY,YAAY,QAAQ,QAAQ,SAAS;AACvD,YAAQ,OAAO;AAAA,MACb,OAAO,UAAU;AAAA,MACjB,eAAe,IAAI,UAAU,QAAQ,WAAW;AAAA,IAClD;AAAA,EACF,OAAO;AACL,YAAQ,OAAO,EAAE,OAAO,UAAU,cAAc,IAAI;AAAA,EACtD;AAEA,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAC3C,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAC3C,MAAI,QAAQ,OAAQ,SAAQ,SAAS,gBAAgB,QAAQ,QAAQ,UAAU;AAC/E,OAAI,aAAQ,YAAR,mBAAiB,OAAO;AAC1B,YAAQ,OAAO,iBAAiB,QAAQ,SAAS,YAAY,OAAO;AAAA,EACtE;AACA,MAAI,QAAQ,OAAQ,SAAQ,SAAS,QAAQ;AAE7C,QAAM,SAAS,YAAmC,OAAO;AAEzD,MAAI,GAAC,aAAQ,SAAR,mBAAc,SAAS;AAC5B,QAAM,YAAY,WAAW,QAAQ,KAAK,SAAS,UAAU;AAC7D,QAAM,cAA0C;AAAA,IAC9C,KAAI,aAAQ,SAAR,YAAgB,KAAK;AAAA,IACzB,KAAI,aAAQ,QAAR,YAAe,KAAK;AAAA,IACxB,KAAI,aAAQ,UAAR,YAAiB,KAAK;AAAA,IAC1B,KAAI,aAAQ,WAAR,YAAkB,KAAK;AAAA,IAC3B,UAAU,oBAAoB;AAAA,IAC9B,UAAU,QAAQ,KAAK,mBAAmB;AAAA,IAC1C,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,QAAQ,QAAQ,KAAK;AAAA,IACrB,MAAM,EAAE,OAAO,UAAU,cAAc,IAAI;AAAA,IAC3C,KAAK;AAAA,EACP;AACA,cAAY,SAAS;AACrB,MAAI,QAAQ,OAAQ,aAAY,SAAS,QAAQ;AACjD,MAAI,QAAQ,KAAK,cAAc;AAC7B,gBAAY,QAAQ,YAAY,QAAQ,KAAK,YAAY,EAAE;AAAA,EAC7D;AACA,MAAI,QAAQ,YAAY,QAAW;AACjC,gBAAY,gBAAgB,IAAI,WAAW;AAAA,EAC7C;AACA,MAAI,QAAQ,MAAO,aAAY,QAAQ,QAAQ;AAC/C,MAAI,QAAQ,MAAO,aAAY,QAAQ,QAAQ;AAE/C,QAAM,QAAQ,WAAW,WAAW;AACtC;AAEO,SAAS,eACd,OACA,SACA,YACA,cACM;AAxNR;AAyNE,MAAI,QAAQ,SAAS,UAAU,CAAC,QAAQ,SAAS,CAAC,QAAQ,IAAK;AAC/D,QAAM,OAAO,mBAAmB,OAAO;AACvC,QAAM,YAAY,SAAS,IAAI;AAC/B,MAAI,CAAC,UAAU,OAAQ;AACvB,QAAM,SAAS,aAAa,WAAW,YAAY;AACnD,QAAM,EAAE,MAAM,MAAM,MAAM,KAAK,IAAI,gBAAgB,OAAO;AAC1D,QAAM,IAAI,YAAY,QAAQ,SAAS,SAAS;AAChD,QAAM,UAAU,kBAAkB,QAAQ,OAAO;AACjD,QAAM,cAAa,aAAQ,WAAR,YAAkB,CAAC;AACtC,QAAMC,eAAc,eAAe;AAEnC,QAAM,UAAgC;AAAA,IACpC,KAAI,aAAQ,SAAR,YAAgB,KAAK;AAAA,IACzB,KAAI,aAAQ,QAAR,YAAe,KAAK;AAAA,IACxB,IAAI,OAAO,QAAQ;AAAA,IACnB,IAAI,OAAO,QAAQ;AAAA,IACnB,MAAM;AAAA,MACJ,OAAO,EAAE;AAAA,MACT,eAAe,IAAI,EAAE,QAAQ,WAAW;AAAA,MACxC,SAAQ,aAAQ,UAAR,YAAiB,KAAK;AAAA,MAC9B,UAAU,QAAQ,QAAQA,aAAY,QAAQ,KAAK,IAAI;AAAA,MACvD,gBAAgB,iBAAiB,WAAW,CAAC,CAAC;AAAA,MAC9C,cAAc,iBAAiB,WAAW,CAAC,CAAC;AAAA,IAC9C;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAC3C,MAAI,QAAQ,MAAO,SAAQ,QAAQ,QAAQ;AAC3C,MAAI,QAAQ,OAAQ,SAAQ,SAAS,gBAAgB,QAAQ,QAAQ,UAAU;AAE/E,QAAM,SAAS,YAAmC,OAAO;AAC3D;AAEO,SAAS,gBACd,OACA,SACA,YACA,cACM;AA/PR;AAgQE,MAAI,QAAQ,SAAS,QAAS;AAC9B,QAAM,OAAO,eAAe,SAAS,YAAY,YAAY;AAC7D,MAAI,CAAC,KAAK,OAAQ;AAElB,QAAM,YAAa,QAAgB;AACnC,QAAM,OAAO,YACT,UAAU,IAAI,CAAC,UAAO;AAtQ5B,QAAAC;AAsQiC,aAAAA,MAAA,QAAQ,UAAR,OAAAA,MAAiB,KAAK,QAAS;AAAA,GAAY,IACtE;AAEJ,QAAM,WAAW,KAAK,UAAU;AAChC,QAAM,kBAAkB,aAAQ,WAAR,YAAkB,KAAK,WAAY;AAC3D,QAAM,eAAgB,QAAgB,gBACjC,QAAgB,gBAAgB,eACjC;AACJ,QAAM,OAAO,eACT,IAAI,MAAM,QAAQ,EAAE,KAAK,KAAK,IAAI,cAAc,aAAa,CAAC,IAC9D;AAEJ,QAAM,UAAU,QAAQ;AACxB,QAAM,UACJ,mCAAS,WAAS,mCAAS,SACvB;AAAA,IACE,MAAK,aAAQ,UAAR,YAAiB,KAAK;AAAA,IAC3B,OAAO,YAAY,QAAQ,SAAS,SAAS,EAAE,MAAM,QAAQ,KAAK,EAAE;AAAA,EACtE,IACA;AAAA,IACE,IAAI,IAAI;AAAA,IACR,OAAO;AAAA,EACT;AAEN,QAAM,SAAS,MAAM;AAAA,IACnB,KAAI,aAAQ,SAAR,YAAgB,KAAK;AAAA,IACzB,KAAI,aAAQ,QAAR,YAAe,KAAK;AAAA,IACxB,KAAI,aAAQ,UAAR,YAAiB,KAAK;AAAA,IAC1B,KAAI,aAAQ,WAAR,YAAkB,KAAK;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AACH;;;AfvRO,IAAM,mBAAmB;AACzB,IAAM,yBAAyB;AAC/B,IAAM,4BAA4B;AAEzC,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,KAAK,QAAQ,iBAAiB,EAAE,EAAE,KAAK,KAAK;AACrD;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MACJ,QAAQ,yCAAyC,EAAE,EACnD,QAAQ,uCAAuC,EAAE,EACjD,QAAQ,uCAAuC,EAAE,EACjD,QAAQ,oBAAoB,EAAE,EAC9B,QAAQ,2BAA2B,EAAE;AAC1C;AAEA,SAAS,iBAAiB,UAAkB,YAAoB,OAAuB;AACrF,QAAM,YAAY,SAAS,UAAU;AACrC,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,SAAO,MAAM;AACX,UAAM,YAAY,OAAO,QAAQ,WAAW,MAAM;AAClD,QAAI,cAAc,GAAI;AAEtB,UAAM,UAAU,OAAO,YAAY,SAAS,SAAS;AACrD,UAAM,QAAQ,OAAO,QAAQ,WAAW,SAAS;AACjD,QAAI,YAAY,MAAM,UAAU,GAAI;AAEpC,UAAM,QAAQ,OAAO,MAAM,SAAS,QAAQ,UAAU,MAAM;AAC5D,UAAM,YAAY,MAAM,QAAQ,UAAU;AAC1C,UAAM,UAAU,MAAM,QAAQ,WAAW;AACzC,QAAI,cAAc,MAAM,YAAY,IAAI;AACtC,eAAS,QAAQ;AACjB;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,QAAQ,KAAK,SAAS;AAChD,UAAM,YAAY,MAAM,MAAM,cAAc,GAAG,OAAO;AACtD,UAAM,eAAe,cAAc,SAAS;AAC5C,UAAM,WAAW,gCAAgC,KAAK;AACtD,QAAI,YAAY;AAEhB,QAAI,aAAa,SAAS,eAAe,GAAG;AAC1C,kBAAY,aAAa,QAAQ,iBAAiB,gBAAgB,QAAQ,EAAE;AAAA,IAC9E,OAAO;AACL,YAAM,UAAU,aAAa,QAAQ,OAAO;AAC5C,kBACE,YAAY,KACR,GAAG,YAAY,GAAG,QAAQ,KAC1B,GAAG,aAAa,MAAM,GAAG,OAAO,CAAC,GAAG,QAAQ,GAAG,aAAa,MAAM,OAAO,CAAC;AAAA,IAClF;AAEA,UAAM,eACJ,MAAM,MAAM,GAAG,cAAc,CAAC,IAC9B,YACA,MAAM,MAAM,OAAO;AAErB,aAAS,OAAO,MAAM,GAAG,OAAO,IAAI,eAAe,OAAO,MAAM,QAAQ,UAAU,MAAM;AACxF,aAAS,UAAU,aAAa;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,SACoD;AArFtD;AAsFE,QAAM,QAAQ,QAAQ,MAAM,mCAAmC;AAC/D,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,OAAO,MAAM,CAAC;AACpB,QAAM,OAAO,MAAM,CAAC;AACpB,QAAM,SAAiC;AAAA,IACrC,cAAc;AAAA,IACd,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,aAAa;AAAA,EACf;AACA,SAAO,EAAE,MAAM,MAAM,MAAK,YAAO,IAAI,MAAX,YAAgB,MAAM;AAClD;AAEA,eAAsB,WACpB,UAC2C;AAxG7C;AAyGE,QAAM,OAAO,IAAI,UAAU;AAC3B,QAAM,gBAAgC,CAAC;AAEvC,QAAM,SAAQ,cAAS,UAAT,YAAkB;AAChC,QAAM,UAAS,cAAS,WAAT,YAAmB;AAClC,QAAM,eAAe,MAAM,QAAQ;AACnC,QAAM,aAAc,KAAK,MAAO,QAAQ;AACxC,QAAM,cAAc,KAAK;AAEzB,kBAAgB,MAAM,OAAO,MAAM;AAEnC,aAAW,CAAC,YAAY,SAAS,OAAM,cAAS,WAAT,YAAmB,CAAC,GAAG,QAAQ,GAAG;AACvE,UAAM,QAAQ,KAAK,SAAS;AAC5B,yBAAqB,OAAO,WAAW,SAAS,KAAK;AAErD,eAAW,CAAC,cAAc,OAAO,OAAM,eAAU,aAAV,YAAsB,CAAC,GAAG,QAAQ,GAAG;AAC1E,qBAAe,OAAO,SAAS,UAAU,YAAY,cAAc,WAAW;AAC9E,YAAM,gBAAgB,OAAO,SAAS,YAAY;AAClD;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,qBAAe,OAAO,SAAS,YAAY,YAAY;AACvD,sBAAgB,OAAO,SAAS,YAAY,YAAY;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,WAAW,GAAG,kBAAiB,cAAS,UAAT,YAAkB,cAAc,CAAC;AACtE,QAAM,aAAc,MAAM,KAAK,MAAM;AAAA,IACnC,YAAY;AAAA,IACZ,aAAa;AAAA,EACf,CAAC;AAED,QAAM,WAAW,oBAAoB,cAAc,SAAS;AAC5D,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,SAAS;AAAA,EAClD;AAEA,QAAM,MAAM,MAAM,MAAM,UAAU,UAAU;AAC5C,MAAI,cAAc,QAAQ;AACxB,UAAM,aAAa,OAAO,KAAK,IAAI,KAAK,EAAE,OAAO,CAAC,SAAS,KAAK,WAAW,YAAY,CAAC;AACxF,QAAI,gBAAgB;AACpB,eAAW,QAAQ,YAAY;AAC7B,YAAM,QAAQ,KAAK,MAAM,wBAAwB;AACjD,UAAI,OAAO;AACT,cAAM,QAAQ,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE;AAC1C,YAAI,OAAO,SAAS,KAAK,EAAG,iBAAgB,KAAK,IAAI,eAAe,KAAK;AAAA,MAC3E;AAAA,IACF;AAEA,UAAM,aAAa,oBAAI,IAAoB;AAC3C,UAAM,YAAY,oBAAI,IAAoB;AAE1C,eAAW,WAAW,eAAe;AACnC,YAAM,SAAS,kBAAkB,QAAQ,OAAO;AAChD,UAAI,CAAC,OAAQ;AAEb,uBAAiB;AACjB,YAAM,YAAY,QAAQ,aAAa,IAAI,OAAO,GAAG;AACrD,UAAI,KAAK,aAAa,SAAS,IAAI,OAAO,MAAM,EAAE,QAAQ,KAAK,CAAC;AAEhE,YAAM,cAAc,QAAQ,aAAa;AACzC,YAAM,YAAY,mBAAmB,WAAW;AAChD,YAAM,WAAW,yBAAyB,WAAW;AAErD,YAAM,WACJ,eAAU,IAAI,WAAW,MAAzB,YACC,IAAI,KAAK,QAAQ,IACd,MAAM,IAAI,KAAK,QAAQ,EAAG,MAAM,QAAQ,IACxC;AAEN,UAAI,WAAW;AACf,cAAQ,QAAQ,kBAAkB,CAAC,GAAG,OAAO;AAC3C,cAAM,QAAQ,OAAO,SAAS,IAAI,EAAE;AACpC,YAAI,OAAO,SAAS,KAAK,EAAG,YAAW,KAAK,IAAI,UAAU,KAAK;AAC/D,eAAO;AAAA,MACT,CAAC;AACD,YAAM,QAAQ,MAAM,WAAW,CAAC;AAChC,YAAM,WAAW,qBAAqB,KAAK,uGAAuG,SAAS;AAC3J,YAAM,cAAc,QAAQ;AAAA,QAC1B;AAAA,QACA,GAAG,QAAQ;AAAA,MACb;AACA,gBAAU,IAAI,aAAa,WAAW;AAEtC,YAAM,YACJ,gBAAW,IAAI,WAAW,MAA1B,YACC,IAAI,KAAK,SAAS,IAAI,MAAM,IAAI,KAAK,SAAS,EAAG,MAAM,QAAQ,IAAI;AACtE,YAAM,eAAe,WACjB,iBAAiB,UAAU,QAAQ,YAAY,KAAK,IACpD;AACJ,iBAAW,IAAI,aAAa,YAAY;AAAA,IAC1C;AAEA,eAAW,CAAC,aAAa,GAAG,KAAK,WAAW,QAAQ,GAAG;AACrD,UAAI,KAAK,mBAAmB,WAAW,QAAQ,GAAG;AAAA,IACpD;AACA,eAAW,CAAC,aAAa,GAAG,KAAK,UAAU,QAAQ,GAAG;AACpD,UAAI,KAAK,yBAAyB,WAAW,aAAa,GAAG;AAAA,IAC/D;AAAA,EACF;AAEA,MAAI,kBAAkB;AACpB,QAAI;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH;AAAA,UACE,SAAS;AAAA,UACT,MAAM;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,OAAO,MAAM,IAAI,cAAc,EAAE,MAAM,OAAO,CAAC;AACrD,SAAO,EAAE,MAAM,SAAS;AAC1B;AAGO,IAAM,gBAAgB;","names":["base64","newWord","item","parse","attr","_a","_b","dashTypeMap","_a"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/element.ts","../src/resolveImageData.ts","../src/renderers/shared.ts","../src/htmlParser/tags.ts","../src/htmlParser/lexer.ts","../src/htmlParser/parser.ts","../src/htmlParser/format.ts","../src/htmlParser/index.ts","../src/renderers/constants.ts","../src/renderers/background.ts","../src/renderers/layout.ts","../src/svgPathParser.ts","../src/renderers/points.ts","../src/renderers/utils.ts","../src/renderers/elements.ts"],"sourcesContent":["import PptxGenJS from \"pptxgenjs\";\nimport JSZip from \"jszip\";\nimport { parseDocument } from \"json2pptx-schema\";\n\nimport type { Deck } from \"./types/ppt\";\nimport { getElementRange, getLineElementPath } from \"./element\";\nimport { resolveImageData } from \"./resolveImageData\";\nimport { applySlideBackground } from \"./renderers/background\";\nimport { applyPptxLayout } from \"./renderers/layout\";\nimport {\n addImageElement,\n addLineElement,\n addShapeElement,\n addTableElement,\n addTextElement\n} from \"./renderers/elements\";\nimport { type PatternShape } from \"./renderers/types\";\nexport const ENABLE_DECK_JSON = true;\nexport const PPTX_JSON_PAYLOAD_PATH = \"json2ppt-editor.json\";\nexport const PPTX_JSON_PAYLOAD_VERSION = 1;\n\nfunction sanitizeFileName(name: string): string {\n return name.replace(/[\\\\/:*?\"<>|]/g, \"\").trim() || \"presentation\";\n}\n\nfunction stripFillTags(value: string): string {\n return value\n .replace(/<a:solidFill>[\\s\\S]*?<\\/a:solidFill>/g, \"\")\n .replace(/<a:gradFill>[\\s\\S]*?<\\/a:gradFill>/g, \"\")\n .replace(/<a:blipFill>[\\s\\S]*?<\\/a:blipFill>/g, \"\")\n .replace(/<a:noFill\\s*\\/>/g, \"\")\n .replace(/<a:noFill><\\/a:noFill>/g, \"\");\n}\n\nfunction applyPatternFill(slideXml: string, objectName: string, relId: string): string {\n const nameToken = `name=\"${objectName}\"`;\n let cursor = 0;\n let result = slideXml;\n\n while (true) {\n const nameIndex = result.indexOf(nameToken, cursor);\n if (nameIndex === -1) break;\n\n const spStart = result.lastIndexOf(\"<p:sp\", nameIndex);\n const spEnd = result.indexOf(\"</p:sp>\", nameIndex);\n if (spStart === -1 || spEnd === -1) break;\n\n const spXml = result.slice(spStart, spEnd + \"</p:sp>\".length);\n const spPrStart = spXml.indexOf(\"<p:spPr>\");\n const spPrEnd = spXml.indexOf(\"</p:spPr>\");\n if (spPrStart === -1 || spPrEnd === -1) {\n cursor = spEnd + 1;\n continue;\n }\n\n const spPrOpenEnd = spXml.indexOf(\">\", spPrStart);\n const spPrInner = spXml.slice(spPrOpenEnd + 1, spPrEnd);\n const cleanedInner = stripFillTags(spPrInner);\n const blipFill = `<a:blipFill><a:blip r:embed=\"${relId}\"/><a:srcRect/><a:stretch><a:fillRect/></a:stretch></a:blipFill>`;\n let nextInner = cleanedInner;\n\n if (cleanedInner.includes(\"</a:custGeom>\")) {\n nextInner = cleanedInner.replace(\"</a:custGeom>\", `</a:custGeom>${blipFill}`);\n } else {\n const lnIndex = cleanedInner.indexOf(\"<a:ln\");\n nextInner =\n lnIndex === -1\n ? `${cleanedInner}${blipFill}`\n : `${cleanedInner.slice(0, lnIndex)}${blipFill}${cleanedInner.slice(lnIndex)}`;\n }\n\n const updatedSpXml =\n spXml.slice(0, spPrOpenEnd + 1) +\n nextInner +\n spXml.slice(spPrEnd);\n\n result = result.slice(0, spStart) + updatedSpXml + result.slice(spEnd + \"</p:sp>\".length);\n cursor = spStart + updatedSpXml.length;\n }\n\n return result;\n}\n\nfunction parseDataUrlImage(\n dataUrl: string\n): { mime: string; data: string; ext: string } | null {\n const match = dataUrl.match(/^data:(image\\/[^;]+);base64,(.+)$/);\n if (!match) return null;\n const mime = match[1];\n const data = match[2];\n const extMap: Record<string, string> = {\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpg\",\n \"image/png\": \"png\",\n \"image/gif\": \"gif\",\n \"image/svg+xml\": \"svg\",\n \"image/webp\": \"webp\",\n \"image/bmp\": \"bmp\"\n };\n return { mime, data, ext: extMap[mime] ?? \"png\" };\n}\n\nexport async function createPPTX(\n template: Deck\n): Promise<{ blob: Blob; fileName: string }> {\n const parsedTemplate = parseDocument(template);\n const renderTemplate = parsedTemplate as unknown as Deck;\n\n const pptx = new PptxGenJS();\n const patternShapes: PatternShape[] = [];\n\n const width = parsedTemplate.width;\n const height = parsedTemplate.height;\n const ratioPx2Inch = 96 * (width / 960);\n const ratioPx2Pt = (96 / 72) * (width / 960);\n const textPadding = 10 / ratioPx2Pt;\n\n applyPptxLayout(pptx, width, height);\n\n for (const [slideIndex, slideJson] of (renderTemplate.slides ?? []).entries()) {\n const slide = pptx.addSlide();\n applySlideBackground(slide, slideJson, renderTemplate.theme);\n\n for (const [elementIndex, element] of (slideJson.elements ?? []).entries()) {\n addTextElement(slide, element, renderTemplate, ratioPx2Pt, ratioPx2Inch, textPadding);\n await addImageElement(slide, element, ratioPx2Inch);\n addShapeElement(\n slide,\n element,\n ratioPx2Pt,\n ratioPx2Inch,\n slideIndex,\n elementIndex,\n patternShapes\n );\n addLineElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n addTableElement(slide, element, ratioPx2Pt, ratioPx2Inch);\n }\n }\n\n const fileName = `${sanitizeFileName(parsedTemplate.title || \"presentation\")}.pptx`;\n const pptxBuffer = (await pptx.write({\n outputType: \"arraybuffer\",\n compression: true\n })) as ArrayBuffer;\n\n const needsZip = ENABLE_DECK_JSON || patternShapes.length > 0;\n if (!needsZip) {\n return { blob: new Blob([pptxBuffer]), fileName };\n }\n\n const zip = await JSZip.loadAsync(pptxBuffer);\n if (patternShapes.length) {\n const mediaFiles = Object.keys(zip.files).filter((name) => name.startsWith(\"ppt/media/\"));\n let maxImageIndex = 0;\n for (const name of mediaFiles) {\n const match = name.match(/ppt\\/media\\/image(\\d+)/);\n if (match) {\n const index = Number.parseInt(match[1], 10);\n if (Number.isFinite(index)) maxImageIndex = Math.max(maxImageIndex, index);\n }\n }\n\n const slideCache = new Map<number, string>();\n const relsCache = new Map<number, string>();\n\n for (const pattern of patternShapes) {\n const parsed = parseDataUrlImage(pattern.dataUrl);\n if (!parsed) continue;\n\n maxImageIndex += 1;\n const imageName = `image${maxImageIndex}.${parsed.ext}`;\n zip.file(`ppt/media/${imageName}`, parsed.data, { base64: true });\n\n const slideNumber = pattern.slideIndex + 1;\n const slidePath = `ppt/slides/slide${slideNumber}.xml`;\n const relsPath = `ppt/slides/_rels/slide${slideNumber}.xml.rels`;\n\n const relsXml =\n relsCache.get(slideNumber) ??\n (zip.file(relsPath)\n ? await zip.file(relsPath)!.async(\"string\")\n : `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"></Relationships>`);\n\n let maxRelId = 0;\n relsXml.replace(/Id=\"rId(\\d+)\"/g, (_, id) => {\n const value = Number.parseInt(id, 10);\n if (Number.isFinite(value)) maxRelId = Math.max(maxRelId, value);\n return \"\";\n });\n const relId = `rId${maxRelId + 1}`;\n const relEntry = `<Relationship Id=\"${relId}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/${imageName}\"/>`;\n const nextRelsXml = relsXml.replace(\n \"</Relationships>\",\n `${relEntry}</Relationships>`\n );\n relsCache.set(slideNumber, nextRelsXml);\n\n const slideXml =\n slideCache.get(slideNumber) ??\n (zip.file(slidePath) ? await zip.file(slidePath)!.async(\"string\") : \"\");\n const nextSlideXml = slideXml\n ? applyPatternFill(slideXml, pattern.objectName, relId)\n : slideXml;\n slideCache.set(slideNumber, nextSlideXml);\n }\n\n for (const [slideNumber, xml] of slideCache.entries()) {\n zip.file(`ppt/slides/slide${slideNumber}.xml`, xml);\n }\n for (const [slideNumber, xml] of relsCache.entries()) {\n zip.file(`ppt/slides/_rels/slide${slideNumber}.xml.rels`, xml);\n }\n }\n\n if (ENABLE_DECK_JSON) {\n zip.file(\n PPTX_JSON_PAYLOAD_PATH,\n JSON.stringify(\n {\n version: PPTX_JSON_PAYLOAD_VERSION,\n deck: parsedTemplate\n },\n null,\n 2\n )\n );\n }\n const blob = await zip.generateAsync({ type: \"blob\" });\n return { blob, fileName };\n}\n\n// Backwards compatibility alias\nexport const buildPptxBlob = createPPTX;\n\nexport { getElementRange, getLineElementPath };\nexport { resolveImageData };\nexport type {\n BaseElement,\n Deck,\n DeckTheme,\n ElementClip,\n ElementFilters,\n ElementOutline,\n ElementShadow,\n ImageElement,\n LineElement,\n ShapeElement,\n Slide,\n SlideBackground,\n SlideElement,\n TextContent,\n TextElement\n} from \"./types/ppt\";\n","import type { LineElement, SlideElement } from './types/ppt'\n\nexport const getElementRange = (element: SlideElement) => {\n let minX = 0\n let maxX = 0\n let minY = 0\n let maxY = 0\n\n if (element.type === 'line' && element.start && element.end) {\n minX = element.left ?? 0\n maxX = (element.left ?? 0) + Math.max(element.start[0], element.end[0])\n minY = element.top ?? 0\n maxY = (element.top ?? 0) + Math.max(element.start[1], element.end[1])\n } else if (element.left !== undefined && element.top !== undefined) {\n minX = element.left\n minY = element.top\n maxX = element.left + (element.width ?? 0)\n maxY = element.top + (element.height ?? 0)\n }\n\n return { minX, maxX, minY, maxY }\n}\n\nconst isLineElement = (element: SlideElement): element is LineElement =>\n element.type === 'line'\n\nexport const getLineElementPath = (element: SlideElement) => {\n if (!isLineElement(element) || !element.start || !element.end) return ''\n const start = element.start.join(',')\n const end = element.end.join(',')\n const broken = element.broken as [number, number] | undefined\n const broken2 = element.broken2 as [number, number] | undefined\n const curve = element.curve as [number, number] | undefined\n const cubic = element.cubic as [[number, number], [number, number]] | undefined\n\n if (broken) {\n const mid = broken.join(',')\n return `M${start} L${mid} L${end}`\n }\n if (broken2) {\n const { minX, maxX, minY, maxY } = getElementRange(element)\n if (maxX - minX >= maxY - minY) {\n return `M${start} L${broken2[0]},${element.start[1]} L${broken2[0]},${element.end[1]} ${end}`\n }\n return `M${start} L${element.start[0]},${broken2[1]} L${element.end[0]},${broken2[1]} ${end}`\n }\n if (curve) {\n const mid = curve.join(',')\n return `M${start} Q${mid} ${end}`\n }\n if (cubic) {\n const [c1, c2] = cubic\n const p1 = c1.join(',')\n const p2 = c2.join(',')\n return `M${start} C${p1} ${p2} ${end}`\n }\n return `M${start} L${end}`\n}\n","const dataUrlRegex = /^data:image\\/[^;]+;base64,/\n\nconst mimeFromPath = (path: string) => {\n const lower = path.toLowerCase()\n if (lower.endsWith('.png')) return 'image/png'\n if (lower.endsWith('.jpg') || lower.endsWith('.jpeg')) return 'image/jpeg'\n if (lower.endsWith('.gif')) return 'image/gif'\n if (lower.endsWith('.svg')) return 'image/svg+xml'\n if (lower.endsWith('.webp')) return 'image/webp'\n if (lower.endsWith('.bmp')) return 'image/bmp'\n return 'application/octet-stream'\n}\n\nconst toBase64 = (buffer: ArrayBuffer) => {\n if (typeof Buffer !== 'undefined') {\n return Buffer.from(buffer).toString('base64')\n }\n\n let binary = ''\n const bytes = new Uint8Array(buffer)\n const len = bytes.byteLength\n for (let i = 0; i < len; i += 1) {\n binary += String.fromCharCode(bytes[i])\n }\n return btoa(binary)\n}\n\nconst readLocalFile = async (path: string) => {\n const fs = await import('node:fs/promises')\n const buffer = await fs.readFile(path)\n return buffer.toString('base64')\n}\n\nexport const resolveImageData = async (src: string) => {\n if (dataUrlRegex.test(src)) return src\n\n const isFileUrl = src.startsWith('file://')\n const isLocalPath = !src.startsWith('http') && !src.startsWith('data:')\n const isNode = typeof process !== 'undefined' && Boolean(process.versions?.node)\n\n if ((isFileUrl || isLocalPath) && isNode) {\n const filePath = isFileUrl ? src.replace('file://', '') : src\n const base64 = await readLocalFile(filePath)\n const mime = mimeFromPath(filePath)\n return `data:${mime};base64,${base64}`\n }\n\n if (typeof fetch !== 'function') {\n throw new Error('fetch is not available to resolve image data')\n }\n\n const response = await fetch(src)\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.status} ${response.statusText}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n const base64 = toBase64(arrayBuffer)\n const contentType = response.headers.get('content-type') || mimeFromPath(src)\n return `data:${contentType};base64,${base64}`\n}\n","import tinycolor from \"tinycolor2\";\nimport type PptxGenJS from \"pptxgenjs\";\n\nimport type { SlideElement } from \"../types/ppt\";\nimport { toAST, type AST } from \"../htmlParser\";\nimport { DEFAULT_FONT_SIZE } from \"./constants\";\n\ntype TextSlice = {\n text: string;\n options?: PptxGenJS.TextPropsOptions;\n};\n\nconst dashTypeMap: Record<string, \"solid\" | \"dash\" | \"sysDot\"> = {\n solid: \"solid\",\n dashed: \"dash\",\n dotted: \"sysDot\"\n};\n\nexport function formatColor(input: string): { alpha: number; color: string } {\n if (!input) {\n return {\n alpha: 0,\n color: \"#000000\"\n };\n }\n\n const color = tinycolor(input);\n const alpha = color.getAlpha();\n const hex = alpha === 0 ? \"#ffffff\" : color.setAlpha(1).toHexString();\n return { alpha, color: hex };\n}\n\nexport function formatHTML(html: string, ratioPx2Pt: number): TextSlice[] {\n const ast = toAST(html);\n let bulletFlag = false;\n let indent = 0;\n\n const slices: TextSlice[] = [];\n const parse = (obj: AST[], baseStyleObj: Record<string, string> = {}) => {\n for (const item of obj) {\n const isBlockTag = \"tagName\" in item && [\"div\", \"li\", \"p\"].includes(item.tagName);\n\n if (isBlockTag && slices.length) {\n const lastSlice = slices[slices.length - 1];\n if (!lastSlice.options) lastSlice.options = {};\n lastSlice.options.breakLine = true;\n }\n\n const styleObj = { ...baseStyleObj };\n const styleAttr =\n \"attributes\" in item\n ? item.attributes.find((attr) => attr.key === \"style\")\n : null;\n if (styleAttr && styleAttr.value) {\n const styleArr = styleAttr.value.split(\";\");\n for (const styleItem of styleArr) {\n const match = styleItem.match(/([^:]+):\\s*(.+)/);\n if (match) {\n const [key, value] = [match[1].trim(), match[2].trim()];\n if (key && value) styleObj[key] = value;\n }\n }\n }\n\n if (\"tagName\" in item) {\n if (item.tagName === \"em\") {\n styleObj[\"font-style\"] = \"italic\";\n }\n if (item.tagName === \"strong\") {\n styleObj[\"font-weight\"] = \"bold\";\n }\n if (item.tagName === \"sup\") {\n styleObj[\"vertical-align\"] = \"super\";\n }\n if (item.tagName === \"sub\") {\n styleObj[\"vertical-align\"] = \"sub\";\n }\n if (item.tagName === \"a\") {\n const attr = item.attributes.find((attr) => attr.key === \"href\");\n styleObj.href = attr?.value || \"\";\n }\n if (item.tagName === \"ul\") {\n styleObj[\"list-type\"] = \"ul\";\n }\n if (item.tagName === \"ol\") {\n styleObj[\"list-type\"] = \"ol\";\n }\n if (item.tagName === \"li\") {\n bulletFlag = true;\n }\n if (item.tagName === \"p\") {\n if (\"attributes\" in item) {\n const dataIndentAttr = item.attributes.find((attr) => attr.key === \"data-indent\");\n if (dataIndentAttr && dataIndentAttr.value) indent = +dataIndentAttr.value;\n }\n }\n }\n\n if (\"tagName\" in item && item.tagName === \"br\") {\n slices.push({ text: \"\", options: { breakLine: true } });\n } else if (\"content\" in item) {\n const text = item.content\n .replace(/ /g, \" \")\n .replace(/>/g, \">\")\n .replace(/</g, \"<\")\n .replace(/&/g, \"&\")\n .replace(/\\n/g, \"\");\n const options: PptxGenJS.TextPropsOptions = {};\n\n if (styleObj[\"font-size\"]) {\n options.fontSize = parseInt(styleObj[\"font-size\"], 10) / ratioPx2Pt;\n }\n if (styleObj.color) {\n options.color = formatColor(styleObj.color).color;\n }\n if (styleObj[\"background-color\"]) {\n options.highlight = formatColor(styleObj[\"background-color\"]).color;\n }\n if (styleObj[\"text-decoration-line\"]) {\n if (styleObj[\"text-decoration-line\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration-line\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"text-decoration\"]) {\n if (styleObj[\"text-decoration\"].indexOf(\"underline\") !== -1) {\n options.underline = {\n color: options.color || \"#000000\",\n style: \"sng\"\n };\n }\n if (styleObj[\"text-decoration\"].indexOf(\"line-through\") !== -1) {\n options.strike = \"sngStrike\";\n }\n }\n if (styleObj[\"vertical-align\"]) {\n if (styleObj[\"vertical-align\"] === \"super\") options.superscript = true;\n if (styleObj[\"vertical-align\"] === \"sub\") options.subscript = true;\n }\n if (styleObj[\"text-align\"]) options.align = styleObj[\"text-align\"] as PptxGenJS.HAlign;\n if (styleObj[\"font-weight\"]) options.bold = styleObj[\"font-weight\"] === \"bold\";\n if (styleObj[\"font-style\"]) options.italic = styleObj[\"font-style\"] === \"italic\";\n if (styleObj[\"font-family\"]) options.fontFace = styleObj[\"font-family\"];\n if (styleObj.href) options.hyperlink = { url: styleObj.href };\n\n if (bulletFlag && styleObj[\"list-type\"] === \"ol\") {\n options.bullet = {\n type: \"number\",\n indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25\n };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (bulletFlag && styleObj[\"list-type\"] === \"ul\") {\n options.bullet = { indent: (options.fontSize || DEFAULT_FONT_SIZE) * 1.25 };\n options.paraSpaceBefore = 0.1;\n bulletFlag = false;\n }\n if (indent) {\n options.indentLevel = indent;\n indent = 0;\n }\n\n slices.push({ text, options });\n } else if (\"children\" in item) parse(item.children, styleObj);\n }\n };\n parse(ast);\n return slices;\n}\n\nfunction normalizeFontName(value?: string): string | undefined {\n return value ? value.replace(/^\"+|\"+$/g, \"\") : undefined;\n}\n\nfunction clampOpacity(value?: number): number {\n if (value === undefined) return 1;\n if (!Number.isFinite(value)) return 1;\n return Math.min(1, Math.max(0, value));\n}\n\nfunction getOpacityRatio(value?: string): number | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n if (normalized.endsWith(\"%\")) {\n const percent = Number.parseFloat(normalized);\n return Number.isFinite(percent) ? Math.min(1, Math.max(0, percent / 100)) : undefined;\n }\n const numeric = Number.parseFloat(normalized);\n if (!Number.isFinite(numeric)) return undefined;\n return numeric > 1 ? Math.min(1, Math.max(0, numeric / 100)) : Math.min(1, Math.max(0, numeric));\n}\n\nfunction parseFontSize(value?: string): number | undefined {\n if (!value) return undefined;\n const size = Number.parseFloat(value);\n return Number.isFinite(size) ? size : undefined;\n}\n\nfunction parseTableColor(\n value?: string\n): { color: string; transparency: number } | undefined {\n if (!value) return undefined;\n const normalized = value.trim();\n if (!normalized) return undefined;\n const c = formatColor(normalized);\n return {\n color: c.color.replace(\"#\", \"\"),\n transparency: (1 - c.alpha) * 100\n };\n}\n\nfunction isPlaceholderCell(cell?: {\n colspan?: number;\n rowspan?: number;\n text?: string;\n style?: Record<string, string | undefined>;\n}): boolean {\n if (!cell) return false;\n const colspan = cell.colspan ?? 1;\n const rowspan = cell.rowspan ?? 1;\n if (colspan !== 1 || rowspan !== 1) return false;\n const text = cell.text ?? \"\";\n const style = cell.style;\n const hasStyle =\n Boolean(style?.fontname) ||\n Boolean(style?.fontsize) ||\n Boolean(style?.color) ||\n Boolean(style?.backcolor);\n return text.trim() === \"\" && !hasStyle;\n}\n\nexport function buildTableRows(\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): PptxGenJS.TableRow[] {\n const data = (element as any).data as\n | Array<Array<{ id?: string; colspan?: number; rowspan?: number; text?: string; style?: any }>>\n | undefined;\n if (!data || !data.length) return [];\n\n const colCount =\n ((element as any).colWidths as number[] | undefined)?.length ??\n Math.max(...data.map((row) => row.length));\n\n const rows: PptxGenJS.TableRow[] = [];\n const skip = new Array(colCount).fill(0);\n\n data.forEach((row) => {\n const cells: PptxGenJS.TableCell[] = [];\n let colIndex = 0;\n let cellIndex = 0;\n\n while (colIndex < colCount) {\n if (skip[colIndex] > 0) {\n skip[colIndex] -= 1;\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n colIndex += 1;\n continue;\n }\n\n const cell = row[cellIndex];\n if (!cell) break;\n cellIndex += 1;\n\n const colSpan = cell.colspan ?? 1;\n const rowSpan = cell.rowspan ?? 1;\n\n if (rowSpan > 1) {\n for (let i = 0; i < colSpan; i += 1) {\n skip[colIndex + i] = rowSpan - 1;\n }\n }\n\n if (colSpan > 1) {\n for (let i = 0; i < colSpan - 1; i += 1) {\n if (isPlaceholderCell(row[cellIndex])) {\n cellIndex += 1;\n }\n }\n }\n\n const style = cell.style ?? {};\n const fontSize = parseFontSize(style.fontsize);\n const fill = parseTableColor(style.backcolor);\n const color = parseTableColor(style.color);\n const cellMargin = [\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch,\n 6 / ratioPx2Inch,\n 8 / ratioPx2Inch\n ] as [number, number, number, number];\n\n const options: PptxGenJS.TableCellProps = {\n colspan: colSpan > 1 ? colSpan : undefined,\n rowspan: rowSpan > 1 ? rowSpan : undefined,\n align: style.align as PptxGenJS.HAlign,\n valign: \"middle\",\n fontFace: normalizeFontName(style.fontname),\n fontSize: fontSize ? fontSize / ratioPx2Pt : undefined,\n color: color?.color,\n fill: fill ? { color: fill.color, transparency: fill.transparency } : undefined,\n margin: cellMargin\n };\n\n cells.push({\n text: cell.text ?? \"\",\n options\n });\n\n colIndex += colSpan;\n }\n\n rows.push(cells);\n });\n\n return rows;\n}\n\nexport function getShadowOption(\n shadow: NonNullable<SlideElement[\"shadow\"]>,\n ratioPx2Pt: number\n): PptxGenJS.ShadowProps {\n const c = formatColor(shadow.color ?? \"#000000\");\n const { h = 0, v = 0 } = shadow;\n\n let offset = 4;\n let angle = 45;\n\n if (h === 0 && v === 0) {\n offset = 4;\n angle = 45;\n } else if (h === 0) {\n if (v > 0) {\n offset = v;\n angle = 90;\n } else {\n offset = -v;\n angle = 270;\n }\n } else if (v === 0) {\n if (h > 0) {\n offset = h;\n angle = 1;\n } else {\n offset = -h;\n angle = 180;\n }\n } else if (h > 0 && v > 0) {\n offset = Math.max(h, v);\n angle = 45;\n } else if (h > 0 && v < 0) {\n offset = Math.max(h, -v);\n angle = 315;\n } else if (h < 0 && v > 0) {\n offset = Math.max(-h, v);\n angle = 135;\n } else if (h < 0 && v < 0) {\n offset = Math.max(-h, -v);\n angle = 225;\n }\n\n return {\n color: c.color,\n transparency: (1 - c.alpha) * 100,\n blur: (shadow.blur ?? 0) / ratioPx2Pt,\n offset,\n angle\n };\n}\n\nexport function getOutlineOption(\n outline: NonNullable<SlideElement[\"outline\"]>,\n ratioPx2Pt: number,\n opacity = 1\n): PptxGenJS.ShapeLineProps {\n const c = formatColor(outline.color || \"#000000\");\n const alpha = c.alpha * clampOpacity(opacity);\n return {\n color: c.color,\n transparency: (1 - alpha) * 100,\n width: (outline.width || 1) / ratioPx2Pt,\n dashType: outline.style ? dashTypeMap[outline.style] : \"solid\"\n };\n}\n\nexport function getElementOpacity(value?: number): number {\n return clampOpacity(value);\n}\n\nexport function getFilterOpacity(value?: string): number | undefined {\n return getOpacityRatio(value);\n}\n\nexport function getDashTypeMap(): Record<string, \"solid\" | \"dash\" | \"sysDot\"> {\n return dashTypeMap;\n}\n","export const childlessTags = ['style', 'script', 'template']\n\nexport const closingTags = [\n 'html',\n 'head',\n 'body',\n 'p',\n 'dt',\n 'dd',\n 'li',\n 'option',\n 'thead',\n 'th',\n 'tbody',\n 'tr',\n 'td',\n 'tfoot',\n 'colgroup'\n]\n\nexport const closingTagAncestorBreakers: Record<string, string[]> = {\n li: ['ul', 'ol', 'menu'],\n dt: ['dl'],\n dd: ['dl'],\n tbody: ['table'],\n thead: ['table'],\n tfoot: ['table'],\n tr: ['table'],\n td: ['table']\n}\n\nexport const voidTags = [\n '!doctype',\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr'\n]\n","import type { Token } from './types'\nimport { childlessTags } from './tags'\n\ninterface State {\n str: string\n position: number\n tokens: Token[]\n}\n\nconst jumpPosition = (state: State, end: number) => {\n const len = end - state.position\n movePosition(state, len)\n}\n\nconst movePosition = (state: State, len: number) => {\n state.position = state.position + len\n}\n\nconst findTextEnd = (str: string, index: number) => {\n const isEnd = false\n while (!isEnd) {\n const textEnd = str.indexOf('<', index)\n if (textEnd === -1) {\n return textEnd\n }\n const char = str.charAt(textEnd + 1)\n if (char === '/' || char === '!' || /[A-Za-z0-9]/.test(char)) {\n return textEnd\n }\n index = textEnd + 1\n }\n return -1\n}\n\nconst lexText = (state: State) => {\n const { str } = state\n let textEnd = findTextEnd(str, state.position)\n if (textEnd === state.position) return\n if (textEnd === -1) {\n textEnd = str.length\n }\n\n const content = str.slice(state.position, textEnd)\n jumpPosition(state, textEnd)\n\n state.tokens.push({\n type: 'text',\n content\n })\n}\n\nconst lexComment = (state: State) => {\n const { str } = state\n\n movePosition(state, 4)\n let contentEnd = str.indexOf('-->', state.position)\n let commentEnd = contentEnd + 3\n if (contentEnd === -1) {\n contentEnd = commentEnd = str.length\n }\n\n const content = str.slice(state.position, contentEnd)\n jumpPosition(state, commentEnd)\n\n state.tokens.push({\n type: 'comment',\n content\n })\n}\n\nconst lexTagName = (state: State) => {\n const { str } = state\n const len = str.length\n let start = state.position\n\n while (start < len) {\n const char = str.charAt(start)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (isTagChar) break\n start++\n }\n\n let end = start + 1\n while (end < len) {\n const char = str.charAt(end)\n const isTagChar = !(/\\s/.test(char) || char === '/' || char === '>')\n if (!isTagChar) break\n end++\n }\n\n jumpPosition(state, end)\n const tagName = str.slice(start, end)\n state.tokens.push({\n type: 'tag',\n content: tagName\n })\n return tagName\n}\n\nconst lexTagAttributes = (state: State) => {\n const { str, tokens } = state\n let cursor = state.position\n let quote: string | null = null\n let wordBegin = cursor\n const words: string[] = []\n const len = str.length\n while (cursor < len) {\n const char = str.charAt(cursor)\n if (quote) {\n const isQuoteEnd = char === quote\n if (isQuoteEnd) quote = null\n cursor++\n continue\n }\n\n const isTagEnd = char === '/' || char === '>'\n if (isTagEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n break\n }\n\n const isWordEnd = /\\s/.test(char)\n if (isWordEnd) {\n if (cursor !== wordBegin) words.push(str.slice(wordBegin, cursor))\n wordBegin = cursor + 1\n cursor++\n continue\n }\n\n const isQuoteStart = char === '\\'' || char === '\"'\n if (isQuoteStart) {\n quote = char\n cursor++\n continue\n }\n\n cursor++\n }\n jumpPosition(state, cursor)\n\n const type = 'attribute'\n for (let i = 0; i < words.length; i++) {\n const word = words[i]\n\n const isNotPair = word.indexOf('=') === -1\n if (isNotPair) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.startsWith('=')) {\n if (secondWord.length > 1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n const thirdWord = words[i + 2]\n i += 1\n if (thirdWord) {\n const newWord = word + '=' + thirdWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n }\n }\n if (word.endsWith('=')) {\n const secondWord = words[i + 1]\n if (secondWord && secondWord.indexOf('=') === -1) {\n const newWord = word + secondWord\n tokens.push({ type, content: newWord })\n i += 1\n continue\n }\n\n const newWord = word.slice(0, -1)\n tokens.push({ type, content: newWord })\n continue\n }\n\n tokens.push({ type, content: word })\n }\n}\n\nconst lexSkipTag = (tagName: string, state: State) => {\n const { str, tokens } = state\n const safeTagName = tagName.toLowerCase()\n const len = str.length\n let index = state.position\n\n while (index < len) {\n const nextTag = str.indexOf('</', index)\n if (nextTag === -1) {\n lexText(state)\n break\n }\n\n const tagState = {\n str,\n position: state.position,\n tokens: []\n }\n jumpPosition(tagState, nextTag)\n const name = lexTag(tagState)\n if (safeTagName !== name.toLowerCase()) {\n index = tagState.position\n continue\n }\n\n if (nextTag !== state.position) {\n const textStart = state.position\n jumpPosition(state, nextTag)\n tokens.push({\n type: 'text',\n content: str.slice(textStart, nextTag)\n })\n }\n\n tokens.push(...tagState.tokens)\n jumpPosition(state, tagState.position)\n break\n }\n}\n\nconst lexTag = (state: State) => {\n const { str } = state\n const secondChar = str.charAt(state.position + 1)\n const tagStartClose = secondChar === '/'\n movePosition(state, tagStartClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-start',\n close: tagStartClose\n })\n\n const tagName = lexTagName(state)\n lexTagAttributes(state)\n\n const firstChar = str.charAt(state.position)\n const tagEndClose = firstChar === '/'\n movePosition(state, tagEndClose ? 2 : 1)\n state.tokens.push({\n type: 'tag-end',\n close: tagEndClose\n })\n return tagName\n}\n\nconst lex = (state: State) => {\n const str = state.str\n const len = str.length\n\n while (state.position < len) {\n const start = state.position\n lexText(state)\n\n if (state.position === start) {\n const isComment = str.startsWith('!--', start + 1)\n if (isComment) lexComment(state)\n else {\n const tagName = lexTag(state)\n const safeTag = tagName.toLowerCase()\n if (childlessTags.includes(safeTag)) lexSkipTag(tagName, state)\n }\n }\n }\n}\n\nexport const lexer = (str: string): Token[] => {\n const state = {\n str,\n position: 0,\n tokens: []\n }\n lex(state)\n return state.tokens\n}\n","import type {\n Token,\n HTMLNode,\n TagToken,\n NormalElement,\n TagEndToken,\n AttributeToken,\n TextToken\n} from './types'\nimport { closingTags, closingTagAncestorBreakers, voidTags } from './tags'\n\ninterface StackItem {\n tagName: string | null\n children: HTMLNode[]\n}\n\ninterface State {\n stack: StackItem[]\n cursor: number\n tokens: Token[]\n}\n\nexport const parser = (tokens: Token[]) => {\n const root: StackItem = { tagName: null, children: [] }\n const state: State = { tokens, cursor: 0, stack: [root] }\n parse(state)\n return root.children\n}\n\nexport const hasTerminalParent = (tagName: string, stack: StackItem[]) => {\n const tagParents = closingTagAncestorBreakers[tagName]\n if (tagParents) {\n let currentIndex = stack.length - 1\n while (currentIndex >= 0) {\n const parentTagName = stack[currentIndex].tagName\n if (parentTagName === tagName) break\n if (parentTagName && tagParents.includes(parentTagName)) return true\n currentIndex--\n }\n }\n return false\n}\n\nexport const rewindStack = (stack: StackItem[], newLength: number) => {\n stack.splice(newLength)\n}\n\nexport const parse = (state: State) => {\n const { stack, tokens } = state\n let { cursor } = state\n let nodes = stack[stack.length - 1].children\n const len = tokens.length\n\n while (cursor < len) {\n const token = tokens[cursor]\n if (token.type !== 'tag-start') {\n nodes.push(token as TextToken)\n cursor++\n continue\n }\n\n const tagToken = tokens[++cursor] as TagToken\n cursor++\n const tagName = tagToken.content.toLowerCase()\n if (token.close) {\n let index = stack.length\n let shouldRewind = false\n while (--index > -1) {\n if (stack[index].tagName === tagName) {\n shouldRewind = true\n break\n }\n }\n while (cursor < len) {\n if (tokens[cursor].type !== 'tag-end') break\n cursor++\n }\n if (shouldRewind) {\n rewindStack(stack, index)\n break\n } else continue\n }\n\n const isClosingTag = closingTags.includes(tagName)\n let shouldRewindToAutoClose = isClosingTag\n if (shouldRewindToAutoClose) {\n shouldRewindToAutoClose = !hasTerminalParent(tagName, stack)\n }\n\n if (shouldRewindToAutoClose) {\n let currentIndex = stack.length - 1\n while (currentIndex > 0) {\n if (tagName === stack[currentIndex].tagName) {\n rewindStack(stack, currentIndex)\n const previousIndex = currentIndex - 1\n nodes = stack[previousIndex].children\n break\n }\n currentIndex = currentIndex - 1\n }\n }\n\n const attributes = []\n let tagEndToken: TagEndToken | undefined\n while (cursor < len) {\n const _token = tokens[cursor]\n if (_token.type === 'tag-end') {\n tagEndToken = _token as TagEndToken\n break\n }\n attributes.push((_token as AttributeToken).content)\n cursor++\n }\n\n if (!tagEndToken) break\n\n cursor++\n const children: HTMLNode[] = []\n const elementNode: NormalElement = {\n type: 'element',\n tagName: tagToken.content,\n attributes,\n children\n }\n nodes.push(elementNode)\n\n const hasChildren = !(tagEndToken.close || voidTags.includes(tagName))\n if (hasChildren) {\n stack.push({ tagName, children })\n const innerState = { tokens, cursor, stack }\n parse(innerState)\n cursor = innerState.cursor\n }\n }\n state.cursor = cursor\n}\n","import type { HTMLNode, CommentOrTextAST, ElementAST, AST } from './types'\n\nexport const splitHead = (str: string, sep: string) => {\n const idx = str.indexOf(sep)\n if (idx === -1) return [str]\n return [str.slice(0, idx), str.slice(idx + sep.length)]\n}\n\nconst unquote = (str: string) => {\n const car = str.charAt(0)\n const end = str.length - 1\n const isQuoteStart = car === '\"' || car === \"'\"\n if (isQuoteStart && car === str.charAt(end)) {\n return str.slice(1, end)\n }\n return str\n}\n\nconst formatAttributes = (attributes: string[]) => {\n return attributes.map(attribute => {\n const parts = splitHead(attribute.trim(), '=')\n const key = parts[0]\n const value = typeof parts[1] === 'string' ? unquote(parts[1]) : null\n return { key, value }\n })\n}\n\nexport const format = (nodes: HTMLNode[]): AST[] => {\n return nodes.map(node => {\n if (node.type === 'element') {\n const children = format(node.children)\n const item: ElementAST = {\n type: 'element',\n tagName: node.tagName.toLowerCase(),\n attributes: formatAttributes(node.attributes),\n children\n }\n return item\n }\n\n const item: CommentOrTextAST = {\n type: node.type,\n content: node.content\n }\n return item\n })\n}\n","import { lexer } from './lexer'\nimport { parser } from './parser'\nimport { format } from './format'\nexport type { AST } from './types'\n\nexport const toAST = (str: string) => {\n const tokens = lexer(str)\n const nodes = parser(tokens)\n return format(nodes)\n}\n","export const DEFAULT_WIDTH = 1000;\nexport const DEFAULT_HEIGHT = 562.5;\nexport const DEFAULT_FONT_SIZE = 16;\nexport const DEFAULT_FONT_FACE = \"微软雅黑\";\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck } from \"../types/ppt\";\nimport { formatColor } from \"./shared\";\n\nexport function applySlideBackground(\n slide: PptxGenJS.Slide,\n slideJson: Deck[\"slides\"][number],\n theme: Deck[\"theme\"]\n): void {\n const backgroundColor = slideJson.background?.color ?? theme?.backgroundColor;\n if (!backgroundColor) return;\n const c = formatColor(backgroundColor);\n slide.background = { color: c.color, transparency: (1 - c.alpha) * 100 };\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function applyPptxLayout(pptx: PptxGenJS, width: number, height: number): void {\n const viewportRatio = height / width;\n if (Math.abs(viewportRatio - 0.625) < 0.001) {\n pptx.layout = \"LAYOUT_16x10\";\n return;\n }\n if (Math.abs(viewportRatio - 0.75) < 0.001) {\n pptx.layout = \"LAYOUT_4x3\";\n return;\n }\n if (Math.abs(viewportRatio - 0.70710678) < 0.0001) {\n pptx.defineLayout({ name: \"A3\", width: 10, height: 7.0710678 });\n pptx.layout = \"A3\";\n return;\n }\n if (Math.abs(viewportRatio - 1.41421356) < 0.0001) {\n pptx.defineLayout({ name: \"A3_V\", width: 10, height: 14.1421356 });\n pptx.layout = \"A3_V\";\n return;\n }\n pptx.layout = \"LAYOUT_16x9\";\n}\n","import { SVGPathData } from 'svg-pathdata'\nimport arcToBezier from 'svg-arc-to-cubic-bezier'\n\nconst typeMap: Record<number, string> = {\n 1: 'Z',\n 2: 'M',\n 4: 'H',\n 8: 'V',\n 16: 'L',\n 32: 'C',\n 64: 'S',\n 128: 'Q',\n 256: 'T',\n 512: 'A'\n}\n\nexport const toPoints = (d: string) => {\n if (!d) return []\n if (d.includes('NaN') || d.includes('undefined') || d.includes('null')) return []\n\n let pathData: any\n try {\n pathData = new SVGPathData(d)\n } catch {\n return []\n }\n\n const points: any[] = []\n for (const item of pathData.commands) {\n const type = typeMap[item.type]\n\n if (item.type === 2 || item.type === 16) {\n points.push({\n x: item.x,\n y: item.y,\n relative: item.relative,\n type\n })\n }\n if (item.type === 32) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'cubic',\n x1: item.x1,\n y1: item.y1,\n x2: item.x2,\n y2: item.y2\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 128) {\n points.push({\n x: item.x,\n y: item.y,\n curve: {\n type: 'quadratic',\n x1: item.x1,\n y1: item.y1\n },\n relative: item.relative,\n type\n })\n } else if (item.type === 512) {\n const lastPoint = points[points.length - 1] as any\n if (!lastPoint || !['M', 'L', 'Q', 'C'].includes(lastPoint.type)) continue\n\n const cubicBezierPoints = arcToBezier({\n px: lastPoint.x as number,\n py: lastPoint.y as number,\n cx: item.x,\n cy: item.y,\n rx: item.rX,\n ry: item.rY,\n xAxisRotation: item.xRot,\n largeArcFlag: item.lArcFlag,\n sweepFlag: item.sweepFlag\n }) as Array<{ x: number; y: number; x1: number; y1: number; x2: number; y2: number }>\n for (const cbPoint of cubicBezierPoints) {\n points.push({\n x: cbPoint.x,\n y: cbPoint.y,\n curve: {\n type: 'cubic',\n x1: cbPoint.x1,\n y1: cbPoint.y1,\n x2: cbPoint.x2,\n y2: cbPoint.y2\n },\n relative: false,\n type: 'C'\n })\n }\n } else if (item.type === 1) {\n points.push({ close: true, type })\n } else continue\n }\n return points\n}\n\nexport type SvgPoints = ReturnType<typeof toPoints>\n","import type { SvgPoints } from \"../svgPathParser\";\n\ntype Points = Array<\n | { x: number; y: number; moveTo?: boolean }\n | { x: number; y: number; curve: { type: \"arc\"; hR: number; wR: number; stAng: number; swAng: number } }\n | { x: number; y: number; curve: { type: \"quadratic\"; x1: number; y1: number } }\n | { x: number; y: number; curve: { type: \"cubic\"; x1: number; y1: number; x2: number; y2: number } }\n | { close: true }\n>;\n\nexport function formatPoints(\n points: SvgPoints,\n ratioPx2Inch: number,\n scale = { x: 1, y: 1 }\n): Points {\n return points.map((point) => {\n if (\"close\" in point) {\n return { close: true };\n }\n if (point.type === \"M\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n moveTo: true\n };\n }\n if (point.curve) {\n if (point.curve.type === \"cubic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"cubic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y,\n x2: (point.curve.x2 as number) / ratioPx2Inch * scale.x,\n y2: (point.curve.y2 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n if (point.curve.type === \"quadratic\") {\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y,\n curve: {\n type: \"quadratic\",\n x1: (point.curve.x1 as number) / ratioPx2Inch * scale.x,\n y1: (point.curve.y1 as number) / ratioPx2Inch * scale.y\n }\n };\n }\n }\n return {\n x: (point.x as number) / ratioPx2Inch * scale.x,\n y: (point.y as number) / ratioPx2Inch * scale.y\n };\n });\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nexport function isBase64Image(url: string): boolean {\n const regex = /^data:image\\/[^;]+;base64,/;\n return regex.test(url);\n}\n\nexport function getLineArrowType(\n value?: unknown\n): PptxGenJS.ShapeLineProps[\"beginArrowType\"] {\n if (value === \"arrow\") return \"arrow\";\n if (value === \"dot\") return \"oval\";\n return \"none\";\n}\n","import type PptxGenJS from \"pptxgenjs\";\n\nimport type { Deck, SlideElement } from \"../types/ppt\";\nimport { resolveImageData } from \"../resolveImageData\";\nimport { toPoints } from \"../svgPathParser\";\nimport { getElementRange, getLineElementPath } from \"../element\";\nimport { DEFAULT_FONT_FACE, DEFAULT_FONT_SIZE } from \"./constants\";\nimport { formatPoints } from \"./points\";\nimport { getLineArrowType, isBase64Image } from \"./utils\";\nimport { type PatternShape } from \"./types\";\nimport {\n buildTableRows,\n formatColor,\n formatHTML,\n getDashTypeMap,\n getElementOpacity,\n getFilterOpacity,\n getOutlineOption,\n getShadowOption\n} from \"./shared\";\n\nexport function addTextElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n template: Deck,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n textPadding: number\n): void {\n if (element.type !== \"text\" || !element.content) return;\n const textProps = formatHTML(element.content, ratioPx2Pt);\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.TextPropsOptions = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.defaultFontName || template.theme?.fontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n valign: \"top\",\n // pptxgenjs margin order: [left, right, bottom, top]\n // Keep horizontal padding while removing vertical inset to match preview baseline.\n margin: [textPadding, textPadding, 0, textPadding * 0.42],\n paraSpaceBefore: 0,\n lineSpacingMultiple: 1.5,\n fit: \"none\"\n };\n if (element.rotate) options.rotate = element.rotate;\n if (element.wordSpace) options.charSpacing = element.wordSpace / ratioPx2Pt;\n if (element.lineHeight) options.lineSpacingMultiple = element.lineHeight;\n if (element.fill) {\n const c = formatColor(element.fill);\n options.fill = {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n if (element.defaultColor) options.color = formatColor(element.defaultColor).color;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.opacity !== undefined) options.transparency = (1 - opacity) * 100;\n if (element.paragraphSpace !== undefined) {\n options.paraSpaceBefore = element.paragraphSpace / ratioPx2Pt;\n }\n if (element.vertical) options.vert = \"eaVert\";\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n\n slide.addText(textProps, options);\n}\n\nexport async function addImageElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Inch: number\n): Promise<void> {\n if (element.type !== \"image\" || !element.src) return;\n\n const options: PptxGenJS.ImageProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch\n };\n\n if (isBase64Image(element.src)) options.data = element.src;\n else options.data = await resolveImageData(element.src);\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.rotate) options.rotate = element.rotate;\n const filterOpacity = getFilterOpacity(element.filters?.opacity) ?? 1;\n const elementOpacity = getElementOpacity(element.opacity);\n const imageOpacity = filterOpacity * elementOpacity;\n if (imageOpacity !== 1) {\n options.transparency = (1 - imageOpacity) * 100;\n }\n if (element.clip?.range) {\n if (element.clip.shape === \"ellipse\") options.rounding = true;\n\n const [start, end] = element.clip.range;\n const [startX, startY] = start;\n const [endX, endY] = end;\n\n const originW = (element.width ?? 0) / ((endX - startX) / ratioPx2Inch);\n const originH = (element.height ?? 0) / ((endY - startY) / ratioPx2Inch);\n\n options.w = originW / ratioPx2Inch;\n options.h = originH / ratioPx2Inch;\n\n options.sizing = {\n type: \"crop\",\n x: (startX / ratioPx2Inch) * (originW / ratioPx2Inch),\n y: (startY / ratioPx2Inch) * (originH / ratioPx2Inch),\n w: ((endX - startX) / ratioPx2Inch) * (originW / ratioPx2Inch),\n h: ((endY - startY) / ratioPx2Inch) * (originH / ratioPx2Inch)\n };\n }\n\n slide.addImage(options);\n}\n\nexport function addShapeElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number,\n slideIndex: number,\n elementIndex: number,\n patternShapes: PatternShape[]\n): void {\n if (element.type !== \"shape\" || !element.path || !element.viewBox) return;\n const scale = {\n x: (element.width ?? 0) / element.viewBox[0],\n y: (element.height ?? 0) / element.viewBox[1]\n };\n const rawPoints = toPoints(element.path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch, scale);\n const pattern = (element as any).pattern as string | undefined;\n const hasFill = typeof element.fill === \"string\" ? element.fill.trim().length > 0 : false;\n const opacity = getElementOpacity(element.opacity);\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n points\n };\n\n if (pattern) {\n const objectName = `pattern-${slideIndex}-${element.id ?? elementIndex}`;\n options.objectName = objectName;\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n patternShapes.push({ slideIndex, objectName, dataUrl: pattern });\n } else if (hasFill) {\n const fillColor = formatColor(element.fill || \"#000000\");\n options.fill = {\n color: fillColor.color,\n transparency: (1 - fillColor.alpha * opacity) * 100\n };\n } else {\n options.fill = { color: \"FFFFFF\", transparency: 100 };\n }\n\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n if (element.outline?.width) {\n options.line = getOutlineOption(element.outline, ratioPx2Pt, opacity);\n }\n if (element.rotate) options.rotate = element.rotate;\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n\n if (!element.text?.content) return;\n const textProps = formatHTML(element.text.content, ratioPx2Pt);\n const textOptions: PptxGenJS.TextPropsOptions = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n fontSize: DEFAULT_FONT_SIZE / ratioPx2Pt,\n fontFace: element.text.defaultFontName || DEFAULT_FONT_FACE,\n color: \"#000000\",\n paraSpaceBefore: 0,\n valign: element.text.align as PptxGenJS.VAlign,\n fill: { color: \"FFFFFF\", transparency: 100 },\n fit: \"none\"\n };\n textOptions.margin = 0;\n if (element.rotate) textOptions.rotate = element.rotate;\n if (element.text.defaultColor) {\n textOptions.color = formatColor(element.text.defaultColor).color;\n }\n if (element.opacity !== undefined) {\n textOptions.transparency = (1 - opacity) * 100;\n }\n if (element.flipH) textOptions.flipH = element.flipH;\n if (element.flipV) textOptions.flipV = element.flipV;\n\n slide.addText(textProps, textOptions);\n}\n\nexport function addLineElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"line\" || !element.start || !element.end) return;\n const path = getLineElementPath(element);\n const rawPoints = toPoints(path);\n if (!rawPoints.length) return;\n const points = formatPoints(rawPoints, ratioPx2Inch);\n const { minX, maxX, minY, maxY } = getElementRange(element);\n const c = formatColor(element.color || \"#000000\");\n const opacity = getElementOpacity(element.opacity);\n const pointsMeta = element.points ?? [];\n const dashTypeMap = getDashTypeMap();\n\n const options: PptxGenJS.ShapeProps = {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (maxX - minX) / ratioPx2Inch,\n h: (maxY - minY) / ratioPx2Inch,\n line: {\n color: c.color,\n transparency: (1 - c.alpha * opacity) * 100,\n width: (element.width ?? 1) / ratioPx2Pt,\n dashType: element.style ? dashTypeMap[element.style] : \"solid\",\n beginArrowType: getLineArrowType(pointsMeta[0]),\n endArrowType: getLineArrowType(pointsMeta[1])\n },\n points\n };\n if (element.flipH) options.flipH = element.flipH;\n if (element.flipV) options.flipV = element.flipV;\n if (element.shadow) options.shadow = getShadowOption(element.shadow, ratioPx2Pt);\n\n slide.addShape(\"custGeom\" as PptxGenJS.ShapeType, options);\n}\n\nexport function addTableElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n ratioPx2Pt: number,\n ratioPx2Inch: number\n): void {\n if (element.type !== \"table\") return;\n const rows = buildTableRows(element, ratioPx2Pt, ratioPx2Inch);\n if (!rows.length) return;\n\n const colWidths = (element as any).colWidths as number[] | undefined;\n const colW = colWidths\n ? colWidths.map((ratio) => ((element.width ?? 0) * ratio) / ratioPx2Inch)\n : undefined;\n\n const rowCount = rows.length || 1;\n const baseRowHeight = ((element.height ?? 0) / rowCount) / ratioPx2Inch;\n const minRowHeight = (element as any).cellMinHeight\n ? (element as any).cellMinHeight / ratioPx2Inch\n : undefined;\n const rowH = minRowHeight\n ? new Array(rowCount).fill(Math.max(minRowHeight, baseRowHeight))\n : undefined;\n\n const outline = element.outline;\n const border =\n outline?.width || outline?.color\n ? {\n pt: (outline.width ?? 1) / ratioPx2Pt,\n color: formatColor(outline.color || \"#000000\").color.replace(\"#\", \"\")\n }\n : {\n pt: 1 / ratioPx2Pt,\n color: \"DDDDDD\"\n };\n\n slide.addTable(rows, {\n x: (element.left ?? 0) / ratioPx2Inch,\n y: (element.top ?? 0) / ratioPx2Inch,\n w: (element.width ?? 0) / ratioPx2Inch,\n h: (element.height ?? 0) / ratioPx2Inch,\n colW,\n rowH,\n border,\n margin: 0\n });\n}\n"],"mappings":"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","names":["base64","newWord","item","parse","attr","_a","_b","dashTypeMap","_a"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "json2pptx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Convert JSON slide definitions to PPTX using PptxGenJS.",
|
|
5
5
|
"homepage": "https://json2pptx.henryge.com/",
|
|
6
6
|
"repository": {
|
|
@@ -34,12 +34,14 @@
|
|
|
34
34
|
"sideEffects": false,
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "tsup",
|
|
37
|
+
"dev:watch": "tsup --watch",
|
|
37
38
|
"test": "vitest run",
|
|
38
39
|
"test:watch": "vitest",
|
|
39
40
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
40
41
|
"prepublishOnly": "npm run build"
|
|
41
42
|
},
|
|
42
43
|
"dependencies": {
|
|
44
|
+
"json2pptx-schema": "0.1.0",
|
|
43
45
|
"jszip": "^3.10.1",
|
|
44
46
|
"pptxgenjs": "^3.12.0",
|
|
45
47
|
"svg-arc-to-cubic-bezier": "^3.2.0",
|
|
@@ -53,4 +55,4 @@
|
|
|
53
55
|
"typescript": "^5.3.3",
|
|
54
56
|
"vitest": "^1.6.0"
|
|
55
57
|
}
|
|
56
|
-
}
|
|
58
|
+
}
|