markdownfly 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/parser/index.ts","../src/parser/frontmatter.ts","../src/config/defaults.ts","../src/utils/progress.ts","../src/parser/splitter.ts","../src/parser/preprocess.ts","../src/renderer/pptx-renderer.ts","../src/renderer/layouts/title.ts","../src/renderer/layouts/section.ts","../src/utils/png-size.ts","../src/utils/image-fit.ts","../src/utils/table-chart.ts","../src/renderer/layouts/content.ts","../src/renderer/layouts/code.ts","../src/renderer/layouts/quote.ts","../src/renderer/layouts/index.ts","../src/renderer/code-highlighter.ts","../src/renderer/image-handler.ts","../src/diagrams/svg-to-png.ts","../src/diagrams/theme.ts","../src/diagrams/mermaid-renderer.ts","../src/diagrams/graphviz-renderer.ts","../src/diagrams/echarts-renderer.ts","../src/diagrams/index.ts","../src/utils/gradient.ts","../src/renderer/background.ts","../src/themes/clean.ts","../src/themes/academic.ts","../src/themes/dark.ts","../src/themes/business.ts","../src/themes/warm.ts","../src/themes/aurora.ts","../src/themes/neon.ts","../src/themes/nord.ts","../src/themes/dracula.ts","../src/themes/beige.ts","../src/themes/ink.ts","../src/themes/default.ts","../src/themes/index.ts","../src/utils/output-namer.ts"],"sourcesContent":["/**\n * MarkdownFly — Main orchestration\n * Public API: convert(inputPath, options) → outputPath\n */\n\nimport { readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { parseMarkdown } from './parser/index.js';\nimport { renderPresentation } from './renderer/index.js';\nimport { getTheme } from './themes/index.js';\nimport { getOutputPath } from './utils/output-namer.js';\n\nexport interface ConvertOptions {\n output?: string;\n theme?: string;\n}\n\n/**\n * Convert a Markdown file to PPTX\n * @returns Absolute path of the generated .pptx file\n */\nexport async function convert(inputPath: string, options: ConvertOptions = {}): Promise<string> {\n const absInput = resolve(inputPath);\n const markdown = readFileSync(absInput, 'utf-8');\n\n // Parse\n const presentation = parseMarkdown(markdown);\n\n // Merge CLI options into config\n if (options.theme) presentation.config.theme = options.theme;\n\n // Get theme\n const theme = getTheme(presentation.config.theme);\n\n // Determine output path\n const outputPath = resolve(getOutputPath(absInput, options.output));\n\n // Render PPTX\n await renderPresentation(presentation, theme, outputPath, absInput);\n\n return outputPath;\n}\n\n// Re-export for library use\nexport { parseMarkdown } from './parser/index.js';\nexport {\n getTheme,\n themes,\n cleanTheme,\n academicTheme,\n darkTheme,\n businessTheme,\n warmTheme,\n defaultTheme,\n} from './themes/index.js';\nexport { renderDiagram, isDiagramLanguage } from './diagrams/index.js';\nexport type { Presentation, SlideNode, SlideElement } from './models/slide.js';\nexport type { Theme } from './models/theme.js';\nexport type { MarkdownFlyConfig } from './config/types.js';\n","/**\n * Markdown Parser\n * Main entry point: markdown string → Presentation\n */\n\nimport { unified } from 'unified';\nimport remarkParse from 'remark-parse';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport remarkGfm from 'remark-gfm';\nimport type { Root } from 'mdast';\nimport type { Presentation } from '../models/slide.js';\nimport { extractFrontmatter } from './frontmatter.js';\nimport { splitIntoSlides } from './splitter.js';\nimport { preprocessMarkdown } from './preprocess.js';\n\n/**\n * Parse a markdown string into a Presentation\n */\nexport function parseMarkdown(markdown: string): Presentation {\n const processor = unified()\n .use(remarkParse)\n .use(remarkFrontmatter, ['yaml'])\n .use(remarkGfm); // GFM: tables, task lists, autolinks, strikethrough\n\n // Rewrite layout markers (<-> / === / @(...)) before parsing so they\n // never collide with setext headings or paragraph text.\n const tree = processor.parse(preprocessMarkdown(markdown)) as Root;\n\n const config = extractFrontmatter(tree);\n const slides = splitIntoSlides(tree, config.layout);\n\n return { config, slides };\n}\n","/**\n * Frontmatter extractor\n * Extracts YAML frontmatter from remark AST and merges with defaults\n */\n\nimport type { Root } from 'mdast';\nimport { parse as parseYaml } from 'yaml';\nimport type { MarkdownFlyConfig } from '../config/types.js';\nimport { DEFAULT_CONFIG } from '../config/defaults.js';\nimport { log } from '../utils/progress.js';\n\n/**\n * Extract and parse frontmatter from remark AST\n */\nexport function extractFrontmatter(tree: Root): MarkdownFlyConfig {\n const yamlNode = tree.children.find((node) => node.type === 'yaml') as\n | { type: 'yaml'; value: string }\n | undefined;\n\n if (!yamlNode) {\n return { ...DEFAULT_CONFIG };\n }\n\n try {\n const parsed = parseYaml(yamlNode.value) as Partial<MarkdownFlyConfig> & {\n resource_dir?: string; // snake_case alias\n };\n const { resource_dir, ...parsedOnly } = parsed;\n const merged: MarkdownFlyConfig = {\n ...DEFAULT_CONFIG,\n ...parsedOnly,\n };\n if (resource_dir && !merged.resourceDir) {\n merged.resourceDir = resource_dir;\n }\n return merged;\n } catch {\n log.warn('Failed to parse frontmatter YAML, using defaults');\n return { ...DEFAULT_CONFIG };\n }\n}\n","/**\n * Default configuration values\n */\n\nimport type { MarkdownFlyConfig } from './types.js';\n\nexport const DEFAULT_CONFIG: MarkdownFlyConfig = {\n theme: 'clean',\n};\n","/**\n * Progress display using ora spinner + chalk\n */\n\nimport ora, { type Ora } from 'ora';\nimport chalk from 'chalk';\n\nlet quiet = false;\n\n/** Suppress all per-file progress output (errors/summaries are still printed). */\nexport function setQuiet(value: boolean): void {\n quiet = value;\n}\n\nexport class ProgressReporter {\n private spinner: Ora;\n\n constructor() {\n this.spinner = ora();\n }\n\n start(text: string): void {\n if (quiet) return;\n this.spinner.start(text);\n }\n\n update(text: string): void {\n if (quiet) return;\n this.spinner.text = text;\n }\n\n succeed(text: string): void {\n if (quiet) return;\n this.spinner.succeed(text);\n }\n\n fail(text: string): void {\n if (quiet) return;\n this.spinner.fail(text);\n }\n\n info(text: string): void {\n if (quiet) return;\n this.spinner.info(text);\n }\n}\n\nexport const log = {\n info: (msg: string) => console.log(chalk.blue('ℹ'), msg),\n success: (msg: string) => console.log(chalk.green('✔'), msg),\n warn: (msg: string) => console.error(chalk.yellow('⚠'), msg),\n error: (msg: string) => console.error(chalk.red('✖'), msg),\n};\n","/**\n * Slide Splitter\n * Converts remark AST into SlideNode[] with automatic layout detection\n */\n\nimport type { Root, Content, PhrasingContent } from 'mdast';\nimport type {\n SlideNode,\n SlideElement,\n SlideLayout,\n SlideDirectives,\n TextElement,\n HeadingElement,\n ListElement,\n CodeElement,\n ImageElement,\n TableElement,\n BlockquoteElement,\n DiagramElement,\n BreakElement,\n CalloutElement,\n ImageAlign,\n} from '../models/slide.js';\n\n/** Diagram languages that trigger DiagramElement instead of CodeElement */\nconst DIAGRAM_LANGUAGES = new Set(['mermaid', 'dot', 'graphviz', 'echarts']);\n\n/** Callout variants recognized in blockquotes: > [!NOTE] / [!TIP] / ... */\nconst CALLOUT_VARIANTS = new Set([\n 'note', 'info', 'tip', 'success', 'warning', 'caution', 'danger',\n]);\n\n/**\n * Recursively extract plain text from mdast inline/phrasing nodes\n */\nfunction extractText(node: PhrasingContent | Content): string {\n if ('value' in node && typeof node.value === 'string') {\n return node.value;\n }\n // Soft line breaks inside blockquotes/lists map to \"\\n\"\n // (@types/mdast 4.0.4 omits Softbreak from its unions — cast to check)\n if ((node as { type: string }).type === 'softbreak') {\n return '\\n';\n }\n if ('children' in node && Array.isArray(node.children)) {\n return (node.children as PhrasingContent[]).map(extractText).join('');\n }\n return '';\n}\n\n/**\n * Parse an HTML comment node produced by preprocess.ts\n * Returns a BreakElement or directive key/values\n */\nfunction parseComment(value: string): BreakElement | { directives: Record<string, string> } | null {\n const match = value.match(/<!--\\s*mfly:(row|col|dir)\\s*(.*?)\\s*-->/s);\n if (!match) return null;\n\n if (match[1] === 'row' || match[1] === 'col') {\n return { type: 'break', direction: match[1] } satisfies BreakElement;\n }\n\n if (match[1] === 'dir') {\n const raw = decodeURIComponent(match[2]);\n return { directives: parseDirectiveString(raw) };\n }\n\n return null;\n}\n\n/**\n * Parse \"@(key=value, key=value, ...)\" into a record.\n * Values may be quoted (\"...\", '...') to contain commas or parens.\n */\nexport function parseDirectiveString(input: string): Record<string, string> {\n const inner = input.replace(/^@\\(/, '').replace(/\\)$/, '').trim();\n const result: Record<string, string> = {};\n if (!inner) return result;\n\n const re = /([A-Za-z][A-Za-z0-9_-]*)\\s*=\\s*(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|[^,)]+)/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(inner)) !== null) {\n let value = m[2].trim();\n if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n result[m[1]] = value;\n }\n return result;\n}\n\n/** Build the typed directive object for a slide */\nfunction toDirectives(raw: Record<string, string>): SlideDirectives {\n const d: SlideDirectives = {};\n if (raw.layout) d.layout = raw.layout;\n if (raw.notes) d.notes = raw.notes;\n if (raw.chart) d.chart = raw.chart;\n if (raw.highlight) d.highlight = raw.highlight;\n if (raw.background) d.background = raw.background;\n if (raw.steps) d.steps = raw.steps === 'true' || raw.steps === 'yes' || raw.steps === '1';\n return d;\n}\n\n/** Parse \"2-4,6,8-9\" style line ranges into a list of 1-based numbers */\nexport function parseHighlightRanges(spec: string): number[] {\n const lines = new Set<number>();\n for (const part of spec.split(',')) {\n const range = part.trim().match(/^(\\d+)\\s*-\\s*(\\d+)$/);\n if (range) {\n const from = Number(range[1]);\n const to = Number(range[2]);\n for (let n = Math.min(from, to); n <= Math.max(from, to); n++) lines.add(n);\n } else {\n const single = part.trim().match(/^\\d+$/);\n if (single) lines.add(Number(single));\n }\n }\n return [...lines].sort((a, b) => a - b);\n}\n\n/** Detect \"> [!NOTE] Custom title ...\" style callouts (moffee-compatible). */\nfunction parseCallout(content: string): CalloutElement | null {\n const lines = content.split('\\n');\n const markerMatch = lines[0]?.match(/^\\s*\\[!(.*?)\\]\\s*(.*?)\\s*$/);\n if (!markerMatch) return null;\n const variant = markerMatch[1].toLowerCase();\n if (!CALLOUT_VARIANTS.has(variant)) return null;\n const title = markerMatch[2].trim() || undefined;\n return {\n type: 'callout',\n variant,\n title,\n content: lines.slice(1).join('\\n').trim(),\n } satisfies CalloutElement;\n}\n\n/**\n * Parse a `{w=6in,h=40mm,align=left}` suffix into image element params.\n * Keys: w/width, h/height, align. Invalid pieces are silently ignored, so a\n * `![alt](src){w=200}` line still renders the image.\n */\nfunction parseImageParams(text: string): Pick<ImageElement, 'width' | 'height' | 'align'> {\n const result: Pick<ImageElement, 'width' | 'height' | 'align'> = {};\n const body = text.replace(/^\\{\\s*|\\s*\\}$/g, '');\n for (const part of body.split(',')) {\n const eq = part.indexOf('=');\n if (eq === -1) continue;\n const key = part.slice(0, eq).trim().toLowerCase();\n const value = part.slice(eq + 1).trim();\n switch (key) {\n case 'w':\n case 'width': {\n const normalized = normalizeImageSize(value);\n if (normalized) result.width = normalized;\n break;\n }\n case 'h':\n case 'height': {\n const normalized = normalizeImageSize(value);\n if (normalized) result.height = normalized;\n break;\n }\n case 'align': {\n if (value === 'left' || value === 'center' || value === 'right') {\n result.align = value as ImageAlign;\n }\n break;\n }\n }\n }\n return result;\n}\n\n/** Normalize to '<n>in' or '<n>%'; bare numbers are px (96 dpi). Invalid → undefined. */\nfunction normalizeImageSize(value: string): string | undefined {\n const match = value.match(/^(\\d+(?:\\.\\d+)?)(px|pt|cm|mm|in|inch|%)?$/i);\n if (!match) return undefined;\n const n = parseFloat(match[1]);\n if (!(n > 0)) return undefined;\n const unit = (match[2] || 'px').toLowerCase();\n if (unit === '%') return `${n}%`;\n const inches =\n unit === 'px' ? n / 96 : unit === 'pt' ? n / 72 : unit === 'cm' ? n / 2.54 : unit === 'mm' ? n / 25.4 : n;\n return `${Math.round(inches * 100) / 100}in`;\n}\n\n/**\n * Convert an mdast content node to a SlideElement\n */\nfunction nodeToElement(node: Content): SlideElement | null {\n switch (node.type) {\n case 'heading': {\n return {\n type: 'heading',\n content: node.children.map(extractText).join(''),\n level: node.depth,\n } satisfies HeadingElement;\n }\n\n case 'paragraph': {\n // A paragraph holding exactly one image — optionally followed by a\n // {w=...,align=...} suffix, which CommonMark parses as a plain text node.\n const first = node.children[0];\n if (first?.type === 'image') {\n const rest = node.children.slice(1);\n const paramsFromText = (() => {\n if (rest.length === 0) return {};\n if (!rest.every((c) => c.type === 'text')) return null;\n const suffix = rest\n .map((c) => (c.type === 'text' ? c.value : ''))\n .join('')\n .trim();\n const match = suffix.match(/^\\{.*\\}$/);\n return match ? parseImageParams(match[0]) : null;\n })();\n if (paramsFromText !== null) {\n return {\n type: 'image',\n src: first.url,\n alt: first.alt ?? undefined,\n ...paramsFromText,\n } satisfies ImageElement;\n }\n }\n return {\n type: 'text',\n content: node.children.map(extractText).join(''),\n } satisfies TextElement;\n }\n\n case 'list': {\n // remark-gfm sets checked to true/false for task items and null for\n // plain items — only treat boolean values as task-list markers.\n const hasCheckboxes = node.children.some(\n (item) => typeof item.checked === 'boolean',\n );\n const items = node.children.map((item) => {\n return item.children.map((child) => extractText(child)).join('');\n });\n const result: ListElement = {\n type: 'list',\n items,\n ordered: node.ordered ?? false,\n };\n if (hasCheckboxes) {\n result.checked = node.children.map((item) =>\n typeof item.checked === 'boolean' ? item.checked : false,\n );\n }\n return result;\n }\n\n case 'code': {\n const lang = node.lang?.toLowerCase() ?? '';\n if (DIAGRAM_LANGUAGES.has(lang)) {\n return {\n type: 'diagram',\n diagramType: lang === 'graphviz' ? 'dot' : lang,\n content: node.value,\n } satisfies DiagramElement;\n }\n const element = {\n type: 'code',\n content: node.value,\n language: node.lang ?? undefined,\n } satisfies CodeElement;\n return element;\n }\n\n case 'image': {\n return {\n type: 'image',\n src: node.url,\n alt: node.alt ?? undefined,\n } satisfies ImageElement;\n }\n\n case 'table': {\n const rows = node.children.map((row) =>\n row.children.map((cell) =>\n cell.children.map(extractText).join(''),\n ),\n );\n const headers = rows.length > 0 ? rows[0] : [];\n const bodyRows = rows.slice(1);\n return {\n type: 'table',\n headers,\n rows: bodyRows,\n } satisfies TableElement;\n }\n\n case 'blockquote': {\n const content = node.children\n .map((child) => extractText(child))\n .join('\\n');\n const callout = parseCallout(content);\n if (callout) return callout;\n return {\n type: 'blockquote',\n content,\n } satisfies BlockquoteElement;\n }\n\n case 'html': {\n const parsed = parseComment(node.value);\n if (parsed === null) return null;\n if ('direction' in parsed) return parsed;\n // Directive comments are collected by the caller — see splitIntoSlides\n return null;\n }\n\n default:\n return null;\n }\n}\n\n/**\n * Determine slide layout based on content (rule engine)\n */\nfunction detectLayout(\n title: string | undefined,\n elements: SlideElement[],\n isFirstSlide: boolean,\n headingLevel: number,\n): SlideLayout {\n // First slide with H1 → title\n if (isFirstSlide && headingLevel === 1) {\n return 'title';\n }\n\n // H2 with no body content → section divider\n if (headingLevel === 2 && elements.length === 0) {\n return 'section';\n }\n\n // Only code elements → code layout\n const nonEmptyElements = elements.filter(\n (e) => e.type !== 'text' || e.content.trim() !== '',\n );\n if (\n nonEmptyElements.length > 0 &&\n nonEmptyElements.every((e) => e.type === 'code')\n ) {\n return 'code';\n }\n\n // Only blockquote → quote layout\n if (\n nonEmptyElements.length > 0 &&\n nonEmptyElements.every((e) => e.type === 'blockquote')\n ) {\n return 'quote';\n }\n\n return 'content';\n}\n\n/**\n * Split remark AST into SlideNode array\n * @param defaultLayout Optional frontmatter layout; the auto-detection rule\n * engine runs first, @(layout=...) directives override it.\n */\nexport function splitIntoSlides(tree: Root, defaultLayout?: string): SlideNode[] {\n const slides: SlideNode[] = [];\n let currentTitle: string | undefined;\n let currentSubtitle: string | undefined;\n let currentElements: SlideElement[] = [];\n let currentDirectives: Record<string, string> = {};\n let currentHeadingLevel = 0;\n let isFirstSlide = true;\n\n function flushSlide(): void {\n // Don't create empty slides (but keep slides that carry directives/notes)\n if (!currentTitle && currentElements.length === 0 && Object.keys(currentDirectives).length === 0) {\n return;\n }\n\n // Apply @(highlight=...) to the slide's code block if not already applied\n if (currentDirectives.highlight && currentElements.length > 0) {\n const ranges = parseHighlightRanges(currentDirectives.highlight);\n if (ranges.length > 0) {\n const code = currentElements.find(\n (e): e is CodeElement => e.type === 'code' && !e.highlightLines,\n );\n if (code) code.highlightLines = ranges;\n }\n }\n\n const autoLayout = detectLayout(\n currentTitle,\n currentElements,\n isFirstSlide && slides.length === 0,\n currentHeadingLevel,\n );\n // Precedence: @(layout=...) directive > structural auto-detection\n // (title/section/code/quote) > frontmatter fallback (only for generic\n // content slides) > generic content.\n const layout: SlideLayout = (currentDirectives.layout as SlideLayout | undefined) ??\n (autoLayout === 'content' ? (defaultLayout as SlideLayout | undefined) : autoLayout) ??\n 'content';\n\n slides.push({\n layout,\n title: currentTitle,\n subtitle: currentSubtitle,\n elements: currentElements,\n notes: currentDirectives.notes,\n directives: toDirectives(currentDirectives),\n });\n\n currentTitle = undefined;\n currentSubtitle = undefined;\n currentElements = [];\n currentDirectives = {};\n currentHeadingLevel = 0;\n isFirstSlide = false;\n }\n\n for (const node of tree.children) {\n // Skip frontmatter\n if (node.type === 'yaml') continue;\n\n // --- separator → new slide\n if (node.type === 'thematicBreak') {\n flushSlide();\n continue;\n }\n\n // H1 or H2 → new slide\n if (node.type === 'heading' && (node.depth === 1 || node.depth === 2)) {\n flushSlide();\n currentTitle = node.children.map(extractText).join('');\n currentHeadingLevel = node.depth;\n continue;\n }\n\n // Directive comment may precede content in any position — collect it,\n // but preserve ordering by pushing to elements when it's a break marker.\n if (node.type === 'html') {\n const parsed = parseComment(node.value);\n if (parsed !== null) {\n if ('direction' in parsed) {\n currentElements.push(parsed);\n } else {\n Object.assign(currentDirectives, parsed.directives);\n }\n }\n continue;\n }\n\n // Other content → add to current slide\n const element = nodeToElement(node);\n if (element) {\n currentElements.push(element);\n }\n }\n\n // Flush remaining content\n flushSlide();\n\n return slides;\n}\n","/**\n * Preprocess the raw markdown before remark parsing.\n *\n * Converts inline layout markers that are NOT valid CommonMark into HTML\n * comment nodes, which remark keeps intact and our splitter can recognize:\n *\n * === (standalone line) → <!-- mfly:row --> vertical block separator\n * <-> (standalone line) → <!-- mfly:col --> horizontal column separator\n * @(...) (standalone line) → <!-- mfly:dir:... --> slide-level directive\n *\n * Standalone lines starting with `%%` are removed entirely (like moffee's\n * comment syntax) — handy for drafting notes that never reach the deck.\n *\n * Why comments: `===` collides with setext heading underlines, and `<->`\n * would otherwise be a plain paragraph. Encoding them as comments makes the\n * AST explicit and keeps the rest of the markdown untouched.\n *\n * Lines inside fenced code blocks are never rewritten.\n */\n\nconst ROW_RE = /^={3,}$/;\nconst COL_RE = /^<->$/;\nconst DIR_RE = /^@\\(.+\\)$/;\nconst COMMENT_RE = /^%%/;\n\nexport function preprocessMarkdown(markdown: string): string {\n const lines = markdown.split('\\n');\n const out: string[] = [];\n\n let inFence = false;\n let fenceChar = '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n const fenceMatch = trimmed.match(/^(`{3,}|~{3,})/);\n\n if (!inFence) {\n if (fenceMatch) {\n inFence = true;\n fenceChar = fenceMatch[1][0];\n out.push(line);\n continue;\n }\n if (COMMENT_RE.test(trimmed)) {\n // Drop %% comment lines entirely\n out.push('');\n continue;\n }\n if (COL_RE.test(trimmed)) {\n out.push('<!-- mfly:col -->');\n continue;\n }\n if (ROW_RE.test(trimmed)) {\n out.push('<!-- mfly:row -->');\n continue;\n }\n if (DIR_RE.test(trimmed)) {\n // Encode so anything inside (parens, \"--\", etc.) is comment-safe\n out.push(`<!-- mfly:dir:${encodeURIComponent(trimmed)} -->`);\n continue;\n }\n out.push(line);\n continue;\n }\n\n // Inside a fenced block: only watch for the closing fence\n out.push(line);\n if (fenceMatch && trimmed.startsWith(fenceChar)) {\n inFence = false;\n }\n }\n\n return out.join('\\n');\n}\n","/**\n * PPTX Renderer\n * Orchestrates pptxgenjs to produce .pptx files from Presentation\n */\n\nimport PptxGenJS from 'pptxgenjs';\nimport type { Presentation } from '../models/slide.js';\nimport type { Theme } from '../models/theme.js';\nimport { renderSlideLayout } from './layouts/index.js';\nimport { highlightCode } from './code-highlighter.js';\nimport { resolveImage } from './image-handler.js';\nimport { renderDiagram } from '../diagrams/index.js';\nimport { slideBackground } from './background.js';\n\nimport { writeFileSync } from 'node:fs';\nimport { dirname, resolve } from 'node:path';\n\n/**\n * Render a Presentation to a .pptx file\n */\nexport async function renderPresentation(\n presentation: Presentation,\n theme: Theme,\n outputPath: string,\n inputPath: string = '',\n): Promise<void> {\n const pptx = new PptxGenJS();\n\n // Configure presentation\n pptx.layout = 'LAYOUT_WIDE'; // 16:9 = 13.33\" x 7.5\"\n pptx.author = presentation.config.author ?? 'MarkdownFly';\n pptx.title = presentation.slides[0]?.title ?? 'Presentation';\n\n const { resourceDir } = presentation.config;\n // Frontmatter resource_dir: relative paths are relative to the source file,\n // not the process cwd (agents may run from anywhere). basePath is a directory.\n const resourceBase = resourceDir\n ? resolve(dirname(inputPath), resourceDir)\n : dirname(inputPath);\n const backgroundProps = slideBackground(theme);\n\n // Build render context\n const ctx = {\n highlightCode: async (code: string, language: string, highlightLines: number[] = []) => {\n return highlightCode(code, language, theme, highlightLines) as unknown as Promise<PptxGenJS.TextProps[]>;\n },\n resolveImage: async (src: string) => {\n return resolveImage(src, resourceBase);\n },\n renderDiagram: async (diagramType: string, code: string) => {\n return renderDiagram(diagramType, code, theme);\n },\n footerTemplate: presentation.config.footer,\n pageNumber: 0,\n totalSlides: presentation.slides.length,\n currentSection: '',\n };\n\n // Render each slide\n for (let i = 0; i < presentation.slides.length; i++) {\n const node = presentation.slides[i];\n const slide = pptx.addSlide();\n\n // Set default background (flat color or theme gradient image)\n slide.background = backgroundProps;\n\n ctx.pageNumber = i + 1;\n if (node.layout === 'section' && node.title) {\n ctx.currentSection = node.title;\n }\n\n await renderSlideLayout(slide, node, theme, ctx);\n }\n\n // Write file using nodebuffer for 100% reliable path handling across OS\n const buffer = (await pptx.write({ outputType: 'nodebuffer' })) as Buffer;\n writeFileSync(outputPath, Buffer.from(buffer));\n}\n","/**\n * Title slide layout — cover/opening slide\n */\n\nimport PptxGenJS from 'pptxgenjs';\nimport type { SlideNode } from '../../models/slide.js';\nimport type { Theme } from '../../models/theme.js';\n\nexport function renderTitleSlide(\n slide: PptxGenJS.Slide,\n node: SlideNode,\n theme: Theme,\n): void {\n const textColor = theme.colors.titleText ?? 'FFFFFF';\n const subtitleColor = textColor === 'FFFFFF' ? 'FFFFFFCC' : theme.colors.secondary;\n const metaColor = textColor === 'FFFFFF' ? 'FFFFFF99' : theme.colors.secondary;\n\n // Gradient themes keep the gradient background on the cover slide too;\n // flat themes fall back to their solid titleBackground / primary design.\n const bgColor = theme.colors.backgroundGradient\n ? undefined\n : theme.colors.titleBackground ?? theme.colors.primary;\n if (bgColor) {\n slide.background = { color: bgColor };\n }\n if (node.title) {\n slide.addText(node.title, {\n x: 0.8,\n y: 2.0,\n w: 11.7,\n h: 1.5,\n fontSize: theme.fontSize.title,\n fontFace: theme.fonts.heading,\n color: textColor,\n bold: true,\n align: 'center',\n valign: 'middle',\n });\n }\n\n // Subtitle\n if (node.subtitle) {\n slide.addText(node.subtitle, {\n x: 0.8,\n y: 3.8,\n w: 11.7,\n h: 0.8,\n fontSize: theme.fontSize.body,\n fontFace: theme.fonts.body,\n color: subtitleColor,\n align: 'center',\n valign: 'middle',\n });\n }\n\n // Author / Date from elements\n const textElements = node.elements.filter((e) => e.type === 'text');\n if (textElements.length > 0) {\n const metaText = textElements.map((e) => e.content).join(' · ');\n slide.addText(metaText, {\n x: 0.8,\n y: 5.5,\n w: 11.7,\n h: 0.6,\n fontSize: theme.fontSize.small,\n fontFace: theme.fonts.body,\n color: metaColor,\n align: 'center',\n });\n }\n}\n","/**\n * Section divider slide layout\n */\n\nimport PptxGenJS from 'pptxgenjs';\nimport type { SlideNode } from '../../models/slide.js';\nimport type { Theme } from '../../models/theme.js';\n\nexport function renderSectionSlide(\n slide: PptxGenJS.Slide,\n node: SlideNode,\n theme: Theme,\n): void {\n // Accent strip on left\n slide.addShape('rect' as PptxGenJS.ShapeType, {\n x: 0,\n y: 0,\n w: 0.15,\n h: 7.5,\n fill: { color: theme.colors.accent },\n });\n\n // Section title centered\n if (node.title) {\n slide.addText(node.title, {\n x: 1.0,\n y: 2.5,\n w: 11.3,\n h: 2.0,\n fontSize: theme.fontSize.heading + 4,\n fontFace: theme.fonts.heading,\n color: theme.colors.text,\n bold: true,\n align: 'left',\n valign: 'middle',\n });\n }\n}\n","/**\n * PNG size helpers\n */\n\nexport interface PngSize {\n width: number;\n height: number;\n}\n\n/**\n * Read pixel dimensions from a PNG buffer (IHDR chunk, no dependencies)\n * Returns null when the data is not a valid PNG\n */\nexport function getPngSize(data: Buffer): PngSize | null {\n if (data.length < 24) return null;\n if (data.readUInt32BE(0) !== 0x89504e47) return null;\n const width = data.readUInt32BE(16);\n const height = data.readUInt32BE(20);\n if (!(width > 0 && height > 0)) return null;\n return { width, height };\n}\n","/**\n * Image placement helpers\n */\n\nexport interface Size {\n width: number;\n height: number;\n}\n\nexport interface FitOptions {\n /** Normalized size, e.g. '6in' or '60%' (percent is relative to the box width) */\n width?: string;\n /** Normalized size, e.g. '4in' or '70%' (percent is relative to the box height) */\n height?: string;\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface PlacedImage {\n /** Horizontal offset inside the box, per `align` */\n x: number;\n width: number;\n height: number;\n}\n\n/**\n * Scale an image to fit inside a max-width/max-height box while preserving\n * its aspect ratio. Returns the largest size that fits the box.\n */\nexport function fitInBox(img: Size, maxWidth: number, maxHeight: number): Size {\n if (!(img.width > 0 && img.height > 0) || !(maxWidth > 0 && maxHeight > 0)) {\n return { width: maxWidth, height: maxHeight };\n }\n const ar = img.height / img.width;\n let width = maxWidth;\n let height = width * ar;\n if (height > maxHeight) {\n height = maxHeight;\n width = height / ar;\n }\n return { width, height };\n}\n\n/** Convert a normalized size ('6in' / '60%') to inches; `of` is the reference for percentages. */\nexport function resolveImageSize(value: string | undefined, of: number): number | undefined {\n if (!value) return undefined;\n if (value.endsWith('%')) {\n const pct = parseFloat(value);\n if (Number.isNaN(pct) || pct <= 0) return undefined;\n return (of * pct) / 100;\n }\n const n = parseFloat(value);\n if (Number.isNaN(n) || n <= 0) return undefined;\n return n;\n}\n\n/**\n * Resolve the requested width/height (either may be undefined, meaning\n * \"derive from the other side / the image ratio\"). Returns concrete numbers.\n */\nfunction resolveSizes(img: Size, box: Size, widthStr?: string, heightStr?: string): Size {\n const width = resolveImageSize(widthStr, box.width);\n const height = resolveImageSize(heightStr, box.height);\n const ar = img.height > 0 && img.width > 0 ? img.height / img.width : 0.5;\n\n if (width === undefined && height === undefined) {\n return fitInBox(\n { width: img.width > 0 ? img.width : 6, height: img.height > 0 ? img.height : 3 },\n box.width,\n box.height,\n );\n }\n if (height === undefined) {\n // width is defined here: the both-undefined branch above was skipped\n return { width: width!, height: width! * ar };\n }\n if (width === undefined) {\n return { width: height! / ar, height: height! };\n }\n return { width, height };\n}\n\n/**\n * Place an image inside a box honoring `![alt](src){w=...,h=...,align=...}`:\n * - only one size given → aspect ratio preserved, the other side derived\n * - both sizes given → explicit (aspect not preserved)\n * - the result is always shrunk back into the box\n * `img` is the source pixel size (or the renderer's fallback when unknown).\n */\nexport function fitImageWithOptions(img: Size, box: Size, options: FitOptions = {}): PlacedImage {\n let { width, height } = resolveSizes(img, box, options.width, options.height);\n\n // Never overflow the box (explicit sizes are clamped by proportional shrink)\n if (width > box.width || height > box.height) {\n const fitted = fitInBox({ width, height }, box.width, box.height);\n width = fitted.width;\n height = fitted.height;\n }\n\n const align = options.align ?? 'center';\n const x = align === 'left' ? 0 : align === 'right' ? box.width - width : (box.width - width) / 2;\n return { x, width, height };\n}\n","/**\n * Table → ECharts option converter\n * Powers the @(chart=bar|line|pie) directive: a plain Markdown table\n * becomes a rendered chart without writing JSON by hand.\n */\n\nimport type { TableElement } from '../models/slide.js';\n\n/**\n * Convert a Markdown table into an ECharts option JSON string.\n *\n * bar/line: first column = category, every other column = one series.\n * pie: first column = slice name, second column = value.\n */\nexport function tableToChartOption(\n table: TableElement,\n type: string,\n): string {\n const { headers, rows } = table;\n\n if (headers.length < 2 || rows.length === 0) {\n throw new Error('chart: table needs at least 2 columns and 1 data row');\n }\n\n if (type === 'pie') {\n const series = {\n name: headers[1],\n type: 'pie',\n radius: '55%',\n data: rows.map((r) => ({ name: r[0], value: Number(r[1]) || 0 })),\n };\n return JSON.stringify({\n toolbox: { show: false },\n series: [series],\n });\n }\n\n // bar / line / others → category axis + one series per data column\n const categories = rows.map((r) => r[0]);\n const series = headers.slice(1).map((name, i) => ({\n name,\n type,\n data: rows.map((r) => Number(r[i + 1]) || 0),\n }));\n\n return JSON.stringify({\n xAxis: { type: 'category', data: categories, axisLabel: { hideOverlap: true } },\n yAxis: { type: 'value' },\n series,\n });\n}\n","/**\n * Content slide layout — the most common, handles mixed content.\n *\n * Supports grid layout via break elements:\n * - BreakElement('row') (from `===`): stack content vertically\n * - BreakElement('col') (from `<->`): lay content out side-by-side\n * Columns and rows split the content area evenly.\n */\n\nimport PptxGenJS from 'pptxgenjs';\nimport type { SlideNode, SlideElement } from '../../models/slide.js';\nimport type { Theme } from '../../models/theme.js';\nimport type { RenderContext } from './index.js';\nimport { getPngSize } from '../../utils/png-size.js';\nimport { fitInBox, fitImageWithOptions } from '../../utils/image-fit.js';\nimport { tableToChartOption } from '../../utils/table-chart.js';\nimport { log } from '../../utils/progress.js';\nimport { readFileSync } from 'node:fs';\n\n// Slide dimensions (16:9 LAYOUT_WIDE)\nconst SLIDE_W = 13.33;\nconst SLIDE_H = 7.5;\nconst MARGIN = 0.6;\nconst CONTENT_W = SLIDE_W - MARGIN * 2;\nconst TITLE_H = 0.9;\nconst BOTTOM_MARGIN = 0.45;\nconst GRID_GAP = 0.25;\n\n/** Extension → MIME map used when embedding images as base64 data */\nconst IMAGE_MIME: Record<string, string> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n webp: 'image/webp',\n bmp: 'image/bmp',\n svg: 'image/svg+xml',\n};\n\n/** Vertical space available below the title bar */\nfunction contentAreaInsets(node: SlideNode): { top: number; bottom: number } {\n return {\n top: node.title ? 0.3 + TITLE_H + 0.2 : 0.3,\n bottom: BOTTOM_MARGIN,\n };\n}\n\n/**\n * Split the element stream into rows (by row breaks), then each row\n * into columns (by col breaks). A slide with no breaks is one row of one column.\n */\nfunction splitGrid(elements: SlideElement[]): SlideElement[][][] {\n const rows: SlideElement[][] = [];\n let currentRow: SlideElement[] = [];\n\n for (const el of elements) {\n if (el.type === 'break' && el.direction === 'row') {\n rows.push(currentRow);\n currentRow = [];\n continue;\n }\n // col breaks and content stay in the row; col splitting happens next\n currentRow.push(el);\n }\n rows.push(currentRow);\n\n return rows.map((row) => {\n const columns: SlideElement[][] = [];\n let currentCol: SlideElement[] = [];\n for (const el of row) {\n if (el.type === 'break' && el.direction === 'col') {\n columns.push(currentCol);\n currentCol = [];\n continue;\n }\n currentCol.push(el);\n }\n columns.push(currentCol);\n return columns;\n });\n}\n\nexport async function renderContentSlide(\n slide: PptxGenJS.Slide,\n node: SlideNode,\n theme: Theme,\n ctx: RenderContext,\n): Promise<void> {\n const { top } = contentAreaInsets(node);\n\n // Title bar\n if (node.title) {\n slide.addShape('rect' as PptxGenJS.ShapeType, {\n x: MARGIN,\n y: 0.3 + TITLE_H - 0.05,\n w: CONTENT_W,\n h: 0.04,\n fill: { color: theme.colors.primary },\n });\n\n slide.addText(node.title, {\n x: MARGIN,\n y: 0.3,\n w: CONTENT_W,\n h: TITLE_H,\n fontSize: theme.fontSize.heading,\n fontFace: theme.fonts.heading,\n color: theme.colors.primary,\n bold: true,\n valign: 'bottom',\n });\n }\n\n const grid = splitGrid(prepareElements(node));\n const rows = grid.length;\n const availH = SLIDE_H - top - BOTTOM_MARGIN - GRID_GAP * (rows - 1);\n\n // Rows are sized by estimated content weight (like flexbox), not evenly —\n // a row with one short line shouldn't eat half the slide. Shrunk to fit.\n const ests = grid.map((columns) =>\n Math.max(\n 0.8,\n ...columns.map((c) => estimateColumnHeight(c, (CONTENT_W - GRID_GAP * (columns.length - 1)) / columns.length)),\n ),\n );\n const totalEst = ests.reduce((a, b) => a + b, 0);\n const scale = totalEst > availH ? availH / totalEst : 1;\n\n let y = top;\n for (let r = 0; r < rows; r++) {\n const columns = grid[r];\n const cols = columns.length;\n const colW = (CONTENT_W - GRID_GAP * (cols - 1)) / cols;\n const rowH = ests[r] * scale;\n\n for (let c = 0; c < cols; c++) {\n await renderColumn(\n slide,\n columns[c],\n { x: MARGIN + c * (colW + GRID_GAP), y, w: colW, h: rowH },\n node,\n theme,\n ctx,\n );\n }\n y += rowH + GRID_GAP;\n }\n}\n\n/**\n * Rewrites the slide's elements for rendering:\n * - @(chart=...) converts the first table into an echarts diagram so that\n * layout estimation treats it as an image (big row) instead of a table.\n */\nfunction prepareElements(node: SlideNode): SlideElement[] {\n const chart = node.directives?.chart;\n if (!chart) return node.elements;\n\n const elements = [...node.elements];\n const idx = elements.findIndex((e) => e.type === 'table');\n if (idx === -1) return elements;\n\n const table = elements[idx] as Extract<SlideElement, { type: 'table' }>;\n try {\n elements[idx] = {\n type: 'diagram',\n diagramType: 'echarts',\n content: tableToChartOption(table, chart),\n };\n } catch {\n // Invalid chart table — fall through to rendering as a table\n }\n return elements;\n}\n\n/** Estimate wrapped text lines for a string in a column of width w (inches). */\nfunction estimateTextLines(content: string, w: number): number {\n const charsPerLine = Math.max(20, Math.floor(w * 60));\n return Math.max(1, Math.ceil(content.length / charsPerLine));\n}\n\n/** Cheap height estimate for a column of elements (inches). */\nfunction estimateColumnHeight(elements: SlideElement[], w: number): number {\n let h = 0;\n for (const el of elements) {\n switch (el.type) {\n case 'text':\n h += Math.max(0.5, Math.ceil(el.content.length / Math.max(20, Math.floor(w * 60))) * 0.35);\n break;\n case 'heading':\n h += 0.7;\n break;\n case 'list':\n h += el.items.length * 0.5;\n break;\n case 'code':\n h += Math.max(1.0, el.content.split('\\n').length * 0.25);\n break;\n case 'diagram':\n case 'image':\n // Most diagrams are wide (aspect ~1.5-3:1); assume ~2:1 and let the\n // actual render down-scale. Enough height to look deliberate.\n // Explicit image sizes are honored so a small icon doesn't eat the row.\n if (el.type === 'image' && el.height && !el.height.endsWith('%')) {\n h += parseFloat(el.height) + 0.2;\n } else if (el.type === 'image' && el.width && !el.width.endsWith('%')) {\n h += parseFloat(el.width) * 0.5 + 0.2;\n } else {\n h += Math.min(4.5, Math.max(1.2, w * 0.5));\n }\n break;\n case 'table':\n h += (el.rows.length + 1) * 0.4;\n break;\n case 'callout':\n // Same adaptive sizing as the renderer: label row + one line per wrap\n h += Math.min(4.5, 0.72 + estimateTextLines(el.content, w) * 0.3);\n break;\n case 'blockquote':\n h += 1.0;\n break;\n case 'break':\n break;\n default:\n h += 0.5;\n }\n }\n return h;\n}\n\ninterface Box {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** Render a stream of elements inside a fixed box; content exceeding the box is clipped (kept simple). */\nasync function renderColumn(\n slide: PptxGenJS.Slide,\n elements: SlideElement[],\n box: Box,\n node: SlideNode,\n theme: Theme,\n ctx: RenderContext,\n): Promise<void> {\n // Vertically center content that is shorter than its grid cell — a\n // two-line column next to a diagram shouldn't hug the row's top edge.\n const est = estimateColumnHeight(elements, box.w);\n const yPos = box.h > est ? box.y + (box.h - est) / 2 : box.y;\n let cursor = yPos;\n for (const element of elements) {\n const consumed = await renderElement(slide, element, cursor, box, node, theme, ctx);\n cursor += consumed;\n }\n}\n\nasync function renderElement(\n slide: PptxGenJS.Slide,\n element: SlideElement,\n yPos: number,\n box: Box,\n node: SlideNode,\n theme: Theme,\n ctx: RenderContext,\n): Promise<number> {\n const { x, w } = box;\n const maxH = Math.max(0.5, box.y + box.h - yPos);\n\n switch (element.type) {\n case 'text': {\n if (!element.content.trim()) return 0;\n slide.addText(element.content, {\n x,\n y: yPos,\n w,\n h: 0.6,\n fontSize: theme.fontSize.body,\n fontFace: theme.fonts.body,\n color: theme.colors.text,\n bold: element.bold,\n italic: element.italic,\n valign: 'top',\n wrap: true,\n });\n // Rough estimate: ~0.5 inch per 80 chars (scaled to column width)\n const charsPerLine = Math.max(20, Math.floor(w * 60));\n const lines = Math.ceil(element.content.length / charsPerLine);\n return Math.max(0.5, lines * 0.35);\n }\n\n case 'heading': {\n slide.addText(element.content, {\n x,\n y: yPos,\n w,\n h: 0.6,\n fontSize: theme.fontSize.heading - (element.level - 2) * 4,\n fontFace: theme.fonts.heading,\n color: theme.colors.primary,\n bold: true,\n });\n return 0.7;\n }\n\n case 'list': {\n const items = element.items.map((item, i) => {\n const checked = element.checked?.[i];\n const isTask = checked !== undefined;\n let text = item;\n const options: Record<string, unknown> = {\n // Task items have no bullet, so they need an explicit break line;\n // bulleted items break lines on their own.\n breakLine: isTask ? true : undefined,\n bullet: element.ordered\n ? { type: 'number' as const, startAt: i + 1 }\n : isTask\n ? false\n : true,\n color: theme.colors.text,\n fontSize: theme.fontSize.body,\n fontFace: theme.fonts.body,\n paraSpaceBefore: 4,\n paraSpaceAfter: 4,\n };\n if (isTask) {\n // Task list: prefix glyph, done items get muted color\n text = `${checked ? '☑' : '☐'} ${item}`;\n if (checked) options.color = theme.colors.secondary;\n }\n return { text, options };\n });\n\n const height = Math.max(0.8, Math.min(maxH, items.length * 0.5));\n slide.addText(items as PptxGenJS.TextProps[], {\n x,\n y: yPos,\n w,\n h: height,\n valign: 'top',\n });\n return height + 0.15;\n }\n\n case 'code': {\n const runs = await ctx.highlightCode(\n element.content,\n element.language ?? 'text',\n element.highlightLines,\n );\n const lines = element.content.split('\\n').length;\n const height = Math.min(maxH, Math.max(1.0, lines * 0.25));\n\n slide.addText(runs, {\n x,\n y: yPos,\n w,\n h: height,\n fill: { color: theme.colors.codeBackground },\n fontFace: theme.fonts.code,\n fontSize: theme.fontSize.code,\n color: theme.colors.codeText,\n valign: 'top',\n margin: [8, 12, 8, 12],\n });\n return height + 0.2;\n }\n\n case 'diagram': {\n try {\n const pngBuffer = await ctx.renderDiagram(element.diagramType, element.content);\n // Diagrams can be very wide (graphviz chains) or very tall (mermaid\n // flows) — scale into the box, aspect preserved.\n const imgSize = getPngSize(pngBuffer) ?? { width: 8, height: 3.5 };\n const boxH = Math.max(1.2, maxH);\n const fitted = fitInBox(imgSize, w, boxH);\n const base64 = pngBuffer.toString('base64');\n\n slide.addImage({\n data: `image/png;base64,${base64}`,\n x: x + (w - fitted.width) / 2,\n y: yPos,\n w: fitted.width,\n h: fitted.height,\n });\n return fitted.height + 0.2;\n } catch (err) {\n slide.addText(`[Diagram render error: ${err instanceof Error ? err.message : 'unknown'}]`, {\n x,\n y: yPos,\n w,\n h: 0.5,\n fontSize: theme.fontSize.small,\n color: 'FF0000',\n italic: true,\n });\n return 0.6;\n }\n }\n\n case 'image': {\n try {\n const resolved = await ctx.resolveImage(element.src);\n if (!resolved.ok) {\n log.warn(`[${node.title ?? 'slide'}] ${resolved.error}`);\n return 0;\n }\n const imgSize = getPngSize(readFileSync(resolved.path)) ?? { width: 6, height: 3.0 };\n const boxH = Math.max(1.2, maxH);\n const placed = fitImageWithOptions(\n imgSize,\n { width: w, height: boxH },\n { width: element.width, height: element.height, align: element.align },\n );\n // Base64 data (not a path): avoids pptxgenjs' Node-vs-browser media\n // encoding, which crashes under ESM hosts (no `require` → XHR path).\n const ext = resolved.path.split('.').pop()?.toLowerCase() ?? 'png';\n const mime = IMAGE_MIME[ext] ?? 'image/png';\n const data = `${mime};base64,${readFileSync(resolved.path).toString('base64')}`;\n slide.addImage({\n data,\n path: 'preencoded.png',\n x: x + placed.x,\n y: yPos,\n w: placed.width,\n h: placed.height,\n });\n return placed.height + 0.2;\n } catch (err) {\n log.warn(\n `Failed to embed image ${element.src}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n return 0;\n }\n\n case 'table': {\n const headerRow = element.headers.map((h) => ({\n text: h,\n options: {\n bold: true,\n color: 'FFFFFF',\n fill: { color: theme.colors.primary },\n fontSize: theme.fontSize.body - 2,\n fontFace: theme.fonts.body,\n align: 'center' as const,\n border: { type: 'solid' as const, pt: 0.5, color: theme.colors.primary },\n },\n }));\n\n const bodyRows = element.rows.map((row) =>\n row.map((cell) => ({\n text: cell,\n options: {\n fontSize: theme.fontSize.body - 2,\n fontFace: theme.fonts.body,\n color: theme.colors.text,\n border: { type: 'solid' as const, pt: 0.5, color: 'D1D5DB' },\n },\n })),\n );\n\n const allRows = [headerRow, ...bodyRows];\n const tableH = Math.min(maxH, allRows.length * 0.4);\n\n slide.addTable(allRows as PptxGenJS.TableRow[], {\n x,\n y: yPos,\n w,\n h: tableH,\n colW: Array(element.headers.length).fill(w / element.headers.length),\n margin: [4, 6, 4, 6],\n border: { type: 'solid', pt: 0.5, color: 'D1D5DB' },\n autoPage: false,\n });\n return tableH + 0.2;\n }\n\n case 'blockquote': {\n // Left accent border + italic text\n slide.addShape('rect' as PptxGenJS.ShapeType, {\n x,\n y: yPos,\n w: 0.06,\n h: Math.min(0.8, maxH),\n fill: { color: theme.colors.accent },\n });\n\n slide.addText(element.content, {\n x: x + 0.2,\n y: yPos,\n w: w - 0.2,\n h: Math.min(0.8, maxH),\n fontSize: theme.fontSize.body,\n fontFace: theme.fonts.body,\n color: theme.colors.secondary,\n italic: true,\n valign: 'middle',\n });\n return 1.0;\n }\n\n case 'callout': {\n const palette: Record<string, string> = {\n note: theme.colors.primary,\n info: theme.colors.primary,\n tip: theme.colors.accent,\n success: theme.colors.accent,\n warning: 'EAB308',\n caution: 'EAB308',\n danger: 'DC2626',\n };\n const color = palette[element.variant] ?? theme.colors.primary;\n const label = element.title ?? element.variant.toUpperCase();\n\n // Card height adapts to content: label row + one line per wrapped line\n const textLines = estimateTextLines(element.content, w);\n const cardH = Math.min(maxH, 0.72 + textLines * 0.3);\n const textH = cardH - 0.44;\n\n // Soft background + left accent bar\n slide.addShape('roundRect' as PptxGenJS.ShapeType, {\n x,\n y: yPos,\n w,\n h: cardH,\n fill: { color, transparency: 88 },\n line: { color, width: 0.75, transparency: 70 },\n rectRadius: 0.08,\n });\n slide.addShape('rect' as PptxGenJS.ShapeType, {\n x,\n y: yPos + 0.12,\n w: 0.07,\n h: cardH - 0.24,\n fill: { color },\n });\n\n slide.addText(label, {\n x: x + 0.2,\n y: yPos + 0.08,\n w: w - 0.4,\n h: 0.3,\n fontSize: theme.fontSize.small,\n fontFace: theme.fonts.heading,\n color,\n bold: true,\n });\n slide.addText(element.content, {\n x: x + 0.2,\n y: yPos + 0.4,\n w: w - 0.4,\n h: textH,\n fontSize: theme.fontSize.body - 1,\n fontFace: theme.fonts.body,\n color: theme.colors.text,\n valign: 'top',\n wrap: true,\n });\n return cardH + 0.1;\n }\n\n default:\n return 0;\n }\n}\n","/**\n * Code-focused slide layout\n */\n\nimport PptxGenJS from 'pptxgenjs';\nimport type { SlideNode } from '../../models/slide.js';\nimport type { Theme } from '../../models/theme.js';\nimport type { RenderContext } from './index.js';\n\nexport async function renderCodeSlide(\n slide: PptxGenJS.Slide,\n node: SlideNode,\n theme: Theme,\n ctx: RenderContext,\n): Promise<void> {\n let yPos = 0.3;\n\n // Title\n if (node.title) {\n slide.addText(node.title, {\n x: 0.5,\n y: yPos,\n w: 12.3,\n h: 0.7,\n fontSize: theme.fontSize.heading,\n fontFace: theme.fonts.heading,\n color: theme.colors.primary,\n bold: true,\n });\n yPos += 0.9;\n }\n\n // Code blocks\n for (const element of node.elements) {\n if (element.type === 'code') {\n const runs = await ctx.highlightCode(\n element.content,\n element.language ?? 'text',\n element.highlightLines,\n );\n\n slide.addText(runs, {\n x: 0.5,\n y: yPos,\n w: 12.3,\n h: 7.5 - yPos - 0.5,\n fill: { color: theme.colors.codeBackground },\n color: theme.colors.codeText,\n fontFace: theme.fonts.code,\n fontSize: theme.fontSize.code,\n valign: 'top',\n paraSpaceAfter: 2,\n margin: [10, 15, 10, 15],\n });\n yPos += 5.0;\n }\n }\n}\n","/**\n * Quote slide layout\n */\n\nimport PptxGenJS from 'pptxgenjs';\nimport type { SlideNode } from '../../models/slide.js';\nimport type { Theme } from '../../models/theme.js';\n\nexport function renderQuoteSlide(\n slide: PptxGenJS.Slide,\n node: SlideNode,\n theme: Theme,\n): void {\n // Big opening quote mark\n slide.addText('\\u201C', {\n x: 1.5,\n y: 1.0,\n w: 2.0,\n h: 1.5,\n fontSize: 72,\n fontFace: 'Georgia',\n color: theme.colors.accent,\n bold: true,\n });\n\n // Quote text\n const quoteElement = node.elements.find((e) => e.type === 'blockquote');\n if (quoteElement && quoteElement.type === 'blockquote') {\n let quoteText = quoteElement.content;\n let attribution = '';\n\n // Extract attribution (— Author pattern)\n const attrMatch = quoteText.match(/\\n?\\s*[—\\u2014-]\\s*(.+)$/);\n if (attrMatch) {\n attribution = attrMatch[1].trim();\n quoteText = quoteText.slice(0, attrMatch.index).trim();\n }\n\n slide.addText(quoteText, {\n x: 1.8,\n y: 2.5,\n w: 9.7,\n h: 2.5,\n fontSize: theme.fontSize.heading,\n fontFace: theme.fonts.body,\n color: theme.colors.text,\n italic: true,\n align: 'center',\n valign: 'middle',\n });\n\n // Attribution\n if (attribution) {\n slide.addText(`— ${attribution}`, {\n x: 1.8,\n y: 5.2,\n w: 9.7,\n h: 0.6,\n fontSize: theme.fontSize.body,\n fontFace: theme.fonts.body,\n color: theme.colors.secondary,\n align: 'right',\n });\n }\n }\n}\n","/**\n * Layout Registry\n * Routes SlideNode to the correct layout renderer\n */\n\nimport PptxGenJS from 'pptxgenjs';\nimport type { SlideNode } from '../../models/slide.js';\nimport type { Theme } from '../../models/theme.js';\nimport type { ImageResolution } from '../image-handler.js';\nimport { log } from '../../utils/progress.js';\nimport { renderTitleSlide } from './title.js';\nimport { renderSectionSlide } from './section.js';\nimport { renderContentSlide } from './content.js';\nimport { renderCodeSlide } from './code.js';\nimport { renderQuoteSlide } from './quote.js';\n\n/** Context passed to layout renderers for async operations */\nexport interface RenderContext {\n highlightCode: (code: string, language: string, highlightLines?: number[]) => Promise<PptxGenJS.TextProps[]>;\n resolveImage: (src: string) => Promise<ImageResolution>;\n renderDiagram: (diagramType: string, code: string) => Promise<Buffer>;\n /** Page footer template with {page}/{total}/{section}/{title} placeholders */\n footerTemplate?: string;\n pageNumber?: number;\n totalSlides?: number;\n /** Title of the most recent section layout slide ({section} placeholder) */\n currentSection?: string;\n}\n\n/**\n * Render a slide using the appropriate layout\n */\nexport async function renderSlideLayout(\n slide: PptxGenJS.Slide,\n node: SlideNode,\n theme: Theme,\n ctx: RenderContext,\n): Promise<void> {\n // @(background=...) overrides the slide's background (image or theme color)\n if (node.directives?.background) {\n const resolved = await ctx.resolveImage(node.directives.background);\n if (resolved.ok && resolved.path) {\n slide.background = { path: resolved.path };\n } else if (node.directives.background.startsWith('#')) {\n slide.background = { color: node.directives.background.replace(/^#/, '') };\n } else if (!resolved.ok) {\n log.warn(`[${node.title ?? 'slide'}] ${resolved.error}`);\n }\n }\n\n switch (node.layout) {\n case 'title':\n renderTitleSlide(slide, node, theme);\n break;\n\n case 'section':\n renderSectionSlide(slide, node, theme);\n break;\n\n case 'code':\n await renderCodeSlide(slide, node, theme, ctx);\n break;\n\n case 'quote':\n renderQuoteSlide(slide, node, theme);\n break;\n\n case 'content':\n default:\n await renderContentSlide(slide, node, theme, ctx);\n break;\n }\n\n // Add speaker notes if present\n if (node.notes) {\n slide.addNotes(node.notes);\n }\n\n // Footer / page number (skip cover slides)\n if (node.layout !== 'title' && node.layout !== 'closing' && node.layout !== 'blank') {\n const footerText = renderFooter(node, theme, ctx);\n if (footerText) {\n slide.addText(footerText, {\n x: 0.6,\n y: 7.16,\n w: 12.13,\n h: 0.28,\n fontSize: theme.fontSize.small - 1,\n fontFace: theme.fonts.body,\n color: theme.colors.secondary,\n align: 'right',\n valign: 'middle',\n });\n }\n }\n}\n\n/** Compose the per-slide footer line from context (section tracking + config footer) */\nfunction renderFooter(node: SlideNode, theme: Theme, ctx: RenderContext): string {\n const template = ctx.footerTemplate;\n if (!template) return '';\n return template\n .replace('{page}', String(ctx.pageNumber))\n .replace('{total}', String(ctx.totalSlides))\n .replace('{section}', ctx.currentSection || '')\n .replace('{title}', node.title ?? '');\n}\n","/**\n * Code Highlighter\n * Uses Shiki for token-level syntax highlighting → pptxgenjs text runs\n */\n\nimport { createHighlighter, type Highlighter } from 'shiki';\nimport type { Theme } from '../models/theme.js';\n\ninterface PptxTextRun {\n text: string;\n options: {\n color?: string;\n fontFace?: string;\n fontSize?: number;\n bold?: boolean;\n italic?: boolean;\n highlight?: string;\n };\n}\n\nlet highlighterInstance: Highlighter | null = null;\n\nasync function getHighlighter(): Promise<Highlighter> {\n if (!highlighterInstance) {\n highlighterInstance = await createHighlighter({\n themes: ['github-dark', 'dracula'],\n langs: [\n 'javascript', 'typescript', 'python', 'java', 'c', 'cpp', 'csharp',\n 'go', 'rust', 'ruby', 'php', 'swift', 'kotlin', 'bash', 'shell',\n 'sql', 'html', 'css', 'json', 'yaml', 'markdown', 'xml', 'docker',\n ],\n });\n }\n return highlighterInstance;\n}\n\n/**\n * Strip '#' prefix from hex color\n */\nfunction cleanColor(color: string | undefined): string {\n if (!color) return 'E2E8F0';\n return color.replace(/^#/, '');\n}\n\n/**\n * Highlight code and return pptxgenjs text runs\n * @param highlightLines 1-based line numbers drawn with a highlight background\n */\nexport async function highlightCode(\n code: string,\n language: string,\n theme: Theme,\n highlightLines: number[] = [],\n): Promise<PptxTextRun[]> {\n const highlighter = await getHighlighter();\n const runs: PptxTextRun[] = [];\n const shikiThemeName = theme.shikiTheme ?? 'github-dark';\n const highlightColor = theme.colors.highlightBackground ?? 'FFF3C4';\n\n try {\n // Load language if not already loaded\n const loadedLangs = highlighter.getLoadedLanguages();\n if (!loadedLangs.includes(language as never)) {\n try {\n await highlighter.loadLanguage(language as never);\n } catch {\n // Language not supported — fall back to plain text\n return [\n {\n text: code,\n options: {\n color: theme.colors.codeText,\n fontFace: theme.fonts.code,\n fontSize: theme.fontSize.code,\n },\n },\n ];\n }\n }\n\n // Load theme if not loaded\n const loadedThemes = highlighter.getLoadedThemes();\n if (!loadedThemes.includes(shikiThemeName as never)) {\n try {\n await highlighter.loadTheme(shikiThemeName as never);\n } catch {\n // Theme not supported — use github-dark fallback\n }\n }\n\n const effectiveTheme = highlighter.getLoadedThemes().includes(shikiThemeName as never)\n ? shikiThemeName\n : 'github-dark';\n\n const result = highlighter.codeToTokens(code, {\n lang: language as never,\n theme: effectiveTheme,\n });\n\n for (let i = 0; i < result.tokens.length; i++) {\n const lineNumber = i + 1;\n const line = result.tokens[i];\n const isHighlighted = highlightLines.includes(lineNumber);\n for (const token of line) {\n const options: PptxTextRun['options'] = {\n color: cleanColor(token.color),\n fontFace: theme.fonts.code,\n fontSize: theme.fontSize.code,\n };\n if (isHighlighted) {\n options.highlight = highlightColor;\n }\n runs.push({ text: token.content, options });\n }\n // Add line break between lines (except last)\n if (i < result.tokens.length - 1) {\n runs.push({\n text: '\\n',\n options: {\n fontFace: theme.fonts.code,\n fontSize: theme.fontSize.code,\n },\n });\n }\n }\n } catch {\n // Fallback: plain text\n runs.push({\n text: code,\n options: {\n color: theme.colors.codeText,\n fontFace: theme.fonts.code,\n fontSize: theme.fontSize.code,\n },\n });\n }\n\n return runs;\n}\n","/**\n * Image Handler\n * Resolves and downloads images for embedding in PPTX\n */\n\nimport { existsSync, writeFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\n/** Outcome of resolving an image source. Failure carries a human-readable reason. */\nexport type ImageResolution =\n | { ok: true; path: string }\n | { ok: false; error: string };\n\nconst REMOTE_FETCH_TIMEOUT_MS = 10_000;\n\n/**\n * Resolve an image source to a local file path or base64 data\n * Never throws — failures are returned as { ok: false, error }.\n */\nexport async function resolveImage(\n src: string,\n basePath: string,\n): Promise<ImageResolution> {\n try {\n // data: URI\n if (src.startsWith('data:')) {\n const match = src.match(/^data:image\\/(\\w+);base64,(.+)/);\n if (match) {\n const ext = match[1];\n const base64 = match[2];\n const tmpPath = join(tmpdir(), `mfly-${randomUUID().slice(0, 8)}.${ext}`);\n writeFileSync(tmpPath, Buffer.from(base64, 'base64'));\n return { ok: true, path: tmpPath };\n }\n return { ok: false, error: `Unsupported data URI: ${src.slice(0, 48)}` };\n }\n\n // URL (http/https)\n if (src.startsWith('http://') || src.startsWith('https://')) {\n let response: Response;\n try {\n response = await fetch(src, { signal: AbortSignal.timeout(REMOTE_FETCH_TIMEOUT_MS) });\n } catch (err) {\n const name = err instanceof Error ? err.name : '';\n const reason = name === 'TimeoutError' || name === 'AbortError'\n ? `request timed out after ${REMOTE_FETCH_TIMEOUT_MS / 1000}s`\n : err instanceof Error ? err.message : String(err);\n return { ok: false, error: `Failed to fetch ${src}: ${reason}` };\n }\n if (!response.ok) {\n return { ok: false, error: `Failed to fetch ${src}: HTTP ${response.status}` };\n }\n\n const buffer = Buffer.from(await response.arrayBuffer());\n const ext = src.split('.').pop()?.split('?')[0] ?? 'png';\n const tmpPath = join(tmpdir(), `mfly-${randomUUID().slice(0, 8)}.${ext}`);\n writeFileSync(tmpPath, buffer);\n return { ok: true, path: tmpPath };\n }\n\n // Local file path (basePath is always a directory)\n const absolutePath = resolve(basePath, src);\n if (existsSync(absolutePath)) {\n return { ok: true, path: absolutePath };\n }\n\n return { ok: false, error: `Image not found: ${src} (resolved to ${absolutePath})` };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n","/**\n * SVG to PNG conversion using @resvg/resvg-js (native N-API binding)\n */\n\n/**\n * Normalize SVG string to guarantee valid dimensions and viewBox for Resvg\n */\nfunction normalizeSvg(svg: string): string {\n let clean = svg.trim();\n\n // Ensure xmlns\n if (!clean.includes('xmlns=')) {\n clean = clean.replace(/<svg\\b([^>]*)>/i, '<svg xmlns=\"http://www.w3.org/2000/svg\" $1>');\n }\n\n // Remove existing width and height attributes (with any units pt/px/%/em) to prevent duplicates or percentage panics\n clean = clean.replace(/(<svg\\b[^>]*)\\s+width=[\"'][^\"']*[\"']/gi, '$1');\n clean = clean.replace(/(<svg\\b[^>]*)\\s+height=[\"'][^\"']*[\"']/gi, '$1');\n\n // Strip SVG marker definitions and references that cause Rust panics in Resvg's geom.rs\n clean = clean.replace(/<marker\\b[\\s\\S]*?<\\/marker>/gi, '');\n clean = clean.replace(/\\s+marker-(end|start|mid)=[\"'][^\"']*[\"']/gi, '');\n\n // Check for viewBox\n const viewBoxMatch = clean.match(/viewBox\\s*=\\s*[\"']([^\"']+)[\"']/i);\n\n if (viewBoxMatch) {\n const parts = viewBoxMatch[1].trim().split(/[\\s,]+/).map(Number);\n if (parts.length === 4 && parts[2] > 0 && parts[3] > 0) {\n const w = parts[2];\n const h = parts[3];\n clean = clean.replace(/<svg\\b([^>]*)>/i, `<svg width=\"${w}\" height=\"${h}\" $1>`);\n }\n } else {\n clean = clean.replace(/<svg\\b([^>]*)>/i, `<svg width=\"800\" height=\"600\" viewBox=\"0 0 800 600\" $1>`);\n }\n\n return clean;\n}\n\n/**\n * Convert SVG string to PNG Buffer\n * @resvg/resvg-js is a native addon — loaded lazily so that runs without\n * diagrams (or on platforms lacking the prebuilt binary) never touch it.\n */\nexport async function svgToPng(svg: string, width: number = 800): Promise<Buffer> {\n const normalized = normalizeSvg(svg);\n const { Resvg } = await import('@resvg/resvg-js');\n const resvg = new Resvg(normalized, {\n fitTo: { mode: 'width' as const, value: width },\n });\n const pngData = resvg.render();\n return Buffer.from(pngData.asPng());\n}\n","/**\n * Diagram theme helpers\n * Shared between mermaid/dot renderers so diagrams follow the presentation theme\n */\n\nimport type { Theme } from '../models/theme.js';\n\n/**\n * True when the theme background is dark (perceived luminance below 50%)\n */\nexport function isDarkColor(hex: string): boolean {\n const clean = hex.replace(/^#/, '');\n if (clean.length < 6) return false;\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n if ([r, g, b].some((n) => Number.isNaN(n))) return false;\n return 0.299 * r + 0.587 * g + 0.114 * b < 128;\n}\n\nexport function isDarkTheme(theme?: Theme): boolean {\n return theme ? isDarkColor(theme.colors.background) : false;\n}\n\n/**\n * Font stack for diagram text: prefers the theme's CJK font so Chinese labels\n * do not fall back to a Latin-only face, e.g. `\"微软雅黑\", \"Segoe UI\", sans-serif`\n */\nexport function diagramFontFamily(theme?: Theme): string {\n if (!theme) return '\"trebuchet ms\", sans-serif';\n return `\"${theme.fonts.cjk}\", \"${theme.fonts.body}\", sans-serif`;\n}\n","/**\n * Mermaid Diagram Renderer\n * Uses mermaid + jsdom to render diagrams to SVG in Node.js\n */\n\nimport type { DiagramRenderer } from './renderer.js';\nimport type { Theme } from '../models/theme.js';\nimport { svgToPng } from './svg-to-png.js';\nimport { isDarkTheme, diagramFontFamily } from './theme.js';\n\nlet initialized = false;\n\n// ---------------------------------------------------------------------------\n// SVG geometry measurement\n//\n// jsdom has no layout engine, so every getBBox() mermaid relies on is a fake.\n// Mermaid sizes its output via `svg.getBBox()` on the root <svg> (its\n// `setupGraphViewbox`), which previously returned a constant 80x40 — far\n// smaller than the actual drawing — so the produced viewBox was tiny and the\n// rasterized PNG turned into a huge zoomed crop (the \"giant purple box\" bug).\n// The polyfills below measure REAL geometry (rect/path/circle/line/... with\n// translate/rotate/scale chains) for the root <svg>; other elements keep the\n// old text heuristics because mermaid's internal node layout already works\n// with them.\n// ---------------------------------------------------------------------------\n\ntype Matrix = [number, number, number, number, number, number];\n\nconst IDENTITY: Matrix = [1, 0, 0, 1, 0, 0];\n\nconst SKIP_TAGS = new Set([\n 'style', 'script', 'defs', 'clippath', 'marker', 'filter', 'mask', 'pattern', 'foreignobject',\n]);\n\n/** 2x3 affine multiply: result = m1·m2 (right operand applies to points first) */\nfunction mul(m1: Matrix, m2: Matrix): Matrix {\n return [\n m1[0] * m2[0] + m1[2] * m2[1],\n m1[1] * m2[0] + m1[3] * m2[1],\n m1[0] * m2[2] + m1[2] * m2[3],\n m1[1] * m2[2] + m1[3] * m2[3],\n m1[0] * m2[4] + m1[2] * m2[5] + m1[4],\n m1[1] * m2[4] + m1[3] * m2[5] + m1[5],\n ];\n}\n\nfunction parseTransform(attr: string | null): Matrix {\n if (!attr) return IDENTITY;\n let m: Matrix = IDENTITY;\n const re = /([a-zA-Z]+)\\s*\\(([^)]*)\\)/g;\n let mt: RegExpExecArray | null;\n while ((mt = re.exec(attr))) {\n const name = mt[1];\n const args = mt[2].trim().split(/[\\s,]+/).filter(Boolean).map(Number);\n if (args.some((n) => !Number.isFinite(n))) continue;\n let next: Matrix | null = null;\n switch (name) {\n case 'matrix':\n if (args.length >= 6) next = [args[0], args[1], args[2], args[3], args[4], args[5]];\n break;\n case 'translate':\n next = [1, 0, 0, 1, args[0] || 0, args[1] || 0];\n break;\n case 'scale': {\n const sx = args[0] || 1;\n const sy = args.length > 1 ? args[1] || 1 : sx;\n next = [sx, 0, 0, sy, 0, 0];\n break;\n }\n case 'rotate': {\n const rad = ((args[0] || 0) * Math.PI) / 180;\n const cos = Math.cos(rad);\n const sin = Math.sin(rad);\n const rot: Matrix = [cos, sin, -sin, cos, 0, 0];\n next =\n args.length >= 3\n ? mul(mul([1, 0, 0, 1, args[1], args[2]], rot), [1, 0, 0, 1, -args[1], -args[2]])\n : rot;\n break;\n }\n case 'skewX':\n next = [1, 0, Math.tan((args[0] || 0) * Math.PI / 180), 1, 0, 0];\n break;\n case 'skewY':\n next = [1, Math.tan((args[0] || 0) * Math.PI / 180), 0, 1, 0, 0];\n break;\n }\n if (next) m = mul(m, next);\n }\n return m;\n}\n\nfunction expandedBox(m: Matrix, b: { x: number; y: number; width: number; height: number }) {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n const pts = [\n [b.x, b.y],\n [b.x + b.width, b.y],\n [b.x, b.y + b.height],\n [b.x + b.width, b.y + b.height],\n ];\n for (const [px, py] of pts) {\n const x = m[0] * px + m[2] * py + m[4];\n const y = m[1] * px + m[3] * py + m[5];\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/** Rough text width: CJK chars ≈ 1em, others ≈ 0.55em (mermaid default 16px) */\nfunction textWidth(el: Element): number {\n let width = 0;\n const collect = (e: Element): void => {\n for (const child of Array.from(e.childNodes)) {\n if (child.nodeType === 3) {\n for (const ch of child.textContent ?? '') {\n width += (ch.codePointAt(0) ?? 0) > 0x2e80 ? 16 : 9;\n }\n } else if (child.nodeType === 1) {\n collect(child as Element);\n }\n }\n };\n collect(el);\n return width;\n}\n\n/** Bounds of a path's geometry; control points included (over-estimate is safe) */\nfunction pathBounds(d: string): { x: number; y: number; width: number; height: number } | null {\n const re = /([a-zA-Z])|(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)/gi;\n const toks: Array<string | number> = [];\n let m: RegExpExecArray | null;\n while ((m = re.exec(d))) toks.push(m[1] ?? parseFloat(m[2]));\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n const add = (x: number, y: number): void => {\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n };\n\n let i = 0;\n let x = 0;\n let y = 0;\n let sx = 0;\n let sy = 0;\n let lastCmd = '';\n let lastRel = false;\n const nums = (count: number): number[] | null => {\n const out: number[] = [];\n while (count-- > 0) {\n const t = toks[i++];\n if (typeof t !== 'number') return null;\n out.push(t);\n }\n return out;\n };\n\n while (i < toks.length) {\n let cmd = toks[i];\n let rel: boolean;\n if (typeof cmd === 'string') {\n rel = cmd === cmd.toLowerCase();\n cmd = cmd.toUpperCase();\n lastCmd = cmd;\n lastRel = rel;\n i++;\n } else {\n // Implicit repeat of the previous command (e.g. value pairs after M)\n cmd = lastCmd;\n rel = lastRel;\n }\n switch (cmd) {\n case 'M': {\n const v = nums(2);\n if (!v) return null;\n x = rel ? x + v[0] : v[0];\n y = rel ? y + v[1] : v[1];\n sx = x;\n sy = y;\n add(x, y);\n lastCmd = 'L'; // subsequent value pairs are implicit lineto\n lastRel = rel;\n break;\n }\n case 'L': {\n const v = nums(2);\n if (!v) return null;\n x = rel ? x + v[0] : v[0];\n y = rel ? y + v[1] : v[1];\n add(x, y);\n break;\n }\n case 'H': {\n const v = nums(1);\n if (!v) return null;\n x = rel ? x + v[0] : v[0];\n add(x, y);\n break;\n }\n case 'V': {\n const v = nums(1);\n if (!v) return null;\n y = rel ? y + v[0] : v[0];\n add(x, y);\n break;\n }\n case 'C': {\n const v = nums(6);\n if (!v) return null;\n // Control points are included; curves stay inside their convex hull\n add(rel ? x + v[0] : v[0], rel ? y + v[1] : v[1]);\n add(rel ? x + v[2] : v[2], rel ? y + v[3] : v[3]);\n x = rel ? x + v[4] : v[4];\n y = rel ? y + v[5] : v[5];\n add(x, y);\n break;\n }\n case 'S':\n case 'Q': {\n const v = nums(4);\n if (!v) return null;\n add(rel ? x + v[0] : v[0], rel ? y + v[1] : v[1]);\n x = rel ? x + v[2] : v[2];\n y = rel ? y + v[3] : v[3];\n add(x, y);\n break;\n }\n case 'T': {\n const v = nums(2);\n if (!v) return null;\n x = rel ? x + v[0] : v[0];\n y = rel ? y + v[1] : v[1];\n add(x, y);\n break;\n }\n case 'A': {\n const v = nums(7);\n if (!v) return null;\n x = rel ? x + v[5] : v[5];\n y = rel ? y + v[6] : v[6];\n add(x, y);\n break;\n }\n case 'Z':\n x = sx;\n y = sy;\n break;\n default:\n return null;\n }\n }\n if (!Number.isFinite(minX)) return null;\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/** Bounds of one element's own geometry, in its local coordinate space */\nfunction elementLocalBox(el: Element): { x: number; y: number; width: number; height: number } | null {\n const tag = el.tagName ? el.tagName.toLowerCase() : '';\n const num = (name: string): number => {\n const v = parseFloat(el.getAttribute(name) ?? '');\n return Number.isFinite(v) ? v : 0;\n };\n switch (tag) {\n case 'rect': {\n const w = num('width');\n const h = num('height');\n if (!(w > 0 && h > 0)) return null;\n return { x: num('x'), y: num('y'), width: w, height: h };\n }\n case 'circle': {\n const r = num('r');\n if (!(r > 0)) return null;\n return { x: num('cx') - r, y: num('cy') - r, width: 2 * r, height: 2 * r };\n }\n case 'ellipse': {\n const rx = num('rx');\n const ry = num('ry');\n if (!(rx > 0 && ry > 0)) return null;\n return { x: num('cx') - rx, y: num('cy') - ry, width: 2 * rx, height: 2 * ry };\n }\n case 'line': {\n const x1 = num('x1');\n const y1 = num('y1');\n const x2 = num('x2');\n const y2 = num('y2');\n return { x: Math.min(x1, x2), y: Math.min(y1, y2), width: Math.abs(x2 - x1), height: Math.abs(y2 - y1) };\n }\n case 'polygon':\n case 'polyline': {\n const pts = (el.getAttribute('points') ?? '').split(/[\\s,]+/).filter(Boolean).map(Number);\n if (pts.length < 4 || pts.some((n) => !Number.isFinite(n))) return null;\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let k = 0; k + 1 < pts.length; k += 2) {\n const px = pts[k];\n const py = pts[k + 1];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n }\n case 'path':\n return pathBounds(el.getAttribute('d') ?? '');\n case 'text':\n case 'tspan': {\n const w = textWidth(el);\n // Mermaid centers node labels (text-anchor: middle); degenerate (empty)\n // labels are dropped so they do not pollute the bounds\n if (w <= 4) return null;\n return { x: num('x') - w / 2, y: num('y') - 14, width: w, height: 24 };\n }\n default:\n return null;\n }\n}\n\n/** Union of all descendant geometry, expressed in the root element's space */\nfunction contentBBox(root: Element): { x: number; y: number; width: number; height: number } | null {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n const accumulate = (b: { x: number; y: number; width: number; height: number }): void => {\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n if (b.x + b.width > maxX) maxX = b.x + b.width;\n if (b.y + b.height > maxY) maxY = b.y + b.height;\n };\n const walk = (el: Element, m: Matrix): void => {\n for (const child of Array.from(el.children)) {\n const tag = child.tagName ? child.tagName.toLowerCase() : '';\n if (SKIP_TAGS.has(tag)) continue;\n const cm = mul(m, parseTransform(child.getAttribute('transform')));\n const local = elementLocalBox(child);\n if (local) {\n const b = expandedBox(cm, local);\n // Skip zero-area geometry (empty labels, straight lines) that would\n // only stretch the bounds by a point\n if (b.width > 0.5 || b.height > 0.5) accumulate(b);\n }\n walk(child, cm);\n }\n };\n walk(root, IDENTITY);\n if (!Number.isFinite(minX)) return null;\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nexport class MermaidDiagramRenderer implements DiagramRenderer {\n readonly type = 'mermaid';\n private renderCounter = 0;\n\n async initialize(): Promise<void> {\n if (initialized) return;\n\n // Set up jsdom globals for mermaid\n const { JSDOM } = await import('jsdom');\n const dom = new JSDOM('<!DOCTYPE html><html><body></body></html>', {\n pretendToBeVisual: true,\n });\n\n // Mermaid requires browser globals\n const assignGlobal = (key: string, value: unknown) => {\n try {\n Object.defineProperty(globalThis, key, {\n value,\n configurable: true,\n writable: true,\n });\n } catch {\n (globalThis as Record<string, unknown>)[key] = value;\n }\n };\n\n assignGlobal('window', dom.window);\n assignGlobal('document', dom.window.document);\n assignGlobal('navigator', dom.window.navigator);\n assignGlobal('DOMParser', dom.window.DOMParser);\n assignGlobal('XMLSerializer', dom.window.XMLSerializer);\n assignGlobal('HTMLElement', dom.window.HTMLElement);\n assignGlobal('SVGElement', dom.window.SVGElement);\n assignGlobal('Element', dom.window.Element);\n assignGlobal('Node', dom.window.Node);\n assignGlobal('Text', dom.window.Text);\n assignGlobal('getComputedStyle', dom.window.getComputedStyle);\n assignGlobal('CustomEvent', dom.window.CustomEvent);\n assignGlobal('Event', dom.window.Event);\n assignGlobal('EventTarget', dom.window.EventTarget);\n assignGlobal('HTMLCollection', dom.window.HTMLCollection);\n assignGlobal('NodeList', dom.window.NodeList);\n assignGlobal('MutationObserver', dom.window.MutationObserver);\n\n // CSSStyleSheet polyfill / bind\n if (dom.window.CSSStyleSheet) {\n assignGlobal('CSSStyleSheet', dom.window.CSSStyleSheet);\n } else {\n class MockCSSStyleSheet {\n cssRules = [];\n insertRule() { return 0; }\n deleteRule() {}\n replaceSync() {}\n replace() { return Promise.resolve(this); }\n }\n assignGlobal('CSSStyleSheet', MockCSSStyleSheet);\n }\n\n // Extract text from direct text nodes or text elements, ignoring <style> and <script>\n const getDirectText = (el: Element): string => {\n const tag = el.tagName ? el.tagName.toLowerCase() : '';\n if (tag === 'style' || tag === 'script' || tag === 'defs' || tag === 'marker') return '';\n let text = '';\n for (const child of Array.from(el.childNodes)) {\n if (child.nodeType === 3) {\n text += child.textContent || '';\n } else if (child.nodeType === 1) {\n const ctag = (child as Element).tagName.toLowerCase();\n if (ctag === 'tspan' || ctag === 'text' || ctag === 'span' || ctag === 'div' || ctag === 'p') {\n text += getDirectText(child as Element);\n }\n }\n }\n return text;\n };\n\n const toRect = (b: { x: number; y: number; width: number; height: number }) => ({\n x: b.x,\n y: b.y,\n width: b.width,\n height: b.height,\n top: b.y,\n right: b.x + b.width,\n bottom: b.y + b.height,\n left: b.x,\n toJSON: () => ({}),\n });\n\n // Polyfill SVG layout methods that JSDOM lacks\n const polyfillBBox = function (this: Element) {\n const tag = this.tagName ? this.tagName.toLowerCase() : '';\n if (tag === 'style' || tag === 'script' || tag === 'defs' || tag === 'clippath' || tag === 'marker') {\n return toRect({ x: 0, y: 0, width: 0, height: 0 });\n }\n // Mermaid sizes the output SVG from getBBox() on the root <svg>. Measure\n // the real geometry instead of a constant, so the viewBox matches content.\n if (tag === 'svg') {\n const box = contentBBox(this);\n if (box) return toRect(box);\n }\n const text = getDirectText(this);\n const width = text ? Math.max(30, text.length * 9 + 20) : 80;\n const height = text ? 28 : 40;\n return toRect({ x: 0, y: 0, width, height });\n };\n\n if (!(dom.window.SVGElement.prototype as unknown as Record<string, unknown>).getBBox) {\n (dom.window.SVGElement.prototype as unknown as Record<string, unknown>).getBBox = polyfillBBox;\n }\n if (!(dom.window.Element.prototype as unknown as Record<string, unknown>).getBBox) {\n (dom.window.Element.prototype as unknown as Record<string, unknown>).getBBox = polyfillBBox;\n }\n if (!dom.window.Element.prototype.getBoundingClientRect) {\n dom.window.Element.prototype.getBoundingClientRect = polyfillBBox as unknown as () => DOMRect;\n }\n const computeTextLength = function (this: Element) {\n const text = getDirectText(this);\n return text.length * 9;\n };\n (dom.window.Element.prototype as unknown as Record<string, unknown>).getComputedTextLength = computeTextLength;\n (dom.window.SVGElement.prototype as unknown as Record<string, unknown>).getComputedTextLength = computeTextLength;\n (dom.window.HTMLElement.prototype as unknown as Record<string, unknown>).getComputedTextLength = computeTextLength;\n\n if (dom.window.HTMLCanvasElement) {\n dom.window.HTMLCanvasElement.prototype.getContext = (() => ({\n measureText: (text: string) => ({ width: text.length * 8 }),\n fillRect: () => {},\n clearRect: () => {},\n getImageData: () => ({ data: new Array(4) }),\n putImageData: () => {},\n createImageData: () => [],\n setTransform: () => {},\n drawImage: () => {},\n save: () => {},\n fillText: () => {},\n restore: () => {},\n beginPath: () => {},\n moveTo: () => {},\n lineTo: () => {},\n closePath: () => {},\n stroke: () => {},\n translate: () => {},\n scale: () => {},\n rotate: () => {},\n arc: () => {},\n fill: () => {},\n })) as unknown as typeof dom.window.HTMLCanvasElement.prototype.getContext;\n }\n\n if (dom.window.SVGSVGElement) {\n if (!dom.window.SVGSVGElement.prototype.createSVGMatrix) {\n dom.window.SVGSVGElement.prototype.createSVGMatrix = () => ({\n a: 1, b: 0, c: 0, d: 1, e: 0, f: 0,\n multiply: function () { return this; },\n inverse: function () { return this; },\n translate: function () { return this; },\n scale: function () { return this; },\n rotate: function () { return this; },\n } as unknown as DOMMatrix);\n }\n if (!dom.window.SVGSVGElement.prototype.createSVGPoint) {\n dom.window.SVGSVGElement.prototype.createSVGPoint = () => ({\n x: 0, y: 0,\n matrixTransform: function () { return this; },\n } as unknown as DOMPoint);\n }\n }\n\n // Mock matchMedia if missing\n if (!dom.window.matchMedia) {\n dom.window.matchMedia = () => ({\n matches: false,\n media: '',\n onchange: null,\n addListener: () => {},\n removeListener: () => {},\n addEventListener: () => {},\n removeEventListener: () => {},\n dispatchEvent: () => false,\n }) as unknown as MediaQueryList;\n }\n\n // Import and initialize mermaid\n const mermaid = (await import('mermaid')).default;\n mermaid.initialize(this.buildConfig() as unknown as Parameters<typeof mermaid.initialize>[0]);\n\n initialized = true;\n }\n\n private buildConfig(theme?: Theme) {\n return {\n startOnLoad: false,\n securityLevel: 'loose',\n // Top-level htmlLabels is required: flowchart-v2 reads it (the\n // flowchart.htmlLabels key is ignored) and html labels rely on real DOM\n // layout (scrollWidth) that jsdom does not provide — with them on, nodes\n // collapse to 60x30 stubs and resvg drops the HTML content entirely.\n htmlLabels: false,\n theme: isDarkTheme(theme) ? 'dark' : 'default',\n themeVariables: {\n fontFamily: diagramFontFamily(theme),\n background: 'transparent',\n },\n flowchart: { htmlLabels: false, curve: 'basis', useMaxWidth: false },\n sequence: { useMaxWidth: false },\n };\n }\n\n async render(code: string, theme?: Theme): Promise<Buffer> {\n await this.initialize();\n\n const mermaid = (await import('mermaid')).default;\n const id = `mfly-mermaid-${Date.now()}-${this.renderCounter++}`;\n\n // Re-apply per render so diagram follows the selected presentation theme\n mermaid.initialize(this.buildConfig(theme) as unknown as Parameters<typeof mermaid.initialize>[0]);\n\n try {\n const { svg } = await mermaid.render(id, code.trim());\n return svgToPng(svg, 1200);\n } catch (err) {\n throw new Error(\n `Mermaid render failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n","/**\n * Graphviz/DOT Diagram Renderer\n * Uses @viz-js/viz (WASM) — works natively in Node.js, no DOM needed\n */\n\nimport type { DiagramRenderer } from './renderer.js';\nimport type { Theme } from '../models/theme.js';\nimport { svgToPng } from './svg-to-png.js';\nimport { isDarkTheme } from './theme.js';\n\nexport class GraphvizDiagramRenderer implements DiagramRenderer {\n readonly type = 'dot';\n private viz: Awaited<ReturnType<typeof import('@viz-js/viz').instance>> | null = null;\n\n async initialize(): Promise<void> {\n if (this.viz) return;\n const vizModule = await import('@viz-js/viz');\n this.viz = await vizModule.instance();\n }\n\n /**\n * Dark theme support: prepend default node/edge/graph attributes so nodes,\n * edges, and labels become light-on-dark. User-specified attrs in the DOT\n * code still win because they appear after these defaults.\n */\n private themeDefaults(code: string, dark: boolean): string {\n if (!dark) return code;\n const prelude =\n ' graph [fontcolor=\"#c9d1d9\" bgcolor=\"transparent\"];\\n' +\n ' node [color=\"#8b949e\" fontcolor=\"#c9d1d9\"];\\n' +\n ' edge [color=\"#8b949e\" fontcolor=\"#c9d1d9\"];\\n';\n return code.replace(/\\{/, `{\\n${prelude}`);\n }\n\n async render(code: string, theme?: Theme): Promise<Buffer> {\n await this.initialize();\n\n try {\n const dark = isDarkTheme(theme);\n const svg = this.viz!.renderString(this.themeDefaults(code.trim(), dark), {\n format: 'svg',\n engine: 'dot',\n graphAttributes: {\n bgcolor: 'transparent',\n },\n });\n return svgToPng(svg, 1200);\n } catch (err) {\n throw new Error(\n `Graphviz render failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }\n}\n","/**\n * ECharts Diagram Renderer\n * Uses ECharts SSR mode — pure Node.js, no DOM/canvas needed\n */\n\nimport type { DiagramRenderer } from './renderer.js';\nimport type { Theme } from '../models/theme.js';\nimport { svgToPng } from './svg-to-png.js';\n\nexport class EChartsDiagramRenderer implements DiagramRenderer {\n readonly type = 'echarts';\n\n async initialize(): Promise<void> {\n // ECharts SSR mode needs no initialization\n }\n\n async render(code: string, _theme?: Theme): Promise<Buffer> {\n const echarts = await import('echarts');\n\n let option: Record<string, unknown>;\n try {\n option = JSON.parse(code.trim());\n } catch {\n throw new Error('ECharts: invalid JSON option');\n }\n\n // Extract optional size hints\n const width = typeof option.width === 'number' ? option.width : 800;\n const height = typeof option.height === 'number' ? option.height : 450;\n delete option.width;\n delete option.height;\n\n // SSR mode: no DOM required\n const chart = echarts.init(null, null, {\n renderer: 'svg',\n ssr: true,\n width,\n height,\n });\n\n try {\n chart.setOption({\n ...option,\n animation: false,\n });\n\n const svg = chart.renderToSVGString();\n return svgToPng(svg, width * 2); // 2x for retina quality\n } finally {\n chart.dispose();\n }\n }\n}\n","/**\n * Diagram Registry\n * Unified entry point for all diagram renderers\n */\n\nimport type { DiagramRenderer } from './renderer.js';\nimport type { Theme } from '../models/theme.js';\nimport { MermaidDiagramRenderer } from './mermaid-renderer.js';\nimport { GraphvizDiagramRenderer } from './graphviz-renderer.js';\nimport { EChartsDiagramRenderer } from './echarts-renderer.js';\n\n/** Language identifiers that are diagrams */\nconst DIAGRAM_LANGUAGES: Record<string, () => DiagramRenderer> = {\n mermaid: () => new MermaidDiagramRenderer(),\n dot: () => new GraphvizDiagramRenderer(),\n graphviz: () => new GraphvizDiagramRenderer(),\n echarts: () => new EChartsDiagramRenderer(),\n};\n\n/** Cached renderer instances (lazy init) */\nconst instances = new Map<string, DiagramRenderer>();\n\nfunction getOrCreate(language: string): DiagramRenderer | undefined {\n // Normalize 'graphviz' → 'dot' for caching\n const key = language === 'graphviz' ? 'dot' : language;\n\n if (instances.has(key)) return instances.get(key)!;\n\n const factory = DIAGRAM_LANGUAGES[language];\n if (!factory) return undefined;\n\n const renderer = factory();\n instances.set(key, renderer);\n return renderer;\n}\n\n/** Check if a code block language is a diagram type */\nexport function isDiagramLanguage(language: string): boolean {\n return language.toLowerCase() in DIAGRAM_LANGUAGES;\n}\n\n/** Get a diagram renderer by language */\nexport function getDiagramRenderer(language: string): DiagramRenderer | undefined {\n return getOrCreate(language.toLowerCase());\n}\n\n/**\n * Render a diagram code block to PNG\n * @returns PNG image as Buffer\n */\nexport async function renderDiagram(\n language: string,\n code: string,\n theme?: Theme,\n): Promise<Buffer> {\n const renderer = getOrCreate(language.toLowerCase());\n if (!renderer) {\n throw new Error(`No diagram renderer for language: ${language}`);\n }\n\n await renderer.initialize();\n return renderer.render(code, theme);\n}\n","/**\n * PNG gradient generator\n * PptxGenJS slide backgrounds only support solid colors or images, so linear\n * gradient backgrounds are rendered here to a small PNG that gets stretched\n * over the whole slide (pptxgenjs emits <a:stretch><a:fillRect/></a:stretch>).\n *\n * Pure Node implementation (zlib + hand-rolled PNG chunks) — no dependencies.\n */\n\nimport { deflateSync } from 'node:zlib';\n\nexport type RgbTuple = readonly [number, number, number];\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) {\n c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n }\n table[n] = c >>> 0;\n }\n return table;\n})();\n\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n for (let i = 0; i < bytes.length; i++) {\n crc = CRC_TABLE[(crc ^ bytes[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction pngChunk(type: string, data: Uint8Array): Buffer {\n const length = Buffer.alloc(4);\n length.writeUInt32BE(data.length);\n const payload = Buffer.concat([Buffer.from(type, 'latin1'), Buffer.from(data)]);\n const crc = Buffer.alloc(4);\n crc.writeUInt32BE(crc32(payload));\n return Buffer.concat([length, payload, crc]);\n}\n\n/** Encode a width×height truecolor (RGB, no alpha) PNG. */\nexport function encodePngRgb(\n width: number,\n height: number,\n pixelAt: (x: number, y: number) => RgbTuple,\n): Buffer {\n const ihdr = Buffer.alloc(13);\n ihdr.writeUInt32BE(width, 0);\n ihdr.writeUInt32BE(height, 4);\n ihdr[8] = 8; // bit depth\n ihdr[9] = 2; // color type: truecolor RGB\n // bytes 10-12 (compression/filter/interlace) stay 0\n\n // Scanlines: filter byte 0 (none) + width * RGB\n const raw = Buffer.alloc(height * (1 + width * 3));\n let offset = 0;\n for (let y = 0; y < height; y++) {\n raw[offset++] = 0;\n for (let x = 0; x < width; x++) {\n const [r, g, b] = pixelAt(x, y);\n raw[offset++] = r;\n raw[offset++] = g;\n raw[offset++] = b;\n }\n }\n const idat = deflateSync(raw, { level: 9 });\n\n return Buffer.concat([\n Buffer.from([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]),\n pngChunk('IHDR', ihdr),\n pngChunk('IDAT', new Uint8Array(idat)),\n pngChunk('IEND', new Uint8Array(0)),\n ]);\n}\n\n/** Parse '#RRGGBB' / 'RRGGBB' / '#RGB' / 'RGB' into an RGB tuple. */\nexport function hexToRgb(hex: string): RgbTuple {\n let s = hex.replace(/^#/, '');\n if (s.length === 3) s = s.split('').map((ch) => ch + ch).join('');\n if (!/^[0-9a-fA-F]{6}$/.test(s)) throw new Error(`Invalid hex color: ${hex}`);\n return [\n parseInt(s.slice(0, 2), 16),\n parseInt(s.slice(2, 4), 16),\n parseInt(s.slice(4, 6), 16),\n ];\n}\n\nexport interface GradientOptions {\n width?: number;\n height?: number;\n}\n\n/**\n * Create a linear-gradient PNG.\n * Angle follows the CSS convention (0° = to top, 90° = to right, 135° = to\n * bottom-right, 180° = to bottom). The default canvas matches the 16:9 slide,\n * so the visual angle survives stretching.\n */\nexport function createLinearGradientPng(\n from: string,\n to: string,\n angleDeg = 180,\n options: GradientOptions = {},\n): Buffer {\n const width = options.width ?? 192;\n const height = options.height ?? 108;\n const angle = (angleDeg * Math.PI) / 180;\n // CSS gradient-line direction in screen coords (y grows downward)\n const dx = Math.sin(angle);\n const dy = -Math.cos(angle);\n // Half the L1 extent of the unit square: keeps the gradient spans 0..1\n // across the full diagonal no matter which angle is given.\n const extent = (Math.abs(dx) + Math.abs(dy)) / 2;\n\n const c1 = hexToRgb(from);\n const c2 = hexToRgb(to);\n\n return encodePngRgb(width, height, (x, y) => {\n const px = x / (width - 1) - 0.5;\n const py = y / (height - 1) - 0.5;\n let t = 0.5 + (px * dx + py * dy) / (2 * extent);\n t = t < 0 ? 0 : t > 1 ? 1 : t;\n return [\n Math.round(c1[0] + (c2[0] - c1[0]) * t),\n Math.round(c1[1] + (c2[1] - c1[1]) * t),\n Math.round(c1[2] + (c2[2] - c1[2]) * t),\n ];\n });\n}\n","/**\n * Slide background resolver\n * Turns the theme's flat color (or linear gradient) into pptxgenjs background props.\n * Gradient PNGs are generated once and cached per gradient definition.\n */\n\nimport type { Theme } from '../models/theme.js';\nimport { createLinearGradientPng } from '../utils/gradient.js';\n\nconst cache = new Map<string, string>();\n\nexport interface SlideBackgroundProps {\n /** Flat fallback color; pptxgenjs ignores it when an image `data` is present */\n color: string;\n /** Base64 PNG stretched over the slide (gradient themes only) */\n data?: string;\n}\n\nexport function slideBackground(theme: Theme): SlideBackgroundProps {\n const gradient = theme.colors.backgroundGradient;\n if (!gradient) return { color: theme.colors.background };\n\n const key = `${gradient.from}|${gradient.to}|${gradient.angle ?? 180}`;\n let data = cache.get(key);\n if (!data) {\n // 192×108 keeps 16:9 so angles look the same as the rendered slide\n const png = createLinearGradientPng(gradient.from, gradient.to, gradient.angle ?? 180, {\n width: 192,\n height: 108,\n });\n data = `image/png;base64,${png.toString('base64')}`;\n cache.set(key, data);\n }\n return { color: theme.colors.background, data };\n}\n","import type { Theme } from '../models/theme.js';\n\nexport const cleanTheme: Theme = {\n name: 'clean',\n colors: {\n primary: '2563EB',\n secondary: '4B5563',\n background: 'FFFFFF',\n text: '1F2937',\n accent: '10B981',\n codeBackground: '1E293B',\n codeText: 'E2E8F0',\n titleBackground: '2563EB',\n titleText: 'FFFFFF',\n },\n fonts: {\n heading: 'Segoe UI',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'github-dark',\n};\n","import type { Theme } from '../models/theme.js';\n\nexport const academicTheme: Theme = {\n name: 'academic',\n colors: {\n primary: '003366',\n secondary: '4A5568',\n background: 'FFFFFF',\n text: '111827',\n accent: '991B1B',\n codeBackground: '1E293B',\n codeText: 'E2E8F0',\n titleBackground: '003366',\n titleText: 'FFFFFF',\n },\n fonts: {\n heading: 'Times New Roman',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '宋体',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'github-dark',\n};\n","import type { Theme } from '../models/theme.js';\n\nexport const darkTheme: Theme = {\n name: 'dark',\n colors: {\n primary: '38BDF8',\n secondary: '94A3B8',\n background: '0F172A',\n text: 'F8FAFC',\n accent: 'A855F7',\n codeBackground: '020617',\n codeText: '38BDF8',\n titleBackground: '0F172A',\n titleText: '38BDF8',\n highlightBackground: '334155',\n backgroundGradient: { from: '0F172A', to: '1E293B', angle: 135 },\n },\n fonts: {\n heading: 'Segoe UI',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'dracula',\n};\n","import type { Theme } from '../models/theme.js';\n\nexport const businessTheme: Theme = {\n name: 'business',\n colors: {\n primary: '1E3A8A',\n secondary: '64748B',\n background: 'F8FAFC',\n text: '0F172A',\n accent: 'D97706',\n codeBackground: '0F172A',\n codeText: 'E2E8F0',\n titleBackground: '1E3A8A',\n titleText: 'FFFFFF',\n },\n fonts: {\n heading: 'Segoe UI',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'github-dark',\n};\n","import type { Theme } from '../models/theme.js';\n\nexport const warmTheme: Theme = {\n name: 'warm',\n colors: {\n primary: '065F46',\n secondary: '78716C',\n background: 'FDFBF7',\n text: '292524',\n accent: 'C2410C',\n codeBackground: '292524',\n codeText: 'FDFBF7',\n titleBackground: '065F46',\n titleText: '292524',\n backgroundGradient: { from: 'FDFBF7', to: 'F5EEDF', angle: 180 },\n },\n fonts: {\n heading: 'Georgia',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'github-dark',\n};\n","import type { Theme } from '../models/theme.js';\n\n/**\n * Aurora — dark neon gradient (mint/blue/purple accents on deep navy),\n * inspired by the SlideForge \"aurora\" deck palette.\n */\nexport const auroraTheme: Theme = {\n name: 'aurora',\n colors: {\n primary: '7AA2FF',\n secondary: '8FA3C9',\n background: '06091C',\n text: 'E8F0FF',\n accent: '5EF2C6',\n codeBackground: '0B1128',\n codeText: 'AECAF5',\n titleText: 'F4F8FF',\n highlightBackground: '233152',\n backgroundGradient: { from: '101A3A', to: '05060F', angle: 135 },\n },\n fonts: {\n heading: 'Segoe UI',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'dracula',\n};\n","import type { Theme } from '../models/theme.js';\n\n/**\n * Neon — high-contrast dark tech theme with cyan/magenta accents,\n * inspired by ppt-agents' \"dark\" (cyan + magenta high contrast).\n */\nexport const neonTheme: Theme = {\n name: 'neon',\n colors: {\n primary: '00E5FF',\n secondary: '9AA4B5',\n background: '121212',\n text: 'FFFFFF',\n accent: 'FF4081',\n codeBackground: '0C0C0C',\n codeText: '85E7F7',\n titleBackground: '121212',\n titleText: '00E5FF',\n highlightBackground: '2A2A32',\n },\n fonts: {\n heading: 'Segoe UI',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'dracula',\n};\n","import type { Theme } from '../models/theme.js';\n\n/**\n * Nord — the classic Arctic Frost palette (frost blues + aurora warm accents).\n */\nexport const nordTheme: Theme = {\n name: 'nord',\n colors: {\n primary: '88C0D0',\n secondary: '81A1C1',\n background: '2E3440',\n text: 'D8DEE9',\n accent: 'EBCB8B',\n codeBackground: '272C36',\n codeText: 'A9BBD3',\n titleBackground: '2E3440',\n titleText: '88C0D0',\n highlightBackground: '3B4252',\n },\n fonts: {\n heading: 'Segoe UI',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'nord',\n};\n","import type { Theme } from '../models/theme.js';\n\n/**\n * Dracula — the official Dracula palette (purple primary + pink accent on charcoal).\n */\nexport const draculaTheme: Theme = {\n name: 'dracula',\n colors: {\n primary: 'BD93F9',\n secondary: '6272A4',\n background: '282A36',\n text: 'F8F8F2',\n accent: 'FF79C6',\n codeBackground: '21222C',\n codeText: 'F8F8F2',\n titleBackground: '282A36',\n titleText: 'BD93F9',\n highlightBackground: '44475A',\n },\n fonts: {\n heading: 'Segoe UI',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'dracula',\n};\n","import type { Theme } from '../models/theme.js';\n\n/**\n * Beige — warm minimal light theme (paper beige, bronze + terracotta accents),\n * inspired by reveal.js' \"beige\" palette.\n */\nexport const beigeTheme: Theme = {\n name: 'beige',\n colors: {\n primary: '8B6F3D',\n secondary: '6B6455',\n background: 'F7F3DE',\n text: '2F2A1F',\n accent: 'C0563C',\n codeBackground: '3A352B',\n codeText: 'E8E0CC',\n titleBackground: '8B6F3D',\n titleText: '2F2A1F',\n highlightBackground: 'F0E2B8',\n backgroundGradient: { from: 'F7F3DE', to: 'F1E8D2', angle: 180 },\n },\n fonts: {\n heading: 'Georgia',\n body: 'Segoe UI',\n code: 'Consolas',\n cjk: '微软雅黑',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'github-dark',\n};\n","import type { Theme } from '../models/theme.js';\n\n/**\n * Ink — Chinese ink-wash style (rice-paper background, ink blacks,\n * vermilion seal-red accent, Kai serif typography).\n */\nexport const inkTheme: Theme = {\n name: 'ink',\n colors: {\n primary: '2F3530',\n secondary: '6F6A5E',\n background: 'F7F4EC',\n text: '262626',\n accent: 'C0272D',\n codeBackground: '2B2924',\n codeText: 'D8D2C0',\n titleBackground: '30352F',\n titleText: '262626',\n highlightBackground: 'EBDDCD',\n backgroundGradient: { from: 'F7F4EC', to: 'EFE8DA', angle: 180 },\n },\n fonts: {\n heading: 'KaiTi',\n body: 'KaiTi',\n code: 'Consolas',\n cjk: 'KaiTi',\n },\n fontSize: {\n title: 36,\n heading: 28,\n body: 18,\n code: 14,\n small: 12,\n },\n shikiTheme: 'github-dark',\n};\n","import type { Theme } from '../models/theme.js';\nimport { cleanTheme } from './clean.js';\n\nexport const defaultTheme: Theme = {\n ...cleanTheme,\n name: 'default',\n};\n","import type { Theme } from '../models/theme.js';\nimport { cleanTheme } from './clean.js';\nimport { academicTheme } from './academic.js';\nimport { darkTheme } from './dark.js';\nimport { businessTheme } from './business.js';\nimport { warmTheme } from './warm.js';\nimport { auroraTheme } from './aurora.js';\nimport { neonTheme } from './neon.js';\nimport { nordTheme } from './nord.js';\nimport { draculaTheme } from './dracula.js';\nimport { beigeTheme } from './beige.js';\nimport { inkTheme } from './ink.js';\nimport { defaultTheme } from './default.js';\n\nexport const themes: Record<string, Theme> = {\n clean: cleanTheme,\n academic: academicTheme,\n dark: darkTheme,\n business: businessTheme,\n warm: warmTheme,\n aurora: auroraTheme,\n neon: neonTheme,\n nord: nordTheme,\n dracula: draculaTheme,\n beige: beigeTheme,\n ink: inkTheme,\n default: defaultTheme,\n};\n\nexport function getTheme(name?: string): Theme {\n if (!name) {\n return cleanTheme;\n }\n if (typeof name !== 'string') {\n throw new Error(`Invalid theme value: expected a string, got ${typeof name}`);\n }\n const theme = themes[name.toLowerCase()];\n if (!theme) {\n console.warn(`Theme \"${name}\" not found, using \"clean\"`);\n return cleanTheme;\n }\n return theme;\n}\n\nexport {\n cleanTheme,\n academicTheme,\n darkTheme,\n businessTheme,\n warmTheme,\n auroraTheme,\n neonTheme,\n nordTheme,\n draculaTheme,\n beigeTheme,\n inkTheme,\n defaultTheme,\n};\n","/**\n * Smart output file naming\n */\n\nimport { existsSync } from 'node:fs';\nimport { basename, extname, dirname, join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\n\n/**\n * Determine output path:\n * 1. If specified, use it\n * 2. Otherwise: input.md → input.pptx\n * 3. If exists: add timestamp\n * 4. If still exists: add 4-char uuid\n */\nexport function getOutputPath(inputPath: string, specifiedOutput?: string): string {\n if (specifiedOutput) return specifiedOutput;\n\n const dir = dirname(inputPath);\n const name = basename(inputPath, extname(inputPath));\n\n // Try simple name\n const simple = join(dir, `${name}.pptx`);\n if (!existsSync(simple)) return simple;\n\n // Add timestamp\n const now = new Date();\n const ts = now.getFullYear().toString() +\n String(now.getMonth() + 1).padStart(2, '0') +\n String(now.getDate()).padStart(2, '0') +\n '-' +\n String(now.getHours()).padStart(2, '0') +\n String(now.getMinutes()).padStart(2, '0') +\n String(now.getSeconds()).padStart(2, '0');\n\n const withTimestamp = join(dir, `${name}-${ts}.pptx`);\n if (!existsSync(withTimestamp)) return withTimestamp;\n\n // Add random suffix\n const uuid = randomUUID().slice(0, 4);\n return join(dir, `${name}-${ts}-${uuid}.pptx`);\n}\n"],"mappings":"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","names":["readFileSync","resolve","series","x","y","DIAGRAM_LANGUAGES","writeFileSync","resolve","existsSync","dirname","join","randomUUID","resolve","readFileSync"]}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "markdownfly",
3
+ "version": "0.1.0",
4
+ "description": "Markdown to PowerPoint (.pptx) CLI tool",
5
+ "type": "module",
6
+ "bin": {
7
+ "mfly": "./dist/cli.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "dev": "tsup --watch",
23
+ "pretest": "tsup",
24
+ "test": "vitest run",
25
+ "test:watch": "vitest",
26
+ "typecheck": "tsc --noEmit",
27
+ "prepack": "tsup"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "git+https://github.com/Kyvin-Guan/markdownFly.git"
32
+ },
33
+ "homepage": "https://github.com/Kyvin-Guan/markdownFly",
34
+ "author": "Kyvin-Guan",
35
+ "engines": {
36
+ "node": ">=20"
37
+ },
38
+ "license": "MIT",
39
+ "keywords": [
40
+ "markdown",
41
+ "pptx",
42
+ "powerpoint",
43
+ "slides",
44
+ "cli",
45
+ "mermaid",
46
+ "graphviz",
47
+ "echarts"
48
+ ],
49
+ "dependencies": {
50
+ "@resvg/resvg-js": "^2.6.0",
51
+ "@viz-js/viz": "^3.0.0",
52
+ "chalk": "^5.4.0",
53
+ "commander": "^13.0.0",
54
+ "echarts": "^5.6.0",
55
+ "fast-glob": "^3.3.0",
56
+ "jsdom": "^25.0.0",
57
+ "mermaid": "^11.0.0",
58
+ "ora": "^8.0.0",
59
+ "pptxgenjs": "^3.12.0",
60
+ "remark-frontmatter": "^5.0.0",
61
+ "remark-gfm": "^4.0.1",
62
+ "remark-parse": "^11.0.0",
63
+ "shiki": "^3.0.0",
64
+ "unified": "^11.0.0",
65
+ "yaml": "^2.7.0"
66
+ },
67
+ "devDependencies": {
68
+ "@types/jsdom": "^21.0.0",
69
+ "@types/mdast": "^4.0.4",
70
+ "@types/node": "^22.0.0",
71
+ "tsup": "^8.0.0",
72
+ "typescript": "^5.7.0",
73
+ "vitest": "^3.0.0"
74
+ }
75
+ }