@ai-matrx/print 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/dist/document.cjs +31 -13
- package/dist/document.cjs.map +1 -1
- package/dist/document.js +31 -13
- package/dist/document.js.map +1 -1
- package/package.json +1 -1
package/dist/document.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/document/settings.ts","../src/document/docx.ts","../src/document/epub.ts","../src/document/html.ts","../src/directives.ts","../src/document/pdf.ts","../src/document/tree.ts","../src/markdown.ts","../src/document/citations.ts","../src/document.ts"],"sourcesContent":["/**\n * Document settings carried in the markdown source's YAML frontmatter.\n *\n * Grammar: the source's FIRST line is exactly `---`; the block ends at the\n * next line that is exactly `---` or `...`; the lines between are YAML 1.2\n * (core schema — `2026-09-25` stays a string). A leading `---` with no closing\n * line is a thematic break, not frontmatter. This is the same rule pandoc,\n * Jekyll, Hugo and Obsidian use.\n *\n * Keys follow pandoc's names where pandoc has one (`title`, `subtitle`,\n * `author`, `date`, `lang`, `papersize`, `geometry`, `toc`, `toc-depth`,\n * `numbersections`, `csl`, `references`, `fontsize`) and accept camelCase /\n * snake_case / kebab-case spellings of every key. Unknown keys are ignored\n * silently (frontmatter is shared with other tools); a KNOWN key with a value\n * we cannot use is announced with the remedy.\n */\n\nimport { parse as parseYaml } from \"yaml\";\nimport type {\n CitationStyle,\n CslItem,\n CslName,\n DocumentNotice,\n DocumentSettings,\n Margins,\n Orientation,\n PageSizeName,\n RunningTemplate,\n} from \"./types\";\n\n/** Portrait page sizes in points. */\nexport const PAGE_SIZES: Readonly<Record<PageSizeName, { width: number; height: number; label: string }>> = {\n letter: { width: 612, height: 792, label: \"Letter\" },\n legal: { width: 612, height: 1008, label: \"Legal\" },\n tabloid: { width: 792, height: 1224, label: \"Tabloid\" },\n executive: { width: 522, height: 756, label: \"Executive\" },\n a3: { width: 841.89, height: 1190.55, label: \"A3\" },\n a4: { width: 595.28, height: 841.89, label: \"A4\" },\n a5: { width: 419.53, height: 595.28, label: \"A5\" },\n b5: { width: 498.9, height: 708.66, label: \"B5\" },\n};\n\nexport const DEFAULT_FOOTER: RunningTemplate = { center: \"Page {page} of {pages}\" };\n\nconst BIBLIOGRAPHY_TITLES: Record<CitationStyle, string> = {\n apa: \"References\",\n mla: \"Works Cited\",\n chicago: \"Bibliography\",\n};\n\nexport interface FrontmatterSplit {\n /** Parsed YAML mapping (empty when there is no frontmatter). */\n data: Record<string, unknown>;\n /** The markdown after the frontmatter block. */\n body: string;\n /** The raw YAML text, or null when the source has no frontmatter. */\n raw: string | null;\n}\n\n/** Split `---` YAML frontmatter off a markdown source. Never throws. */\nexport function splitFrontmatter(source: string, notices?: DocumentNotice[]): FrontmatterSplit {\n const text = source.replace(/^/, \"\");\n const lines = text.split(/\\r?\\n/);\n if (lines[0]?.trim() !== \"---\" || lines[0] !== lines[0].trimStart()) {\n return { data: {}, body: text, raw: null };\n }\n let close = -1;\n for (let i = 1; i < lines.length; i++) {\n const t = (lines[i] as string).trimEnd();\n if (t === \"---\" || t === \"...\") {\n close = i;\n break;\n }\n }\n if (close === -1) return { data: {}, body: text, raw: null };\n const raw = lines.slice(1, close).join(\"\\n\");\n const body = lines.slice(close + 1).join(\"\\n\");\n let data: unknown;\n try {\n data = raw.trim() ? parseYaml(raw) : {};\n } catch (err) {\n notices?.push({\n code: \"frontmatter-invalid\",\n message: `The document settings at the top could not be read: ${(err as Error).message.split(\"\\n\")[0]}`,\n remedy: \"Fix the YAML between the two --- lines (every setting is `name: value`, lists use `- item`).\",\n });\n return { data: {}, body, raw };\n }\n if (data === null || typeof data !== \"object\" || Array.isArray(data)) {\n notices?.push({\n code: \"frontmatter-invalid\",\n message: \"The document settings at the top are not a list of `name: value` settings.\",\n remedy: \"Write one setting per line between the --- lines, e.g. `title: Annual report`.\",\n });\n return { data: {}, body, raw };\n }\n return { data: data as Record<string, unknown>, body, raw };\n}\n\n/** Normalize a key: `toc-depth`, `toc_depth`, `tocDepth` → `tocdepth`. */\nconst norm = (k: string): string => k.replace(/[-_\\s]/g, \"\").toLowerCase();\n\nfunction flatten(data: Record<string, unknown>): Map<string, unknown> {\n const out = new Map<string, unknown>();\n for (const [k, v] of Object.entries(data)) out.set(norm(k), v);\n // `page:` / `print:` / `document:` nested blocks carry the same keys.\n for (const nest of [\"page\", \"print\", \"document\", \"layout\"]) {\n const v = out.get(nest);\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n for (const [k, inner] of Object.entries(v as Record<string, unknown>)) {\n const key = norm(k);\n if (!out.has(key) || nest !== \"page\") out.set(key, inner);\n if (nest === \"page\" && !out.has(`page${key}`)) out.set(`page${key}`, inner);\n }\n }\n }\n return out;\n}\n\nconst str = (v: unknown): string | undefined => {\n if (v === null || v === undefined) return undefined;\n if (typeof v === \"string\") return v.trim() || undefined;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (v instanceof Date) return v.toISOString().slice(0, 10);\n return undefined;\n};\n\nconst bool = (v: unknown): boolean | undefined => {\n if (typeof v === \"boolean\") return v;\n if (typeof v === \"string\") {\n const t = v.trim().toLowerCase();\n if ([\"true\", \"yes\", \"on\", \"1\"].includes(t)) return true;\n if ([\"false\", \"no\", \"off\", \"0\", \"none\"].includes(t)) return false;\n }\n if (typeof v === \"number\") return v !== 0;\n return undefined;\n};\n\n/** A length: `1in`, `2.5cm`, `25mm`, `72pt`, `96px`, or a bare number (inches). */\nexport function parseLength(v: unknown): number | undefined {\n if (typeof v === \"number\" && Number.isFinite(v)) return v * 72;\n if (typeof v !== \"string\") return undefined;\n const m = /^\\s*(-?\\d+(?:\\.\\d+)?)\\s*(in|inch|inches|cm|mm|pt|px|\")?\\s*$/i.exec(v);\n if (!m) return undefined;\n const n = Number(m[1]);\n switch ((m[2] ?? \"in\").toLowerCase()) {\n case \"cm\":\n return (n / 2.54) * 72;\n case \"mm\":\n return (n / 25.4) * 72;\n case \"pt\":\n return n;\n case \"px\":\n return n * 0.75;\n default:\n return n * 72;\n }\n}\n\nfunction parseMargins(v: unknown, base: Margins): Margins | undefined {\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const all = parseLength(o.all ?? o.margin);\n const pick = (k: keyof Margins): number =>\n parseLength(o[k]) ?? parseLength(k === \"left\" || k === \"right\" ? o.x : o.y) ?? all ?? base[k];\n return { top: pick(\"top\"), right: pick(\"right\"), bottom: pick(\"bottom\"), left: pick(\"left\") };\n }\n const parts = (typeof v === \"number\" ? [String(v)] : typeof v === \"string\" ? v.trim().split(/[\\s,]+/) : [])\n .map((p) => parseLength(/^\\d+(\\.\\d+)?$/.test(p) ? Number(p) : p))\n .filter((n): n is number => n !== undefined);\n if (parts.length === 0) return undefined;\n const [t, r = t, b = t, l = r] = parts as [number, number?, number?, number?];\n return { top: t, right: r as number, bottom: b as number, left: l as number };\n}\n\n/** pandoc `geometry: margin=1in` / `geometry: [top=1in, left=1.25in]`. */\nfunction parseGeometry(v: unknown, base: Margins): Margins | undefined {\n const items = Array.isArray(v) ? v.map(String) : typeof v === \"string\" ? v.split(\",\") : [];\n if (items.length === 0) return undefined;\n const m = { ...base };\n let hit = false;\n for (const item of items) {\n const [k, val] = item.split(\"=\").map((s) => s.trim().toLowerCase());\n const len = parseLength(val);\n if (!k || len === undefined) continue;\n hit = true;\n if (k === \"margin\") m.top = m.right = m.bottom = m.left = len;\n else if (k === \"top\" || k === \"tmargin\") m.top = len;\n else if (k === \"bottom\" || k === \"bmargin\") m.bottom = len;\n else if (k === \"left\" || k === \"lmargin\" || k === \"inner\") m.left = len;\n else if (k === \"right\" || k === \"rmargin\" || k === \"outer\") m.right = len;\n else if (k === \"hmargin\") m.left = m.right = len;\n else if (k === \"vmargin\") m.top = m.bottom = len;\n else hit = hit || false;\n }\n return hit ? m : undefined;\n}\n\nfunction parseRunning(v: unknown): RunningTemplate | null | undefined {\n if (v === undefined) return undefined;\n if (v === false || v === null) return null;\n if (typeof v === \"string\") {\n const t = v.trim();\n if (!t || /^(none|off|false)$/i.test(t)) return null;\n // \"left | center | right\" — the Word/Docs three-slot habit.\n if (t.includes(\"|\")) {\n const [left, center, right] = t.split(\"|\").map((s) => s.trim());\n return { left: left || undefined, center: center || undefined, right: right || undefined };\n }\n return { center: t };\n }\n if (typeof v === \"object\" && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n return { left: str(o.left), center: str(o.center ?? o.centre ?? o.middle), right: str(o.right) };\n }\n return undefined;\n}\n\nfunction parseName(n: unknown): CslName | null {\n if (typeof n === \"string\") {\n const t = n.trim();\n if (!t) return null;\n if (t.includes(\",\")) {\n const [family, given] = t.split(\",\").map((s) => s.trim());\n return { family, given: given || undefined };\n }\n const parts = t.split(/\\s+/);\n if (parts.length === 1) return { family: parts[0] };\n return { family: parts[parts.length - 1], given: parts.slice(0, -1).join(\" \") };\n }\n if (n && typeof n === \"object\") {\n const o = n as Record<string, unknown>;\n const family = str(o.family ?? o.last ?? o.surname);\n const given = str(o.given ?? o.first);\n const literal = str(o.literal ?? o.name);\n if (!family && !given && !literal) return null;\n return { family, given, literal };\n }\n return null;\n}\n\n/** Accept CSL-JSON items plus friendly shorthands (`authors: [...]`, `year: 2020`). */\nexport function normalizeReference(raw: unknown): CslItem | null {\n if (!raw || typeof raw !== \"object\") return null;\n const o = raw as Record<string, unknown>;\n const id = str(o.id ?? o.key ?? o[\"citation-key\"]);\n if (!id) return null;\n const names = (v: unknown): CslName[] | undefined => {\n const arr = Array.isArray(v) ? v : typeof v === \"string\" ? v.split(/\\s+and\\s+|;/) : [];\n const out = arr.map(parseName).filter((x): x is CslName => x !== null);\n return out.length ? out : undefined;\n };\n let issued = o.issued && typeof o.issued === \"object\" ? (o.issued as CslItem[\"issued\"]) : undefined;\n const year = o.year ?? o.date ?? (typeof o.issued === \"object\" ? undefined : o.issued);\n if (!issued && year !== undefined) {\n const y = str(year);\n const m = y ? /^(\\d{4})(?:-(\\d{1,2}))?(?:-(\\d{1,2}))?/.exec(y) : null;\n issued = m\n ? { \"date-parts\": [[Number(m[1]), ...(m[2] ? [Number(m[2])] : []), ...(m[3] ? [Number(m[3])] : [])]] }\n : y\n ? { literal: y }\n : undefined;\n }\n return {\n id,\n type: str(o.type),\n title: str(o.title),\n author: names(o.author ?? o.authors),\n editor: names(o.editor ?? o.editors),\n issued,\n \"container-title\": str(o[\"container-title\"] ?? o.containerTitle ?? o.journal ?? o.website ?? o.booktitle),\n publisher: str(o.publisher),\n \"publisher-place\": str(o[\"publisher-place\"] ?? o.publisherPlace ?? o.place ?? o.address),\n volume: str(o.volume),\n issue: str(o.issue ?? o.number),\n page: str(o.page ?? o.pages),\n edition: str(o.edition),\n URL: str(o.URL ?? o.url),\n DOI: str(o.DOI ?? o.doi),\n };\n}\n\nexport interface ResolveSettingsOptions {\n /** Used when the frontmatter has no `title`. */\n title?: string | undefined;\n /** Extra references (e.g. from a host's source records); frontmatter wins on id clash. */\n references?: CslItem[] | undefined;\n /** \"Today\" for `date: today` — injectable so tests are deterministic. */\n now?: Date | undefined;\n}\n\n/** Turn a frontmatter mapping into complete, validated settings. */\nexport function resolveSettings(\n data: Record<string, unknown>,\n notices: DocumentNotice[],\n options: ResolveSettingsOptions = {},\n): DocumentSettings {\n const f = flatten(data);\n const get = (...keys: string[]): unknown => {\n for (const k of keys) if (f.has(k)) return f.get(k);\n return undefined;\n };\n const ignore = (key: string, value: unknown, remedy: string) =>\n notices.push({\n code: \"setting-ignored\",\n message: `The setting \"${key}: ${typeof value === \"object\" ? JSON.stringify(value) : String(value)}\" was not understood, so the default is used.`,\n remedy,\n });\n\n // Page size + orientation.\n let size: PageSizeName = \"letter\";\n let orientation: Orientation = \"portrait\";\n const sizeRaw = get(\"pagesize\", \"papersize\", \"paper\", \"size\");\n if (sizeRaw !== undefined) {\n const s = String(sizeRaw).toLowerCase().replace(/paper$/, \"\").replace(/[\\s-]/g, \"\");\n const words = s.match(/[a-z]+\\d*/g) ?? [];\n const name = words.find((w) => w in PAGE_SIZES) as PageSizeName | undefined;\n if (name) size = name;\n else ignore(\"page size\", sizeRaw, `Use one of: ${Object.keys(PAGE_SIZES).join(\", \")}.`);\n if (/landscape/.test(s)) orientation = \"landscape\";\n }\n const orientRaw = get(\"orientation\", \"pageorientation\");\n if (orientRaw !== undefined) {\n const o = String(orientRaw).toLowerCase();\n if (o === \"landscape\" || o === \"portrait\") orientation = o;\n else ignore(\"orientation\", orientRaw, \"Use `portrait` or `landscape`.\");\n }\n if (bool(get(\"landscape\")) === true) orientation = \"landscape\";\n\n // Margins: 1in all round by default (Word / Docs).\n let margins: Margins = { top: 72, right: 72, bottom: 72, left: 72 };\n const marginRaw = get(\"margins\", \"margin\", \"pagemargins\", \"pagemargin\");\n if (marginRaw !== undefined) {\n const m = parseMargins(marginRaw, margins);\n if (m) margins = m;\n else ignore(\"margins\", marginRaw, \"Write margins like `1in`, `2.5cm`, `20mm`, or `1in 0.75in` (top/bottom left/right).\");\n }\n const geometry = get(\"geometry\");\n if (geometry !== undefined) {\n const m = parseGeometry(geometry, margins);\n if (m) margins = m;\n else ignore(\"geometry\", geometry, \"Write it like pandoc: `geometry: margin=1in`.\");\n }\n for (const side of [\"top\", \"right\", \"bottom\", \"left\"] as const) {\n const v = get(`margin${side}`, `${side}margin`);\n const len = parseLength(v);\n if (len !== undefined) margins[side] = len;\n }\n\n // Cover page.\n const title = str(get(\"title\")) ?? options.title;\n const subtitle = str(get(\"subtitle\"));\n const authorRaw = get(\"author\", \"authors\");\n const author = Array.isArray(authorRaw)\n ? authorRaw\n .map((a) => (typeof a === \"string\" ? a : str((a as Record<string, unknown>)?.name)))\n .filter(Boolean)\n .join(\", \")\n : str(authorRaw);\n let date = str(get(\"date\"));\n if (date && /^today$/i.test(date)) {\n const now = options.now ?? new Date();\n date = now.toLocaleDateString(\"en-US\", { year: \"numeric\", month: \"long\", day: \"numeric\" });\n }\n const logo = str(get(\"logo\", \"coverlogo\"));\n const coverRaw = get(\"cover\", \"coverpage\", \"titlepage\");\n let cover = false;\n if (coverRaw !== undefined) {\n const b = bool(coverRaw);\n if (b === undefined && coverRaw && typeof coverRaw === \"object\") cover = true;\n else if (b === undefined) ignore(\"cover\", coverRaw, \"Use `cover: true` or `cover: false`.\");\n else cover = b;\n }\n if (cover && !title) {\n notices.push({\n code: \"setting-ignored\",\n message: \"A cover page was asked for, but the document has no title.\",\n remedy: \"Add `title: …` to the settings at the top (subtitle, author, date and logo are optional).\",\n });\n }\n\n // Table of contents.\n const tocRaw = get(\"toc\", \"tableofcontents\", \"contents\");\n let tocEnabled = false;\n let tocDepth = 3;\n let tocTitle = \"Contents\";\n if (tocRaw !== undefined) {\n if (tocRaw && typeof tocRaw === \"object\" && !Array.isArray(tocRaw)) {\n const o = tocRaw as Record<string, unknown>;\n tocEnabled = bool(o.enabled ?? true) ?? true;\n const d = Number(o.depth);\n if (Number.isFinite(d)) tocDepth = d;\n tocTitle = str(o.title) ?? tocTitle;\n } else {\n const b = bool(tocRaw);\n if (b === undefined) ignore(\"toc\", tocRaw, \"Use `toc: true`, or `toc: { depth: 2, title: Contents }`.\");\n else tocEnabled = b;\n }\n }\n const depthRaw = get(\"tocdepth\");\n if (depthRaw !== undefined && Number.isFinite(Number(depthRaw))) tocDepth = Number(depthRaw);\n tocDepth = Math.min(6, Math.max(1, Math.round(tocDepth)));\n tocTitle = str(get(\"toctitle\")) ?? tocTitle;\n\n // Running header / footer.\n const headerRaw = get(\"header\", \"pageheader\", \"runningheader\");\n const footerRaw = get(\"footer\", \"pagefooter\", \"runningfooter\");\n let header = parseRunning(headerRaw);\n if (header === undefined) {\n if (headerRaw !== undefined) ignore(\"header\", headerRaw, 'Use text like `header: \"{title} | | {date}\"`, or `header: false`.');\n header = null;\n }\n let footer = parseRunning(footerRaw);\n if (footer === undefined) {\n if (footerRaw !== undefined) ignore(\"footer\", footerRaw, 'Use text like `footer: \"Page {page} of {pages}\"`, or `footer: false`.');\n footer = DEFAULT_FOOTER;\n }\n if (bool(get(\"pagenumbers\")) === false && footerRaw === undefined) footer = null;\n\n const firstRaw = get(\"firstpage\", \"differentfirstpage\", \"titlepageheader\");\n let differentFirstPage = cover;\n if (firstRaw !== undefined) {\n const b = bool(firstRaw);\n if (b !== undefined) differentFirstPage = b || cover;\n else if (/different/i.test(String(firstRaw))) differentFirstPage = true;\n else if (/same/i.test(String(firstRaw))) differentFirstPage = cover;\n else ignore(\"firstPage\", firstRaw, \"Use `firstPage: different` or `firstPage: same`.\");\n }\n\n // Columns.\n let columns: 1 | 2 | 3 = 1;\n const colRaw = get(\"columns\", \"cols\", \"columncount\");\n if (colRaw !== undefined) {\n const n = Number(colRaw);\n if (Number.isInteger(n) && n >= 1 && n <= 3) columns = n as 1 | 2 | 3;\n else ignore(\"columns\", colRaw, \"Use 1, 2 or 3.\");\n }\n\n // Citations.\n let citationStyle: CitationStyle = \"apa\";\n const cslRaw = get(\"citationstyle\", \"csl\", \"citestyle\", \"referencestyle\");\n if (cslRaw !== undefined) {\n const s = String(cslRaw).toLowerCase();\n if (/apa/.test(s)) citationStyle = \"apa\";\n else if (/mla|modern-language/.test(s)) citationStyle = \"mla\";\n else if (/chicago/.test(s)) citationStyle = \"chicago\";\n else ignore(\"citation style\", cslRaw, \"Use `apa`, `mla` or `chicago`.\");\n }\n const refs = new Map<string, CslItem>();\n for (const r of options.references ?? []) refs.set(r.id, r);\n const refsRaw = get(\"references\", \"bibliography\", \"sources\");\n if (refsRaw !== undefined) {\n if (Array.isArray(refsRaw)) {\n for (const r of refsRaw) {\n const item = normalizeReference(r);\n if (item) refs.set(item.id, item);\n else ignore(\"references\", r, \"Every reference needs an `id:` (the key you cite as [@id]) and usually `title`, `author`, `issued`/`year`.\");\n }\n } else if (refsRaw && typeof refsRaw === \"object\") {\n for (const [id, r] of Object.entries(refsRaw as Record<string, unknown>)) {\n const item = normalizeReference({ id, ...(r as object) });\n if (item) refs.set(item.id, item);\n }\n } else if (typeof refsRaw !== \"string\") {\n ignore(\"references\", refsRaw, \"List references as CSL-JSON items: `- id: smith2020` with `title`, `author`, `issued`.\");\n }\n }\n\n let fontSize = 11;\n const fsRaw = get(\"fontsize\", \"basefontsize\");\n if (fsRaw !== undefined) {\n const n = parseLength(typeof fsRaw === \"number\" ? `${fsRaw}pt` : fsRaw);\n if (n && n >= 6 && n <= 24) fontSize = n;\n else ignore(\"fontSize\", fsRaw, \"Use a size in points between 6 and 24, e.g. `fontSize: 11`.\");\n }\n\n return {\n title,\n subtitle,\n author,\n date,\n logo,\n lang: str(get(\"lang\", \"language\")) ?? \"en\",\n page: { size, ...PAGE_SIZES[size], orientation, margins },\n cover: cover && Boolean(title),\n toc: { enabled: tocEnabled, depth: tocDepth, title: tocTitle },\n header,\n footer,\n differentFirstPage,\n columns,\n numberSections: bool(get(\"numbersections\", \"sectionnumbers\", \"numberedheadings\", \"numberheadings\")) ?? false,\n citationStyle,\n bibliographyTitle: str(get(\"bibliographytitle\", \"referencestitle\", \"referencesectiontitle\")) ?? BIBLIOGRAPHY_TITLES[citationStyle],\n references: [...refs.values()],\n hyphenate: bool(get(\"hyphenate\", \"hyphenation\")) ?? true,\n fontSize,\n };\n}\n\n/** Fill a running template for one page. */\nexport function fillTemplate(\n template: string,\n s: DocumentSettings,\n page: number | string,\n pages: number | string,\n): string {\n return template.replace(/\\{(page|pages|title|subtitle|author|date)\\}/gi, (_m, k: string) => {\n switch (k.toLowerCase()) {\n case \"page\":\n return String(page);\n case \"pages\":\n return String(pages);\n case \"title\":\n return s.title ?? \"\";\n case \"subtitle\":\n return s.subtitle ?? \"\";\n case \"author\":\n return s.author ?? \"\";\n default:\n return s.date ?? \"\";\n }\n });\n}\n\n/** Split a template into literal text and `{page}` / `{pages}` field tokens. */\nexport function templateParts(\n template: string,\n s: DocumentSettings,\n): Array<{ text: string } | { field: \"page\" | \"pages\" }> {\n const filled = template.replace(/\\{(title|subtitle|author|date)\\}/gi, (m) => fillTemplate(m, s, \"\", \"\"));\n const out: Array<{ text: string } | { field: \"page\" | \"pages\" }> = [];\n let last = 0;\n for (const m of filled.matchAll(/\\{(page|pages)\\}/gi)) {\n if (m.index! > last) out.push({ text: filled.slice(last, m.index) });\n out.push({ field: (m[1] as string).toLowerCase() as \"page\" | \"pages\" });\n last = m.index! + m[0].length;\n }\n if (last < filled.length) out.push({ text: filled.slice(last) });\n return out;\n}\n","/**\n * DocTree → DOCX (Word). Uses the `docx` package, loaded lazily.\n *\n * Word-native everywhere it matters, so the file keeps working when the reader\n * edits it: real sections (size, margins, orientation, columns per section),\n * running headers/footers with PAGE / NUMPAGES fields, a different first page\n * (titlePage), a real TOC field pre-filled with entries and page numbers (and\n * `updateFields` so Word refreshes it on open), SEQ-field captions with\n * bookmarks, cross-references as internal hyperlinks, heading keep-with-next,\n * widow/orphan control, table rows that never split with repeating header\n * rows, automatic hyphenation.\n */\n\nimport type * as Docx from \"docx\";\nimport type { Block, Caption, DocSection, DocTree, DocumentSettings, ImageMap, Inline, RunningTemplate } from \"./types\";\nimport { templateParts } from \"./settings\";\n\ntype D = typeof Docx;\ntype Child = Docx.Paragraph | Docx.Table | Docx.TableOfContents;\n\nconst TW = 20; // twips per point\n\n/** Drop `undefined` keys: docx's option types forbid explicit undefined. */\nfunction strip<T extends object>(o: T): { [K in keyof T]-?: Exclude<T[K], undefined> } {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) if (v !== undefined) out[k] = v;\n return out as { [K in keyof T]-?: Exclude<T[K], undefined> };\n}\nconst HEX = { text: \"1F2937\", heading: \"111827\", muted: \"6B7280\", link: \"1D4ED8\", rule: \"D1D5DB\", codeBg: \"F6F8FA\", danger: \"B91C1C\" };\nconst MONO = \"Consolas\";\n\ninterface Ctx {\n d: D;\n tree: DocTree;\n s: DocumentSettings;\n images?: ImageMap | undefined;\n bookmarks: Map<string, string>;\n numbering: Map<string, Docx.ILevelsOptions[]>;\n listInstance: number;\n /** Usable text width in points for the current section/column. */\n width: number;\n tocIds: Set<string>;\n minLevel: number;\n}\n\n/** A Word-legal bookmark name for a document id (≤40 chars, [A-Za-z0-9_]). */\nfunction bm(c: Ctx, id: string): string {\n let name = c.bookmarks.get(id);\n if (name) return name;\n const base = `m_${id.replace(/[^A-Za-z0-9_]/g, \"_\")}`.slice(0, 36);\n name = base;\n const used = new Set(c.bookmarks.values());\n for (let n = 2; used.has(name); n++) name = `${base.slice(0, 33)}_${n}`;\n c.bookmarks.set(id, name);\n return name;\n}\n\ninterface RunStyle {\n bold?: boolean;\n italics?: boolean;\n strike?: boolean;\n size?: number;\n color?: string;\n}\n\nfunction runs(nodes: Inline[], c: Ctx, st: RunStyle = {}): Docx.ParagraphChild[] {\n const { d } = c;\n const out: Docx.ParagraphChild[] = [];\n const tr = (text: string, extra: Partial<Docx.IRunOptions> = {}) =>\n new d.TextRun(\n strip({\n text,\n bold: st.bold,\n italics: st.italics,\n strike: st.strike,\n size: st.size ? st.size * 2 : undefined,\n color: st.color,\n ...extra,\n }) as Docx.IRunOptions,\n );\n for (const n of nodes) {\n switch (n.type) {\n case \"text\":\n out.push(tr(n.value));\n break;\n case \"strong\":\n out.push(...runs(n.children, c, { ...st, bold: true }));\n break;\n case \"emphasis\":\n out.push(...runs(n.children, c, { ...st, italics: true }));\n break;\n case \"delete\":\n out.push(...runs(n.children, c, { ...st, strike: true }));\n break;\n case \"code\":\n out.push(tr(n.value, { font: MONO, shading: { type: d.ShadingType.CLEAR, fill: \"F3F4F6\", color: \"auto\" } }));\n break;\n case \"break\":\n out.push(new d.TextRun({ break: 1 }));\n break;\n case \"link\":\n if (/^(https?:|mailto:|tel:)/i.test(n.url)) {\n out.push(\n new d.ExternalHyperlink({\n link: n.url,\n children: runs(n.children, c, { ...st, color: HEX.link }) as Docx.ParagraphChild[] as never,\n }),\n );\n } else out.push(...runs(n.children, c, st));\n break;\n case \"image\":\n out.push(tr(n.alt));\n break;\n case \"xref\": {\n if (!n.resolved) {\n out.push(tr(n.label, { bold: true, color: HEX.danger }));\n break;\n }\n const id = n.target.startsWith(\"sec:\") ? n.target.slice(4) : n.target;\n out.push(new d.InternalHyperlink({ anchor: bm(c, id), children: [tr(n.label, { color: HEX.link })] }));\n break;\n }\n case \"cite\":\n if (n.resolved) {\n out.push(new d.InternalHyperlink({ anchor: bm(c, `ref-${n.keys[0]}`), children: [tr(n.label)] }));\n } else out.push(tr(n.label, { bold: true, color: HEX.danger }));\n break;\n case \"noteRef\":\n out.push(new d.InternalHyperlink({ anchor: bm(c, `note-${n.n}`), children: [tr(String(n.n), { superScript: true, color: HEX.link })] }));\n break;\n }\n }\n return out;\n}\n\nfunction captionParagraph(cap: Caption, c: Ctx, keepNext: boolean): Docx.Paragraph {\n const { d } = c;\n const word = cap.kind === \"fig\" ? \"Figure\" : \"Table\";\n const labelRuns = [new d.TextRun({ text: `${word} `, bold: true }), new d.SimpleField(`SEQ ${word} \\\\* ARABIC`, String(cap.number))];\n const children: Docx.ParagraphChild[] = cap.id\n ? [new d.Bookmark({ id: bm(c, `${cap.kind}:${cap.id}`), children: labelRuns as never })]\n : (labelRuns as never);\n if (cap.children.length) children.push(new d.TextRun({ text: \": \" }), ...runs(cap.children, c));\n return new d.Paragraph({\n style: \"Caption\",\n keepNext,\n keepLines: true,\n alignment: cap.kind === \"fig\" ? d.AlignmentType.CENTER : d.AlignmentType.LEFT,\n children,\n });\n}\n\nfunction numberingRef(c: Ctx, ordered: boolean, start: number): string {\n const ref = ordered ? `matrx-num-${start}` : \"matrx-bullets\";\n if (!c.numbering.has(ref)) {\n const { d } = c;\n const bullets = [\"•\", \"◦\", \"▪\"];\n const formats = [d.LevelFormat.DECIMAL, d.LevelFormat.LOWER_LETTER, d.LevelFormat.LOWER_ROMAN];\n c.numbering.set(\n ref,\n Array.from({ length: 6 }, (_, level) => ({\n level,\n format: ordered ? formats[level % 3] : d.LevelFormat.BULLET,\n text: ordered ? `%${level + 1}.` : bullets[level % 3],\n start: ordered && level === 0 ? start : 1,\n alignment: d.AlignmentType.LEFT,\n style: { paragraph: { indent: { left: 360 * (level + 1) + 60, hanging: 300 } } },\n })) as Docx.ILevelsOptions[],\n );\n }\n return ref;\n}\n\ninterface BlockOpts {\n indent?: number;\n listLevel?: number;\n quote?: boolean;\n}\n\nfunction blocks(list: Block[], c: Ctx, o: BlockOpts = {}): Child[] {\n const out: Child[] = [];\n for (const b of list) out.push(...block(b, c, o));\n return out;\n}\n\nfunction para(c: Ctx, o: BlockOpts, opts: Docx.IParagraphOptions): Docx.Paragraph {\n const { d } = c;\n return new d.Paragraph(\n strip({\n ...opts,\n indent: o.indent ? { left: o.indent } : opts.indent,\n border: o.quote ? { left: { style: d.BorderStyle.SINGLE, size: 18, color: HEX.rule, space: 8 } } : opts.border,\n }) as Docx.IParagraphOptions,\n );\n}\n\nfunction block(b: Block, c: Ctx, o: BlockOpts): Child[] {\n const { d } = c;\n switch (b.type) {\n case \"heading\": {\n const level = Math.min(6, Math.max(1, b.level - c.minLevel + 1));\n const heading = [d.HeadingLevel.HEADING_1, d.HeadingLevel.HEADING_2, d.HeadingLevel.HEADING_3, d.HeadingLevel.HEADING_4, d.HeadingLevel.HEADING_5, d.HeadingLevel.HEADING_6][level - 1];\n const kids = [...(b.number ? [new d.TextRun({ text: `${b.number} `, color: HEX.muted })] : []), ...runs(b.children, c)];\n return [\n new d.Paragraph({\n heading: heading as (typeof d.HeadingLevel)[keyof typeof d.HeadingLevel],\n keepNext: true,\n keepLines: true,\n children: [new d.Bookmark({ id: bm(c, b.id), children: kids as never })],\n // The bibliography/notes headings are not numbered and still in the TOC.\n }),\n ];\n }\n case \"paragraph\":\n return [para(c, o, { children: runs(b.children, c), widowControl: true })];\n case \"list\": {\n const level = o.listLevel ?? 0;\n const ref = numberingRef(c, b.ordered, b.start);\n const instance = ++c.listInstance;\n const out: Child[] = [];\n for (const it of b.items) {\n const [first, ...rest] = it.children;\n const firstRuns = first?.type === \"paragraph\" ? runs(first.children, c) : [];\n if (it.checked !== null) {\n out.push(\n para(c, { ...o, indent: (o.indent ?? 0) + 360 * (level + 1) }, {\n children: [new d.TextRun({ text: it.checked ? \"☒ \" : \"☐ \", font: \"Segoe UI Symbol\" }), ...firstRuns],\n widowControl: true,\n }),\n );\n } else {\n out.push(new d.Paragraph({ numbering: { reference: ref, level, instance }, children: firstRuns, widowControl: true }));\n }\n const tail = first && first.type !== \"paragraph\" ? [first, ...rest] : rest;\n for (const child of tail) {\n if (child.type === \"list\") out.push(...block(child, c, { ...o, listLevel: level + 1 }));\n else out.push(...block(child, c, { ...o, indent: (o.indent ?? 0) + 360 * (level + 1) + 60 }));\n }\n }\n return out;\n }\n case \"blockquote\":\n return blocks(b.children, c, { ...o, indent: (o.indent ?? 0) + 360, quote: true });\n case \"code\": {\n const lines = b.value.replace(/\\n$/, \"\").split(\"\\n\");\n const keep = lines.length <= 45;\n return lines.map(\n (l, i) =>\n new d.Paragraph({\n style: \"SourceCode\",\n keepNext: keep && i < lines.length - 1,\n keepLines: true,\n ...(o.indent ? { indent: { left: o.indent } } : {}),\n children: [new d.TextRun({ text: l.replace(/\\t/g, \" \") || \" \", font: MONO })],\n }),\n );\n }\n case \"table\": {\n const n = Math.max(b.header.length, ...b.rows.map((r) => r.length), 1);\n const keep = b.rows.length <= 20;\n const alignOf = (i: number) =>\n b.align[i] === \"center\" ? d.AlignmentType.CENTER : b.align[i] === \"right\" ? d.AlignmentType.RIGHT : d.AlignmentType.LEFT;\n const border = { style: d.BorderStyle.SINGLE, size: 4, color: \"E5E7EB\" };\n const none = { style: d.BorderStyle.NONE, size: 0, color: \"FFFFFF\" };\n const row = (cells: Inline[][], head: boolean, last: boolean) =>\n new d.TableRow({\n tableHeader: head,\n cantSplit: true,\n children: Array.from(\n { length: n },\n (_, i) =>\n new d.TableCell({\n ...(head ? { shading: { type: d.ShadingType.CLEAR, fill: \"F3F4F6\", color: \"auto\" } } : {}),\n margins: { top: 60, bottom: 60, left: 100, right: 100 },\n borders: { top: none, left: none, right: none, bottom: head ? { ...border, size: 10, color: HEX.heading } : border },\n children: [\n new d.Paragraph({\n alignment: alignOf(i),\n keepNext: keep && !last,\n children: runs(cells[i] ?? [], c, head ? { bold: true } : {}),\n }),\n ],\n }),\n ),\n });\n const out: Child[] = [];\n if (b.caption) out.push(captionParagraph(b.caption, c, true));\n out.push(\n new d.Table({\n width: { size: 100, type: d.WidthType.PERCENTAGE },\n rows: [row(b.header, true, b.rows.length === 0), ...b.rows.map((r, i) => row(r, false, i === b.rows.length - 1))],\n }),\n );\n out.push(new d.Paragraph({ spacing: { after: 60 }, children: [] }));\n return out;\n }\n case \"figure\": {\n const img = c.images?.get(b.url);\n const out: Child[] = [];\n if (img) {\n const maxW = c.width;\n const maxH = (c.s.page.height - c.s.page.margins.top - c.s.page.margins.bottom) * 0.6;\n const scale = Math.min(1, maxW / img.width, maxH / img.height);\n const px = (v: number) => Math.round(v * scale * (96 / 72));\n out.push(\n new d.Paragraph({\n alignment: d.AlignmentType.CENTER,\n keepNext: Boolean(b.caption),\n keepLines: true,\n children: [\n new d.ImageRun({\n type: img.mime === \"image/png\" ? \"png\" : img.mime === \"image/gif\" ? \"gif\" : \"jpg\",\n data: img.bytes,\n transformation: { width: px(img.width), height: px(img.height) },\n altText: { name: b.alt || \"image\", description: b.alt, title: b.alt },\n }),\n ],\n }),\n );\n } else {\n out.push(\n new d.Paragraph({\n alignment: d.AlignmentType.CENTER,\n keepNext: Boolean(b.caption),\n children: [new d.TextRun({ text: `[Image unavailable: ${b.alt || b.url}]`, italics: true, color: HEX.muted })],\n }),\n );\n }\n if (b.caption) out.push(captionParagraph(b.caption, c, false));\n return out;\n }\n case \"rule\":\n return [new d.Paragraph({ border: { bottom: { style: d.BorderStyle.SINGLE, size: 6, color: HEX.rule, space: 1 } }, children: [] })];\n case \"pageBreak\":\n return [new d.Paragraph({ children: [new d.PageBreak()] })];\n case \"toc\":\n return [\n new d.Paragraph({ style: \"TOCHeading\", keepNext: true, children: [new d.TextRun(c.s.toc.title)] }),\n new d.TableOfContents(c.s.toc.title, {\n hyperlink: true,\n headingStyleRange: `1-${c.s.toc.depth}`,\n cachedEntries: c.tree.toc.map((e) => {\n const page = pagesFor(c).get(e.id);\n return { title: e.text, level: e.level, href: bm(c, e.id), ...(page ? { page } : {}) };\n }),\n }),\n ];\n case \"notes\":\n return c.tree.notes.flatMap((n) => {\n const [first, ...rest] = n.children;\n const lead = new d.Paragraph({\n indent: { left: 360, hanging: 360 },\n children: [\n new d.Bookmark({ id: bm(c, `note-${n.n}`), children: [new d.TextRun({ text: `${n.n}.\\t`, color: HEX.muted })] }),\n ...(first?.type === \"paragraph\" ? runs(first.children, c) : []),\n ],\n });\n const tail = first && first.type !== \"paragraph\" ? [first, ...rest] : rest;\n return [lead, ...blocks(tail, c, { indent: 360 })];\n });\n case \"bibliography\":\n return c.tree.bibliography.map(\n (e) =>\n new d.Paragraph({\n indent: { left: 720, hanging: 720 },\n spacing: { after: 120 },\n children: [new d.Bookmark({ id: bm(c, `ref-${e.id}`), children: [] }), ...runs(e.children, c)],\n }),\n );\n }\n}\n\nconst PAGES_KEY = Symbol(\"pages\");\nfunction pagesFor(c: Ctx): Map<string, number> {\n return ((c as unknown as Record<symbol, Map<string, number>>)[PAGES_KEY] ??= new Map());\n}\n\nfunction runningParagraph(t: RunningTemplate, c: Ctx, widthPt: number): Docx.Paragraph {\n const { d } = c;\n const slot = (v: string | undefined): Docx.ParagraphChild[] =>\n v\n ? templateParts(v, c.s).map((p) =>\n \"field\" in p\n ? new d.TextRun({ children: [p.field === \"page\" ? d.PageNumber.CURRENT : d.PageNumber.TOTAL_PAGES], size: 18, color: HEX.muted })\n : new d.TextRun({ text: p.text, size: 18, color: HEX.muted }),\n )\n : [];\n return new d.Paragraph({\n tabStops: [\n { type: d.TabStopType.CENTER, position: Math.round((widthPt / 2) * TW) },\n { type: d.TabStopType.RIGHT, position: Math.round(widthPt * TW) },\n ],\n children: [...slot(t.left), new d.TextRun({ children: [new d.Tab()] }), ...slot(t.center), new d.TextRun({ children: [new d.Tab()] }), ...slot(t.right)],\n });\n}\n\nfunction coverChildren(c: Ctx): Child[] {\n const { d, s } = c;\n const out: Child[] = [];\n const pageH = (s.page.orientation === \"landscape\" ? s.page.width : s.page.height) - s.page.margins.top - s.page.margins.bottom;\n out.push(new d.Paragraph({ spacing: { before: Math.round(pageH * 0.28 * TW) }, children: [] }));\n const logo = s.logo ? c.images?.get(s.logo) : undefined;\n if (logo) {\n const scale = Math.min(1, 160 / logo.width, 72 / logo.height);\n out.push(\n new d.Paragraph({\n spacing: { after: 480 },\n children: [\n new d.ImageRun({\n type: logo.mime === \"image/png\" ? \"png\" : logo.mime === \"image/gif\" ? \"gif\" : \"jpg\",\n data: logo.bytes,\n transformation: { width: Math.round(logo.width * scale * (96 / 72)), height: Math.round(logo.height * scale * (96 / 72)) },\n }),\n ],\n }),\n );\n }\n out.push(new d.Paragraph({ style: \"Title\", children: [new d.TextRun(s.title ?? \"\")] }));\n if (s.subtitle) out.push(new d.Paragraph({ style: \"Subtitle\", children: [new d.TextRun(s.subtitle)] }));\n if (s.author) out.push(new d.Paragraph({ spacing: { before: 720 }, children: [new d.TextRun({ text: s.author, size: 24, color: \"4B5563\" })] }));\n if (s.date) out.push(new d.Paragraph({ children: [new d.TextRun({ text: s.date, size: 24, color: \"4B5563\" })] }));\n out.push(new d.Paragraph({ children: [new d.PageBreak()] }));\n return out;\n}\n\nexport interface DocxOptions {\n images?: ImageMap | undefined;\n /** Heading id → page number (from the PDF layout) for the cached TOC. */\n headingPages?: Map<string, number> | undefined;\n}\n\nexport async function documentToDocx(tree: DocTree, options: DocxOptions = {}): Promise<Uint8Array> {\n const d = (await import(\"docx\")) as D;\n const s = tree.settings;\n const levels: number[] = [];\n for (const sec of tree.sections) for (const b of sec.blocks) if (b.type === \"heading\") levels.push(b.level);\n const c: Ctx = {\n d,\n tree,\n s,\n images: options.images,\n bookmarks: new Map(),\n numbering: new Map(),\n listInstance: 0,\n width: s.page.width - s.page.margins.left - s.page.margins.right,\n tocIds: new Set(tree.toc.map((e) => e.id)),\n minLevel: Math.min(7, ...levels),\n };\n if (options.headingPages) for (const [k, v] of options.headingPages) pagesFor(c).set(k, v);\n\n const m = s.page.margins;\n const sections: Docx.ISectionOptions[] = tree.sections.map((sec: DocSection, idx) => {\n const landscape = sec.orientation === \"landscape\";\n const pageW = landscape ? s.page.height : s.page.width;\n const full = pageW - m.left - m.right;\n const gap = 18;\n c.width = (full - gap * (sec.columns - 1)) / sec.columns;\n const children: Child[] = [];\n if (idx === 0 && s.cover) children.push(...coverChildren(c));\n children.push(...blocks(sec.blocks, c));\n if (children.length === 0) children.push(new d.Paragraph({ children: [] }));\n const header = s.header ? new d.Header({ children: [runningParagraph(s.header, c, full)] }) : undefined;\n const footer = s.footer ? new d.Footer({ children: [runningParagraph(s.footer, c, full)] }) : undefined;\n const firstPageOnly = idx === 0 && s.differentFirstPage;\n return strip({\n properties: strip({\n type: d.SectionType.NEXT_PAGE,\n titlePage: firstPageOnly,\n page: {\n size: { width: Math.round(s.page.width * TW), height: Math.round(s.page.height * TW), orientation: landscape ? d.PageOrientation.LANDSCAPE : d.PageOrientation.PORTRAIT },\n margin: {\n top: Math.round(m.top * TW),\n right: Math.round(m.right * TW),\n bottom: Math.round(m.bottom * TW),\n left: Math.round(m.left * TW),\n header: Math.round(Math.max(18, m.top / 2 - 6) * TW),\n footer: Math.round(Math.max(18, m.bottom / 2 - 6) * TW),\n },\n },\n column: sec.columns > 1 ? { count: sec.columns, space: gap * TW, equalWidth: true } : undefined,\n }),\n headers: header ? { default: header, ...(firstPageOnly ? { first: new d.Header({ children: [new d.Paragraph({ children: [] })] }) } : {}) } : undefined,\n footers: footer ? { default: footer, ...(firstPageOnly ? { first: new d.Footer({ children: [new d.Paragraph({ children: [] })] }) } : {}) } : undefined,\n children,\n }) as Docx.ISectionOptions;\n });\n\n const size = s.fontSize * 2;\n const heading = (id: string, name: string, pt: number, level: number) => ({\n id,\n name,\n basedOn: \"Normal\",\n next: \"Normal\",\n quickFormat: true,\n run: { font: \"Calibri\", size: Math.round(pt * 2), bold: true, color: HEX.heading },\n paragraph: { spacing: { before: Math.round(pt * 14), after: Math.round(pt * 5) }, keepNext: true, keepLines: true, outlineLevel: level },\n });\n const doc = new d.Document({\n creator: s.author ?? \"AI Matrx\",\n title: s.title ?? \"Document\",\n ...(s.subtitle ? { description: s.subtitle } : {}),\n features: { updateFields: true },\n hyphenation: { autoHyphenation: s.hyphenate, doNotHyphenateCaps: true },\n numbering: { config: [...c.numbering.entries()].map(([reference, levels]) => ({ reference, levels })) },\n styles: {\n default: {\n document: { run: { font: \"Cambria\", size, color: HEX.text }, paragraph: { spacing: { after: 140, line: 300 } } },\n },\n paragraphStyles: [\n heading(\"Heading1\", \"Heading 1\", s.fontSize * 1.8, 0),\n heading(\"Heading2\", \"Heading 2\", s.fontSize * 1.45, 1),\n heading(\"Heading3\", \"Heading 3\", s.fontSize * 1.2, 2),\n heading(\"Heading4\", \"Heading 4\", s.fontSize * 1.05, 3),\n heading(\"Heading5\", \"Heading 5\", s.fontSize, 4),\n heading(\"Heading6\", \"Heading 6\", s.fontSize, 5),\n { id: \"Title\", name: \"Title\", basedOn: \"Normal\", run: { font: \"Calibri\", size: 60, bold: true, color: HEX.heading }, paragraph: { spacing: { after: 200 } } },\n { id: \"Subtitle\", name: \"Subtitle\", basedOn: \"Normal\", run: { font: \"Calibri\", size: 32, color: \"4B5563\" } },\n { id: \"Caption\", name: \"Caption\", basedOn: \"Normal\", next: \"Normal\", run: { font: \"Calibri\", size: Math.round(s.fontSize * 1.8), color: HEX.muted }, paragraph: { spacing: { before: 60, after: 160 } } },\n { id: \"TOCHeading\", name: \"TOC Heading\", basedOn: \"Normal\", next: \"Normal\", run: { font: \"Calibri\", size: Math.round(s.fontSize * 2.9), bold: true, color: HEX.heading }, paragraph: { spacing: { after: 200 } } },\n { id: \"SourceCode\", name: \"Source Code\", basedOn: \"Normal\", run: { font: MONO, size: Math.round(s.fontSize * 1.6) }, paragraph: { spacing: { after: 0, line: 260 }, shading: { type: d.ShadingType.CLEAR, fill: HEX.codeBg, color: \"auto\" } } },\n ],\n },\n sections,\n });\n const buf = await d.Packer.toArrayBuffer(doc);\n return renumberBookmarks(new Uint8Array(buf));\n}\n\n/**\n * docx 9 gives EVERY bookmark `w:id=\"1\"` (a fresh id generator per Bookmark),\n * and Word pairs bookmarkStart/End by id — duplicates make cross-references\n * and the TOC's hyperlinks resolve to the wrong place. Our bookmarks never\n * nest, so each start pairs with the next end: renumber them in order.\n */\nexport function renumberBookmarkXml(xml: string): string {\n let n = 0;\n let open: number | null = null;\n return xml.replace(/<w:bookmark(Start|End)\\b([^>]*?)w:id=\"\\d+\"/g, (_m, kind: string, attrs: string) => {\n if (kind === \"Start\") {\n open = ++n;\n return `<w:bookmarkStart${attrs}w:id=\"${open}\"`;\n }\n const id = open ?? ++n;\n open = null;\n return `<w:bookmarkEnd${attrs}w:id=\"${id}\"`;\n });\n}\n\nasync function renumberBookmarks(bytes: Uint8Array): Promise<Uint8Array> {\n const JSZipMod = (await import(\"jszip\")) as unknown as { default?: unknown };\n const JSZip = (JSZipMod.default ?? JSZipMod) as {\n loadAsync: (b: Uint8Array) => Promise<{\n file: ((name: string) => { async: (t: \"string\") => Promise<string> } | null) & ((name: string, data: string) => void);\n generateAsync: (o: Record<string, unknown>) => Promise<Uint8Array>;\n }>;\n };\n const zip = await JSZip.loadAsync(bytes);\n const entry = zip.file(\"word/document.xml\");\n if (!entry) return bytes;\n const xml = await entry.async(\"string\");\n zip.file(\"word/document.xml\", renumberBookmarkXml(xml));\n return zip.generateAsync({ type: \"uint8array\", compression: \"DEFLATE\" });\n}\n","/**\n * DocTree → EPUB 3 (reflowable). The same block renderer as the HTML output\n * (XHTML mode), one chapter per top-level heading, a navigation document built\n * from the same TOC entries, images packaged inside the book.\n *\n * Container rules honoured: `mimetype` is the first entry and STORED\n * (uncompressed); META-INF/container.xml points at the package document;\n * nav.xhtml carries `epub:type=\"toc\"`; dcterms:modified is set.\n */\n\nimport { escapeHtml } from \"@ai-matrx/kit/html-escape\";\nimport { coverHtml, renderBlocksHtml, type HtmlRenderContext } from \"./html\";\nimport type { Block, DocTree, ImageMap } from \"./types\";\n\ninterface Chapter {\n file: string;\n title: string;\n blocks: Block[];\n}\n\nconst EPUB_CSS = `\nbody{font-family:Georgia,\"Times New Roman\",serif;line-height:1.5;color:#1f2937;margin:0 5%;}\nh1,h2,h3,h4,h5,h6{font-family:\"Helvetica Neue\",Arial,sans-serif;line-height:1.25;page-break-after:avoid;break-after:avoid;color:#111827;}\np{margin:0 0 0.7em;orphans:2;widows:2;hyphens:auto;-epub-hyphens:auto;}\npre.doc-code{font-family:Menlo,Consolas,monospace;font-size:0.8em;white-space:pre-wrap;background:#f6f8fa;padding:0.6em;border:1px solid #e5e7eb;page-break-inside:avoid;}\ncode{font-family:Menlo,Consolas,monospace;font-size:0.9em;}\ntable{border-collapse:collapse;width:100%;font-size:0.9em;}\nth,td{border-bottom:1px solid #e5e7eb;padding:0.25em 0.4em;text-align:left;vertical-align:top;}\nth{border-bottom:1.5px solid #111827;}\ncaption,figcaption,.doc-caption{font-size:0.9em;color:#4b5563;text-align:left;}\n.doc-caption-label{font-weight:bold;color:#111827;}\nfigure{margin:1em 0;text-align:center;page-break-inside:avoid;}\nfigure img{max-width:100%;}\nblockquote{margin:0 0 0.8em;padding-left:1em;border-left:3px solid #d1d5db;color:#4b5563;}\n.doc-task-list{list-style:none;padding-left:0.2em;}\n.doc-task-box{display:inline-block;width:0.8em;height:0.8em;border:1px solid #374151;margin-right:0.4em;}\n.doc-task-box.is-checked{background:#374151;}\n.doc-toc ol{list-style:none;padding-left:0;}\n.doc-bibliography .doc-ref{padding-left:2em;text-indent:-2em;}\n.doc-cover{text-align:center;margin-top:30%;}\n.doc-cover-logo{max-height:5em;}\n.doc-cover-title{font-size:2em;}\n.matrx-page-break{page-break-after:always;break-after:page;}\n`.trim();\n\nfunction extOf(mime: string): string {\n return mime === \"image/png\" ? \"png\" : mime === \"image/gif\" ? \"gif\" : \"jpg\";\n}\n\nfunction xhtml(title: string, lang: string, body: string): string {\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" lang=\"${escapeHtml(lang)}\" xml:lang=\"${escapeHtml(lang)}\">\n<head><meta charset=\"utf-8\"/><title>${escapeHtml(title)}</title><link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\"/></head>\n<body>\n${body}\n</body>\n</html>`;\n}\n\nfunction uuid(): string {\n const g = globalThis as unknown as { crypto?: { randomUUID?: () => string } };\n if (g.crypto?.randomUUID) return g.crypto.randomUUID();\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n return (ch === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport interface EpubOptions {\n images?: ImageMap | undefined;\n /** Book identifier (defaults to a random urn:uuid). */\n identifier?: string | undefined;\n /** Modification time — injectable for deterministic tests. */\n now?: Date | undefined;\n}\n\nexport async function documentToEpub(tree: DocTree, options: EpubOptions = {}): Promise<Uint8Array> {\n const JSZipMod = (await import(\"jszip\")) as unknown as { default?: unknown };\n const JSZip = (JSZipMod.default ?? JSZipMod) as new () => {\n file: (name: string, data: string | Uint8Array, opts?: Record<string, unknown>) => void;\n generateAsync: (o: Record<string, unknown>) => Promise<Uint8Array>;\n };\n const s = tree.settings;\n const lang = s.lang || \"en\";\n\n // Chapters: split at the shallowest heading level.\n const levels: number[] = [];\n for (const sec of tree.sections) for (const b of sec.blocks) if (b.type === \"heading\") levels.push(b.level);\n const top = Math.min(7, ...levels);\n const chapters: Chapter[] = [];\n let current: Chapter | null = null;\n for (const sec of tree.sections) {\n for (const b of sec.blocks) {\n if (b.type === \"pageBreak\") continue;\n if (b.type === \"heading\" && b.level === top && current && current.blocks.length) current = null;\n if (!current) {\n current = { file: `chapter-${chapters.length + 1}.xhtml`, title: b.type === \"heading\" ? b.plain : (s.title ?? \"Start\"), blocks: [] };\n chapters.push(current);\n }\n current.blocks.push(b);\n }\n }\n if (chapters.length === 0) chapters.push({ file: \"chapter-1.xhtml\", title: s.title ?? \"Document\", blocks: [] });\n\n // Where every id lives, for cross-chapter links.\n const home = new Map<string, string>();\n const walk = (file: string, list: Block[]) => {\n for (const b of list) {\n if (b.type === \"heading\") home.set(b.id, file);\n if (b.type === \"figure\" && b.caption?.id) home.set(`fig:${b.caption.id}`, file);\n if (b.type === \"table\" && b.caption?.id) home.set(`tbl:${b.caption.id}`, file);\n if (b.type === \"bibliography\") for (const e of tree.bibliography) home.set(`ref-${e.id}`, file);\n if (b.type === \"notes\") for (const n of tree.notes) home.set(`note-${n.n}`, file);\n if (b.type === \"list\") for (const it of b.items) walk(file, it.children);\n if (b.type === \"blockquote\") walk(file, b.children);\n }\n };\n for (const ch of chapters) walk(ch.file, ch.blocks);\n\n // Images packaged in the book.\n const imagePaths = new Map<string, { path: string; mime: string; bytes: Uint8Array }>();\n let imgN = 0;\n for (const [url, img] of options.images ?? new Map()) {\n if (!img) continue;\n imgN++;\n imagePaths.set(url, { path: `images/img-${imgN}.${extOf(img.mime)}`, mime: img.mime, bytes: img.bytes });\n }\n\n const zip = new JSZip();\n zip.file(\"mimetype\", \"application/epub+zip\", { compression: \"STORE\" });\n zip.file(\n \"META-INF/container.xml\",\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<container version=\"1.0\" xmlns=\"urn:oasis:names:tc:opendocument:xmlns:container\">\n<rootfiles><rootfile full-path=\"OEBPS/content.opf\" media-type=\"application/oebps-package+xml\"/></rootfiles>\n</container>`,\n );\n zip.file(\"OEBPS/style.css\", EPUB_CSS);\n for (const img of imagePaths.values()) zip.file(`OEBPS/${img.path}`, img.bytes);\n\n const makeCtx = (file: string): HtmlRenderContext => ({\n tree,\n xhtml: true,\n hrefFor: (id) => {\n const target = home.get(id) ?? file;\n return target === file ? `#${id}` : `${target}#${id}`;\n },\n srcFor: (url) => imagePaths.get(url)?.path ?? url,\n });\n\n const spine: string[] = [];\n const manifest: string[] = [\n `<item id=\"nav\" href=\"nav.xhtml\" media-type=\"application/xhtml+xml\" properties=\"nav\"/>`,\n `<item id=\"css\" href=\"style.css\" media-type=\"text/css\"/>`,\n ];\n if (s.cover) {\n zip.file(\"OEBPS/cover.xhtml\", xhtml(s.title ?? \"Cover\", lang, coverHtml(s, makeCtx(\"cover.xhtml\"))));\n manifest.push(`<item id=\"cover\" href=\"cover.xhtml\" media-type=\"application/xhtml+xml\"/>`);\n spine.push(`<itemref idref=\"cover\"/>`);\n }\n chapters.forEach((ch, i) => {\n zip.file(`OEBPS/${ch.file}`, xhtml(ch.title, lang, renderBlocksHtml(ch.blocks, makeCtx(ch.file))));\n manifest.push(`<item id=\"ch${i + 1}\" href=\"${ch.file}\" media-type=\"application/xhtml+xml\"/>`);\n spine.push(`<itemref idref=\"ch${i + 1}\"/>`);\n });\n let n = 0;\n for (const img of imagePaths.values()) {\n n++;\n manifest.push(\n `<item id=\"img${n}\" href=\"${img.path}\" media-type=\"${img.mime}\"${s.logo && imagePaths.get(s.logo)?.path === img.path ? ' properties=\"cover-image\"' : \"\"}/>`,\n );\n }\n\n // Navigation document: every TOC entry (or one per chapter when none).\n const entries = tree.toc.length\n ? tree.toc\n : chapters.map((ch) => ({ id: \"\", level: 1, text: ch.title, file: ch.file }));\n const navItems = entries\n .map((e) => {\n const file = \"file\" in e ? (e.file as string) : (home.get(e.id) ?? chapters[0]!.file);\n const hrefAttr = e.id ? `${file}#${e.id}` : file;\n return `<li class=\"toc-l${e.level}\"><a href=\"${escapeHtml(hrefAttr)}\">${escapeHtml(e.text)}</a></li>`;\n })\n .join(\"\\n\");\n zip.file(\n \"OEBPS/nav.xhtml\",\n xhtml(\n s.toc.title,\n lang,\n `<nav epub:type=\"toc\" id=\"toc\"><h1>${escapeHtml(s.toc.title)}</h1><ol>\\n${navItems}\\n</ol></nav>`,\n ),\n );\n\n const modified = (options.now ?? new Date()).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n const id = options.identifier ?? `urn:uuid:${uuid()}`;\n zip.file(\n \"OEBPS/content.opf\",\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" unique-identifier=\"bookid\" xml:lang=\"${escapeHtml(lang)}\">\n<metadata xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n<dc:identifier id=\"bookid\">${escapeHtml(id)}</dc:identifier>\n<dc:title>${escapeHtml(s.title ?? \"Document\")}</dc:title>\n<dc:language>${escapeHtml(lang)}</dc:language>\n${s.author ? `<dc:creator>${escapeHtml(s.author)}</dc:creator>` : \"\"}\n${s.date ? `<dc:date>${escapeHtml(s.date)}</dc:date>` : \"\"}\n<meta property=\"dcterms:modified\">${modified}</meta>\n</metadata>\n<manifest>\n${manifest.join(\"\\n\")}\n</manifest>\n<spine>\n${spine.join(\"\\n\")}\n</spine>\n</package>`,\n );\n\n return zip.generateAsync({ type: \"uint8array\", compression: \"DEFLATE\", mimeType: \"application/epub+zip\" });\n}\n","/**\n * DocTree → HTML. Two uses, one renderer:\n * • `documentToHtml` — a standalone, print-grade HTML file: CSS paged media\n * (@page size/margins/orientation, running header/footer margin boxes with\n * \"Page X of Y\", a different first page, named landscape pages per\n * section, columns, widow/orphan control, keep-with-next headings, no\n * breaks inside tables/code/figures, hyphenation), always light.\n * • `renderBlocksHtml` — the block renderer the EPUB writer reuses (XHTML).\n */\n\nimport { escapeHtml } from \"@ai-matrx/kit/html-escape\";\nimport { PAGE_BREAK_CLASS } from \"../directives\";\nimport { PAGE_SIZES, templateParts } from \"./settings\";\nimport type { Block, Caption, DocTree, DocumentSettings, ImageMap, Inline, RunningTemplate } from \"./types\";\n\nexport interface HtmlRenderContext {\n tree: DocTree;\n images?: ImageMap | undefined;\n /** XHTML output (EPUB): self-closed void elements. */\n xhtml?: boolean;\n /** Where an in-document id lives (EPUB chapters split the document). */\n hrefFor?: (id: string) => string;\n /** Image URL override (EPUB packages images inside the book). */\n srcFor?: (url: string) => string;\n}\n\nconst SAFE_URL = /^(?:https?:|mailto:|tel:|#|\\/|\\.{0,2}\\/|data:image\\/(?:png|jpe?g|gif|webp);)/i;\n\nfunction safeUrl(url: string): string | null {\n const u = url.trim();\n if (!u) return null;\n if (!/^[a-z][a-z0-9+.-]*:/i.test(u)) return u; // relative\n return SAFE_URL.test(u) ? u : null;\n}\n\nconst br = (x: HtmlRenderContext) => (x.xhtml ? \"<br/>\" : \"<br>\");\n\nexport function renderInlineHtml(nodes: Inline[], x: HtmlRenderContext): string {\n return nodes\n .map((n) => {\n switch (n.type) {\n case \"text\":\n return escapeHtml(n.value);\n case \"strong\":\n return `<strong>${renderInlineHtml(n.children, x)}</strong>`;\n case \"emphasis\":\n return `<em>${renderInlineHtml(n.children, x)}</em>`;\n case \"delete\":\n return `<del>${renderInlineHtml(n.children, x)}</del>`;\n case \"code\":\n return `<code>${escapeHtml(n.value)}</code>`;\n case \"break\":\n return br(x);\n case \"link\": {\n const href = safeUrl(n.url);\n const inner = renderInlineHtml(n.children, x);\n return href ? `<a href=\"${escapeHtml(href)}\">${inner}</a>` : inner;\n }\n case \"image\": {\n const src = imageSrc(n.url, x);\n if (!src) return escapeHtml(n.alt);\n return `<img class=\"doc-inline-img\" src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(n.alt)}\"${x.xhtml ? \"/\" : \"\"}>`;\n }\n case \"xref\": {\n if (!n.resolved) return `<span class=\"doc-xref-missing\">${escapeHtml(n.label)}</span>`;\n const id = n.target.startsWith(\"sec:\") ? n.target.slice(4) : n.target;\n return `<a class=\"doc-xref\" href=\"${escapeHtml(href(id, x))}\">${escapeHtml(n.label)}</a>`;\n }\n case \"cite\":\n return n.resolved\n ? `<a class=\"doc-cite\" href=\"${escapeHtml(href(\"ref-\" + (n.keys[0] ?? \"\"), x))}\">${escapeHtml(n.label)}</a>`\n : `<span class=\"doc-cite doc-cite-missing\">${escapeHtml(n.label)}</span>`;\n case \"noteRef\":\n return `<sup class=\"doc-note-ref\"><a href=\"${escapeHtml(href(`note-${n.n}`, x))}\" id=\"noteref-${n.n}\">${n.n}</a></sup>`;\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\nconst href = (id: string, x: HtmlRenderContext) => (x.hrefFor ? x.hrefFor(id) : `#${id}`);\n\nfunction imageSrc(url: string, x: HtmlRenderContext): string | null {\n if (x.srcFor) return x.srcFor(url);\n const resolved = x.images?.get(url);\n if (resolved) return resolved.dataUrl;\n return safeUrl(url);\n}\n\nfunction captionHtml(c: Caption, tag: \"figcaption\" | \"caption\", x: HtmlRenderContext): string {\n const text = renderInlineHtml(c.children, x);\n return `<${tag} class=\"doc-caption\"><span class=\"doc-caption-label\">${c.label}</span>${text ? `: ${text}` : \"\"}</${tag}>`;\n}\n\nfunction tocHtml(x: HtmlRenderContext): string {\n const { tree } = x;\n const items = tree.toc\n .map(\n (e) =>\n `<li class=\"toc-l${e.level}\"><a href=\"${escapeHtml(href(e.id, x))}\"><span class=\"toc-text\">${escapeHtml(e.text)}</span><span class=\"toc-page\"></span></a></li>`,\n )\n .join(\"\");\n return `<nav class=\"doc-toc\" role=\"doc-toc\"><h2 class=\"doc-toc-title\">${escapeHtml(\n tree.settings.toc.title,\n )}</h2><ol>${items}</ol></nav>`;\n}\n\nexport function renderBlocksHtml(blocks: Block[], x: HtmlRenderContext): string {\n return blocks.map((b) => renderBlockHtml(b, x)).join(\"\\n\");\n}\n\nfunction renderBlockHtml(b: Block, x: HtmlRenderContext): string {\n switch (b.type) {\n case \"heading\": {\n const num = b.number ? `<span class=\"doc-heading-number\">${b.number}</span> ` : \"\";\n return `<h${b.level} id=\"${escapeHtml(b.id)}\">${num}${renderInlineHtml(b.children, x)}</h${b.level}>`;\n }\n case \"paragraph\":\n return `<p>${renderInlineHtml(b.children, x)}</p>`;\n case \"list\": {\n const tag = b.ordered ? \"ol\" : \"ul\";\n const start = b.ordered && b.start !== 1 ? ` start=\"${b.start}\"` : \"\";\n const task = b.items.some((i) => i.checked !== null);\n const items = b.items\n .map((i) => {\n const box =\n i.checked === null\n ? \"\"\n : `<span class=\"doc-task-box${i.checked ? \" is-checked\" : \"\"}\" role=\"img\" aria-label=\"${i.checked ? \"done\" : \"not done\"}\"></span>`;\n const inner =\n i.children.length === 1 && i.children[0]?.type === \"paragraph\"\n ? renderInlineHtml(i.children[0].children, x)\n : renderBlocksHtml(i.children, x);\n return `<li${i.checked !== null ? ' class=\"doc-task\"' : \"\"}>${box}${inner}</li>`;\n })\n .join(\"\");\n return `<${tag}${start}${task ? ' class=\"doc-task-list\"' : \"\"}>${items}</${tag}>`;\n }\n case \"blockquote\":\n return `<blockquote>${renderBlocksHtml(b.children, x)}</blockquote>`;\n case \"code\":\n return `<pre class=\"doc-code\"${b.lang ? ` data-language=\"${escapeHtml(b.lang)}\"` : \"\"}><code>${escapeHtml(\n b.value,\n )}</code></pre>`;\n case \"table\": {\n const al = (i: number) => {\n const a = b.align[i];\n return a ? ` style=\"text-align:${a}\"` : \"\";\n };\n const head = `<thead><tr>${b.header.map((c, i) => `<th${al(i)}>${renderInlineHtml(c, x)}</th>`).join(\"\")}</tr></thead>`;\n const body = `<tbody>${b.rows\n .map((r) => `<tr>${r.map((c, i) => `<td${al(i)}>${renderInlineHtml(c, x)}</td>`).join(\"\")}</tr>`)\n .join(\"\")}</tbody>`;\n const id = b.caption?.id ? ` id=\"tbl:${escapeHtml(b.caption.id)}\"` : \"\";\n return `<div class=\"doc-table-wrap\"${id}><table>${b.caption ? captionHtml(b.caption, \"caption\", x) : \"\"}${head}${body}</table></div>`;\n }\n case \"figure\": {\n const src = imageSrc(b.url, x);\n const id = b.caption?.id ? ` id=\"fig:${escapeHtml(b.caption.id)}\"` : \"\";\n const img = src\n ? `<img src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(b.alt)}\"${x.xhtml ? \"/\" : \"\"}>`\n : `<div class=\"doc-image-missing\">Image unavailable: ${escapeHtml(b.alt || b.url)}</div>`;\n return `<figure class=\"doc-figure\"${id}>${img}${b.caption ? captionHtml(b.caption, \"figcaption\", x) : \"\"}</figure>`;\n }\n case \"rule\":\n return `<hr${x.xhtml ? \"/\" : \"\"}>`;\n case \"pageBreak\":\n return `<div class=\"${PAGE_BREAK_CLASS}\" role=\"separator\" aria-label=\"Page break\"></div>`;\n case \"toc\":\n return tocHtml(x);\n case \"notes\":\n return `<ol class=\"doc-notes\">${x.tree.notes\n .map(\n (n) =>\n `<li id=\"note-${n.n}\">${renderBlocksHtml(n.children, x)} <a class=\"doc-note-back\" href=\"${escapeHtml(\n href(`noteref-${n.n}`, x),\n )}\" aria-label=\"Back to text\">↩</a></li>`,\n )\n .join(\"\")}</ol>`;\n case \"bibliography\":\n return `<div class=\"doc-bibliography\" role=\"doc-bibliography\">${x.tree.bibliography\n .map((e) => `<p class=\"doc-ref\" id=\"ref-${escapeHtml(e.id)}\">${renderInlineHtml(e.children, x)}</p>`)\n .join(\"\")}</div>`;\n }\n}\n\nexport function coverHtml(s: DocumentSettings, x: HtmlRenderContext): string {\n const logo = s.logo ? imageSrc(s.logo, x) : null;\n return `<section class=\"doc-cover\">${logo ? `<img class=\"doc-cover-logo\" src=\"${escapeHtml(logo)}\" alt=\"\"${x.xhtml ? \"/\" : \"\"}>` : \"\"}<h1 class=\"doc-cover-title\">${escapeHtml(\n s.title ?? \"\",\n )}</h1>${s.subtitle ? `<p class=\"doc-cover-subtitle\">${escapeHtml(s.subtitle)}</p>` : \"\"}${\n s.author ? `<p class=\"doc-cover-author\">${escapeHtml(s.author)}</p>` : \"\"\n }${s.date ? `<p class=\"doc-cover-date\">${escapeHtml(s.date)}</p>` : \"\"}</section>`;\n}\n\n// ── print CSS ──────────────────────────────────────────────────────────────\n\nconst cssString = (s: string) => `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \" \")}\"`;\n\nfunction marginContent(template: string | undefined, s: DocumentSettings): string {\n if (!template) return \"none\";\n return templateParts(template, s)\n .map((p) => (\"field\" in p ? `counter(${p.field})` : cssString(p.text)))\n .join(\" \");\n}\n\nfunction runningBoxes(t: RunningTemplate | null, where: \"top\" | \"bottom\", s: DocumentSettings): string {\n if (!t) return \"\";\n const box = (slot: \"left\" | \"center\" | \"right\") =>\n t[slot]\n ? `@${where}-${slot}{content:${marginContent(t[slot], s)};font:9pt/1.2 var(--doc-font);color:var(--matrx-print-muted,#6b7280);}`\n : \"\";\n return box(\"left\") + box(\"center\") + box(\"right\");\n}\n\nconst pt = (n: number) => `${Math.round(n * 100) / 100}pt`;\n\n/** The print stylesheet for a document's settings. Light mode, always. */\nexport function documentCss(s: DocumentSettings): string {\n const { width, height, margins: m } = s.page;\n const portrait = `${pt(width)} ${pt(height)}`;\n const landscape = `${pt(height)} ${pt(width)}`;\n const base = s.page.orientation === \"landscape\" ? landscape : portrait;\n const blankBoxes = [\"top\", \"bottom\"]\n .flatMap((w) => [\"left\", \"center\", \"right\"].map((sl) => `@${w}-${sl}{content:none;}`))\n .join(\"\");\n return `\n:root{color-scheme:light;--doc-font:\"Charter\",\"Georgia\",\"Cambria\",\"Times New Roman\",serif;--doc-sans:\"Inter\",\"Helvetica Neue\",\"Arial\",sans-serif;--doc-mono:\"SFMono-Regular\",\"Menlo\",\"Consolas\",\"Liberation Mono\",monospace;}\n@page{size:${base};margin:${pt(m.top)} ${pt(m.right)} ${pt(m.bottom)} ${pt(m.left)};${runningBoxes(s.header, \"top\", s)}${runningBoxes(s.footer, \"bottom\", s)}}\n@page doc-portrait{size:${portrait};}\n@page doc-landscape{size:${landscape};}\n${s.differentFirstPage ? `@page:first{${blankBoxes}}` : \"\"}\n@page doc-cover{${blankBoxes}}\nhtml{background:var(--matrx-print-page,#ffffff);}\nbody{margin:0;background:var(--matrx-print-page,#ffffff);color:var(--matrx-print-text,#1f2937);font:${pt(s.fontSize)}/1.5 var(--doc-font);-webkit-print-color-adjust:exact;print-color-adjust:exact;}\n.doc{max-width:${pt(width - m.left - m.right)};margin:0 auto;padding:48px 24px;}\n@media print{.doc{max-width:none;padding:0;}}\n.doc-section.doc-landscape{page:doc-landscape;}\n.doc-section.doc-portrait{page:doc-portrait;}\n@media screen{.doc-section.doc-landscape{max-width:none;}}\n.doc-section+.doc-section{break-before:page;}\n@media screen{.doc-section+.doc-section{border-top:1px dashed var(--matrx-print-rule,#d1d5db);margin-top:32px;padding-top:32px;}}\n.doc-cols-2{column-count:2;column-gap:0.3in;}\n.doc-cols-3{column-count:3;column-gap:0.25in;}\n.doc-cover{page:doc-cover;break-after:page;min-height:${pt(height - m.top - m.bottom)};display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:10pt;}\n@media screen{.doc-cover{min-height:60vh;border-bottom:1px dashed var(--matrx-print-rule,#d1d5db);margin-bottom:32px;}}\n.doc-cover-logo{max-height:72pt;max-width:40%;margin-bottom:24pt;}\n.doc-cover-title{font:700 30pt/1.15 var(--doc-sans);margin:0;letter-spacing:-0.01em;}\n.doc-cover-subtitle{font:400 16pt/1.3 var(--doc-sans);color:var(--matrx-print-muted,#4b5563);margin:0;}\n.doc-cover-author,.doc-cover-date{font:12pt/1.4 var(--doc-sans);color:var(--matrx-print-muted,#4b5563);margin:0;}\n.doc-cover-author{margin-top:36pt;}\np,li,dd{orphans:3;widows:3;}\np{margin:0 0 0.7em;${s.hyphenate ? \"hyphens:auto;-webkit-hyphens:auto;\" : \"\"}}\nh1,h2,h3,h4,h5,h6{font-family:var(--doc-sans);color:var(--matrx-print-heading,#111827);line-height:1.25;break-after:avoid;page-break-after:avoid;break-inside:avoid;hyphens:manual;}\nh1{font-size:${pt(s.fontSize * 1.8)};margin:1.2em 0 0.5em;}\nh2{font-size:${pt(s.fontSize * 1.45)};margin:1.1em 0 0.45em;}\nh3{font-size:${pt(s.fontSize * 1.2)};margin:1em 0 0.4em;}\nh4,h5,h6{font-size:${pt(s.fontSize * 1.05)};margin:0.9em 0 0.35em;}\n.doc-heading-number{color:var(--matrx-print-muted,#6b7280);margin-right:0.35em;}\na{color:var(--matrx-print-link,#1d4ed8);text-decoration:none;}\ncode{font:0.88em var(--doc-mono);background:var(--matrx-print-code-bg,#f3f4f6);padding:0.05em 0.3em;border-radius:3px;}\npre.doc-code{font:0.82em/1.45 var(--doc-mono);background:var(--matrx-print-code-bg,#f6f8fa);border:1px solid var(--matrx-print-rule,#e5e7eb);border-radius:4px;padding:8pt 10pt;white-space:pre-wrap;overflow-wrap:anywhere;break-inside:avoid;page-break-inside:avoid;}\npre.doc-code code{background:none;padding:0;font:inherit;}\nblockquote{margin:0 0 0.8em;padding:0.1em 0 0.1em 1em;border-left:3px solid var(--matrx-print-rule,#d1d5db);color:var(--matrx-print-muted,#4b5563);break-inside:avoid;}\nhr{border:0;border-top:1px solid var(--matrx-print-rule,#d1d5db);margin:1.2em 0;}\n.doc-table-wrap{margin:0 0 1em;break-inside:avoid;page-break-inside:avoid;}\ntable{border-collapse:collapse;width:100%;font-size:0.92em;}\nthead{display:table-header-group;}\ntr{break-inside:avoid;page-break-inside:avoid;}\nth,td{border-bottom:1px solid var(--matrx-print-rule,#e5e7eb);padding:4pt 6pt;text-align:left;vertical-align:top;}\nth{font-family:var(--doc-sans);font-weight:600;border-bottom:1.5px solid var(--matrx-print-heading,#111827);}\ntable caption{caption-side:top;text-align:left;margin-bottom:4pt;}\n.doc-caption{font:0.9em/1.4 var(--doc-sans);color:var(--matrx-print-muted,#4b5563);break-after:avoid;}\n.doc-caption-label{font-weight:600;color:var(--matrx-print-heading,#111827);}\n.doc-figure{margin:0 0 1em;text-align:center;break-inside:avoid;page-break-inside:avoid;}\n.doc-figure img{max-width:100%;max-height:${pt((height - m.top - m.bottom) * 0.7)};}\n.doc-figure figcaption{margin-top:4pt;}\n.doc-image-missing{border:1px dashed var(--matrx-print-rule,#d1d5db);padding:16pt;color:var(--matrx-print-muted,#6b7280);}\n.doc-inline-img{max-height:1.2em;vertical-align:middle;}\n.doc-task-list{list-style:none;padding-left:0.2em;}\n.doc-task-box{display:inline-block;width:0.8em;height:0.8em;border:1.2px solid var(--matrx-print-heading,#374151);border-radius:2px;margin-right:0.45em;vertical-align:-0.05em;}\n.doc-task-box.is-checked{background:var(--matrx-print-heading,#374151);}\n.doc-xref-missing,.doc-cite-missing{color:var(--matrx-print-danger,#b91c1c);font-weight:600;}\n.doc-toc{break-after:auto;}\n.doc-toc-title{font-size:${pt(s.fontSize * 1.45)};}\n.doc-toc ol{list-style:none;padding:0;margin:0;}\n.doc-toc li{margin:0.2em 0;}\n.doc-toc a{display:flex;gap:0.5em;color:inherit;}\n.doc-toc .toc-text{flex:1;}\n.doc-toc a::after{content:target-counter(attr(href url),page);}\n${[2, 3, 4, 5, 6].map((l) => `.doc-toc .toc-l${l}{padding-left:${(l - 1) * 1.2}em;}`).join(\"\")}\n.doc-toc .toc-l1{font-weight:600;}\n.doc-bibliography .doc-ref{padding-left:2em;text-indent:-2em;}\n.doc-notes{font-size:0.9em;}\n.doc-note-back{margin-left:0.3em;}\n.${PAGE_BREAK_CLASS}{break-after:page;page-break-after:always;height:0;}\n@media screen{.${PAGE_BREAK_CLASS}{height:auto;border-top:1px dashed var(--matrx-print-rule,#d1d5db);margin:24px 0;}}\n`.trim();\n}\n\nexport interface DocumentHtmlOptions {\n images?: ImageMap | undefined;\n}\n\n/** A complete, standalone print-grade HTML document. */\nexport function documentToHtml(tree: DocTree, options: DocumentHtmlOptions = {}): string {\n const s = tree.settings;\n const x: HtmlRenderContext = { tree, images: options.images };\n const sections = tree.sections\n .map((sec) => {\n const cls = [\n \"doc-section\",\n sec.orientation === s.page.orientation ? \"\" : `doc-${sec.orientation}`,\n sec.columns > 1 ? `doc-cols-${sec.columns}` : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n return `<section class=\"${cls}\">${renderBlocksHtml(sec.blocks, x)}</section>`;\n })\n .join(\"\\n\");\n const size = PAGE_SIZES[s.page.size].label;\n return `<!DOCTYPE html>\n<html lang=\"${escapeHtml(s.lang)}\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light\">\n<meta name=\"generator\" content=\"@ai-matrx/print/document (${size}, ${s.page.orientation})\">\n<title>${escapeHtml(s.title ?? \"Document\")}</title>\n${s.author ? `<meta name=\"author\" content=\"${escapeHtml(s.author)}\">` : \"\"}\n<style>${documentCss(s)}</style>\n</head>\n<body>\n<main class=\"doc\">\n${s.cover ? coverHtml(s, x) : \"\"}\n${sections}\n</main>\n</body>\n</html>`;\n}\n","/**\n * @ai-matrx/print/directives — the ONE definition of the print directives\n * markdown can carry, shared by every surface that reads markdown.\n *\n * Why a separate, zero-dependency entry: the directive syntax has three\n * readers — this package's two converters (print window / PDF / HTML page),\n * the chat renderer's remark plugin (the on-screen preview), and any editor\n * that inserts one. If each re-derived the regex they would drift the first\n * time someone added an alias. `/markdown` carries ~20KB of stylesheet, so the\n * chat bundle imports the syntax from here instead and pays nothing.\n *\n * ── Page break ────────────────────────────────────────────────────────────\n * A line that is exactly one of these (case-insensitive, surrounding\n * whitespace ignored) forces the next content onto a new printed page:\n *\n * <!-- pagebreak --> ← canonical; invisible in any other renderer\n * <!-- page-break --> <!-- page break --> <!-- newpage -->\n * \\pagebreak \\newpage ← LaTeX / pandoc habit\n * <div style=\"page-break-after: always\"></div> ← Typora / VS Code habit\n * (also `page-break-before`, `break-after: page`, `break-before: page`,\n * and `<div class=\"page-break\"></div>` / `class=\"pagebreak\"`)\n *\n * On screen every surface draws the same idea: a dashed rule labelled\n * \"Page break\" with generous padding. In print it is a zero-height element\n * with `break-after: page`.\n */\n\n/** The form editors insert and docs recommend. */\nexport const PAGE_BREAK_MARKDOWN = \"<!-- pagebreak -->\";\n\n/** The class every surface puts on a rendered page break. */\nexport const PAGE_BREAK_CLASS = \"matrx-page-break\";\n\n/** Screen label for a rendered page break. */\nexport const PAGE_BREAK_LABEL = \"Page break\";\n\nconst COMMENT_FORM = /^<!--\\s*(?:page[\\s_-]?break|new[\\s_-]?page)\\s*-->$/i;\nconst LATEX_FORM = /^\\\\(?:pagebreak|newpage|clearpage)\\s*(?:\\{\\s*\\})?$/i;\nconst DIV_FORM = /^<div\\b([^>]*)>\\s*<\\/div>$|^<div\\b([^>]*)\\/>$/i;\nconst DIV_BREAK_ATTR =\n /(?:page-break-(?:after|before)\\s*:\\s*always|break-(?:after|before)\\s*:\\s*page|class\\s*=\\s*[\"'](?:[^\"']*\\s)?page-?break(?:\\s[^\"']*)?[\"'])/i;\n\n/** Columns of leading indentation (tab = 4, NBSP counts as a space). */\nfunction indentColumns(line: string): number {\n let cols = 0;\n for (const ch of line) {\n if (ch === \" \" || ch === \"\\u00A0\") cols += 1;\n else if (ch === \"\\t\") cols += 4;\n else break;\n }\n return cols;\n}\n\n/**\n * Is this single line a page-break directive? Indented four or more columns\n * it is not — in markdown that is a code block, and every surface must agree.\n */\nexport function isPageBreakLine(line: string): boolean {\n if (indentColumns(line) >= 4) return false;\n const t = line.trim();\n if (t.length < 8 || t.length > 200) return false;\n if (COMMENT_FORM.test(t) || LATEX_FORM.test(t)) return true;\n const div = DIV_FORM.exec(t);\n if (!div) return false;\n return DIV_BREAK_ATTR.test(div[1] ?? div[2] ?? \"\");\n}\n\n// ── Section break ─────────────────────────────────────────────────────────\n//\n// A section break is a page break that can also change the page layout for\n// everything after it (Word's \"Section break (next page)\"):\n//\n// <!-- section --> ← new page, same layout\n// <!-- section: landscape --> ← new page, landscape from here on\n// <!-- section landscape columns=2 --> ← landscape AND two columns\n// <!-- section portrait columns=1 --> ← back to the default layout\n//\n// Recognised words: `landscape` / `portrait`, `columns=N` (or `cols=N`,\n// `N columns`, 1–3). Unknown words are ignored, never an error — the break\n// still happens. Every page-break reader treats a section break as a break.\n\n/** The form editors insert for a plain section break. */\nexport const SECTION_BREAK_MARKDOWN = \"<!-- section -->\";\n\nexport interface SectionBreakDirective {\n /** Absent = inherit the document's orientation. */\n orientation?: \"portrait\" | \"landscape\";\n /** Absent = inherit the document's column count. 1–3. */\n columns?: 1 | 2 | 3;\n}\n\nconst SECTION_FORM = /^<!--\\s*section(?:[\\s_-]?break)?\\b\\s*:?\\s*([^>]*?)\\s*-->$/i;\n\n/** Parse a section-break line; `null` when the line is not one. */\nexport function parseSectionBreakLine(line: string): SectionBreakDirective | null {\n if (indentColumns(line) >= 4) return null;\n const m = SECTION_FORM.exec(line.trim());\n if (!m) return null;\n const words = (m[1] ?? \"\").toLowerCase();\n const out: SectionBreakDirective = {};\n if (/\\blandscape\\b/.test(words)) out.orientation = \"landscape\";\n else if (/\\bportrait\\b/.test(words)) out.orientation = \"portrait\";\n const cols = /\\b(?:columns?|cols?)\\s*[=:]\\s*(\\d)\\b/.exec(words) ?? /\\b(\\d)\\s*[-\\s]?columns?\\b/.exec(words);\n if (cols) {\n const n = Math.min(3, Math.max(1, Number(cols[1])));\n out.columns = n as 1 | 2 | 3;\n }\n return out;\n}\n\n// ── Table of contents / bibliography placement ───────────────────────────\n//\n// `[[toc]]`, `[toc]`, `[TOC]`, `${toc}`, `<!-- toc -->`, `\\tableofcontents`\n// put the table of contents at that spot (otherwise frontmatter `toc: true`\n// puts it at the start). `<!-- bibliography -->`, `[[bibliography]]`,\n// `\\printbibliography` put the reference list there (otherwise it closes the\n// document whenever something is cited).\n\nexport const TOC_MARKDOWN = \"[[toc]]\";\nexport const BIBLIOGRAPHY_MARKDOWN = \"<!-- bibliography -->\";\n\nconst TOC_FORM = /^(?:\\[\\[\\s*toc\\s*\\]\\]|\\[toc\\]|\\$\\{toc\\}|<!--\\s*toc\\s*-->|\\\\tableofcontents)$/i;\nconst BIBLIOGRAPHY_FORM =\n /^(?:\\[\\[\\s*(?:bibliography|references)\\s*\\]\\]|<!--\\s*(?:bibliography|references)\\s*-->|\\\\printbibliography|\\\\bibliography\\{[^}]*\\})$/i;\n\nexport function isTocLine(line: string): boolean {\n return indentColumns(line) < 4 && TOC_FORM.test(line.trim());\n}\n\nexport function isBibliographyLine(line: string): boolean {\n return indentColumns(line) < 4 && BIBLIOGRAPHY_FORM.test(line.trim());\n}\n\n/** Any directive that ends the current printed page (page or section break). */\nexport function isBreakLine(line: string): boolean {\n return isPageBreakLine(line) || parseSectionBreakLine(line) !== null;\n}\n\n/**\n * Split markdown into the pieces that belong on separate pages. Fence-aware:\n * a directive inside a ``` / ~~~ code block is code, not a break. Always\n * returns at least one piece; empty pieces (two breaks in a row, a break at\n * the very start or end) are kept out so no blank page is produced.\n */\nexport function splitAtPageBreaks(markdown: string): string[] {\n const lines = markdown.split(/\\r?\\n/);\n const pieces: string[] = [];\n let current: string[] = [];\n let fence: string | null = null;\n\n for (const line of lines) {\n // Any indent — the converters accept list-nested fences, so must this.\n const fenceMatch = /^\\s*(`{3,}|~{3,})/.exec(line);\n if (fenceMatch) {\n const marker = fenceMatch[1] as string;\n if (fence === null) fence = marker;\n else if (marker[0] === fence[0] && marker.length >= fence.length) fence = null;\n } else if (fence === null && isBreakLine(line)) {\n if (current.join(\"\\n\").trim()) pieces.push(current.join(\"\\n\"));\n current = [];\n continue;\n }\n current.push(line);\n }\n if (current.join(\"\\n\").trim() || pieces.length === 0) pieces.push(current.join(\"\\n\"));\n return pieces;\n}\n","/**\n * DocTree → PDF (real text PDF via pdfmake — selectable, searchable,\n * link-bearing; never a screenshot). pdfmake is loaded lazily at call time.\n *\n * Print behaviours: page size / margins / orientation, per-section\n * orientation and 1–3 newspaper columns, cover page, running header/footer\n * with \"Page X of Y\", different first page, table of contents WITH page\n * numbers, numbered captions, cross-reference links, keep-with-next headings\n * (a heading is never the last thing on a page), short paragraphs never split\n * (orphan/widow control), table rows never split and header rows repeat,\n * tables/code/figures kept whole when they fit on a page.\n */\n\nimport { fillTemplate } from \"./settings\";\nimport type { Block, Caption, DocSection, DocTree, DocumentSettings, ImageMap, Inline, RunningTemplate } from \"./types\";\n\n// pdfmake's document-definition is a loose JSON shape; keep it local.\ntype Node = Record<string, unknown> | string;\n\nconst COLOR = {\n text: \"#1f2937\",\n heading: \"#111827\",\n muted: \"#6b7280\",\n link: \"#1d4ed8\",\n rule: \"#d1d5db\",\n codeBg: \"#f6f8fa\",\n danger: \"#b91c1c\",\n};\n\n/** Characters the built-in Courier (WinAnsi) can draw. */\nconst WIN_ANSI_EXTRA = new Set(\n \"€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ\",\n);\nconst courierCanDraw = (s: string): boolean => {\n for (const ch of s) {\n const c = ch.codePointAt(0) as number;\n if ((c >= 0x20 && c <= 0x7e) || (c >= 0xa0 && c <= 0xff) || c === 0x09 || WIN_ANSI_EXTRA.has(ch)) continue;\n return false;\n }\n return true;\n};\n\ninterface Ctx {\n tree: DocTree;\n images?: ImageMap | undefined;\n s: DocumentSettings;\n /** Usable width of the current column, in points. */\n width: number;\n tocIds: Set<string>;\n minLevel: number;\n}\n\ninterface RunStyle {\n bold?: boolean;\n italics?: boolean;\n strike?: boolean;\n link?: string;\n dest?: string;\n}\n\nfunction runs(nodes: Inline[], c: Ctx, st: RunStyle = {}): Node[] {\n const out: Node[] = [];\n const base = (text: string): Record<string, unknown> => {\n const r: Record<string, unknown> = { text };\n if (st.bold) r.bold = true;\n if (st.italics) r.italics = true;\n if (st.strike) r.decoration = \"lineThrough\";\n if (st.link) {\n r.link = st.link;\n r.color = COLOR.link;\n }\n if (st.dest) {\n r.linkToDestination = st.dest;\n r.color = COLOR.link;\n }\n return r;\n };\n for (const n of nodes) {\n switch (n.type) {\n case \"text\":\n out.push(base(n.value));\n break;\n case \"strong\":\n out.push(...runs(n.children, c, { ...st, bold: true }));\n break;\n case \"emphasis\":\n out.push(...runs(n.children, c, { ...st, italics: true }));\n break;\n case \"delete\":\n out.push(...runs(n.children, c, { ...st, strike: true }));\n break;\n case \"code\": {\n const r = base(n.value);\n if (courierCanDraw(n.value)) r.font = \"Courier\";\n r.fontSize = c.s.fontSize * 0.92;\n r.background = \"#f3f4f6\";\n out.push(r);\n break;\n }\n case \"break\":\n out.push(base(\"\\n\"));\n break;\n case \"link\":\n out.push(...runs(n.children, c, /^(https?:|mailto:|tel:)/i.test(n.url) ? { ...st, link: n.url } : st));\n break;\n case \"image\":\n out.push(base(n.alt));\n break;\n case \"xref\": {\n if (!n.resolved) {\n out.push({ ...base(n.label), bold: true, color: COLOR.danger });\n break;\n }\n const id = n.target.startsWith(\"sec:\") ? n.target.slice(4) : n.target;\n out.push({ ...base(n.label), linkToDestination: id, color: COLOR.link });\n break;\n }\n case \"cite\": {\n const r = base(n.label);\n if (n.resolved) {\n r.linkToDestination = `ref-${n.keys[0]}`;\n } else {\n r.bold = true;\n r.color = COLOR.danger;\n }\n out.push(r);\n break;\n }\n case \"noteRef\":\n out.push({ text: String(n.n), sup: true, linkToDestination: `note-${n.n}`, color: COLOR.link });\n break;\n }\n }\n return out;\n}\n\nconst capNode = (cap: Caption, c: Ctx, where: \"above\" | \"below\"): Node => ({\n text: [{ text: cap.label, bold: true, color: COLOR.heading }, ...(cap.children.length ? [\": \", ...runs(cap.children, c)] : [])],\n style: \"caption\",\n id: cap.id ? `${cap.kind}:${cap.id}` : undefined,\n margin: where === \"above\" ? [0, 0, 0, 4] : [0, 4, 0, 0],\n});\n\nfunction estimateLines(text: string, c: Ctx): number {\n const charsPerLine = Math.max(20, c.width / (c.s.fontSize * 0.5));\n return Math.ceil(Math.max(1, text.length) / charsPerLine);\n}\n\nconst plain = (nodes: Inline[]): string =>\n nodes.map((n) => (\"value\" in n ? n.value : \"label\" in n ? n.label : \"children\" in n ? plain(n.children) : \"\")).join(\"\");\n\nfunction taskItem(checked: boolean, content: Node[], c: Ctx): Node {\n const size = c.s.fontSize * 0.75;\n return {\n columns: [\n {\n width: size + 6,\n canvas: [\n { type: \"rect\", x: 0, y: c.s.fontSize * 0.3, w: size, h: size, r: 1.5, lineWidth: 1, lineColor: COLOR.heading, ...(checked ? { color: COLOR.heading } : {}) },\n ],\n },\n { width: \"*\", stack: content },\n ],\n columnGap: 2,\n };\n}\n\n/** Small enough that a heading can be glued to it (keep-with-next). */\nfunction gluable(b: Block | undefined): boolean {\n if (!b) return false;\n if (b.type === \"paragraph\" || b.type === \"figure\" || b.type === \"rule\") return true;\n if (b.type === \"code\") return b.value.split(\"\\n\").length <= 45;\n if (b.type === \"table\") return b.rows.length <= 20;\n if (b.type === \"list\") return b.items.length <= 12;\n if (b.type === \"blockquote\") return b.children.length <= 4;\n return false;\n}\n\nfunction blocks(list: Block[], c: Ctx): Node[] {\n const out: Node[] = [];\n let breakNext = false;\n for (let i = 0; i < list.length; i++) {\n const b = list[i] as Block;\n let node = block(b, c);\n // Keep-with-next: a heading travels with the block after it, so it can\n // never be stranded as the last line of a page.\n if (node && b.type === \"heading\" && gluable(list[i + 1])) {\n const next = block(list[i + 1] as Block, c);\n if (next) {\n node = { stack: [node, next], unbreakable: true };\n i++;\n }\n }\n if (node === null) {\n if (b.type === \"pageBreak\") breakNext = true;\n continue;\n }\n if (breakNext && typeof node === \"object\") {\n node.pageBreak = \"before\";\n breakNext = false;\n }\n out.push(node);\n }\n return out;\n}\n\nfunction block(b: Block, c: Ctx): Node | null {\n switch (b.type) {\n case \"heading\": {\n const rel = Math.min(6, b.level - c.minLevel + 1);\n const node: Record<string, unknown> = {\n text: [...(b.number ? [{ text: `${b.number} `, color: COLOR.muted }] : []), ...runs(b.children, c)],\n style: `h${Math.min(6, b.level)}`,\n headlineLevel: b.level,\n id: b.id,\n };\n if (c.tocIds.has(b.id)) {\n node.tocItem = true;\n node.tocMargin = [(rel - 1) * 14, rel === 1 ? 4 : 1, 0, 0];\n node.tocStyle = rel === 1 ? \"tocL1\" : \"toc\";\n }\n return node;\n }\n case \"paragraph\": {\n const text = runs(b.children, c);\n const p = { text, style: \"p\" };\n // Orphan/widow control: a paragraph short enough to fit is never split.\n return estimateLines(plain(b.children), c) <= 5 ? { stack: [p], unbreakable: true } : p;\n }\n case \"list\": {\n const items = b.items.map((it) => {\n const content =\n it.children.length === 1 && it.children[0]?.type === \"paragraph\"\n ? [{ text: runs(it.children[0].children, c), margin: [0, 0, 0, 2] } as Node]\n : blocks(it.children, { ...c, width: c.width - 18 });\n if (it.checked !== null) return { ...(taskItem(it.checked, content, c) as object), listType: \"none\" };\n return content.length === 1 ? content[0] : { stack: content };\n });\n const node: Record<string, unknown> = b.ordered ? { ol: items, start: b.start } : { ul: items };\n node.margin = [0, 0, 0, 6];\n node.markerColor = COLOR.muted;\n return node;\n }\n case \"blockquote\":\n return {\n table: { widths: [\"*\"], body: [[{ stack: blocks(b.children, { ...c, width: c.width - 16 }), color: COLOR.muted }]] },\n layout: {\n hLineWidth: () => 0,\n vLineWidth: (i: number) => (i === 0 ? 3 : 0),\n vLineColor: () => COLOR.rule,\n paddingLeft: () => 10,\n paddingRight: () => 0,\n paddingTop: () => 2,\n paddingBottom: () => 2,\n },\n margin: [0, 0, 0, 8],\n };\n case \"code\": {\n const lines = b.value.replace(/\\n$/, \"\").split(\"\\n\");\n const size = c.s.fontSize * 0.8;\n const stack = lines.map((l) => {\n const t = l.replace(/\\t/g, \" \") || \" \";\n return courierCanDraw(t)\n ? { text: t, font: \"Courier\", fontSize: size, preserveLeadingSpaces: true }\n : { text: t, fontSize: size, preserveLeadingSpaces: true };\n });\n return {\n table: { widths: [\"*\"], body: [[{ stack, fillColor: COLOR.codeBg }]] },\n layout: {\n hLineWidth: () => 0.5,\n vLineWidth: () => 0.5,\n hLineColor: () => \"#e5e7eb\",\n vLineColor: () => \"#e5e7eb\",\n paddingLeft: () => 8,\n paddingRight: () => 8,\n paddingTop: () => 6,\n paddingBottom: () => 6,\n },\n margin: [0, 0, 0, 8],\n // Keep a block that fits on one page together.\n unbreakable: lines.length <= 45,\n };\n }\n case \"table\": {\n const n = Math.max(b.header.length, ...b.rows.map((r) => r.length), 1);\n const cell = (inl: Inline[] | undefined, i: number, head: boolean) => ({\n text: runs(inl ?? [], c),\n bold: head,\n alignment: b.align[i] ?? \"left\",\n fontSize: c.s.fontSize * 0.92,\n color: head ? COLOR.heading : COLOR.text,\n });\n const row = (r: Inline[][], head: boolean) => Array.from({ length: n }, (_, i) => cell(r[i], i, head));\n const table = {\n table: {\n headerRows: 1,\n dontBreakRows: true,\n keepWithHeaderRows: 1,\n widths: Array.from({ length: n }, () => \"*\"),\n body: [row(b.header, true), ...b.rows.map((r) => row(r, false))],\n },\n layout: {\n hLineWidth: (i: number) => (i === 1 ? 1.2 : i === 0 ? 0 : 0.5),\n vLineWidth: () => 0,\n hLineColor: (i: number) => (i === 1 ? COLOR.heading : \"#e5e7eb\"),\n paddingLeft: () => 5,\n paddingRight: () => 5,\n paddingTop: () => 3,\n paddingBottom: () => 3,\n },\n };\n const stack: Node[] = [];\n if (b.caption) stack.push(capNode(b.caption, c, \"above\"));\n stack.push(table);\n return { stack, margin: [0, 2, 0, 10], unbreakable: b.rows.length <= 20 };\n }\n case \"figure\": {\n const img = c.images?.get(b.url);\n const maxH = (c.s.page.height - c.s.page.margins.top - c.s.page.margins.bottom) * 0.6;\n const stack: Node[] = [];\n if (img) {\n const scale = Math.min(1, c.width / img.width, maxH / img.height);\n stack.push({ image: img.dataUrl, width: img.width * scale, height: img.height * scale, alignment: \"center\" });\n } else {\n stack.push({ text: `[Image unavailable: ${b.alt || b.url}]`, italics: true, color: COLOR.muted, alignment: \"center\" });\n }\n if (b.caption) stack.push({ ...(capNode(b.caption, c, \"below\") as object), alignment: \"center\" });\n return { stack, margin: [0, 4, 0, 10], unbreakable: true };\n }\n case \"rule\":\n return {\n canvas: [{ type: \"line\", x1: 0, y1: 0, x2: c.width, y2: 0, lineWidth: 0.75, lineColor: COLOR.rule }],\n margin: [0, 6, 0, 10],\n };\n case \"pageBreak\":\n return null;\n case \"toc\":\n return {\n toc: {\n title: { text: c.s.toc.title, style: \"tocTitle\" },\n numberStyle: { color: COLOR.muted },\n },\n margin: [0, 0, 0, 12],\n };\n case \"notes\":\n return {\n stack: c.tree.notes.map((n) => ({\n columns: [\n { width: 18, text: `${n.n}.`, color: COLOR.muted, id: `note-${n.n}` },\n { width: \"*\", stack: blocks(n.children, { ...c, width: c.width - 18 }) },\n ],\n fontSize: c.s.fontSize * 0.9,\n })),\n };\n case \"bibliography\":\n return {\n stack: c.tree.bibliography.map((e) => ({\n text: runs(e.children, c),\n id: `ref-${e.id}`,\n margin: [0, 0, 0, 6],\n leadingIndent: 0,\n })),\n };\n }\n}\n\nfunction running(t: RunningTemplate | null, s: DocumentSettings, page: number, pages: number, margins: [number, number]): Node | null {\n if (!t) return null;\n const slot = (v: string | undefined, alignment: string) => ({ text: v ? fillTemplate(v, s, page, pages) : \"\", alignment, width: \"*\" });\n return {\n columns: [slot(t.left, \"left\"), slot(t.center, \"center\"), slot(t.right, \"right\")],\n fontSize: 9,\n color: COLOR.muted,\n margin: [margins[0], 0, margins[1], 0],\n };\n}\n\nfunction sectionContent(sec: DocSection, c: Ctx): Node[] {\n const landscape = sec.orientation === \"landscape\";\n const pageW = landscape ? c.s.page.height : c.s.page.width;\n const full = pageW - c.s.page.margins.left - c.s.page.margins.right;\n const gap = 18;\n const colW = (full - gap * (sec.columns - 1)) / sec.columns;\n const inner = blocks(sec.blocks, { ...c, width: colW });\n if (sec.columns === 1) return inner;\n return [\n {\n columns: [\n { width: colW, stack: inner },\n ...Array.from({ length: sec.columns - 1 }, () => ({ width: colW, stack: [] })),\n ],\n columnGap: gap,\n snakingColumns: true,\n },\n ];\n}\n\n/** Build the pdfmake document definition (exported for tests and hosts). */\nexport function buildPdfDefinition(tree: DocTree, images?: ImageMap, pageCountSink?: (n: number) => void): Record<string, unknown> {\n const s = tree.settings;\n const m = s.page.margins;\n const headings: number[] = [];\n for (const sec of tree.sections) for (const b of sec.blocks) if (b.type === \"heading\") headings.push(b.level);\n const c: Ctx = {\n tree,\n images,\n s,\n width: s.page.width - m.left - m.right,\n tocIds: new Set(tree.toc.map((e) => e.id)),\n minLevel: Math.min(7, ...headings),\n };\n\n const content: Node[] = [];\n if (s.cover) {\n const logo = s.logo ? images?.get(s.logo) : undefined;\n const pageH = (s.page.orientation === \"landscape\" ? s.page.width : s.page.height) - m.top - m.bottom;\n const cover: Node[] = [];\n if (logo) {\n const scale = Math.min(1, 160 / logo.width, 72 / logo.height);\n cover.push({ image: logo.dataUrl, width: logo.width * scale, height: logo.height * scale, margin: [0, 0, 0, 24] });\n }\n cover.push({ text: s.title ?? \"\", style: \"coverTitle\" });\n if (s.subtitle) cover.push({ text: s.subtitle, style: \"coverSubtitle\" });\n if (s.author) cover.push({ text: s.author, style: \"coverMeta\", margin: [0, 36, 0, 0] });\n if (s.date) cover.push({ text: s.date, style: \"coverMeta\" });\n content.push({ stack: cover, margin: [0, pageH * 0.28, 0, 0] });\n }\n tree.sections.forEach((sec, idx) => {\n const nodes = sectionContent(sec, c);\n const first = nodes[0];\n if (first && typeof first === \"object\" && (idx > 0 || s.cover)) {\n first.pageBreak = \"before\";\n first.pageOrientation = sec.orientation;\n }\n content.push(...nodes);\n });\n\n const hs = s.fontSize;\n let pageCount = 0;\n const hidden = (page: number) => s.differentFirstPage && page === 1;\n return {\n info: { title: s.title ?? \"Document\", author: s.author, subject: s.subtitle, creator: \"AI Matrx\", producer: \"@ai-matrx/print\" },\n pageSize: { width: s.page.width, height: s.page.height },\n pageOrientation: s.page.orientation,\n pageMargins: [m.left, m.top, m.right, m.bottom],\n language: s.lang,\n header: (page: number, pages: number) => {\n pageCount = pages;\n pageCountSink?.(pageCount);\n if (hidden(page)) return null;\n const r = running(s.header, s, page, pages, [m.left, m.right]);\n return r ? { stack: [r], margin: [0, Math.max(14, m.top / 2 - 6), 0, 0] } : null;\n },\n footer: (page: number, pages: number) => {\n if (hidden(page)) return null;\n const r = running(s.footer, s, page, pages, [m.left, m.right]);\n return r ? { stack: [r], margin: [0, Math.max(10, m.bottom / 2 - 6), 0, 0] } : null;\n },\n // Keep-with-next: a heading never ends a page.\n // (A container stack reports every page its children touch, so only real\n // content nodes that START on the heading's page count as \"following\".)\n pageBreakBefore: (node: PbNode, q: { getFollowingNodesOnPage: () => PbNode[] }) => {\n if (!node.headlineLevel) return false;\n const page = node.startPosition?.pageNumber;\n return !q.getFollowingNodesOnPage().some((n) => !n.stack && n.startPosition?.pageNumber === page);\n },\n content,\n defaultStyle: { font: \"Roboto\", fontSize: hs, lineHeight: 1.3, color: COLOR.text },\n styles: {\n p: { margin: [0, 0, 0, 7] },\n h1: { fontSize: hs * 1.8, bold: true, color: COLOR.heading, margin: [0, 14, 0, 6] },\n h2: { fontSize: hs * 1.45, bold: true, color: COLOR.heading, margin: [0, 12, 0, 5] },\n h3: { fontSize: hs * 1.2, bold: true, color: COLOR.heading, margin: [0, 10, 0, 4] },\n h4: { fontSize: hs * 1.05, bold: true, color: COLOR.heading, margin: [0, 8, 0, 3] },\n h5: { fontSize: hs, bold: true, color: COLOR.heading, margin: [0, 8, 0, 3] },\n h6: { fontSize: hs, bold: true, italics: true, color: COLOR.heading, margin: [0, 8, 0, 3] },\n caption: { fontSize: hs * 0.9, color: COLOR.muted },\n tocTitle: { fontSize: hs * 1.45, bold: true, color: COLOR.heading, margin: [0, 0, 0, 10] },\n toc: { fontSize: hs },\n tocL1: { fontSize: hs, bold: true },\n coverTitle: { fontSize: 30, bold: true, color: COLOR.heading, lineHeight: 1.1 },\n coverSubtitle: { fontSize: 16, color: \"#4b5563\", margin: [0, 10, 0, 0] },\n coverMeta: { fontSize: 12, color: \"#4b5563\", margin: [0, 4, 0, 0] },\n },\n };\n}\n\ninterface PbNode {\n headlineLevel?: number;\n stack?: boolean;\n startPosition?: { pageNumber?: number };\n}\n\nconst FONTS_READY = Symbol.for(\"ai-matrx.print.document.pdfmake-fonts\");\n\n/** Load pdfmake once, with Roboto (body) and Courier (code) registered. */\nasync function loadPdfMake(): Promise<{ createPdf: (d: unknown) => { getBuffer: () => Promise<Uint8Array> } }> {\n const mod = (await import(\"pdfmake\")) as unknown as Record<string, unknown>;\n const pdfMake = (mod.default ?? mod) as Record<string | symbol, unknown> & {\n addVirtualFileSystem?: (v: unknown) => void;\n addFontContainer?: (c: unknown) => void;\n addFonts: (f: unknown) => void;\n virtualfs?: { writeFileSync: (k: string, v: unknown) => void };\n setUrlAccessPolicy?: (f: (u: string) => boolean) => void;\n setLocalAccessPolicy?: (f: (p: string) => boolean) => void;\n createPdf: (d: unknown) => { getBuffer: () => Promise<Uint8Array> };\n };\n if (!pdfMake[FONTS_READY]) {\n const vfsMod = (await import(\"pdfmake/build/vfs_fonts.js\")) as unknown as Record<string, unknown>;\n const vfs = (vfsMod.default ?? vfsMod) as Record<string, string>;\n if (typeof pdfMake.addVirtualFileSystem === \"function\") {\n pdfMake.addVirtualFileSystem(vfs);\n const courier = (await import(\"pdfmake/build/standard-fonts/Courier.js\")) as unknown as Record<string, unknown>;\n pdfMake.addFontContainer?.(courier.default ?? courier);\n } else {\n const B = (globalThis as unknown as { Buffer: { from: (s: string, e: string) => unknown } }).Buffer;\n for (const [k, v] of Object.entries(vfs)) pdfMake.virtualfs?.writeFileSync(k, B.from(v, \"base64\"));\n }\n pdfMake.addFonts({\n Roboto: {\n normal: \"Roboto-Regular.ttf\",\n bold: \"Roboto-Medium.ttf\",\n italics: \"Roboto-Italic.ttf\",\n bolditalics: \"Roboto-MediumItalic.ttf\",\n },\n Courier: { normal: \"Courier\", bold: \"Courier-Bold\", italics: \"Courier-Oblique\", bolditalics: \"Courier-BoldOblique\" },\n });\n // Images arrive pre-resolved as data URLs; nothing is fetched by pdfmake.\n pdfMake.setUrlAccessPolicy?.(() => false);\n pdfMake.setLocalAccessPolicy?.((p) => /^Courier(-Bold|-Oblique|-BoldOblique)?$/.test(p));\n pdfMake[FONTS_READY] = true;\n }\n return pdfMake;\n}\n\nexport interface PdfResult {\n bytes: Uint8Array;\n pageCount: number;\n}\n\nexport async function documentToPdf(tree: DocTree, images?: ImageMap): Promise<PdfResult> {\n const pdfMake = await loadPdfMake();\n let pageCount = 0;\n const def = buildPdfDefinition(tree, images, (n) => {\n pageCount = n;\n });\n const buf = await pdfMake.createPdf(def).getBuffer();\n return { bytes: buf instanceof Uint8Array ? new Uint8Array(buf) : new Uint8Array(buf as ArrayBuffer), pageCount };\n}\n\n/**\n * The page each TOC heading landed on, read from a laid-out PDF definition.\n * Used by the DOCX writer so its cached table of contents shows real numbers\n * before Word refreshes the fields.\n */\nexport async function headingPages(tree: DocTree, images?: ImageMap): Promise<Map<string, number>> {\n const pdfMake = await loadPdfMake();\n const def = buildPdfDefinition(tree, images);\n await pdfMake.createPdf(def).getBuffer();\n // pdfmake lays out the definition in place: every node gains `positions`.\n const want = new Set(tree.toc.map((e) => e.id));\n const pages = new Map<string, number>();\n const walk = (n: unknown): void => {\n if (Array.isArray(n)) {\n for (const x of n) walk(x);\n return;\n }\n if (!n || typeof n !== \"object\") return;\n const o = n as Record<string, unknown>;\n const pos = (o.positions as Array<{ pageNumber?: number }> | undefined)?.[0];\n if (typeof o.id === \"string\" && want.has(o.id) && pos?.pageNumber && !pages.has(o.id)) pages.set(o.id, pos.pageNumber);\n for (const key of [\"stack\", \"columns\", \"ul\", \"ol\", \"content\"]) if (key in o) walk(o[key]);\n const table = o.table as { body?: unknown } | undefined;\n if (table?.body) walk(table.body);\n };\n walk(def.content);\n return pages;\n}\n","/**\n * markdown (+ frontmatter) → DocTree. The ONE parse every document output\n * (PDF, DOCX, EPUB, HTML) renders from.\n *\n * Grammar:\n * • CommonMark + GFM (tables, task lists, strikethrough, autolinks,\n * footnotes) via micromark/mdast — the reference parser, not a regex.\n * • Page/section breaks, TOC and bibliography placement come ONLY from\n * `../directives` (the grammar the chat preview and the print skins share).\n * • Captions + cross-references follow pandoc-crossref:\n * {#fig:growth} figure, numbered \"Figure N\"\n * Table: A caption {#tbl:sales} caption line before/after a table\n * ## Methods {#sec:methods} heading id (`{-}` = unnumbered)\n * see @fig:growth, @tbl:sales, @sec:methods\n * • Citations follow pandoc: [@key], [@key, p. 4], [@a; @b], [-@key], @key.\n */\n\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { gfmFromMarkdown } from \"mdast-util-gfm\";\nimport { gfm } from \"micromark-extension-gfm\";\nimport type {\n Nodes as MdNode,\n Parents as MdParent,\n PhrasingContent,\n Root,\n RootContent,\n Table as MdTable,\n} from \"mdast\";\nimport {\n isBibliographyLine,\n isPageBreakLine,\n isTocLine,\n parseSectionBreakLine,\n type SectionBreakDirective,\n} from \"../directives\";\nimport { removeThinkingContent } from \"../markdown\";\nimport { formatBibliography, formatCitation, parseCitationGroup } from \"./citations\";\nimport { resolveSettings, splitFrontmatter, type ResolveSettingsOptions } from \"./settings\";\nimport type {\n Block,\n Caption,\n CslItem,\n DocSection,\n DocTree,\n DocumentNotice,\n DocumentSettings,\n Inline,\n ListItem,\n} from \"./types\";\n\nexport interface ParseDocumentOptions extends ResolveSettingsOptions {\n /** Where dropped/degraded content is announced (also collected on the tree). */\n onNotice?: (notice: DocumentNotice) => void;\n}\n\nconst MARK = \"matrx:\";\nconst FENCE_RE = /^\\s*(`{3,}|~{3,})/;\nconst TABLE_CAPTION_RE = /^\\s{0,3}(?:Table:|:)\\s+\\S/;\n\n/** Rewrite directive lines into canonical HTML comments the tree reads. Fence-aware. */\nfunction prepass(body: string): string {\n const lines = body.split(/\\r?\\n/);\n const out: string[] = [];\n let fence: string | null = null;\n const isTableLine = (l: string | undefined) => l !== undefined && /^\\s{0,3}\\|/.test(l);\n const prevNonBlank = (i: number) => {\n for (let j = i - 1; j >= 0; j--) if ((lines[j] as string).trim()) return lines[j];\n return undefined;\n };\n const nextNonBlank = (i: number) => {\n for (let j = i + 1; j < lines.length; j++) if ((lines[j] as string).trim()) return lines[j];\n return undefined;\n };\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] as string;\n const fm = FENCE_RE.exec(line);\n if (fm) {\n const marker = fm[1] as string;\n if (fence === null) fence = marker;\n else if (marker[0] === fence[0] && marker.length >= fence.length) fence = null;\n out.push(line);\n continue;\n }\n if (fence !== null) {\n out.push(line);\n continue;\n }\n let directive: string | null = null;\n const section = parseSectionBreakLine(line);\n if (section) directive = `<!--${MARK}section ${JSON.stringify(section)}-->`;\n else if (isPageBreakLine(line)) directive = `<!--${MARK}pagebreak-->`;\n else if (isTocLine(line)) directive = `<!--${MARK}toc-->`;\n else if (isBibliographyLine(line)) directive = `<!--${MARK}bibliography-->`;\n if (directive) {\n out.push(\"\", directive, \"\");\n continue;\n }\n // A pandoc table caption glued to its table would otherwise become a row.\n if (TABLE_CAPTION_RE.test(line) && (isTableLine(prevNonBlank(i)) || isTableLine(nextNonBlank(i)))) {\n out.push(\"\", line.trim().replace(/^:\\s+/, \"Table: \"), \"\");\n continue;\n }\n out.push(line);\n }\n return out.join(\"\\n\");\n}\n\nconst slugify = (s: string): string =>\n s\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^\\w\\s-]/g, \"\")\n .trim()\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\") || \"section\";\n\nexport function plainText(inlines: Inline[]): string {\n return inlines\n .map((n) => {\n switch (n.type) {\n case \"text\":\n case \"code\":\n return n.value;\n case \"strong\":\n case \"emphasis\":\n case \"delete\":\n case \"link\":\n return plainText(n.children);\n case \"xref\":\n case \"cite\":\n return n.label;\n case \"image\":\n return n.alt;\n case \"break\":\n return \" \";\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\ninterface Ctx {\n settings: DocumentSettings;\n notices: DocumentNotice[];\n notify: (n: DocumentNotice) => void;\n defs: Map<string, { url: string; title?: string | null | undefined }>;\n footnoteDefs: Map<string, RootContent[]>;\n noteOrder: Map<string, number>;\n refs: Map<string, CslItem>;\n cited: Set<string>;\n htmlAnnounced: boolean;\n ids: Set<string>;\n figN: number;\n tblN: number;\n figures: Caption[];\n tables: Caption[];\n /** Pending xrefs, resolved once every id is known. */\n xrefs: Array<Extract<Inline, { type: \"xref\" }>>;\n headingIndex: Map<string, Extract<Block, { type: \"heading\" }>>;\n}\n\nfunction uniqueId(ctx: Ctx, base: string): string {\n let id = base;\n for (let n = 2; ctx.ids.has(id); n++) id = `${base}-${n}`;\n ctx.ids.add(id);\n return id;\n}\n\n// ── inline scanning: citations and cross-references inside text ────────────\n\nconst CITE_GROUP_RE = /\\[(-?@[^[\\]]+)\\]/g;\nconst BARE_RE = /(^|[^\\w@.\\\\])@((?:fig|tbl|sec|eq):[\\w-]+|[A-Za-z0-9_](?:[\\w:.#$%&+?<>~/-]*\\w)?)/g;\n\nfunction scanText(value: string, ctx: Ctx): Inline[] {\n const out: Inline[] = [];\n const pushText = (s: string) => {\n if (!s) return;\n const last = out[out.length - 1];\n if (last?.type === \"text\") last.value += s;\n else out.push({ type: \"text\", value: s });\n };\n const scanBare = (s: string) => {\n let last = 0;\n for (const m of s.matchAll(BARE_RE)) {\n const key = m[2] as string;\n const start = m.index! + (m[1] as string).length;\n const xm = /^(fig|tbl|sec|eq):(.+)$/.exec(key);\n if (xm) {\n pushText(s.slice(last, start));\n out.push(makeXref(`${xm[1]}:${xm[2]}`, ctx));\n last = start + key.length + 1;\n } else if (ctx.refs.has(key)) {\n pushText(s.slice(last, start));\n ctx.cited.add(key);\n const { label, resolved } = formatCitation(\n [{ key, suppressAuthor: false }],\n (k) => ctx.refs.get(k),\n ctx.settings.citationStyle,\n true,\n );\n out.push({ type: \"cite\", keys: [key], label, resolved });\n last = start + key.length + 1;\n }\n }\n pushText(s.slice(last));\n };\n let last = 0;\n for (const m of value.matchAll(CITE_GROUP_RE)) {\n const inner = m[1] as string;\n const refs = parseCitationGroup(inner);\n const single = /^@((?:fig|tbl|sec|eq):[\\w-]+)$/.exec(inner.trim());\n if (!refs && !single) continue;\n scanBare(value.slice(last, m.index));\n if (single) out.push(makeXref(single[1] as string, ctx));\n else if (refs) {\n const { label, resolved } = formatCitation(refs, (k) => ctx.refs.get(k), ctx.settings.citationStyle);\n for (const r of refs) if (ctx.refs.has(r.key)) ctx.cited.add(r.key);\n if (!resolved) {\n const missing = refs.filter((r) => !ctx.refs.has(r.key)).map((r) => r.key);\n ctx.notify({\n code: \"citation-unresolved\",\n message: `No reference was found for ${missing.map((k) => `@${k}`).join(\", \")}.`,\n remedy: \"Add it under `references:` in the settings at the top (id, title, author, issued), or fix the key's spelling.\",\n });\n }\n out.push({ type: \"cite\", keys: refs.map((r) => r.key), label, resolved });\n }\n last = m.index! + m[0].length;\n }\n scanBare(value.slice(last));\n return out;\n}\n\nfunction makeXref(target: string, ctx: Ctx): Extract<Inline, { type: \"xref\" }> {\n const x = { type: \"xref\" as const, target, label: target, resolved: false };\n ctx.xrefs.push(x);\n return x;\n}\n\nfunction inlines(nodes: PhrasingContent[] | readonly MdNode[], ctx: Ctx): Inline[] {\n const out: Inline[] = [];\n for (const n of nodes as MdNode[]) {\n switch (n.type) {\n case \"text\":\n out.push(...scanText(n.value, ctx));\n break;\n case \"strong\":\n out.push({ type: \"strong\", children: inlines(n.children, ctx) });\n break;\n case \"emphasis\":\n out.push({ type: \"emphasis\", children: inlines(n.children, ctx) });\n break;\n case \"delete\":\n out.push({ type: \"delete\", children: inlines(n.children, ctx) });\n break;\n case \"inlineCode\":\n out.push({ type: \"code\", value: n.value });\n break;\n case \"break\":\n out.push({ type: \"break\" });\n break;\n case \"link\":\n out.push({ type: \"link\", url: n.url, children: inlines(n.children, ctx) });\n break;\n case \"image\":\n out.push({ type: \"image\", url: n.url, alt: n.alt ?? \"\" });\n break;\n case \"linkReference\": {\n const def = ctx.defs.get(n.identifier);\n const kids = inlines(n.children, ctx);\n if (def) out.push({ type: \"link\", url: def.url, children: kids });\n else out.push({ type: \"text\", value: \"[\" }, ...kids, { type: \"text\", value: \"]\" });\n break;\n }\n case \"imageReference\": {\n const def = ctx.defs.get(n.identifier);\n if (def) out.push({ type: \"image\", url: def.url, alt: n.alt ?? \"\" });\n break;\n }\n case \"footnoteReference\": {\n let num = ctx.noteOrder.get(n.identifier);\n if (num === undefined) {\n num = ctx.noteOrder.size + 1;\n ctx.noteOrder.set(n.identifier, num);\n }\n out.push({ type: \"noteRef\", n: num });\n break;\n }\n case \"html\":\n // Inline raw HTML: <br> is a line break; any other tag is dropped and\n // its text kept (the tags are separate nodes, the text between survives).\n if (/^<br\\s*\\/?>$/i.test(n.value.trim())) out.push({ type: \"break\" });\n else if (!/^<!--/.test(n.value)) announceHtml(ctx);\n break;\n default:\n break;\n }\n }\n return out;\n}\n\nfunction announceHtml(ctx: Ctx) {\n if (ctx.htmlAnnounced) return;\n ctx.htmlAnnounced = true;\n ctx.notify({\n code: \"html-stripped\",\n message: \"Raw HTML tags in the document were left out of the printed/exported file (their text is kept).\",\n remedy: \"Use markdown formatting instead of HTML tags; a page break is the line <!-- pagebreak -->.\",\n });\n}\n\n// ── blocks ─────────────────────────────────────────────────────────────────\n\ntype Directive =\n | { type: \"section\"; value: SectionBreakDirective }\n | { type: \"pagebreak\" }\n | { type: \"toc\" }\n | { type: \"bibliography\" };\n\nfunction directiveOf(node: RootContent): Directive | null {\n if (node.type !== \"html\") return null;\n const m = /^<!--matrx:(section|pagebreak|toc|bibliography)\\s*(.*?)-->$/.exec(node.value.trim());\n if (!m) return null;\n if (m[1] === \"section\") {\n try {\n return { type: \"section\", value: JSON.parse(m[2] || \"{}\") as SectionBreakDirective };\n } catch {\n return { type: \"section\", value: {} };\n }\n }\n return { type: m[1] as \"pagebreak\" | \"toc\" | \"bibliography\" };\n}\n\nconst ATTR_RE = /\\s*\\{([^{}]*)\\}\\s*$/;\n\n/** Pull a trailing pandoc attribute block `{#id .class -}` off inline content. */\nfunction takeAttributes(kids: Inline[]): { id?: string | undefined; unnumbered: boolean } {\n const last = kids[kids.length - 1];\n if (last?.type !== \"text\") return { unnumbered: false };\n const m = ATTR_RE.exec(last.value);\n if (!m) return { unnumbered: false };\n const attrs = (m[1] as string).trim().split(/\\s+/);\n if (!attrs.every((a) => /^(#[\\w:.-]+|\\.[\\w-]+|-|[\\w-]+=\\S+)$/.test(a))) return { unnumbered: false };\n last.value = last.value.slice(0, m.index).replace(/\\s+$/, \"\");\n if (!last.value) kids.pop();\n const id = attrs.find((a) => a.startsWith(\"#\"))?.slice(1);\n const unnumbered = attrs.includes(\"-\") || attrs.includes(\".unnumbered\");\n return { id, unnumbered };\n}\n\nfunction figureOf(node: RootContent, ctx: Ctx): Block | null {\n if (node.type !== \"paragraph\") return null;\n const kids = node.children.filter((c) => !(c.type === \"text\" && !c.value.trim()));\n const img = kids[0];\n if (!img || (img.type !== \"image\" && img.type !== \"imageReference\")) return null;\n let url: string;\n let alt = img.alt ?? \"\";\n if (img.type === \"image\") {\n url = img.url;\n if (!alt && img.title) alt = img.title;\n } else {\n const def = ctx.defs.get(img.identifier);\n if (!def) return null;\n url = def.url;\n }\n let id: string | undefined;\n if (kids.length === 2) {\n const tail = kids[1];\n const m = tail?.type === \"text\" ? /^\\s*\\{#fig:([\\w-]+)[^}]*\\}\\s*$/.exec(tail.value) : null;\n if (!m) return null;\n id = m[1];\n } else if (kids.length > 2) return null;\n const figure: Extract<Block, { type: \"figure\" }> = { type: \"figure\", url, alt };\n if (alt.trim() || id) {\n const number = ++ctx.figN;\n const children = alt.trim() ? scanText(alt, ctx) : [];\n const caption: Caption = { kind: \"fig\", id, number, label: `Figure ${number}`, children };\n if (id) uniqueId(ctx, `fig:${id}`);\n figure.caption = caption;\n ctx.figures.push(caption);\n }\n return figure;\n}\n\nfunction tableCaptionText(node: RootContent | undefined): PhrasingContent[] | null {\n if (!node || node.type !== \"paragraph\") return null;\n const first = node.children[0];\n if (first?.type !== \"text\" || !/^Table:\\s+/.test(first.value)) return null;\n const rest = [{ ...first, value: first.value.replace(/^Table:\\s+/, \"\") }, ...node.children.slice(1)];\n return rest as PhrasingContent[];\n}\n\nfunction convertBlocks(nodes: RootContent[], ctx: Ctx, out: Block[], allowDirectives = false): void {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i] as RootContent;\n const block = convertBlock(nodes, i, ctx, allowDirectives);\n if (block === \"skip-next\") {\n i++;\n continue;\n }\n if (block) out.push(block);\n }\n}\n\nfunction convertTable(node: MdTable, captionNodes: PhrasingContent[] | null, ctx: Ctx): Block {\n const rows = node.children.map((row) => row.children.map((cell) => inlines(cell.children, ctx)));\n const table: Extract<Block, { type: \"table\" }> = {\n type: \"table\",\n align: (node.align ?? []).map((a) => a ?? null),\n header: rows[0] ?? [],\n rows: rows.slice(1),\n };\n if (captionNodes) {\n const kids = inlines(captionNodes, ctx);\n const { id } = takeAttributes(kids);\n const tid = id?.replace(/^tbl:/, \"\");\n const number = ++ctx.tblN;\n const caption: Caption = { kind: \"tbl\", id: tid, number, label: `Table ${number}`, children: kids };\n if (tid) uniqueId(ctx, `tbl:${tid}`);\n table.caption = caption;\n ctx.tables.push(caption);\n }\n return table;\n}\n\nfunction convertBlock(\n nodes: RootContent[],\n i: number,\n ctx: Ctx,\n allowDirectives: boolean,\n): Block | null | \"skip-next\" {\n const node = nodes[i] as RootContent;\n switch (node.type) {\n case \"heading\": {\n const children = inlines(node.children, ctx);\n const { id, unnumbered } = takeAttributes(children);\n const plain = plainText(children).trim();\n const hid = uniqueId(ctx, id ?? slugify(plain));\n const h: Extract<Block, { type: \"heading\" }> = {\n type: \"heading\",\n level: node.depth,\n id: hid,\n plain,\n children,\n numbered: !unnumbered,\n };\n ctx.headingIndex.set(hid, h);\n return h;\n }\n case \"paragraph\": {\n const fig = figureOf(node, ctx);\n if (fig) return fig;\n // A caption paragraph belongs to the adjacent table.\n const cap = tableCaptionText(node);\n if (cap) {\n const next = nodes[i + 1];\n const prev = nodes[i - 1];\n if (next?.type === \"table\") {\n const t = convertTable(next, cap, ctx);\n nodes[i + 1] = { type: \"html\", value: \"<!--matrx:consumed-->\" };\n return t;\n }\n if (prev?.type === \"table\") return null; // consumed by the table (below)\n }\n return { type: \"paragraph\", children: inlines(node.children, ctx) };\n }\n case \"table\": {\n const next = nodes[i + 1];\n const cap = tableCaptionText(next);\n if (cap) {\n const t = convertTable(node, cap, ctx);\n nodes[i + 1] = { type: \"html\", value: \"<!--matrx:consumed-->\" };\n return t;\n }\n return convertTable(node, null, ctx);\n }\n case \"list\": {\n const items: ListItem[] = node.children.map((li) => {\n const children: Block[] = [];\n convertBlocks(li.children as RootContent[], ctx, children);\n return { checked: li.checked ?? null, children };\n });\n return { type: \"list\", ordered: Boolean(node.ordered), start: node.start ?? 1, items };\n }\n case \"blockquote\": {\n const children: Block[] = [];\n convertBlocks(node.children as RootContent[], ctx, children);\n return { type: \"blockquote\", children };\n }\n case \"code\":\n return { type: \"code\", lang: node.lang ?? \"\", value: node.value };\n case \"thematicBreak\":\n return { type: \"rule\" };\n case \"html\": {\n if (/^<!--matrx:consumed-->$/.test(node.value)) return null;\n if (/^\\s*<!--[\\s\\S]*-->\\s*$/.test(node.value)) return null; // comments are invisible\n if (/^\\s*<br\\s*\\/?>\\s*$/i.test(node.value)) return null;\n // Block HTML: keep the words, drop the tags.\n const text = node.value\n .replace(/<(script|style)\\b[\\s\\S]*?<\\/\\1>/gi, \"\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (/<(?!\\/?(?:artifact|flashcards)\\b)[a-z]/i.test(node.value)) announceHtml(ctx);\n return text ? { type: \"paragraph\", children: [{ type: \"text\", value: text }] } : null;\n }\n case \"math\" as string:\n return { type: \"code\", lang: \"math\", value: (node as unknown as { value: string }).value };\n default:\n void allowDirectives;\n return null;\n }\n}\n\nfunction resolveXrefs(ctx: Ctx) {\n const figs = new Map(ctx.figures.filter((c) => c.id).map((c) => [c.id as string, c]));\n const tbls = new Map(ctx.tables.filter((c) => c.id).map((c) => [c.id as string, c]));\n for (const x of ctx.xrefs) {\n const [kind, id] = x.target.split(/:(.*)/s) as [string, string];\n let label: string | undefined;\n if (kind === \"fig\") label = figs.get(id)?.label;\n else if (kind === \"tbl\") label = tbls.get(id)?.label;\n else if (kind === \"sec\") {\n const h = ctx.headingIndex.get(`sec:${id}`) ?? ctx.headingIndex.get(id);\n if (h) {\n label = h.number ? `Section ${h.number}` : `“${h.plain}”`;\n x.target = `sec:${h.id}`;\n }\n }\n if (label) {\n x.label = label;\n x.resolved = true;\n } else {\n x.label = \"??\";\n ctx.notify({\n code: \"xref-unresolved\",\n message: `The cross-reference @${x.target} points at nothing in this document.`,\n remedy:\n kind === \"sec\"\n ? `Give the heading an id: \\`## Title {#sec:${id}}\\`.`\n : kind === \"fig\"\n ? `Label the image: \\`{#fig:${id}}\\`.`\n : `Caption the table: a line \\`Table: Caption {#tbl:${id}}\\` right before or after it.`,\n });\n }\n }\n}\n\n/** Parse a markdown source (with optional frontmatter) into the document tree. */\nexport function parseDocument(source: string, options: ParseDocumentOptions = {}): DocTree {\n const notices: DocumentNotice[] = [];\n const notify = (n: DocumentNotice) => {\n notices.push(n);\n options.onNotice?.(n);\n };\n const sink: DocumentNotice[] = [];\n const fm = splitFrontmatter(source ?? \"\", sink);\n const settings = resolveSettings(fm.data, sink, options);\n for (const n of sink) notify(n);\n\n const body = removeThinkingContent(fm.body);\n const root = fromMarkdown(prepass(body), {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n }) as Root;\n\n const ctx: Ctx = {\n settings,\n notices,\n notify,\n defs: new Map(),\n footnoteDefs: new Map(),\n noteOrder: new Map(),\n refs: new Map(settings.references.map((r) => [r.id, r])),\n cited: new Set(),\n htmlAnnounced: false,\n ids: new Set(),\n figN: 0,\n tblN: 0,\n figures: [],\n tables: [],\n xrefs: [],\n headingIndex: new Map(),\n };\n const visit = (n: MdNode) => {\n if (n.type === \"definition\") ctx.defs.set(n.identifier, { url: n.url, title: n.title });\n if (n.type === \"footnoteDefinition\") ctx.footnoteDefs.set(n.identifier, n.children as RootContent[]);\n if (\"children\" in n) for (const c of (n as MdParent).children) visit(c as MdNode);\n };\n visit(root);\n\n // Sections at section breaks; page breaks / toc / bibliography as blocks.\n const sections: DocSection[] = [\n { orientation: settings.page.orientation, columns: settings.columns, blocks: [] },\n ];\n let hasTocBlock = false;\n let hasBibBlock = false;\n const top = root.children.filter((n) => n.type !== \"definition\" && n.type !== \"footnoteDefinition\");\n for (let i = 0; i < top.length; i++) {\n const node = top[i] as RootContent;\n const d = directiveOf(node);\n const current = sections[sections.length - 1] as DocSection;\n if (d?.type === \"section\") {\n sections.push({\n orientation: d.value.orientation ?? settings.page.orientation,\n columns: d.value.columns ?? settings.columns,\n blocks: [],\n });\n continue;\n }\n if (d?.type === \"pagebreak\") {\n current.blocks.push({ type: \"pageBreak\" });\n continue;\n }\n if (d?.type === \"toc\") {\n if (!hasTocBlock) current.blocks.push({ type: \"toc\" });\n hasTocBlock = true;\n continue;\n }\n if (d?.type === \"bibliography\") {\n current.blocks.push({ type: \"bibliography\" });\n hasBibBlock = true;\n continue;\n }\n const block = convertBlock(top, i, ctx, true);\n if (block && block !== \"skip-next\") current.blocks.push(block);\n }\n // Drop sections a trailing/leading break left empty (no blank pages).\n const nonEmpty = sections.filter((s, idx) => s.blocks.length > 0 || idx === 0);\n sections.length = 0;\n sections.push(...nonEmpty);\n for (const s of sections) {\n while (s.blocks[0]?.type === \"pageBreak\") s.blocks.shift();\n while (s.blocks[s.blocks.length - 1]?.type === \"pageBreak\") s.blocks.pop();\n }\n\n // Section numbering (relative to the shallowest numbered heading level).\n const allHeadings: Array<Extract<Block, { type: \"heading\" }>> = [];\n const collect = (blocks: Block[]) => {\n for (const b of blocks) if (b.type === \"heading\") allHeadings.push(b);\n };\n for (const s of sections) collect(s.blocks);\n const minLevel = Math.min(7, ...allHeadings.map((h) => h.level));\n if (settings.numberSections) {\n const counters = [0, 0, 0, 0, 0, 0];\n for (const h of allHeadings) {\n if (!h.numbered) continue;\n const depth = h.level - minLevel;\n counters[depth] = (counters[depth] ?? 0) + 1;\n for (let d = depth + 1; d < 6; d++) counters[d] = 0;\n h.number = counters\n .slice(0, depth + 1)\n .map((c) => c || 1)\n .join(\".\");\n }\n }\n\n // Footnotes → endnotes.\n const notes: DocTree[\"notes\"] = [];\n for (const [identifier, n] of [...ctx.noteOrder.entries()].sort((a, b) => a[1] - b[1])) {\n const children: Block[] = [];\n convertBlocks(ctx.footnoteDefs.get(identifier) ?? [], ctx, children);\n notes.push({ n, children });\n }\n const last = sections[sections.length - 1] as DocSection;\n const backLevel = minLevel <= 6 ? minLevel : 1;\n const backHeading = (plain: string, id: string): Block => {\n const h: Extract<Block, { type: \"heading\" }> = {\n type: \"heading\",\n level: backLevel,\n id: uniqueId(ctx, id),\n plain,\n children: [{ type: \"text\", value: plain }],\n numbered: false,\n };\n allHeadings.push(h);\n return h;\n };\n if (notes.length) last.blocks.push(backHeading(\"Notes\", \"notes\"), { type: \"notes\" });\n\n // Bibliography.\n const citedItems = [...ctx.cited].map((k) => ctx.refs.get(k)).filter((x): x is CslItem => Boolean(x));\n const bibliography = formatBibliography(citedItems, settings.citationStyle);\n if (bibliography.length || hasBibBlock) {\n const heading = backHeading(settings.bibliographyTitle, \"references\");\n if (hasBibBlock) {\n for (const s of sections) {\n const idx = s.blocks.findIndex((b) => b.type === \"bibliography\");\n if (idx >= 0) {\n s.blocks.splice(idx, 0, heading);\n break;\n }\n }\n } else {\n last.blocks.push(heading, { type: \"bibliography\" });\n }\n }\n\n // Table of contents.\n if (settings.toc.enabled && !hasTocBlock) {\n (sections[0] as DocSection).blocks.unshift({ type: \"toc\" }, { type: \"pageBreak\" });\n }\n const order: Array<Extract<Block, { type: \"heading\" }>> = [];\n for (const s of sections) for (const b of s.blocks) if (b.type === \"heading\") order.push(b);\n const toc = order\n .filter((h) => h.level - minLevel + 1 <= settings.toc.depth)\n .map((h) => ({ id: h.id, level: h.level - minLevel + 1, text: h.number ? `${h.number} ${h.plain}` : h.plain }));\n\n resolveXrefs(ctx);\n\n if (!sections.some((s) => s.blocks.length) && !settings.cover) {\n notify({\n code: \"empty-document\",\n message: \"The document has no content to print or export.\",\n remedy: \"Write something below the settings block (or remove the --- lines if they are not settings).\",\n });\n }\n\n return {\n settings,\n body,\n sections,\n toc,\n figures: ctx.figures,\n tables: ctx.tables,\n bibliography,\n notes,\n notices,\n };\n}\n","/**\n * @ai-matrx/print/markdown — the SHIPPED DEFAULT markdown→HTML converter and\n * print stylesheet.\n *\n * Why this entry exists: `markdownToPdfBlob` used to declare its converter and\n * its stylesheet as REQUIRED injected ports (\"bring your own converter +\n * stylesheet\"). That is the exact failure THE ALL-INCLUSIVE LAW names — every\n * host had to build the hard half itself, and both hosts that tried ended up\n * with a different converter, a different stylesheet, and a different set of\n * bugs. The package now ships a complete, working default for both ports; the\n * injection seam survives as the OVERRIDE path, never as a prerequisite.\n *\n * Two skins, one vocabulary:\n * • \"document\" — `markdownToHtml` emits `.matrx-*`-classed HTML (tables,\n * nested lists, images, links, code, FAQ blocks, flashcards) and\n * `MARKDOWN_DOCUMENT_CSS` styles it. This is the PDF/publish/WordPress\n * lane.\n * • \"article\" — `markdownToArticleHtml` emits bare semantic tags and\n * `MARKDOWN_ARTICLE_CSS` gives them the serif AI-response look. This is\n * the print-window lane.\n *\n * Nothing here touches `window`/`document` at import time, and nothing here is\n * heavy — but it IS ~20KB of CSS, so `markdownToPdfBlob` reaches it through a\n * lazy `import(\"./markdown\")` and a consumer that never prints markdown pays\n * nothing.\n *\n * NOTHING FAILS SILENTLY: every case where the converter drops input it cannot\n * represent (a malformed flashcard, an empty document) is reported through the\n * optional `onNotice` sink with a concrete remedy, instead of vanishing.\n */\n\nimport { openPrintWindow, type PrintOutcome } from \"./core\";\nimport { escapeHtml } from \"@ai-matrx/kit/html-escape\";\nimport {\n MARKDOWN_ARTICLE_CSS,\n MARKDOWN_ARTICLE_TOKENS_CSS,\n MARKDOWN_DOCUMENT_CSS,\n MARKDOWN_DOCUMENT_TOKENS_CSS,\n MARKDOWN_PAGE_CSS,\n MARKDOWN_PAGE_PLAIN_CSS,\n MARKDOWN_SHARED_CSS,\n} from \"./markdown-css\";\nimport {\n PAGE_BREAK_CLASS,\n PAGE_BREAK_LABEL,\n PAGE_BREAK_MARKDOWN,\n isBibliographyLine,\n isBreakLine,\n isPageBreakLine,\n isTocLine,\n splitAtPageBreaks,\n} from \"./directives\";\n\nexport {\n MARKDOWN_ARTICLE_CSS,\n MARKDOWN_ARTICLE_TOKENS_CSS,\n MARKDOWN_DOCUMENT_CSS,\n MARKDOWN_DOCUMENT_TOKENS_CSS,\n MARKDOWN_PAGE_CSS,\n MARKDOWN_SHARED_CSS,\n PAGE_BREAK_CLASS,\n PAGE_BREAK_MARKDOWN,\n isPageBreakLine,\n splitAtPageBreaks,\n};\n\n/** Which shipped look to render markdown in. */\nexport type MarkdownSkin = \"document\" | \"article\";\n\n/**\n * A thing the converter could not represent, with the remedy. Announced, never\n * swallowed — a dropped card that says nothing is indistinguishable from a card\n * the author never wrote.\n */\nexport interface MarkdownNotice {\n code: \"flashcard-malformed\" | \"empty-output\" | \"html-stripped\";\n message: string;\n /** What the caller (or the author of the markdown) should do about it. */\n remedy: string;\n}\n\nexport interface MarkdownToHtmlOptions {\n /** Keep `<thinking>` / `<think>` / `<reasoning>` blocks. Default: false. */\n includeThinking?: boolean;\n /** Where dropped/degraded content is announced. */\n onNotice?: (notice: MarkdownNotice) => void;\n}\n\n// ─── thinking-block stripping ────────────────────────────────────────────────\n\n/**\n * Strip `<thinking>` / `<think>` / `<reasoning>` blocks from model output.\n *\n * All three tags are treated as equivalent — a host that handled only\n * `<thinking>` leaked raw reasoning into printed documents the moment a model\n * switched tag names, which is exactly the bug this package exists to stop\n * being re-solved per app.\n */\nexport function removeThinkingContent(content: string): string {\n if (!content) return \"\";\n\n let result = content\n .replace(/\\n*<thinking>[\\s\\S]*?<\\/thinking>\\n*/gi, \"\\n\")\n .replace(/\\n*<think>[\\s\\S]*?<\\/think>\\n*/gi, \"\\n\")\n .replace(/\\n*<reasoning>[\\s\\S]*?<\\/reasoning>\\n*/gi, \"\\n\");\n\n // 3+ newlines collapse to 2 — intentional paragraph breaks survive.\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n return result.trim();\n}\n\n/** Does this content carry any reasoning block? */\nexport function hasThinkingContent(content: string): boolean {\n if (!content) return false;\n return /<thinking>|<think>|<reasoning>/i.test(content);\n}\n\n// ─── shared machinery: ONE pre-pass, ONE table/list/rule grammar ────────────\n//\n// Both skins used to carry their own table parser, their own list builder,\n// their own rule regex, and their own (or no) code-fence handling — and they\n// had drifted: the article skin had no nested lists, the document skin ran the\n// emphasis pass over code, neither understood a page break, and both pasted an\n// `<artifact>`'s raw HTML (its <html>, <body> and <script>) straight into the\n// host page. Everything below is shared; a skin supplies only class names and\n// the HTML for a code block / flashcard deck.\n\n// Private-use delimiters: they cannot collide with author text (the input is\n// scrubbed of them first) and no markdown pass treats them as syntax.\nconst TOKEN_OPEN = \"\\uE000\";\nconst TOKEN_CLOSE = \"\\uE001\";\nconst BLOCK_TOKEN = (i: number): string => `${TOKEN_OPEN}B${i}${TOKEN_CLOSE}`;\nconst INLINE_TOKEN = (i: number): string => `${TOKEN_OPEN}I${i}${TOKEN_CLOSE}`;\nconst TOKEN_RE = /\\uE000([BI])(\\d+)\\uE001/g;\nconst PARAGRAPH_WRAPPED_BLOCK_RE = /<p[^>]*>\\s*(\\uE000B\\d+\\uE001)\\s*<\\/p>/g;\n\n/** Converted HTML parked behind a placeholder so later passes cannot touch it. */\nclass Stash {\n private readonly items: string[] = [];\n\n block(html: string): string {\n return BLOCK_TOKEN(this.items.push(html) - 1);\n }\n\n inline(html: string): string {\n return INLINE_TOKEN(this.items.push(html) - 1);\n }\n\n restore(html: string): string {\n // Items can hold tokens of their own (inline code inside a link), so\n // restore until nothing is left — bounded, since items never self-nest.\n let out = html;\n for (let pass = 0; pass < 8 && out.includes(TOKEN_OPEN); pass++) {\n out = out\n .replace(PARAGRAPH_WRAPPED_BLOCK_RE, \"$1\")\n .replace(TOKEN_RE, (_m: string, _k: string, i: string) => this.items[Number(i)] ?? \"\");\n }\n return out;\n }\n}\n\ninterface SkinGrammar {\n skin: MarkdownSkin;\n table: string;\n thead: string;\n tbody: string;\n tr: string;\n th: string;\n td: string;\n ul: string;\n ol: string;\n ulNested: string;\n olNested: string;\n li: string;\n hr: string;\n del: string;\n strong: string;\n em: string;\n inlineCode: string;\n}\n\nconst DOCUMENT_GRAMMAR: SkinGrammar = {\n skin: \"document\",\n table: \"matrx-table\",\n thead: \"matrx-table-head\",\n tbody: \"matrx-table-body\",\n tr: \"matrx-table-row\",\n th: \"matrx-table-header\",\n td: \"matrx-table-cell\",\n ul: \"matrx-list matrx-bullet-list\",\n ol: \"matrx-list matrx-numbered-list\",\n ulNested: \"matrx-list matrx-bullet-list matrx-nested-list\",\n olNested: \"matrx-list matrx-numbered-list matrx-nested-list\",\n li: \"matrx-list-item\",\n hr: \"matrx-hr\",\n del: \"matrx-del\",\n strong: \"matrx-strong\",\n em: \"matrx-em\",\n inlineCode: \"matrx-inline-code\",\n};\n\nconst ARTICLE_GRAMMAR: SkinGrammar = {\n skin: \"article\",\n table: \"print-table\",\n thead: \"\",\n tbody: \"\",\n tr: \"\",\n th: \"\",\n td: \"\",\n ul: \"\",\n ol: \"\",\n ulNested: \"\",\n olNested: \"\",\n li: \"\",\n hr: \"\",\n del: \"\",\n strong: \"\",\n em: \"\",\n inlineCode: \"inline-code\",\n};\n\nconst cls = (...names: string[]): string => {\n const joined = names.filter(Boolean).join(\" \");\n return joined ? ` class=\"${joined}\"` : \"\";\n};\n\n/** The rendered page break — identical markup in both skins. */\nconst PAGE_BREAK_HTML = `<div class=\"${PAGE_BREAK_CLASS}\" role=\"separator\" aria-label=\"${PAGE_BREAK_LABEL}\" data-label=\"${PAGE_BREAK_LABEL}\"></div>`;\n\nfunction codeBlockHtml(g: SkinGrammar, code: string, language: string): string {\n const body = escapeHtml(code.replace(/\\n$/, \"\"));\n const lang = language.trim();\n if (g.skin === \"article\") {\n const label = lang ? `<span class=\"code-lang\">${escapeHtml(lang)}</span>` : \"\";\n return `<div class=\"code-block-wrapper\">${label}<pre class=\"code-block\"><code>${body}</code></pre></div>`;\n }\n const dataLang = lang ? ` data-language=\"${escapeHtml(lang)}\"` : \"\";\n return `<pre class=\"matrx-code-block\"${dataLang}><code class=\"matrx-code\">${body}</code></pre>`;\n}\n\n// ── artifacts ───────────────────────────────────────────────────────────────\n\n/** Artifact types whose body is source code, printed as its source. */\nconst CODE_ARTIFACT_LANGUAGE: Readonly<Record<string, string>> = {\n html: \"html\",\n react: \"tsx\",\n svg: \"svg\",\n mermaid: \"mermaid\",\n diff: \"diff\",\n iframe: \"html\",\n code: \"\",\n};\n\nconst ARTIFACT_TYPE_LABEL: Readonly<Record<string, string>> = {\n html: \"HTML\",\n svg: \"SVG\",\n react: \"React\",\n iframe: \"Embed\",\n};\n\nfunction parseTagAttributes(tag: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const m of tag.matchAll(/([a-zA-Z_][\\w-]*)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g)) {\n attrs[(m[1] as string).toLowerCase()] = m[2] ?? m[3] ?? \"\";\n }\n return attrs;\n}\n\nfunction artifactLabel(type: string): string {\n if (!type) return \"Artifact\";\n return (\n ARTIFACT_TYPE_LABEL[type] ??\n type.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n );\n}\n\nfunction looksLikeJson(body: string): boolean {\n const t = body.trim();\n if (!/^[[{]/.test(t)) return false;\n try {\n JSON.parse(t);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * An `<artifact type id version title>body</artifact>` block, rendered as a\n * titled panel. Source-code artifacts (html, react, svg, mermaid, diff, code)\n * and JSON bodies print as escaped source — never as live markup, which is\n * what used to inject a whole `<html>…<script>` document into the host page.\n * Everything else (checklists, flashcards, research, notes) is markdown and is\n * converted in the same skin.\n */\nfunction artifactHtml(\n g: SkinGrammar,\n attrs: Record<string, string>,\n body: string | null,\n ctx: ConvertContext,\n): string {\n const type = (attrs.type ?? \"\").toLowerCase();\n const title = attrs.title?.trim() ?? \"\";\n const header = `<div class=\"matrx-artifact-header\"><span class=\"matrx-artifact-kind\">${escapeHtml(\n artifactLabel(type),\n )}</span>${title ? `<span class=\"matrx-artifact-title\">${escapeHtml(title)}</span>` : \"\"}</div>`;\n\n let inner: string;\n const trimmed = (body ?? \"\").replace(/^\\n+|\\n+$/g, \"\");\n if (body === null || !trimmed.trim()) {\n inner = `<p class=\"matrx-artifact-empty\">Saved artifact — open it in AI Matrx to view its content.</p>`;\n } else if (/^\\s*(`{3,}|~{3,})/.test(trimmed)) {\n inner = convertBody(g.skin, trimmed, ctx);\n } else if (type in CODE_ARTIFACT_LANGUAGE) {\n inner = codeBlockHtml(g, trimmed, CODE_ARTIFACT_LANGUAGE[type] || attrs.language || attrs.lang || \"\");\n } else if (looksLikeJson(trimmed)) {\n inner = codeBlockHtml(g, JSON.stringify(JSON.parse(trimmed), null, 2), \"json\");\n } else {\n inner = convertBody(g.skin, trimmed, ctx);\n }\n\n return `<section class=\"matrx-artifact\" data-artifact-type=\"${escapeHtml(type || \"artifact\")}\">${header}<div class=\"matrx-artifact-body\">${inner}</div></section>`;\n}\n\n// ── flashcards ──────────────────────────────────────────────────────────────\n\ninterface ParsedCard {\n front: string;\n back: string;\n}\n\nfunction parseFlashcards(content: string, notice: MarkdownToHtmlOptions[\"onNotice\"]): ParsedCard[] {\n const cards: ParsedCard[] = [];\n for (const card of content.split(/\\n*---\\n*/g).map((c) => c.trim()).filter(Boolean)) {\n const front = card.match(/Front:\\s*(.+?)(?=\\n|$)/i)?.[1]?.trim();\n const back = card.match(/Back:\\s*([\\s\\S]+?)$/i)?.[1]?.trim();\n if (!front || !back) {\n // A card that silently disappears from a printed deck is a defect the\n // printer can see and the author cannot.\n notice?.({\n code: \"flashcard-malformed\",\n message: `A flashcard was skipped: it is missing a ${front ? \"Back:\" : \"Front:\"} line.`,\n remedy:\n 'Every card inside <flashcards> needs both \"Front: …\" and \"Back: …\", separated from the next card by ---.',\n });\n continue;\n }\n cards.push({ front, back });\n }\n return cards;\n}\n\nfunction flashcardsHtml(g: SkinGrammar, cards: ParsedCard[], ctx: ConvertContext): string {\n if (g.skin === \"article\") {\n // Paper cannot flip: print the deck as question / answer pairs.\n return `<div class=\"matrx-flashcards-print\">${cards\n .map(\n (c, i) =>\n `<div class=\"matrx-fc\"><div class=\"matrx-fc-front\"><span class=\"matrx-fc-num\">${\n i + 1\n }</span>${c.front}</div><div class=\"matrx-fc-back\">${c.back}</div></div>`,\n )\n .join(\"\")}</div>`;\n }\n let out = '<div class=\"matrx-flashcards-container\">\\n';\n for (const { front, back } of cards) {\n ctx.cardIndex++;\n const cardId = `card${ctx.cardIndex}`;\n out += ` <div class=\"matrx-flashcard\">\n <input type=\"checkbox\" class=\"matrx-flashcard-input\" id=\"${cardId}\">\n <label for=\"${cardId}\" class=\"matrx-flashcard-label\"></label>\n <div class=\"matrx-flashcard-inner\">\n <div class=\"matrx-flashcard-front\">\n <div class=\"matrx-flashcard-content\">\n <strong>${front}</strong>\n </div>\n <span class=\"matrx-flashcard-indicator\">CLICK TO FLIP</span>\n </div>\n <div class=\"matrx-flashcard-back\">\n <div class=\"matrx-flashcard-content\">\n ${back}\n </div>\n <span class=\"matrx-flashcard-indicator\">CLICK TO FLIP</span>\n </div>\n </div>\n </div>\n\n`;\n }\n return `${out}</div>\\n`;\n}\n\n// ── the pre-pass ────────────────────────────────────────────────────────────\n\ninterface ConvertContext {\n options: MarkdownToHtmlOptions;\n depth: number;\n cardIndex: number;\n strippedAnnounced: boolean;\n}\n\nconst FENCE_OPEN = /^(\\s*)(`{3,}|~{3,})\\s*([^\\s`]*)[^`]*$/;\n\n/**\n * Pull every region the markdown passes must not touch out of the text:\n * fenced code, `<artifact>` blocks, page-break directives, `<flashcards>`,\n * inline code — and remove what must never reach a printed page (scripts,\n * styles, a document shell, HTML comments). Returns the text with\n * placeholders; `stash.restore` puts the finished HTML back.\n */\nfunction protectRegions(markdown: string, g: SkinGrammar, stash: Stash, ctx: ConvertContext): string {\n const lines = markdown.split(/\\r?\\n/);\n const out: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] as string;\n\n // Fenced code (``` or ~~~, any indent, unclosed = to the end).\n const fence = FENCE_OPEN.exec(line);\n if (fence) {\n const marker = fence[2] as string;\n const code: string[] = [];\n let j = i + 1;\n for (; j < lines.length; j++) {\n const close = /^\\s*(`{3,}|~{3,})\\s*$/.exec(lines[j] as string);\n if (close && (close[1] as string)[0] === marker[0] && (close[1] as string).length >= marker.length) break;\n code.push(lines[j] as string);\n }\n const indent = (fence[1] as string).length;\n const dedented = code.map((l) => l.slice(Math.min(indent, l.length - l.trimStart().length)));\n out.push(stash.block(codeBlockHtml(g, dedented.join(\"\\n\"), fence[3] ?? \"\")));\n i = j;\n continue;\n }\n\n if (isBreakLine(line)) {\n out.push(stash.block(PAGE_BREAK_HTML));\n continue;\n }\n // Placement directives only mean something to the document pipeline\n // (@ai-matrx/print/document); a skin never prints them as literal text.\n if (isTocLine(line) || isBibliographyLine(line)) continue;\n\n // <artifact …>body</artifact> — the canonical materialized wire form.\n const open = /^\\s*<artifact\\b((?:[^>\"']|\"[^\"]*\"|'[^']*')*?)(\\/?)>(.*)$/i.exec(line);\n if (open) {\n const attrs = parseTagAttributes(open[1] ?? \"\");\n if (open[2] === \"/\") {\n out.push(stash.block(artifactHtml(g, attrs, null, ctx)));\n if (open[3]?.trim()) out.push(open[3]);\n continue;\n }\n const bodyLines: string[] = [];\n let rest = open[3] ?? \"\";\n let after = \"\";\n let j = i;\n let inFence: string | null = null;\n for (;;) {\n const closeAt = inFence ? -1 : rest.search(/<\\/artifact\\s*>/i);\n if (closeAt >= 0) {\n bodyLines.push(rest.slice(0, closeAt));\n after = rest.slice(closeAt).replace(/^<\\/artifact\\s*>/i, \"\");\n break;\n }\n bodyLines.push(rest);\n const f = /^\\s*(`{3,}|~{3,})/.exec(rest);\n if (f) {\n const m = f[1] as string;\n if (inFence === null) inFence = m;\n else if (m[0] === inFence[0] && m.length >= inFence.length) inFence = null;\n }\n j++;\n if (j >= lines.length) break;\n rest = lines[j] as string;\n }\n const html =\n ctx.depth >= 3\n ? codeBlockHtml(g, bodyLines.join(\"\\n\"), \"\")\n : artifactHtml(g, attrs, bodyLines.join(\"\\n\"), { ...ctx, depth: ctx.depth + 1 });\n out.push(stash.block(html));\n if (after.trim()) out.push(after);\n i = j;\n continue;\n }\n\n out.push(line);\n }\n\n let text = out.join(\"\\n\");\n\n // Inline code FIRST: prose about HTML (\"put it in a `<script>` tag\") must\n // reach the page as code, not be read as markup by the passes below.\n text = text.replace(/`([^`\\n]+)`/g, (_m: string, code: string) =>\n stash.inline(`<code${cls(g.inlineCode)}>${escapeHtml(code)}</code>`),\n );\n\n // Comments are invisible by definition — page-break comments were already\n // taken above, so what remains is safe to drop without a notice.\n text = text.replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n // A printed page and a published HTML page are not a place to run someone\n // else's script or restyle the host. Paired regions go whole; a stray\n // opening/closing tag goes alone (never \"everything to the end\"). Repeat\n // until stable so a split `<scr<script></script>ipt>` cannot reassemble.\n const before = text;\n for (let pass = 0; pass < 8; pass++) {\n const next = text\n .replace(/<(script|style|head)\\b[^>]*>[\\s\\S]*?<\\/\\1\\s*>/gi, \"\")\n .replace(/<\\/?(?:script|style|head|html|body)\\b[^>]*>/gi, \"\")\n .replace(/<!DOCTYPE[^>]*>/gi, \"\");\n if (next === text) break;\n text = next;\n }\n text = sanitizeRawTags(text);\n if (text !== before && !ctx.strippedAnnounced) {\n ctx.strippedAnnounced = true;\n ctx.options.onNotice?.({\n code: \"html-stripped\",\n message:\n \"Unsafe or page-level markup (a <script>, <style>, <head>, an <html>/<body> shell, an on… event handler, or a javascript: URL) was removed from the rendered copy.\",\n remedy:\n 'To show a full HTML page, put it in an ```html fence or an <artifact type=\"html\"> block — it is printed as its source.',\n });\n }\n\n // Flashcard decks — behind placeholders so no markdown pass re-processes them.\n text = text.replace(/<flashcards>([\\s\\S]*?)<\\/flashcards>/gi, (_m: string, content: string) => {\n const cards = parseFlashcards(content, ctx.options.onNotice);\n return cards.length ? `\\n${stash.block(flashcardsHtml(g, cards, ctx))}\\n` : \"\";\n });\n\n return text;\n}\n\nconst URL_ATTRS = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\", \"poster\", \"background\"]);\n\nfunction decodeForSchemeCheck(value: string): string {\n return value\n .replace(/&#x([0-9a-f]+);?/gi, (_m: string, h: string) => String.fromCharCode(parseInt(h, 16)))\n .replace(/&#(\\d+);?/g, (_m: string, d: string) => String.fromCharCode(Number(d)))\n .replace(/:/gi, \":\")\n .replace(/[\\u0000-\\u0020]+/g, \"\")\n .toLowerCase();\n}\n\n/**\n * Author raw HTML survives (the document skin feeds WordPress), but never with\n * an `on…` handler, a `srcdoc`, or a script-scheme URL — entity- and\n * whitespace-obfuscated forms included.\n */\nfunction sanitizeRawTags(text: string): string {\n return text.replace(\n /<([a-zA-Z][\\w:-]*)((?:[^>\"']|\"[^\"]*\"|'[^']*')*)>/g,\n (whole: string, tag: string, rawAttrs: string) => {\n if (!/[=\\s]/.test(rawAttrs)) return whole;\n let changed = false;\n const attrs = rawAttrs.replace(\n /(\\s+)([^\\s\"'=<>/]+)(\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'>]+)))?/g,\n (m: string, _sp: string, name: string, _eq: string, dq?: string, sq?: string, bare?: string) => {\n const lower = name.toLowerCase();\n if (lower.startsWith(\"on\") || lower === \"srcdoc\") {\n changed = true;\n return \"\";\n }\n if (URL_ATTRS.has(lower)) {\n const value = decodeForSchemeCheck(dq ?? sq ?? bare ?? \"\");\n if (/^(?:javascript|vbscript):|^data:text\\/html/.test(value)) {\n changed = true;\n return ` ${name}=\"#\"`;\n }\n }\n return m;\n },\n );\n return changed ? `<${tag}${attrs}>` : whole;\n },\n );\n}\n\n/** A URL that can go in an attribute: no script schemes, no attribute breakout. */\nfunction safeUrl(url: string): string {\n const u = url.trim();\n if (/^(?:javascript|vbscript):|^data:text\\/html/.test(decodeForSchemeCheck(u))) return \"#\";\n return u.replace(/\"/g, \"%22\");\n}\n\n/**\n * Bold / italic / strikethrough, shared by both skins. Underscores follow the\n * CommonMark intraword rule — `snake_case_name` stays literal.\n */\nfunction convertEmphasis(html: string, g: SkinGrammar): string {\n const strong = `<strong${cls(g.strong)}>`;\n const em = `<em${cls(g.em)}>`;\n return html\n .replace(/\\*\\*\\*(?!\\s)(.+?)(?<!\\s)\\*\\*\\*/g, `${strong}${em}$1</em></strong>`)\n .replace(/\\*\\*(?!\\s)(.+?)(?<!\\s)\\*\\*/g, `${strong}$1</strong>`)\n .replace(/(?<![\\w*])\\*(?![\\s*])(.+?)(?<![\\s*])\\*(?![\\w*])/g, `${em}$1</em>`)\n .replace(/(?<![\\w_])___(?!\\s)(.+?)(?<!\\s)___(?![\\w_])/g, `${strong}${em}$1</em></strong>`)\n .replace(/(?<![\\w_])__(?!\\s)(.+?)(?<!\\s)__(?![\\w_])/g, `${strong}$1</strong>`)\n .replace(/(?<![\\w_])_(?![\\s_])(.+?)(?<![\\s_])_(?![\\w_])/g, `${em}$1</em>`)\n .replace(/~~(?!\\s)(.+?)(?<!\\s)~~/g, `<del${cls(g.del)}>$1</del>`);\n}\n\n/** `[text](url)` / `` with one level of parentheses in the URL. */\nconst LINK_URL = String.raw`((?:[^()\\s]|\\([^()\\s]*\\))+)(?:\\s+\"[^\"]*\")?`;\nconst IMAGE_RE = new RegExp(String.raw`!\\[([^\\]]*)\\]\\(` + LINK_URL + String.raw`\\)`, \"g\");\nconst LINK_RE = new RegExp(String.raw`\\[([^\\]]+)\\]\\(` + LINK_URL + String.raw`\\)`, \"g\");\n\n/** `***` accent rule, `#===` heavy rule, `---` / `___` plain rule. */\nfunction convertRules(html: string, g: SkinGrammar): string {\n return html\n .replace(/^\\s{0,3}#\\s*={3,}\\s*$/gm, `<hr${cls(g.hr, \"matrx-hr-heavy\")}>`)\n .replace(/^\\s{0,3}\\*(?:\\s*\\*){2,}\\s*$/gm, `<hr${cls(g.hr, \"matrx-hr-accent\")}>`)\n .replace(/^\\s{0,3}(?:-\\s*){3,}$/gm, `<hr${cls(g.hr)}>`)\n .replace(/^\\s{0,3}(?:_\\s*){3,}$/gm, `<hr${cls(g.hr)}>`);\n}\n\nfunction splitTableRow(row: string): string[] {\n let r = row.trim();\n if (r.startsWith(\"|\")) r = r.slice(1);\n if (r.endsWith(\"|\") && !r.endsWith(\"\\\\|\")) r = r.slice(0, -1);\n return r.split(/(?<!\\\\)\\|/).map((c) => c.trim().replace(/\\\\\\|/g, \"|\"));\n}\n\nfunction cellAlign(separator: string): string {\n const s = separator.trim();\n const left = s.startsWith(\":\");\n const right = s.endsWith(\":\");\n if (left && right) return ' style=\"text-align:center\"';\n if (right) return ' style=\"text-align:right\"';\n return \"\";\n}\n\n/** GFM tables — empty cells kept (columns never shift), `:---:` alignment honoured. */\nfunction convertTables(html: string, g: SkinGrammar): string {\n const tableRegex = /^(\\|.*\\|)\\s*\\n(\\|[-\\s:|]*\\|)\\s*\\n((?:\\|.*\\|\\s*\\n?)*)/gm;\n return html.replace(\n tableRegex,\n (_m: string, headerRow: string, separatorRow: string, bodyRows: string) => {\n const headers = splitTableRow(headerRow);\n const aligns = splitTableRow(separatorRow).map(cellAlign);\n const rows = bodyRows\n .trim()\n .split(\"\\n\")\n .filter((r) => r.trim())\n .map(splitTableRow);\n\n let t = `<table${cls(g.table)}>\\n<thead${cls(g.thead)}>\\n<tr${cls(g.tr)}>\\n`;\n headers.forEach((h, i) => {\n t += `<th${cls(g.th)}${aligns[i] ?? \"\"}>${h}</th>\\n`;\n });\n t += \"</tr>\\n</thead>\\n\";\n if (rows.length > 0) {\n t += `<tbody${cls(g.tbody)}>\\n`;\n for (const row of rows) {\n t += `<tr${cls(g.tr)}>\\n`;\n row.forEach((c, i) => {\n t += `<td${cls(g.td)}${aligns[i] ?? \"\"}>${c}</td>\\n`;\n });\n t += \"</tr>\\n\";\n }\n t += \"</tbody>\\n\";\n }\n return `${t}</table>\\n`;\n },\n );\n}\n\ninterface OpenList {\n type: \"ul\" | \"ol\";\n indent: number;\n}\n\n/** Nested ordered/bullet lists — indentation-driven open/close bookkeeping. */\nfunction convertLists(html: string, g: SkinGrammar): string {\n const lines = html.split(\"\\n\");\n let processed = \"\";\n const listStack: OpenList[] = [];\n let lastListItem: \"\" | \"ul\" | \"ol\" = \"\";\n const li = `<li${cls(g.li)}>`;\n\n const top = (): OpenList | undefined => listStack[listStack.length - 1];\n const openTag = (type: \"ul\" | \"ol\", nested: boolean): string =>\n type === \"ol\"\n ? `<ol${cls(nested ? g.olNested : g.ol)}>\\n`\n : `<ul${cls(nested ? g.ulNested : g.ul)}>\\n`;\n\n const popOne = (): void => {\n if (lastListItem) {\n processed += \"</li>\\n\";\n lastListItem = \"\";\n }\n const closing = listStack.pop();\n if (!closing) return;\n processed += closing.type === \"ol\" ? \"</ol>\\n\" : \"</ul>\\n\";\n if (listStack.length > 0) processed += \"</li>\\n\";\n };\n\n const closeDeeperThan = (indent: number): void => {\n while (listStack.length > 0 && (top() as OpenList).indent > indent) popOne();\n };\n\n for (const line of lines) {\n const numbered = line.match(/^(\\s*)(\\d+)[.)]\\s+(.+)$/);\n const bullet = numbered ? null : line.match(/^(\\s*)[*\\-+]\\s+(.+)$/);\n if (numbered || bullet) {\n const type: \"ul\" | \"ol\" = numbered ? \"ol\" : \"ul\";\n const indent = ((numbered ?? bullet) as RegExpMatchArray)[1]?.length ?? 0;\n const content = (numbered ? numbered[3] : (bullet as RegExpMatchArray)[2]) ?? \"\";\n const current = top();\n\n if (current && indent > current.indent) {\n processed += `\\n${openTag(type, true)}`;\n listStack.push({ type, indent });\n } else {\n closeDeeperThan(indent);\n if (lastListItem && top()?.indent === indent) processed += \"</li>\\n\";\n const now = top();\n if (now && now.indent === indent && now.type !== type) {\n // Same depth, other list type: close the old list, open the new one.\n const closing = listStack.pop() as OpenList;\n processed += closing.type === \"ol\" ? \"</ol>\\n\" : \"</ul>\\n\";\n }\n const after = top();\n if (!after || after.indent !== indent || after.type !== type) {\n processed += openTag(type, listStack.length > 0);\n listStack.push({ type, indent });\n }\n }\n processed += `${li}${content}`;\n lastListItem = type;\n continue;\n }\n\n if (line.trim() !== \"\") {\n while (listStack.length > 0) popOne();\n }\n processed += `${line}\\n`;\n }\n while (listStack.length > 0) popOne();\n\n // GFM task items: `- [ ] todo` / `- [x] done` print as real boxes.\n return processed.replace(\n /<li( class=\"([^\"]*)\")?>\\s*\\[([ xX])\\]\\s+/g,\n (_m: string, _c: string | undefined, classes: string | undefined, mark: string) =>\n `<li${cls(classes ?? \"\", \"matrx-task-item\")}><span class=\"matrx-task-box${\n mark === \" \" ? \"\" : \" is-checked\"\n }\" aria-hidden=\"true\"></span>`,\n );\n}\n\nfunction convertBody(skin: MarkdownSkin, markdown: string, ctx: ConvertContext): string {\n return skin === \"article\" ? articleBody(markdown, ctx) : documentBody(markdown, ctx);\n}\n\n/** Author text can never forge a placeholder. */\nfunction scrubTokens(markdown: string): string {\n return markdown.replace(/[\\uE000\\uE001]/g, \"\");\n}\n\nfunction newContext(options: MarkdownToHtmlOptions): ConvertContext {\n return { options, depth: 0, cardIndex: 0, strippedAnnounced: false };\n}\n\n// ─── document skin: markdown → `.matrx-*` HTML ───────────────────────────────\n\n/**\n * markdown → `.matrx-*`-classed HTML wrapped in `.matrx-content-container`.\n *\n * The class vocabulary is deliberate and non-configurable: it is what\n * `MARKDOWN_DOCUMENT_CSS` styles, what the PDF lane renders, and what a\n * WordPress theme targets. Handles (in this order, because the order is the\n * whole trick): the shared pre-pass (code, artifacts, page breaks, flashcards,\n * inline code, unsafe page markup) → rules → images → links → headings →\n * emphasis → nested/task lists → blockquotes → tables → block elements →\n * paragraphs → FAQ promotion → placeholder restoration.\n */\nexport function markdownToHtml(\n markdown: string,\n options: MarkdownToHtmlOptions = {},\n): string {\n if (!markdown) {\n options.onNotice?.({\n code: \"empty-output\",\n message: \"markdownToHtml received an empty string.\",\n remedy: \"Check the content is loaded before converting; nothing was rendered.\",\n });\n return \"\";\n }\n const source = scrubTokens(options.includeThinking ? markdown : removeThinkingContent(markdown));\n return `<div class=\"matrx-content-container\">${documentBody(source, newContext(options))}</div>`;\n}\n\nfunction documentBody(markdown: string, ctx: ConvertContext): string {\n const g = DOCUMENT_GRAMMAR;\n const stash = new Stash();\n let html = protectRegions(markdown, g, stash, ctx);\n\n // Rules before headings/lists so `---` / `#===` / `***` are never eaten.\n html = convertRules(html, g);\n\n // Images BEFORE links — `` is a superset of `[a](u)`.\n html = html.replace(IMAGE_RE, (_m: string, alt: string, url: string) =>\n stash.block(`<img class=\"matrx-image\" src=\"${safeUrl(url)}\" alt=\"${escapeHtml(alt)}\" />`),\n );\n html = html.replace(LINK_RE, (_m: string, text: string, url: string) =>\n stash.inline(`<a class=\"matrx-link\" href=\"${safeUrl(url)}\">${convertEmphasis(text, g)}</a>`),\n );\n\n html = html\n .replace(/^# (.+)$/gm, '<h1 class=\"matrx-h1\">$1</h1>')\n .replace(/^## (.+)$/gm, '<h2 class=\"matrx-h2\">$1</h2>')\n .replace(/^### (.+)$/gm, '<h3 class=\"matrx-h3\">$1</h3>')\n .replace(/^#### (.+)$/gm, '<h4 class=\"matrx-h4\">$1</h4>')\n .replace(/^##### (.+)$/gm, '<h5 class=\"matrx-h5\">$1</h5>')\n .replace(/^###### (.+)$/gm, '<h6 class=\"matrx-h6\">$1</h6>');\n\n // Lists BEFORE emphasis, so a bullet opening with bold (`* **A** and *b*`)\n // is still a bullet.\n html = convertLists(html, g);\n html = convertEmphasis(html, g);\n\n html = html.replace(/^> ?(.+)$/gm, '<blockquote class=\"matrx-blockquote\">$1</blockquote>');\n\n html = convertTables(html, g);\n\n html = html\n .replace(/<table>/g, '<table class=\"matrx-table\">')\n .replace(/<thead>/g, '<thead class=\"matrx-table-head\">')\n .replace(/<tbody>/g, '<tbody class=\"matrx-table-body\">')\n .replace(/<tr>/g, '<tr class=\"matrx-table-row\">')\n .replace(/<th>/g, '<th class=\"matrx-table-header\">')\n .replace(/<td>/g, '<td class=\"matrx-table-cell\">');\n\n html = html.replace(/<img(?![^>]*class=)([^>]*)>/g, '<img class=\"matrx-image\"$1>');\n // Author divs join the vocabulary without losing their own class\n // (the old rewrite emitted two class attributes and the browser kept one).\n html = html.replace(/<div\\b([^>]*)>/g, (m: string, attrs: string) => {\n if (/\\bclass=\"matrx-/.test(attrs)) return m;\n if (/\\bclass=\"/.test(attrs)) return `<div${attrs.replace(/\\bclass=\"/, 'class=\"matrx-div ')}>`;\n return `<div class=\"matrx-div\"${attrs}>`;\n });\n html = html.replace(/<span(?![^>]*class=)([^>]*)>/g, '<span class=\"matrx-span\"$1>');\n\n html = html.replace(/^([^<\\n].+)$/gm, '<p class=\"matrx-paragraph\">$1</p>');\n html = html.replace(/<\\/p>\\s*<p class=\"matrx-paragraph\">/g, '</p><p class=\"matrx-paragraph\">');\n\n // Intro paragraph (first <p> after the h1) — before FAQ promotion.\n html = html.replace(\n /(<h1 class=\"matrx-h1\">[\\s\\S]*?<\\/h1>\\s*)<p class=\"matrx-paragraph\">((?:(?!\\uE000B)[\\s\\S])*?)<\\/p>/g,\n '$1<p class=\"matrx-intro\">$2</p>',\n );\n\n // FAQ promotion: bold questions and question headings become FAQ items.\n html = html.replace(\n /^<strong class=\"matrx-strong\">([^<]*\\?[^<]*)<\\/strong>$/gm,\n '<h3 class=\"matrx-h3\">$1</h3>',\n );\n html = html.replace(\n /<p class=\"matrx-paragraph\"><strong class=\"matrx-strong\">([^<]*\\?[^<]*)<\\/strong><\\/p>/g,\n '<h3 class=\"matrx-h3\">$1</h3>',\n );\n html = html.replace(\n /<h3 class=\"matrx-h3\">([^<]*\\?[^<]*)<\\/h3>/g,\n '<div class=\"matrx-faq-question\">$1</div>',\n );\n html = html.replace(\n /(<div class=\"matrx-faq-question\">[^<]*<\\/div>)\\s*(<p class=\"matrx-paragraph\">[\\s\\S]*?<\\/p>)/g,\n '<div class=\"matrx-faq-item\">$1<div class=\"matrx-faq-answer\">$2</div></div>',\n );\n html = html.replace(\n /(<div class=\"matrx-faq-question\">[^<]*<\\/div>)(?!\\s*<div class=\"matrx-faq-answer\">)/g,\n '<div class=\"matrx-faq-item\">$1<div class=\"matrx-faq-answer\"></div></div>',\n );\n html = html.replace(\n /(<div class=\"matrx-faq-answer\">)<p class=\"matrx-paragraph\">([\\s\\S]*?)<\\/p>(<\\/div>)/g,\n \"$1$2$3\",\n );\n\n return stash.restore(html);\n}\n\n// ─── article skin: markdown → bare semantic HTML ─────────────────────────────\n\n/**\n * markdown → bare semantic HTML (`h1`…`h6`, `p`, `ul`/`ol`, `blockquote`,\n * `.code-block-wrapper`, `.print-table`) for the article skin.\n *\n * Code is HTML-escaped in both skins (the shared pre-pass); a print window\n * never re-escapes, so unescaped code would render as markup.\n */\nexport function markdownToArticleHtml(\n markdown: string,\n options: MarkdownToHtmlOptions = {},\n): string {\n if (!markdown) {\n options.onNotice?.({\n code: \"empty-output\",\n message: \"markdownToArticleHtml received an empty string.\",\n remedy: \"Check the content is loaded before printing; nothing was rendered.\",\n });\n return \"\";\n }\n const source = scrubTokens(options.includeThinking ? markdown : removeThinkingContent(markdown));\n return articleBody(source, newContext(options));\n}\n\nfunction articleBody(markdown: string, ctx: ConvertContext): string {\n const g = ARTICLE_GRAMMAR;\n const stash = new Stash();\n let html = protectRegions(markdown, g, stash, ctx);\n html = convertTables(html, g);\n html = convertRules(html, g);\n\n // Images BEFORE links — `` is a superset of `[a](u)`. Without this\n // pass an image fell through to the link pass and printed as a literal\n // \"!\" followed by a link (chat \"Print\", 2026-09-21).\n html = html.replace(IMAGE_RE, (_m: string, alt: string, url: string) =>\n stash.block(\n `<figure class=\"print-figure\"><img class=\"print-image\" src=\"${safeUrl(url)}\" alt=\"${escapeHtml(alt)}\" />${\n alt ? `<figcaption>${escapeHtml(alt)}</figcaption>` : \"\"\n }</figure>`,\n ),\n );\n html = html.replace(LINK_RE, (_m: string, text: string, url: string) =>\n stash.inline(`<a href=\"${safeUrl(url)}\">${convertEmphasis(text, g)}</a>`),\n );\n\n html = html\n .replace(/^#{6}\\s+(.+)$/gm, \"<h6>$1</h6>\")\n .replace(/^#{5}\\s+(.+)$/gm, \"<h5>$1</h5>\")\n .replace(/^#{4}\\s+(.+)$/gm, \"<h4>$1</h4>\")\n .replace(/^#{3}\\s+(.+)$/gm, \"<h3>$1</h3>\")\n .replace(/^#{2}\\s+(.+)$/gm, \"<h2>$1</h2>\")\n .replace(/^#{1}\\s+(.+)$/gm, \"<h1>$1</h1>\");\n\n html = html.replace(/^> ?(.+)$/gm, \"<blockquote>$1</blockquote>\");\n html = convertLists(html, g);\n html = convertEmphasis(html, g);\n\n html = html\n .split(\"\\n\")\n .map((line) => {\n const t = line.trim();\n if (!t) return \"\";\n if (\n /^<\\/?(h[1-6]|ul|ol|li|blockquote|pre|hr|table|thead|tbody|tr|th|td|div|figure|section)/.test(t) ||\n /^\\uE000B\\d+\\uE001$/.test(t)\n ) {\n return line;\n }\n return `<p>${t}</p>`;\n })\n .join(\"\\n\");\n\n return stash.restore(html).replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\n// ─── stylesheet + document composition ───────────────────────────────────────\n\n/**\n * The Print / Close action bar. The article sheet styles it already; the\n * document sheet is a content stylesheet with no chrome, so this ships beside\n * it — otherwise every host printing document-skin markdown gets two unstyled\n * browser buttons at the top of the page.\n */\nexport const PRINT_ACTIONS_CSS = `\n.print-actions { display: flex; gap: 10px; margin: 0 auto 28px; max-width: 800px; padding: 0 2rem 20px; border-bottom: 2px solid var(--matrx-print-border, #e1e1e1); }\n.print-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 20px; border-radius: 8px; font-size: 13px; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; cursor: pointer; border: none; font-weight: 600; }\n.print-btn-primary { background: var(--matrx-print-accent, #667eea); color: var(--matrx-print-bg, #ffffff); }\n.print-btn-secondary { background: var(--matrx-print-surface, #f8f9fa); color: var(--matrx-print-fg-strong, #374151); border: 1px solid var(--matrx-print-border-muted, #d1d5db); }\n@media print { .print-actions { display: none !important; } }\n`;\n\nexport interface MarkdownStylesheetOptions {\n /** Which shipped look. Default: `\"document\"`. */\n skin?: MarkdownSkin;\n /**\n * Host brand overrides — a CSS string appended AFTER the package's default\n * token values, so `:root { --matrx-print-accent: #0f766e; }` wins. Token\n * VALUES are host-owned; the token CONTRACT and the structural CSS are not.\n */\n tokens?: string;\n /** Extra rules appended after everything else. */\n extraCss?: string;\n /**\n * Number printed pages (\"3 / 12\", bottom centre) via `@page` margin boxes.\n * Default: true. Page margins are set either way.\n */\n pageNumbers?: boolean;\n}\n\n/**\n * The complete default stylesheet for a skin: default token values, the\n * structural sheet, the rules both skins share (page breaks, artifacts, task\n * boxes, print hard parts), page geometry, then the host's overrides. Never returns an empty string.\n */\nexport function getMarkdownStylesheet(\n options: MarkdownStylesheetOptions = {},\n): string {\n const skin: MarkdownSkin = options.skin ?? \"document\";\n const base =\n skin === \"article\"\n ? `${MARKDOWN_ARTICLE_TOKENS_CSS}\\n${MARKDOWN_ARTICLE_CSS}`\n : `${MARKDOWN_DOCUMENT_TOKENS_CSS}\\n${MARKDOWN_DOCUMENT_CSS}`;\n const page = options.pageNumbers === false ? MARKDOWN_PAGE_PLAIN_CSS : MARKDOWN_PAGE_CSS;\n return [base, MARKDOWN_SHARED_CSS, page, options.tokens ?? \"\", options.extraCss ?? \"\"]\n .filter((part) => part.trim().length > 0)\n .join(\"\\n\");\n}\n\n/** Convert markdown with the converter that matches a skin. */\nexport function markdownToHtmlForSkin(\n markdown: string,\n skin: MarkdownSkin,\n options: MarkdownToHtmlOptions = {},\n): string {\n return skin === \"article\"\n ? markdownToArticleHtml(markdown, options)\n : markdownToHtml(markdown, options);\n}\n\nexport interface RenderMarkdownDocumentOptions extends MarkdownStylesheetOptions {\n title?: string;\n /** Override the shipped converter. The seam survives; it is no longer required. */\n convertToHtml?: (markdown: string) => string;\n /** Replace the whole stylesheet (not merely the tokens). */\n css?: string;\n onNotice?: (notice: MarkdownNotice) => void;\n /** Include the Print / Close action bar (hidden by `@media print`). */\n withPrintActions?: boolean;\n}\n\n/**\n * markdown → a complete, standalone, styled HTML document string.\n *\n * This is the one composition every lane uses — the print window, the PDF\n * capture host, and \"copy a full HTML page\". A host that builds its own\n * `<!DOCTYPE html>` wrapper around package CSS is re-implementing this.\n */\nexport function renderMarkdownDocument(\n markdown: string,\n options: RenderMarkdownDocumentOptions = {},\n): string {\n const skin: MarkdownSkin = options.skin ?? \"document\";\n const title = options.title ?? \"AI Response\";\n const convert =\n options.convertToHtml ??\n ((md: string) =>\n markdownToHtmlForSkin(\n md,\n skin,\n options.onNotice ? { onNotice: options.onNotice } : {},\n ));\n const bodyHtml = convert(markdown);\n const css =\n options.css ??\n getMarkdownStylesheet({\n skin,\n ...(options.tokens === undefined ? {} : { tokens: options.tokens }),\n ...(options.extraCss === undefined ? {} : { extraCss: options.extraCss }),\n });\n\n // The article sheet already styles the action bar; the document sheet is a\n // pure content stylesheet, so it gets the shared chrome appended.\n const chrome =\n options.withPrintActions && skin !== \"article\" ? PRINT_ACTIONS_CSS : \"\";\n\n const actions = options.withPrintActions\n ? '<div class=\"print-actions\"><button class=\"print-btn print-btn-primary\" onclick=\"window.print()\">Print / Save as PDF</button><button class=\"print-btn print-btn-secondary\" onclick=\"window.close()\">Close</button></div>'\n : \"\";\n\n return `<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"><title>${escapeHtml(\n title,\n )}</title>\n<style>${css}${chrome}</style></head>\n<body>${actions}<div class=\"content\">${bodyHtml}</div></body></html>`;\n}\n\nexport interface PrintMarkdownOptions extends RenderMarkdownDocumentOptions {\n /** Window features for the print window. */\n windowFeatures?: string;\n}\n\n/**\n * Open a print window for a markdown string, in one call.\n *\n * Returns the `PrintOutcome` so the host can tell the user when the popup was\n * blocked and the `.html` download fallback fired instead — a silent fallback\n * is indistinguishable from \"print did nothing\".\n */\nexport function printMarkdown(\n markdown: string,\n options: PrintMarkdownOptions = {},\n): PrintOutcome {\n const title = options.title ?? \"AI Response\";\n const doc = renderMarkdownDocument(markdown, {\n ...options,\n title,\n withPrintActions: options.withPrintActions ?? true,\n });\n return options.windowFeatures === undefined\n ? openPrintWindow(doc, title)\n : openPrintWindow(doc, title, options.windowFeatures);\n}\n","/**\n * Citations and the reference list — pandoc citation syntax over CSL-JSON\n * reference items, formatted in three built-in styles:\n *\n * apa APA 7th edition (author–date) (Smith & Jones, 2020, p. 4)\n * mla MLA 9th edition (author–page) (Smith and Jones 4)\n * chicago Chicago 17th, author–date (Smith and Jones 2020, 4)\n *\n * Syntax (pandoc): `[@smith2020]`, `[@smith2020, p. 4]`, `[@a; @b]`,\n * `[-@smith2020]` (suppress the author), and a bare `@smith2020` in running\n * text (narrative: \"Smith (2020)\") — the bare form only fires for a key that\n * is actually in the reference list, so an email or an @-handle is never\n * mistaken for a citation.\n */\n\nimport type { BibliographyEntry, CitationStyle, CslItem, CslName, Inline } from \"./types\";\n\nconst t = (value: string): Inline => ({ type: \"text\", value });\nconst em = (value: string): Inline => ({ type: \"emphasis\", children: [t(value)] });\n\nexport interface CiteRef {\n key: string;\n locator?: string | undefined;\n suppressAuthor: boolean;\n}\n\n/** Parse the inside of `[...]` into cite refs; null if it is not a citation. */\nexport function parseCitationGroup(inner: string): CiteRef[] | null {\n const parts = inner.split(\";\").map((p) => p.trim());\n if (parts.length === 0) return null;\n const refs: CiteRef[] = [];\n for (const part of parts) {\n const m = /^(-?)@([A-Za-z0-9_][\\w:.#$%&+?<>~/-]*?)(?:\\s*,\\s*(.+))?$/.exec(part);\n if (!m) return null;\n // `@fig:x` / `@tbl:x` / `@sec:x` are cross-references, not citations.\n if (/^(fig|tbl|sec|eq|lst):/i.test(m[2] as string)) return null;\n refs.push({ key: m[2] as string, locator: m[3]?.trim(), suppressAuthor: m[1] === \"-\" });\n }\n return refs;\n}\n\nfunction year(item: CslItem): string {\n const dp = item.issued?.[\"date-parts\"]?.[0]?.[0];\n if (dp !== undefined && dp !== null && String(dp).trim()) return String(dp);\n return item.issued?.literal ?? \"n.d.\";\n}\n\nconst family = (n: CslName): string => n.literal ?? n.family ?? n.given ?? \"\";\n\nfunction initials(given: string | undefined): string {\n if (!given) return \"\";\n return given\n .split(/[\\s]+/)\n .filter(Boolean)\n .map((g) =>\n g\n .split(\"-\")\n .map((p) => `${p[0]?.toUpperCase() ?? \"\"}.`)\n .join(\"-\"),\n )\n .join(\" \");\n}\n\nfunction authorsOf(item: CslItem): CslName[] {\n return item.author?.length ? item.author : (item.editor ?? []);\n}\n\n/** The short author form used in an in-text citation. */\nfunction shortAuthors(item: CslItem, style: CitationStyle, narrative = false): string {\n const a = authorsOf(item);\n if (a.length === 0) return item.title ? `\"${item.title}\"` : item.id;\n // APA: \"&\" inside parentheses, \"and\" in running text.\n const and = style === \"apa\" && !narrative ? \"&\" : \"and\";\n if (a.length === 1) return family(a[0] as CslName);\n if (a.length === 2) return `${family(a[0] as CslName)} ${and} ${family(a[1] as CslName)}`;\n if (style === \"chicago\" && a.length === 3)\n return `${family(a[0] as CslName)}, ${family(a[1] as CslName)}, and ${family(a[2] as CslName)}`;\n return `${family(a[0] as CslName)} et al.`;\n}\n\nfunction mlaLocator(locator: string): string {\n return locator.replace(/^(?:pp?\\.|pages?)\\s*/i, \"\");\n}\n\n/** Format one citation group as in-text text, e.g. \"(Smith, 2020, p. 4; Lee, 2019)\". */\nexport function formatCitation(\n refs: CiteRef[],\n lookup: (key: string) => CslItem | undefined,\n style: CitationStyle,\n narrative = false,\n): { label: string; resolved: boolean } {\n let resolved = true;\n const pieces = refs.map((r) => {\n const item = lookup(r.key);\n if (!item) {\n resolved = false;\n return `${r.key}?`;\n }\n const who = shortAuthors(item, style);\n const when = year(item);\n const loc = r.locator;\n if (style === \"mla\") {\n const l = loc ? mlaLocator(loc) : \"\";\n if (r.suppressAuthor || narrative) return l;\n return l ? `${who} ${l}` : who;\n }\n if (style === \"chicago\") {\n const l = loc ? mlaLocator(loc) : \"\";\n const core = r.suppressAuthor || narrative ? when : `${who} ${when}`;\n return l ? `${core}, ${l}` : core;\n }\n const core = r.suppressAuthor || narrative ? when : `${who}, ${when}`;\n return loc ? `${core}, ${loc}` : core;\n });\n if (narrative && refs.length === 1) {\n const item = lookup(refs[0]!.key);\n if (item) {\n const inner = pieces[0];\n const who = shortAuthors(item, style, true);\n return { label: inner ? `${who} (${inner})` : who, resolved };\n }\n }\n const body = pieces.filter(Boolean).join(\"; \");\n return { label: body ? `(${body})` : \"\", resolved };\n}\n\n// ── reference list ─────────────────────────────────────────────────────────\n\nfunction apaNames(names: CslName[]): string {\n const fmt = (n: CslName) =>\n n.literal ?? [n.family, initials(n.given)].filter(Boolean).join(\", \");\n if (names.length === 1) return fmt(names[0] as CslName);\n if (names.length <= 20) {\n return `${names.slice(0, -1).map(fmt).join(\", \")}, & ${fmt(names[names.length - 1] as CslName)}`;\n }\n return `${names.slice(0, 19).map(fmt).join(\", \")}, … ${fmt(names[names.length - 1] as CslName)}`;\n}\n\nfunction invertedFirst(names: CslName[], and: string, etAlAt: number): string {\n const first = (n: CslName) => n.literal ?? [n.family, n.given].filter(Boolean).join(\", \");\n const rest = (n: CslName) => n.literal ?? [n.given, n.family].filter(Boolean).join(\" \");\n if (names.length === 1) return first(names[0] as CslName);\n if (names.length >= etAlAt) return `${first(names[0] as CslName)}, et al.`;\n if (names.length === 2) return `${first(names[0] as CslName)}, ${and} ${rest(names[1] as CslName)}`;\n return `${first(names[0] as CslName)}, ${names\n .slice(1, -1)\n .map(rest)\n .join(\", \")}, ${and} ${rest(names[names.length - 1] as CslName)}`;\n}\n\nconst endDot = (s: string): string => (/[.?!]$/.test(s) ? s : `${s}.`);\nconst isArticle = (i: CslItem) => /article|chapter|paper-conference|entry/.test(i.type ?? \"\") || Boolean(i[\"container-title\"] && (i.volume || i.issue || i.page));\nconst isWeb = (i: CslItem) => /webpage|post|post-weblog/.test(i.type ?? \"\") || (!i.publisher && !i[\"container-title\"] && Boolean(i.URL));\nconst link = (i: CslItem): string | undefined => (i.DOI ? `https://doi.org/${i.DOI.replace(/^https?:\\/\\/doi\\.org\\//, \"\")}` : i.URL);\n\nfunction formatApa(i: CslItem): Inline[] {\n const out: Inline[] = [];\n const names = authorsOf(i);\n const y = year(i);\n if (names.length) out.push(t(`${endDot(apaNames(names))} (${y}). `));\n if (isArticle(i)) {\n if (i.title) out.push(t(`${endDot(i.title)} `));\n if (!names.length) out.push(t(`(${y}). `));\n if (i[\"container-title\"]) {\n out.push(em(i[\"container-title\"]));\n if (i.volume) {\n out.push(t(\", \"), em(String(i.volume)));\n }\n if (i.issue) out.push(t(`(${i.issue})`));\n if (i.page) out.push(t(`, ${i.page}`));\n out.push(t(\". \"));\n }\n } else {\n if (i.title) out.push(em(i.title));\n if (i.edition) out.push(t(` (${i.edition} ed.)`));\n out.push(t(\". \"));\n if (!names.length) out.push(t(`(${y}). `));\n if (isWeb(i) && i[\"container-title\"]) out.push(t(`${endDot(i[\"container-title\"])} `));\n if (i.publisher) out.push(t(`${endDot(i.publisher)} `));\n }\n const l = link(i);\n if (l) out.push({ type: \"link\", url: l, children: [t(l)] });\n return trimTail(out);\n}\n\nfunction formatMla(i: CslItem): Inline[] {\n const out: Inline[] = [];\n const names = authorsOf(i);\n if (names.length) out.push(t(`${endDot(invertedFirst(names, \"and\", 3))} `));\n const y = year(i);\n if (isArticle(i) || isWeb(i)) {\n if (i.title) out.push(t(`“${endDot(i.title)}” `));\n if (i[\"container-title\"]) out.push(em(i[\"container-title\"]));\n const tail: string[] = [];\n if (i.volume) tail.push(`vol. ${i.volume}`);\n if (i.issue) tail.push(`no. ${i.issue}`);\n if (i.publisher && isWeb(i)) tail.push(i.publisher);\n if (y !== \"n.d.\") tail.push(y);\n if (i.page) tail.push(`${/[-–]/.test(i.page) ? \"pp.\" : \"p.\"} ${i.page}`);\n if (tail.length) out.push(t(`${i[\"container-title\"] ? \", \" : \"\"}${tail.join(\", \")}`));\n const l = link(i);\n if (l) out.push(t(\", \"), { type: \"link\", url: l, children: [t(l.replace(/^https?:\\/\\//, \"\"))] });\n out.push(t(\".\"));\n } else {\n if (i.title) out.push(em(i.title), t(\". \"));\n const tail = [i.publisher, y !== \"n.d.\" ? y : undefined].filter(Boolean);\n if (tail.length) out.push(t(`${tail.join(\", \")}.`));\n }\n return trimTail(out);\n}\n\nfunction formatChicago(i: CslItem): Inline[] {\n const out: Inline[] = [];\n const names = authorsOf(i);\n if (names.length) out.push(t(`${endDot(invertedFirst(names, \"and\", 11))} `));\n out.push(t(`${year(i)}. `));\n if (isArticle(i) || isWeb(i)) {\n if (i.title) out.push(t(`“${endDot(i.title)}” `));\n if (i[\"container-title\"]) {\n out.push(em(i[\"container-title\"]));\n if (i.volume) out.push(t(` ${i.volume}`));\n if (i.issue) out.push(t(` (${i.issue})`));\n if (i.page) out.push(t(`: ${i.page}`));\n out.push(t(\". \"));\n }\n } else {\n if (i.title) out.push(em(i.title), t(\". \"));\n const pub = [i[\"publisher-place\"], i.publisher].filter(Boolean).join(\": \");\n if (pub) out.push(t(`${endDot(pub)} `));\n }\n const l = link(i);\n if (l) out.push({ type: \"link\", url: l, children: [t(l)] }, t(\".\"));\n return trimTail(out);\n}\n\nfunction trimTail(out: Inline[]): Inline[] {\n const last = out[out.length - 1];\n if (last?.type === \"text\") last.value = last.value.replace(/\\s+$/, \"\");\n return out;\n}\n\n/** Format the reference list for the cited keys, sorted as the style requires. */\nexport function formatBibliography(items: CslItem[], style: CitationStyle): BibliographyEntry[] {\n const sortKey = (i: CslItem) => {\n const a = authorsOf(i)[0];\n return `${(a ? family(a) : (i.title ?? i.id)).toLowerCase()}\\u0000${year(i)}\\u0000${(i.title ?? \"\").toLowerCase()}`;\n };\n const fmt = style === \"mla\" ? formatMla : style === \"chicago\" ? formatChicago : formatApa;\n return [...items]\n .sort((a, b) => sortKey(a).localeCompare(sortKey(b)))\n .map((i) => ({ id: i.id, children: fmt(i) }));\n}\n","/**\n * @ai-matrx/print/document — print-grade documents from markdown.\n *\n * ONE parsed tree (`parseDocument`) → PDF, DOCX, EPUB, HTML (+ the markdown\n * source itself), so every format carries the same page setup, cover, TOC,\n * numbered captions, cross-references, citations and bibliography.\n *\n * Settings live in the markdown's YAML frontmatter:\n *\n * ---\n * title: Quarterly Review\n * subtitle: Operations\n * author: Jane Park\n * date: today\n * cover: true\n * toc: true # or { depth: 2, title: Contents }\n * page: { size: a4, orientation: portrait, margins: 1in }\n * header: \"{title} | | {date}\" # left | center | right\n * footer: \"Page {page} of {pages}\"\n * firstPage: different\n * columns: 2\n * numberSections: true\n * csl: apa # apa | mla | chicago\n * references:\n * - id: smith2020\n * title: Paper Cuts\n * author: [Smith, Jane]\n * issued: 2020\n * ---\n *\n * Heavy engines (pdfmake, docx, jszip) load lazily when an export is called;\n * parsing and HTML are pure string work and safe on the server.\n */\n\nimport { documentToDocx } from \"./document/docx\";\nimport { documentToEpub } from \"./document/epub\";\nimport { documentToHtml } from \"./document/html\";\nimport { documentToPdf, headingPages } from \"./document/pdf\";\nimport { parseDocument, type ParseDocumentOptions } from \"./document/tree\";\nimport type { Block, DocTree, DocumentNotice, ImageMap, ResolvedImage } from \"./document/types\";\n\nexport { parseDocument, plainText } from \"./document/tree\";\nexport type { ParseDocumentOptions } from \"./document/tree\";\nexport { documentToHtml, documentCss, renderBlocksHtml } from \"./document/html\";\nexport { buildPdfDefinition, documentToPdf } from \"./document/pdf\";\nexport { documentToDocx } from \"./document/docx\";\nexport { documentToEpub } from \"./document/epub\";\nexport {\n PAGE_SIZES,\n DEFAULT_FOOTER,\n splitFrontmatter,\n resolveSettings,\n normalizeReference,\n parseLength,\n fillTemplate,\n} from \"./document/settings\";\nexport { formatCitation, formatBibliography, parseCitationGroup } from \"./document/citations\";\nexport type * from \"./document/types\";\n\nexport type DocumentFormat = \"pdf\" | \"docx\" | \"epub\" | \"html\" | \"markdown\";\n\nexport const DOCUMENT_FORMATS: ReadonlyArray<{ format: DocumentFormat; label: string; extension: string; mime: string }> = [\n { format: \"pdf\", label: \"PDF\", extension: \"pdf\", mime: \"application/pdf\" },\n { format: \"docx\", label: \"Word (.docx)\", extension: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" },\n { format: \"epub\", label: \"EPUB\", extension: \"epub\", mime: \"application/epub+zip\" },\n { format: \"html\", label: \"Web page (.html)\", extension: \"html\", mime: \"text/html\" },\n { format: \"markdown\", label: \"Markdown\", extension: \"md\", mime: \"text/markdown\" },\n];\n\n// ── images: fetched once, shared by every format ──────────────────────────\n\nfunction sniff(bytes: Uint8Array): { mime: ResolvedImage[\"mime\"]; width: number; height: number } | null {\n const b = bytes;\n if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) {\n const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);\n return { mime: \"image/png\", width: dv.getUint32(16), height: dv.getUint32(20) };\n }\n if (b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46) {\n return { mime: \"image/gif\", width: b[6]! | (b[7]! << 8), height: b[8]! | (b[9]! << 8) };\n }\n if (b[0] === 0xff && b[1] === 0xd8) {\n let i = 2;\n while (i + 9 < b.length) {\n if (b[i] !== 0xff) {\n i++;\n continue;\n }\n const marker = b[i + 1]!;\n const len = (b[i + 2]! << 8) | b[i + 3]!;\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n return { mime: \"image/jpeg\", height: (b[i + 5]! << 8) | b[i + 6]!, width: (b[i + 7]! << 8) | b[i + 8]! };\n }\n i += 2 + len;\n }\n }\n return null;\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n const g = globalThis as unknown as { Buffer?: { from: (b: Uint8Array) => { toString: (e: string) => string } } };\n if (g.Buffer) return g.Buffer.from(bytes).toString(\"base64\");\n let s = \"\";\n for (let i = 0; i < bytes.length; i += 0x8000) s += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return btoa(s);\n}\n\nfunction fromBase64(b64: string): Uint8Array {\n const g = globalThis as unknown as { Buffer?: { from: (s: string, e: string) => Uint8Array } };\n if (g.Buffer) return new Uint8Array(g.Buffer.from(b64, \"base64\"));\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\n/** Load image bytes for a URL. Default: data: URLs decode, http(s) fetches. */\nexport type ImageLoader = (url: string) => Promise<Uint8Array | null>;\n\nexport const defaultImageLoader: ImageLoader = async (url) => {\n const data = /^data:image\\/[\\w.+-]+;base64,(.*)$/i.exec(url);\n if (data) return fromBase64(data[1] as string);\n if (!/^https?:\\/\\//i.test(url) || typeof fetch !== \"function\") return null;\n const res = await fetch(url, { credentials: \"omit\" });\n if (!res.ok) return null;\n return new Uint8Array(await res.arrayBuffer());\n};\n\nfunction imageUrls(tree: DocTree): string[] {\n const urls = new Set<string>();\n const walk = (blocks: Block[]) => {\n for (const b of blocks) {\n if (b.type === \"figure\") urls.add(b.url);\n if (b.type === \"list\") for (const it of b.items) walk(it.children);\n if (b.type === \"blockquote\") walk(b.children);\n }\n };\n for (const s of tree.sections) walk(s.blocks);\n if (tree.settings.cover && tree.settings.logo) urls.add(tree.settings.logo);\n return [...urls];\n}\n\n/** Resolve every figure/logo image once. Failures are announced, never fatal. */\nexport async function resolveDocumentImages(\n tree: DocTree,\n loader: ImageLoader = defaultImageLoader,\n onNotice?: (n: DocumentNotice) => void,\n): Promise<ImageMap> {\n const map: ImageMap = new Map();\n await Promise.all(\n imageUrls(tree).map(async (url) => {\n let bytes: Uint8Array | null = null;\n try {\n bytes = await loader(url);\n } catch {\n bytes = null;\n }\n const info = bytes ? sniff(bytes) : null;\n if (!bytes || !info || !info.width || !info.height) {\n map.set(url, null);\n const n: DocumentNotice = {\n code: \"image-unavailable\",\n message: `An image could not be included: ${url.length > 90 ? `${url.slice(0, 87)}…` : url}`,\n remedy: bytes\n ? \"Use a PNG, JPEG or GIF image.\"\n : \"Use an image stored in AI Matrx (or any public https link that allows downloads); private or expired links cannot be printed.\",\n };\n tree.notices.push(n);\n onNotice?.(n);\n return;\n }\n map.set(url, { ...info, bytes, dataUrl: `data:${info.mime};base64,${toBase64(bytes)}` });\n }),\n );\n return map;\n}\n\n// ── one-call export ────────────────────────────────────────────────────────\n\nexport interface ExportDocumentOptions extends ParseDocumentOptions {\n /** File name without extension (default: the document title). */\n fileName?: string | undefined;\n imageLoader?: ImageLoader | undefined;\n}\n\nexport interface DocumentExport {\n format: DocumentFormat;\n bytes: Uint8Array;\n mime: string;\n fileName: string;\n /** PDF only. */\n pageCount?: number | undefined;\n tree: DocTree;\n notices: DocumentNotice[];\n}\n\nconst safeName = (s: string) =>\n s\n .replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 120) || \"document\";\n\n/** Export a markdown source to any document format. */\nexport async function exportDocument(\n source: string,\n format: DocumentFormat,\n options: ExportDocumentOptions = {},\n): Promise<DocumentExport> {\n const tree = parseDocument(source, options);\n const meta = DOCUMENT_FORMATS.find((f) => f.format === format);\n if (!meta) throw new Error(`Unknown document format \"${format}\". Use one of: ${DOCUMENT_FORMATS.map((f) => f.format).join(\", \")}.`);\n const fileName = `${safeName(options.fileName ?? tree.settings.title ?? \"document\")}.${meta.extension}`;\n const enc = new TextEncoder();\n let bytes: Uint8Array;\n let pageCount: number | undefined;\n if (format === \"markdown\") {\n bytes = enc.encode(source);\n } else {\n const images = await resolveDocumentImages(tree, options.imageLoader, options.onNotice);\n if (format === \"html\") bytes = enc.encode(documentToHtml(tree, { images }));\n else if (format === \"pdf\") {\n const r = await documentToPdf(tree, images);\n bytes = r.bytes;\n pageCount = r.pageCount;\n } else if (format === \"docx\") {\n const pages = tree.toc.length ? await headingPages(tree, images) : undefined;\n bytes = await documentToDocx(tree, { images, headingPages: pages });\n } else bytes = await documentToEpub(tree, { images });\n }\n return { format, bytes, mime: meta.mime, fileName, pageCount, tree, notices: tree.notices };\n}\n\n/** Browser helper: save an export through a download link. */\nexport function downloadDocumentExport(exp: DocumentExport): void {\n const blob = new Blob([exp.bytes as BlobPart], { type: exp.mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = exp.fileName;\n a.rel = \"noopener\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 30_000);\n}\n"],"mappings":"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","names":["t","family","year","t","pt","levels","escapeHtml","t","href","blocks","t","escapeHtml","n","id","runs","blocks","block","t","escapeHtml","core","inlines","last","block","plain","t","blocks","blocks"]}
|
|
1
|
+
{"version":3,"sources":["../src/document/settings.ts","../src/document/docx.ts","../src/document/epub.ts","../src/document/html.ts","../src/directives.ts","../src/document/pdf.ts","../src/document/tree.ts","../src/markdown.ts","../src/document/citations.ts","../src/document.ts"],"sourcesContent":["/**\n * Document settings carried in the markdown source's YAML frontmatter.\n *\n * Grammar: the source's FIRST line is exactly `---`; the block ends at the\n * next line that is exactly `---` or `...`; the lines between are YAML 1.2\n * (core schema — `2026-09-25` stays a string). A leading `---` with no closing\n * line is a thematic break, not frontmatter. This is the same rule pandoc,\n * Jekyll, Hugo and Obsidian use.\n *\n * Keys follow pandoc's names where pandoc has one (`title`, `subtitle`,\n * `author`, `date`, `lang`, `papersize`, `geometry`, `toc`, `toc-depth`,\n * `numbersections`, `csl`, `references`, `fontsize`) and accept camelCase /\n * snake_case / kebab-case spellings of every key. Unknown keys are ignored\n * silently (frontmatter is shared with other tools); a KNOWN key with a value\n * we cannot use is announced with the remedy.\n */\n\nimport { parse as parseYaml } from \"yaml\";\nimport type {\n CitationStyle,\n CslItem,\n CslName,\n DocumentNotice,\n DocumentSettings,\n Margins,\n Orientation,\n PageSizeName,\n RunningTemplate,\n} from \"./types\";\n\n/** Portrait page sizes in points. */\nexport const PAGE_SIZES: Readonly<Record<PageSizeName, { width: number; height: number; label: string }>> = {\n letter: { width: 612, height: 792, label: \"Letter\" },\n legal: { width: 612, height: 1008, label: \"Legal\" },\n tabloid: { width: 792, height: 1224, label: \"Tabloid\" },\n executive: { width: 522, height: 756, label: \"Executive\" },\n a3: { width: 841.89, height: 1190.55, label: \"A3\" },\n a4: { width: 595.28, height: 841.89, label: \"A4\" },\n a5: { width: 419.53, height: 595.28, label: \"A5\" },\n b5: { width: 498.9, height: 708.66, label: \"B5\" },\n};\n\nexport const DEFAULT_FOOTER: RunningTemplate = { center: \"Page {page} of {pages}\" };\n\nconst BIBLIOGRAPHY_TITLES: Record<CitationStyle, string> = {\n apa: \"References\",\n mla: \"Works Cited\",\n chicago: \"Bibliography\",\n};\n\nexport interface FrontmatterSplit {\n /** Parsed YAML mapping (empty when there is no frontmatter). */\n data: Record<string, unknown>;\n /** The markdown after the frontmatter block. */\n body: string;\n /** The raw YAML text, or null when the source has no frontmatter. */\n raw: string | null;\n}\n\n/** Split `---` YAML frontmatter off a markdown source. Never throws. */\nexport function splitFrontmatter(source: string, notices?: DocumentNotice[]): FrontmatterSplit {\n const text = source.replace(/^/, \"\");\n const lines = text.split(/\\r?\\n/);\n if (lines[0]?.trim() !== \"---\" || lines[0] !== lines[0].trimStart()) {\n return { data: {}, body: text, raw: null };\n }\n let close = -1;\n for (let i = 1; i < lines.length; i++) {\n const t = (lines[i] as string).trimEnd();\n if (t === \"---\" || t === \"...\") {\n close = i;\n break;\n }\n }\n if (close === -1) return { data: {}, body: text, raw: null };\n const raw = lines.slice(1, close).join(\"\\n\");\n const body = lines.slice(close + 1).join(\"\\n\");\n let data: unknown;\n try {\n data = raw.trim() ? parseYaml(raw) : {};\n } catch (err) {\n notices?.push({\n code: \"frontmatter-invalid\",\n message: `The document settings at the top could not be read: ${(err as Error).message.split(\"\\n\")[0]}`,\n remedy: \"Fix the YAML between the two --- lines (every setting is `name: value`, lists use `- item`).\",\n });\n return { data: {}, body, raw };\n }\n if (data === null || typeof data !== \"object\" || Array.isArray(data)) {\n notices?.push({\n code: \"frontmatter-invalid\",\n message: \"The document settings at the top are not a list of `name: value` settings.\",\n remedy: \"Write one setting per line between the --- lines, e.g. `title: Annual report`.\",\n });\n return { data: {}, body, raw };\n }\n return { data: data as Record<string, unknown>, body, raw };\n}\n\n/** Normalize a key: `toc-depth`, `toc_depth`, `tocDepth` → `tocdepth`. */\nconst norm = (k: string): string => k.replace(/[-_\\s]/g, \"\").toLowerCase();\n\nfunction flatten(data: Record<string, unknown>): Map<string, unknown> {\n const out = new Map<string, unknown>();\n for (const [k, v] of Object.entries(data)) out.set(norm(k), v);\n // `page:` / `print:` / `document:` nested blocks carry the same keys.\n for (const nest of [\"page\", \"print\", \"document\", \"layout\"]) {\n const v = out.get(nest);\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n for (const [k, inner] of Object.entries(v as Record<string, unknown>)) {\n const key = norm(k);\n if (!out.has(key) || nest !== \"page\") out.set(key, inner);\n if (nest === \"page\" && !out.has(`page${key}`)) out.set(`page${key}`, inner);\n }\n }\n }\n return out;\n}\n\nconst str = (v: unknown): string | undefined => {\n if (v === null || v === undefined) return undefined;\n if (typeof v === \"string\") return v.trim() || undefined;\n if (typeof v === \"number\" || typeof v === \"boolean\") return String(v);\n if (v instanceof Date) return v.toISOString().slice(0, 10);\n return undefined;\n};\n\nconst bool = (v: unknown): boolean | undefined => {\n if (typeof v === \"boolean\") return v;\n if (typeof v === \"string\") {\n const t = v.trim().toLowerCase();\n if ([\"true\", \"yes\", \"on\", \"1\"].includes(t)) return true;\n if ([\"false\", \"no\", \"off\", \"0\", \"none\"].includes(t)) return false;\n }\n if (typeof v === \"number\") return v !== 0;\n return undefined;\n};\n\n/** A length: `1in`, `2.5cm`, `25mm`, `72pt`, `96px`, or a bare number (inches). */\nexport function parseLength(v: unknown): number | undefined {\n if (typeof v === \"number\" && Number.isFinite(v)) return v * 72;\n if (typeof v !== \"string\") return undefined;\n const m = /^\\s*(-?\\d+(?:\\.\\d+)?)\\s*(in|inch|inches|cm|mm|pt|px|\")?\\s*$/i.exec(v);\n if (!m) return undefined;\n const n = Number(m[1]);\n switch ((m[2] ?? \"in\").toLowerCase()) {\n case \"cm\":\n return (n / 2.54) * 72;\n case \"mm\":\n return (n / 25.4) * 72;\n case \"pt\":\n return n;\n case \"px\":\n return n * 0.75;\n default:\n return n * 72;\n }\n}\n\nfunction parseMargins(v: unknown, base: Margins): Margins | undefined {\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const all = parseLength(o.all ?? o.margin);\n const pick = (k: keyof Margins): number =>\n parseLength(o[k]) ?? parseLength(k === \"left\" || k === \"right\" ? o.x : o.y) ?? all ?? base[k];\n return { top: pick(\"top\"), right: pick(\"right\"), bottom: pick(\"bottom\"), left: pick(\"left\") };\n }\n const parts = (typeof v === \"number\" ? [String(v)] : typeof v === \"string\" ? v.trim().split(/[\\s,]+/) : [])\n .map((p) => parseLength(/^\\d+(\\.\\d+)?$/.test(p) ? Number(p) : p))\n .filter((n): n is number => n !== undefined);\n if (parts.length === 0) return undefined;\n const [t, r = t, b = t, l = r] = parts as [number, number?, number?, number?];\n return { top: t, right: r as number, bottom: b as number, left: l as number };\n}\n\n/** pandoc `geometry: margin=1in` / `geometry: [top=1in, left=1.25in]`. */\nfunction parseGeometry(v: unknown, base: Margins): Margins | undefined {\n const items = Array.isArray(v) ? v.map(String) : typeof v === \"string\" ? v.split(\",\") : [];\n if (items.length === 0) return undefined;\n const m = { ...base };\n let hit = false;\n for (const item of items) {\n const [k, val] = item.split(\"=\").map((s) => s.trim().toLowerCase());\n const len = parseLength(val);\n if (!k || len === undefined) continue;\n hit = true;\n if (k === \"margin\") m.top = m.right = m.bottom = m.left = len;\n else if (k === \"top\" || k === \"tmargin\") m.top = len;\n else if (k === \"bottom\" || k === \"bmargin\") m.bottom = len;\n else if (k === \"left\" || k === \"lmargin\" || k === \"inner\") m.left = len;\n else if (k === \"right\" || k === \"rmargin\" || k === \"outer\") m.right = len;\n else if (k === \"hmargin\") m.left = m.right = len;\n else if (k === \"vmargin\") m.top = m.bottom = len;\n else hit = hit || false;\n }\n return hit ? m : undefined;\n}\n\nfunction parseRunning(v: unknown): RunningTemplate | null | undefined {\n if (v === undefined) return undefined;\n if (v === false || v === null) return null;\n if (typeof v === \"string\") {\n const t = v.trim();\n if (!t || /^(none|off|false)$/i.test(t)) return null;\n // \"left | center | right\" — the Word/Docs three-slot habit.\n if (t.includes(\"|\")) {\n const [left, center, right] = t.split(\"|\").map((s) => s.trim());\n return { left: left || undefined, center: center || undefined, right: right || undefined };\n }\n return { center: t };\n }\n if (typeof v === \"object\" && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n return { left: str(o.left), center: str(o.center ?? o.centre ?? o.middle), right: str(o.right) };\n }\n return undefined;\n}\n\nfunction parseName(n: unknown): CslName | null {\n if (typeof n === \"string\") {\n const t = n.trim();\n if (!t) return null;\n if (t.includes(\",\")) {\n const [family, given] = t.split(\",\").map((s) => s.trim());\n return { family, given: given || undefined };\n }\n const parts = t.split(/\\s+/);\n if (parts.length === 1) return { family: parts[0] };\n return { family: parts[parts.length - 1], given: parts.slice(0, -1).join(\" \") };\n }\n if (n && typeof n === \"object\") {\n const o = n as Record<string, unknown>;\n const family = str(o.family ?? o.last ?? o.surname);\n const given = str(o.given ?? o.first);\n const literal = str(o.literal ?? o.name);\n if (!family && !given && !literal) return null;\n return { family, given, literal };\n }\n return null;\n}\n\n/** Accept CSL-JSON items plus friendly shorthands (`authors: [...]`, `year: 2020`). */\nexport function normalizeReference(raw: unknown): CslItem | null {\n if (!raw || typeof raw !== \"object\") return null;\n const o = raw as Record<string, unknown>;\n const id = str(o.id ?? o.key ?? o[\"citation-key\"]);\n if (!id) return null;\n const names = (v: unknown): CslName[] | undefined => {\n const arr = Array.isArray(v) ? v : typeof v === \"string\" ? v.split(/\\s+and\\s+|;/) : [];\n const out = arr.map(parseName).filter((x): x is CslName => x !== null);\n return out.length ? out : undefined;\n };\n let issued = o.issued && typeof o.issued === \"object\" ? (o.issued as CslItem[\"issued\"]) : undefined;\n const year = o.year ?? o.date ?? (typeof o.issued === \"object\" ? undefined : o.issued);\n if (!issued && year !== undefined) {\n const y = str(year);\n const m = y ? /^(\\d{4})(?:-(\\d{1,2}))?(?:-(\\d{1,2}))?/.exec(y) : null;\n issued = m\n ? { \"date-parts\": [[Number(m[1]), ...(m[2] ? [Number(m[2])] : []), ...(m[3] ? [Number(m[3])] : [])]] }\n : y\n ? { literal: y }\n : undefined;\n }\n return {\n id,\n type: str(o.type),\n title: str(o.title),\n author: names(o.author ?? o.authors),\n editor: names(o.editor ?? o.editors),\n issued,\n \"container-title\": str(o[\"container-title\"] ?? o.containerTitle ?? o.journal ?? o.website ?? o.booktitle),\n publisher: str(o.publisher),\n \"publisher-place\": str(o[\"publisher-place\"] ?? o.publisherPlace ?? o.place ?? o.address),\n volume: str(o.volume),\n issue: str(o.issue ?? o.number),\n page: str(o.page ?? o.pages),\n edition: str(o.edition),\n URL: str(o.URL ?? o.url),\n DOI: str(o.DOI ?? o.doi),\n };\n}\n\nexport interface ResolveSettingsOptions {\n /** Used when the frontmatter has no `title`. */\n title?: string | undefined;\n /** Extra references (e.g. from a host's source records); frontmatter wins on id clash. */\n references?: CslItem[] | undefined;\n /** \"Today\" for `date: today` — injectable so tests are deterministic. */\n now?: Date | undefined;\n}\n\n/** Turn a frontmatter mapping into complete, validated settings. */\nexport function resolveSettings(\n data: Record<string, unknown>,\n notices: DocumentNotice[],\n options: ResolveSettingsOptions = {},\n): DocumentSettings {\n const f = flatten(data);\n const get = (...keys: string[]): unknown => {\n for (const k of keys) if (f.has(k)) return f.get(k);\n return undefined;\n };\n const ignore = (key: string, value: unknown, remedy: string) =>\n notices.push({\n code: \"setting-ignored\",\n message: `The setting \"${key}: ${typeof value === \"object\" ? JSON.stringify(value) : String(value)}\" was not understood, so the default is used.`,\n remedy,\n });\n\n // Page size + orientation.\n let size: PageSizeName = \"letter\";\n let orientation: Orientation = \"portrait\";\n const sizeRaw = get(\"pagesize\", \"papersize\", \"paper\", \"size\");\n if (sizeRaw !== undefined) {\n const s = String(sizeRaw).toLowerCase().replace(/paper$/, \"\").replace(/[\\s-]/g, \"\");\n const words = s.match(/[a-z]+\\d*/g) ?? [];\n const name = words.find((w) => w in PAGE_SIZES) as PageSizeName | undefined;\n if (name) size = name;\n else ignore(\"page size\", sizeRaw, `Use one of: ${Object.keys(PAGE_SIZES).join(\", \")}.`);\n if (/landscape/.test(s)) orientation = \"landscape\";\n }\n const orientRaw = get(\"orientation\", \"pageorientation\");\n if (orientRaw !== undefined) {\n const o = String(orientRaw).toLowerCase();\n if (o === \"landscape\" || o === \"portrait\") orientation = o;\n else ignore(\"orientation\", orientRaw, \"Use `portrait` or `landscape`.\");\n }\n if (bool(get(\"landscape\")) === true) orientation = \"landscape\";\n\n // Margins: 1in all round by default (Word / Docs).\n let margins: Margins = { top: 72, right: 72, bottom: 72, left: 72 };\n const marginRaw = get(\"margins\", \"margin\", \"pagemargins\", \"pagemargin\");\n if (marginRaw !== undefined) {\n const m = parseMargins(marginRaw, margins);\n if (m) margins = m;\n else ignore(\"margins\", marginRaw, \"Write margins like `1in`, `2.5cm`, `20mm`, or `1in 0.75in` (top/bottom left/right).\");\n }\n const geometry = get(\"geometry\");\n if (geometry !== undefined) {\n const m = parseGeometry(geometry, margins);\n if (m) margins = m;\n else ignore(\"geometry\", geometry, \"Write it like pandoc: `geometry: margin=1in`.\");\n }\n for (const side of [\"top\", \"right\", \"bottom\", \"left\"] as const) {\n const v = get(`margin${side}`, `${side}margin`);\n const len = parseLength(v);\n if (len !== undefined) margins[side] = len;\n }\n\n // Cover page.\n const title = str(get(\"title\")) ?? options.title;\n const subtitle = str(get(\"subtitle\"));\n const authorRaw = get(\"author\", \"authors\");\n const author = Array.isArray(authorRaw)\n ? authorRaw\n .map((a) => (typeof a === \"string\" ? a : str((a as Record<string, unknown>)?.name)))\n .filter(Boolean)\n .join(\", \")\n : str(authorRaw);\n let date = str(get(\"date\"));\n if (date && /^today$/i.test(date)) {\n const now = options.now ?? new Date();\n date = now.toLocaleDateString(\"en-US\", { year: \"numeric\", month: \"long\", day: \"numeric\" });\n }\n const logo = str(get(\"logo\", \"coverlogo\"));\n const coverRaw = get(\"cover\", \"coverpage\", \"titlepage\");\n let cover = false;\n if (coverRaw !== undefined) {\n const b = bool(coverRaw);\n if (b === undefined && coverRaw && typeof coverRaw === \"object\") cover = true;\n else if (b === undefined) ignore(\"cover\", coverRaw, \"Use `cover: true` or `cover: false`.\");\n else cover = b;\n }\n if (cover && !title) {\n notices.push({\n code: \"setting-ignored\",\n message: \"A cover page was asked for, but the document has no title.\",\n remedy: \"Add `title: …` to the settings at the top (subtitle, author, date and logo are optional).\",\n });\n }\n\n // Table of contents.\n const tocRaw = get(\"toc\", \"tableofcontents\", \"contents\");\n let tocEnabled = false;\n let tocDepth = 3;\n let tocTitle = \"Contents\";\n if (tocRaw !== undefined) {\n if (tocRaw && typeof tocRaw === \"object\" && !Array.isArray(tocRaw)) {\n const o = tocRaw as Record<string, unknown>;\n tocEnabled = bool(o.enabled ?? true) ?? true;\n const d = Number(o.depth);\n if (Number.isFinite(d)) tocDepth = d;\n tocTitle = str(o.title) ?? tocTitle;\n } else {\n const b = bool(tocRaw);\n if (b === undefined) ignore(\"toc\", tocRaw, \"Use `toc: true`, or `toc: { depth: 2, title: Contents }`.\");\n else tocEnabled = b;\n }\n }\n const depthRaw = get(\"tocdepth\");\n if (depthRaw !== undefined && Number.isFinite(Number(depthRaw))) tocDepth = Number(depthRaw);\n tocDepth = Math.min(6, Math.max(1, Math.round(tocDepth)));\n tocTitle = str(get(\"toctitle\")) ?? tocTitle;\n\n // Running header / footer.\n const headerRaw = get(\"header\", \"pageheader\", \"runningheader\");\n const footerRaw = get(\"footer\", \"pagefooter\", \"runningfooter\");\n let header = parseRunning(headerRaw);\n if (header === undefined) {\n if (headerRaw !== undefined) ignore(\"header\", headerRaw, 'Use text like `header: \"{title} | | {date}\"`, or `header: false`.');\n header = null;\n }\n let footer = parseRunning(footerRaw);\n if (footer === undefined) {\n if (footerRaw !== undefined) ignore(\"footer\", footerRaw, 'Use text like `footer: \"Page {page} of {pages}\"`, or `footer: false`.');\n footer = DEFAULT_FOOTER;\n }\n if (bool(get(\"pagenumbers\")) === false && footerRaw === undefined) footer = null;\n\n const firstRaw = get(\"firstpage\", \"differentfirstpage\", \"titlepageheader\");\n let differentFirstPage = cover;\n if (firstRaw !== undefined) {\n const b = bool(firstRaw);\n if (b !== undefined) differentFirstPage = b || cover;\n else if (/different/i.test(String(firstRaw))) differentFirstPage = true;\n else if (/same/i.test(String(firstRaw))) differentFirstPage = cover;\n else ignore(\"firstPage\", firstRaw, \"Use `firstPage: different` or `firstPage: same`.\");\n }\n\n // Columns.\n let columns: 1 | 2 | 3 = 1;\n const colRaw = get(\"columns\", \"cols\", \"columncount\");\n if (colRaw !== undefined) {\n const n = Number(colRaw);\n if (Number.isInteger(n) && n >= 1 && n <= 3) columns = n as 1 | 2 | 3;\n else ignore(\"columns\", colRaw, \"Use 1, 2 or 3.\");\n }\n\n // Citations.\n let citationStyle: CitationStyle = \"apa\";\n const cslRaw = get(\"citationstyle\", \"csl\", \"citestyle\", \"referencestyle\");\n if (cslRaw !== undefined) {\n const s = String(cslRaw).toLowerCase();\n if (/apa/.test(s)) citationStyle = \"apa\";\n else if (/mla|modern-language/.test(s)) citationStyle = \"mla\";\n else if (/chicago/.test(s)) citationStyle = \"chicago\";\n else ignore(\"citation style\", cslRaw, \"Use `apa`, `mla` or `chicago`.\");\n }\n const refs = new Map<string, CslItem>();\n for (const r of options.references ?? []) refs.set(r.id, r);\n const refsRaw = get(\"references\", \"bibliography\", \"sources\");\n if (refsRaw !== undefined) {\n if (Array.isArray(refsRaw)) {\n for (const r of refsRaw) {\n const item = normalizeReference(r);\n if (item) refs.set(item.id, item);\n else ignore(\"references\", r, \"Every reference needs an `id:` (the key you cite as [@id]) and usually `title`, `author`, `issued`/`year`.\");\n }\n } else if (refsRaw && typeof refsRaw === \"object\") {\n for (const [id, r] of Object.entries(refsRaw as Record<string, unknown>)) {\n const item = normalizeReference({ id, ...(r as object) });\n if (item) refs.set(item.id, item);\n }\n } else if (typeof refsRaw !== \"string\") {\n ignore(\"references\", refsRaw, \"List references as CSL-JSON items: `- id: smith2020` with `title`, `author`, `issued`.\");\n }\n }\n\n let fontSize = 11;\n const fsRaw = get(\"fontsize\", \"basefontsize\");\n if (fsRaw !== undefined) {\n const n = parseLength(typeof fsRaw === \"number\" ? `${fsRaw}pt` : fsRaw);\n if (n && n >= 6 && n <= 24) fontSize = n;\n else ignore(\"fontSize\", fsRaw, \"Use a size in points between 6 and 24, e.g. `fontSize: 11`.\");\n }\n\n return {\n title,\n subtitle,\n author,\n date,\n logo,\n lang: str(get(\"lang\", \"language\")) ?? \"en\",\n page: { size, ...PAGE_SIZES[size], orientation, margins },\n cover: cover && Boolean(title),\n toc: { enabled: tocEnabled, depth: tocDepth, title: tocTitle },\n header,\n footer,\n differentFirstPage,\n columns,\n numberSections: bool(get(\"numbersections\", \"sectionnumbers\", \"numberedheadings\", \"numberheadings\")) ?? false,\n citationStyle,\n bibliographyTitle: str(get(\"bibliographytitle\", \"referencestitle\", \"referencesectiontitle\")) ?? BIBLIOGRAPHY_TITLES[citationStyle],\n references: [...refs.values()],\n hyphenate: bool(get(\"hyphenate\", \"hyphenation\")) ?? true,\n fontSize,\n };\n}\n\n/** Fill a running template for one page. */\nexport function fillTemplate(\n template: string,\n s: DocumentSettings,\n page: number | string,\n pages: number | string,\n): string {\n return template.replace(/\\{(page|pages|title|subtitle|author|date)\\}/gi, (_m, k: string) => {\n switch (k.toLowerCase()) {\n case \"page\":\n return String(page);\n case \"pages\":\n return String(pages);\n case \"title\":\n return s.title ?? \"\";\n case \"subtitle\":\n return s.subtitle ?? \"\";\n case \"author\":\n return s.author ?? \"\";\n default:\n return s.date ?? \"\";\n }\n });\n}\n\n/** Split a template into literal text and `{page}` / `{pages}` field tokens. */\nexport function templateParts(\n template: string,\n s: DocumentSettings,\n): Array<{ text: string } | { field: \"page\" | \"pages\" }> {\n const filled = template.replace(/\\{(title|subtitle|author|date)\\}/gi, (m) => fillTemplate(m, s, \"\", \"\"));\n const out: Array<{ text: string } | { field: \"page\" | \"pages\" }> = [];\n let last = 0;\n for (const m of filled.matchAll(/\\{(page|pages)\\}/gi)) {\n if (m.index! > last) out.push({ text: filled.slice(last, m.index) });\n out.push({ field: (m[1] as string).toLowerCase() as \"page\" | \"pages\" });\n last = m.index! + m[0].length;\n }\n if (last < filled.length) out.push({ text: filled.slice(last) });\n return out;\n}\n","/**\n * DocTree → DOCX (Word). Uses the `docx` package, loaded lazily.\n *\n * Word-native everywhere it matters, so the file keeps working when the reader\n * edits it: real sections (size, margins, orientation, columns per section),\n * running headers/footers with PAGE / NUMPAGES fields, a different first page\n * (titlePage), a real TOC field pre-filled with entries and page numbers (and\n * `updateFields` so Word refreshes it on open), SEQ-field captions with\n * bookmarks, cross-references as internal hyperlinks, heading keep-with-next,\n * widow/orphan control, table rows that never split with repeating header\n * rows, automatic hyphenation.\n */\n\nimport type * as Docx from \"docx\";\nimport type { Block, Caption, DocSection, DocTree, DocumentSettings, ImageMap, Inline, RunningTemplate } from \"./types\";\nimport { templateParts } from \"./settings\";\n\ntype D = typeof Docx;\ntype Child = Docx.Paragraph | Docx.Table | Docx.TableOfContents;\n\nconst TW = 20; // twips per point\n\n/** Drop `undefined` keys: docx's option types forbid explicit undefined. */\nfunction strip<T extends object>(o: T): { [K in keyof T]-?: Exclude<T[K], undefined> } {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(o)) if (v !== undefined) out[k] = v;\n return out as { [K in keyof T]-?: Exclude<T[K], undefined> };\n}\nconst HEX = { text: \"1F2937\", heading: \"111827\", muted: \"6B7280\", link: \"1D4ED8\", rule: \"D1D5DB\", codeBg: \"F6F8FA\", danger: \"B91C1C\" };\nconst MONO = \"Consolas\";\n\ninterface Ctx {\n d: D;\n tree: DocTree;\n s: DocumentSettings;\n images?: ImageMap | undefined;\n bookmarks: Map<string, string>;\n numbering: Map<string, Docx.ILevelsOptions[]>;\n listInstance: number;\n /** Usable text width in points for the current section/column. */\n width: number;\n tocIds: Set<string>;\n minLevel: number;\n}\n\n/** A Word-legal bookmark name for a document id (≤40 chars, [A-Za-z0-9_]). */\nfunction bm(c: Ctx, id: string): string {\n let name = c.bookmarks.get(id);\n if (name) return name;\n const base = `m_${id.replace(/[^A-Za-z0-9_]/g, \"_\")}`.slice(0, 36);\n name = base;\n const used = new Set(c.bookmarks.values());\n for (let n = 2; used.has(name); n++) name = `${base.slice(0, 33)}_${n}`;\n c.bookmarks.set(id, name);\n return name;\n}\n\ninterface RunStyle {\n bold?: boolean;\n italics?: boolean;\n strike?: boolean;\n size?: number;\n color?: string;\n}\n\nfunction runs(nodes: Inline[], c: Ctx, st: RunStyle = {}): Docx.ParagraphChild[] {\n const { d } = c;\n const out: Docx.ParagraphChild[] = [];\n const tr = (text: string, extra: Partial<Docx.IRunOptions> = {}) =>\n new d.TextRun(\n strip({\n text,\n bold: st.bold,\n italics: st.italics,\n strike: st.strike,\n size: st.size ? st.size * 2 : undefined,\n color: st.color,\n ...extra,\n }) as Docx.IRunOptions,\n );\n for (const n of nodes) {\n switch (n.type) {\n case \"text\":\n out.push(tr(n.value));\n break;\n case \"strong\":\n out.push(...runs(n.children, c, { ...st, bold: true }));\n break;\n case \"emphasis\":\n out.push(...runs(n.children, c, { ...st, italics: true }));\n break;\n case \"delete\":\n out.push(...runs(n.children, c, { ...st, strike: true }));\n break;\n case \"code\":\n out.push(tr(n.value, { font: MONO, shading: { type: d.ShadingType.CLEAR, fill: \"F3F4F6\", color: \"auto\" } }));\n break;\n case \"break\":\n out.push(new d.TextRun({ break: 1 }));\n break;\n case \"link\":\n if (/^(https?:|mailto:|tel:)/i.test(n.url)) {\n out.push(\n new d.ExternalHyperlink({\n link: n.url,\n children: runs(n.children, c, { ...st, color: HEX.link }) as Docx.ParagraphChild[] as never,\n }),\n );\n } else out.push(...runs(n.children, c, st));\n break;\n case \"image\":\n out.push(tr(n.alt));\n break;\n case \"xref\": {\n if (!n.resolved) {\n out.push(tr(n.label, { bold: true, color: HEX.danger }));\n break;\n }\n const id = n.target.startsWith(\"sec:\") ? n.target.slice(4) : n.target;\n out.push(new d.InternalHyperlink({ anchor: bm(c, id), children: [tr(n.label, { color: HEX.link })] }));\n break;\n }\n case \"cite\":\n if (n.resolved) {\n out.push(new d.InternalHyperlink({ anchor: bm(c, `ref-${n.keys[0]}`), children: [tr(n.label)] }));\n } else out.push(tr(n.label, { bold: true, color: HEX.danger }));\n break;\n case \"noteRef\":\n out.push(new d.InternalHyperlink({ anchor: bm(c, `note-${n.n}`), children: [tr(String(n.n), { superScript: true, color: HEX.link })] }));\n break;\n }\n }\n return out;\n}\n\nfunction captionParagraph(cap: Caption, c: Ctx, keepNext: boolean): Docx.Paragraph {\n const { d } = c;\n const word = cap.kind === \"fig\" ? \"Figure\" : \"Table\";\n const labelRuns = [new d.TextRun({ text: `${word} `, bold: true }), new d.SimpleField(`SEQ ${word} \\\\* ARABIC`, String(cap.number))];\n const children: Docx.ParagraphChild[] = cap.id\n ? [new d.Bookmark({ id: bm(c, `${cap.kind}:${cap.id}`), children: labelRuns as never })]\n : (labelRuns as never);\n if (cap.children.length) children.push(new d.TextRun({ text: \": \" }), ...runs(cap.children, c));\n return new d.Paragraph({\n style: \"Caption\",\n keepNext,\n keepLines: true,\n alignment: cap.kind === \"fig\" ? d.AlignmentType.CENTER : d.AlignmentType.LEFT,\n children,\n });\n}\n\nfunction numberingRef(c: Ctx, ordered: boolean, start: number): string {\n const ref = ordered ? `matrx-num-${start}` : \"matrx-bullets\";\n if (!c.numbering.has(ref)) {\n const { d } = c;\n const bullets = [\"•\", \"◦\", \"▪\"];\n const formats = [d.LevelFormat.DECIMAL, d.LevelFormat.LOWER_LETTER, d.LevelFormat.LOWER_ROMAN];\n c.numbering.set(\n ref,\n Array.from({ length: 6 }, (_, level) => ({\n level,\n format: ordered ? formats[level % 3] : d.LevelFormat.BULLET,\n text: ordered ? `%${level + 1}.` : bullets[level % 3],\n start: ordered && level === 0 ? start : 1,\n alignment: d.AlignmentType.LEFT,\n style: { paragraph: { indent: { left: 360 * (level + 1) + 60, hanging: 300 } } },\n })) as Docx.ILevelsOptions[],\n );\n }\n return ref;\n}\n\ninterface BlockOpts {\n indent?: number;\n listLevel?: number;\n quote?: boolean;\n}\n\nfunction blocks(list: Block[], c: Ctx, o: BlockOpts = {}): Child[] {\n const out: Child[] = [];\n for (const b of list) out.push(...block(b, c, o));\n return out;\n}\n\nfunction para(c: Ctx, o: BlockOpts, opts: Docx.IParagraphOptions): Docx.Paragraph {\n const { d } = c;\n return new d.Paragraph(\n strip({\n ...opts,\n indent: o.indent ? { left: o.indent } : opts.indent,\n border: o.quote ? { left: { style: d.BorderStyle.SINGLE, size: 18, color: HEX.rule, space: 8 } } : opts.border,\n }) as Docx.IParagraphOptions,\n );\n}\n\nfunction block(b: Block, c: Ctx, o: BlockOpts): Child[] {\n const { d } = c;\n switch (b.type) {\n case \"heading\": {\n const level = Math.min(6, Math.max(1, b.level - c.minLevel + 1));\n const heading = [d.HeadingLevel.HEADING_1, d.HeadingLevel.HEADING_2, d.HeadingLevel.HEADING_3, d.HeadingLevel.HEADING_4, d.HeadingLevel.HEADING_5, d.HeadingLevel.HEADING_6][level - 1];\n const kids = [...(b.number ? [new d.TextRun({ text: `${b.number} `, color: HEX.muted })] : []), ...runs(b.children, c)];\n return [\n new d.Paragraph({\n heading: heading as (typeof d.HeadingLevel)[keyof typeof d.HeadingLevel],\n keepNext: true,\n keepLines: true,\n children: [new d.Bookmark({ id: bm(c, b.id), children: kids as never })],\n // The bibliography/notes headings are not numbered and still in the TOC.\n }),\n ];\n }\n case \"paragraph\":\n return [para(c, o, { children: runs(b.children, c), widowControl: true })];\n case \"list\": {\n const level = o.listLevel ?? 0;\n const ref = numberingRef(c, b.ordered, b.start);\n const instance = ++c.listInstance;\n const out: Child[] = [];\n for (const it of b.items) {\n const [first, ...rest] = it.children;\n const firstRuns = first?.type === \"paragraph\" ? runs(first.children, c) : [];\n if (it.checked !== null) {\n out.push(\n para(c, { ...o, indent: (o.indent ?? 0) + 360 * (level + 1) }, {\n children: [new d.TextRun({ text: it.checked ? \"☒ \" : \"☐ \", font: \"Segoe UI Symbol\" }), ...firstRuns],\n widowControl: true,\n }),\n );\n } else {\n out.push(new d.Paragraph({ numbering: { reference: ref, level, instance }, children: firstRuns, widowControl: true }));\n }\n const tail = first && first.type !== \"paragraph\" ? [first, ...rest] : rest;\n for (const child of tail) {\n if (child.type === \"list\") out.push(...block(child, c, { ...o, listLevel: level + 1 }));\n else out.push(...block(child, c, { ...o, indent: (o.indent ?? 0) + 360 * (level + 1) + 60 }));\n }\n }\n return out;\n }\n case \"blockquote\":\n return blocks(b.children, c, { ...o, indent: (o.indent ?? 0) + 360, quote: true });\n case \"code\": {\n const lines = b.value.replace(/\\n$/, \"\").split(\"\\n\");\n const keep = lines.length <= 45;\n return lines.map(\n (l, i) =>\n new d.Paragraph({\n style: \"SourceCode\",\n keepNext: keep && i < lines.length - 1,\n keepLines: true,\n ...(o.indent ? { indent: { left: o.indent } } : {}),\n children: [new d.TextRun({ text: l.replace(/\\t/g, \" \") || \" \", font: MONO })],\n }),\n );\n }\n case \"table\": {\n const n = Math.max(b.header.length, ...b.rows.map((r) => r.length), 1);\n const keep = b.rows.length <= 20;\n const alignOf = (i: number) =>\n b.align[i] === \"center\" ? d.AlignmentType.CENTER : b.align[i] === \"right\" ? d.AlignmentType.RIGHT : d.AlignmentType.LEFT;\n const border = { style: d.BorderStyle.SINGLE, size: 4, color: \"E5E7EB\" };\n const none = { style: d.BorderStyle.NONE, size: 0, color: \"FFFFFF\" };\n const row = (cells: Inline[][], head: boolean, last: boolean) =>\n new d.TableRow({\n tableHeader: head,\n cantSplit: true,\n children: Array.from(\n { length: n },\n (_, i) =>\n new d.TableCell({\n ...(head ? { shading: { type: d.ShadingType.CLEAR, fill: \"F3F4F6\", color: \"auto\" } } : {}),\n margins: { top: 60, bottom: 60, left: 100, right: 100 },\n borders: { top: none, left: none, right: none, bottom: head ? { ...border, size: 10, color: HEX.heading } : border },\n children: [\n new d.Paragraph({\n alignment: alignOf(i),\n keepNext: keep && !last,\n children: runs(cells[i] ?? [], c, head ? { bold: true } : {}),\n }),\n ],\n }),\n ),\n });\n const out: Child[] = [];\n if (b.caption) out.push(captionParagraph(b.caption, c, true));\n out.push(\n new d.Table({\n width: { size: 100, type: d.WidthType.PERCENTAGE },\n rows: [row(b.header, true, b.rows.length === 0), ...b.rows.map((r, i) => row(r, false, i === b.rows.length - 1))],\n }),\n );\n out.push(new d.Paragraph({ spacing: { after: 60 }, children: [] }));\n return out;\n }\n case \"figure\": {\n const img = c.images?.get(b.url);\n const out: Child[] = [];\n if (img) {\n const maxW = c.width;\n const maxH = (c.s.page.height - c.s.page.margins.top - c.s.page.margins.bottom) * 0.6;\n const scale = Math.min(1, maxW / img.width, maxH / img.height);\n const px = (v: number) => Math.round(v * scale * (96 / 72));\n out.push(\n new d.Paragraph({\n alignment: d.AlignmentType.CENTER,\n keepNext: Boolean(b.caption),\n keepLines: true,\n children: [\n new d.ImageRun({\n type: img.mime === \"image/png\" ? \"png\" : img.mime === \"image/gif\" ? \"gif\" : \"jpg\",\n data: img.bytes,\n transformation: { width: px(img.width), height: px(img.height) },\n altText: { name: b.alt || \"image\", description: b.alt, title: b.alt },\n }),\n ],\n }),\n );\n } else {\n out.push(\n new d.Paragraph({\n alignment: d.AlignmentType.CENTER,\n keepNext: Boolean(b.caption),\n children: [new d.TextRun({ text: `[Image unavailable: ${b.alt || b.url}]`, italics: true, color: HEX.muted })],\n }),\n );\n }\n if (b.caption) out.push(captionParagraph(b.caption, c, false));\n return out;\n }\n case \"rule\":\n return [new d.Paragraph({ border: { bottom: { style: d.BorderStyle.SINGLE, size: 6, color: HEX.rule, space: 1 } }, children: [] })];\n case \"pageBreak\":\n return [new d.Paragraph({ children: [new d.PageBreak()] })];\n case \"toc\":\n return [\n new d.Paragraph({ style: \"TOCHeading\", keepNext: true, children: [new d.TextRun(c.s.toc.title)] }),\n new d.TableOfContents(c.s.toc.title, {\n hyperlink: true,\n headingStyleRange: `1-${c.s.toc.depth}`,\n cachedEntries: c.tree.toc.map((e) => {\n const page = pagesFor(c).get(e.id);\n return { title: e.text, level: e.level, href: bm(c, e.id), ...(page ? { page } : {}) };\n }),\n }),\n ];\n case \"notes\":\n return c.tree.notes.flatMap((n) => {\n const [first, ...rest] = n.children;\n const lead = new d.Paragraph({\n indent: { left: 360, hanging: 360 },\n children: [\n new d.Bookmark({ id: bm(c, `note-${n.n}`), children: [new d.TextRun({ text: `${n.n}.\\t`, color: HEX.muted })] }),\n ...(first?.type === \"paragraph\" ? runs(first.children, c) : []),\n ],\n });\n const tail = first && first.type !== \"paragraph\" ? [first, ...rest] : rest;\n return [lead, ...blocks(tail, c, { indent: 360 })];\n });\n case \"bibliography\":\n return c.tree.bibliography.map(\n (e) =>\n new d.Paragraph({\n indent: { left: 720, hanging: 720 },\n spacing: { after: 120 },\n children: [new d.Bookmark({ id: bm(c, `ref-${e.id}`), children: [] }), ...runs(e.children, c)],\n }),\n );\n }\n}\n\nconst PAGES_KEY = Symbol(\"pages\");\nfunction pagesFor(c: Ctx): Map<string, number> {\n return ((c as unknown as Record<symbol, Map<string, number>>)[PAGES_KEY] ??= new Map());\n}\n\nfunction runningParagraph(t: RunningTemplate, c: Ctx, widthPt: number): Docx.Paragraph {\n const { d } = c;\n const slot = (v: string | undefined): Docx.ParagraphChild[] =>\n v\n ? templateParts(v, c.s).map((p) =>\n \"field\" in p\n ? new d.TextRun({ children: [p.field === \"page\" ? d.PageNumber.CURRENT : d.PageNumber.TOTAL_PAGES], size: 18, color: HEX.muted })\n : new d.TextRun({ text: p.text, size: 18, color: HEX.muted }),\n )\n : [];\n return new d.Paragraph({\n tabStops: [\n { type: d.TabStopType.CENTER, position: Math.round((widthPt / 2) * TW) },\n { type: d.TabStopType.RIGHT, position: Math.round(widthPt * TW) },\n ],\n children: [...slot(t.left), new d.TextRun({ children: [new d.Tab()] }), ...slot(t.center), new d.TextRun({ children: [new d.Tab()] }), ...slot(t.right)],\n });\n}\n\nfunction coverChildren(c: Ctx): Child[] {\n const { d, s } = c;\n const out: Child[] = [];\n const pageH = (s.page.orientation === \"landscape\" ? s.page.width : s.page.height) - s.page.margins.top - s.page.margins.bottom;\n out.push(new d.Paragraph({ spacing: { before: Math.round(pageH * 0.28 * TW) }, children: [] }));\n const logo = s.logo ? c.images?.get(s.logo) : undefined;\n if (logo) {\n const scale = Math.min(1, 160 / logo.width, 72 / logo.height);\n out.push(\n new d.Paragraph({\n spacing: { after: 480 },\n children: [\n new d.ImageRun({\n type: logo.mime === \"image/png\" ? \"png\" : logo.mime === \"image/gif\" ? \"gif\" : \"jpg\",\n data: logo.bytes,\n transformation: { width: Math.round(logo.width * scale * (96 / 72)), height: Math.round(logo.height * scale * (96 / 72)) },\n }),\n ],\n }),\n );\n }\n out.push(new d.Paragraph({ style: \"Title\", children: [new d.TextRun(s.title ?? \"\")] }));\n if (s.subtitle) out.push(new d.Paragraph({ style: \"Subtitle\", children: [new d.TextRun(s.subtitle)] }));\n if (s.author) out.push(new d.Paragraph({ spacing: { before: 720 }, children: [new d.TextRun({ text: s.author, size: 24, color: \"4B5563\" })] }));\n if (s.date) out.push(new d.Paragraph({ children: [new d.TextRun({ text: s.date, size: 24, color: \"4B5563\" })] }));\n out.push(new d.Paragraph({ children: [new d.PageBreak()] }));\n return out;\n}\n\nexport interface DocxOptions {\n images?: ImageMap | undefined;\n /** Heading id → page number (from the PDF layout) for the cached TOC. */\n headingPages?: Map<string, number> | undefined;\n}\n\nexport async function documentToDocx(tree: DocTree, options: DocxOptions = {}): Promise<Uint8Array> {\n const d = (await import(\"docx\")) as D;\n const s = tree.settings;\n const levels: number[] = [];\n for (const sec of tree.sections) for (const b of sec.blocks) if (b.type === \"heading\") levels.push(b.level);\n const c: Ctx = {\n d,\n tree,\n s,\n images: options.images,\n bookmarks: new Map(),\n numbering: new Map(),\n listInstance: 0,\n width: s.page.width - s.page.margins.left - s.page.margins.right,\n tocIds: new Set(tree.toc.map((e) => e.id)),\n minLevel: Math.min(7, ...levels),\n };\n if (options.headingPages) for (const [k, v] of options.headingPages) pagesFor(c).set(k, v);\n\n const m = s.page.margins;\n const sections: Docx.ISectionOptions[] = tree.sections.map((sec: DocSection, idx) => {\n const landscape = sec.orientation === \"landscape\";\n const pageW = landscape ? s.page.height : s.page.width;\n const full = pageW - m.left - m.right;\n const gap = 18;\n c.width = (full - gap * (sec.columns - 1)) / sec.columns;\n const children: Child[] = [];\n if (idx === 0 && s.cover) children.push(...coverChildren(c));\n children.push(...blocks(sec.blocks, c));\n if (children.length === 0) children.push(new d.Paragraph({ children: [] }));\n const header = s.header ? new d.Header({ children: [runningParagraph(s.header, c, full)] }) : undefined;\n const footer = s.footer ? new d.Footer({ children: [runningParagraph(s.footer, c, full)] }) : undefined;\n const firstPageOnly = idx === 0 && s.differentFirstPage;\n return strip({\n properties: strip({\n type: d.SectionType.NEXT_PAGE,\n titlePage: firstPageOnly,\n page: {\n size: { width: Math.round(s.page.width * TW), height: Math.round(s.page.height * TW), orientation: landscape ? d.PageOrientation.LANDSCAPE : d.PageOrientation.PORTRAIT },\n margin: {\n top: Math.round(m.top * TW),\n right: Math.round(m.right * TW),\n bottom: Math.round(m.bottom * TW),\n left: Math.round(m.left * TW),\n header: Math.round(Math.max(18, m.top / 2 - 6) * TW),\n footer: Math.round(Math.max(18, m.bottom / 2 - 6) * TW),\n },\n },\n column: sec.columns > 1 ? { count: sec.columns, space: gap * TW, equalWidth: true } : undefined,\n }),\n headers: header ? { default: header, ...(firstPageOnly ? { first: new d.Header({ children: [new d.Paragraph({ children: [] })] }) } : {}) } : undefined,\n footers: footer ? { default: footer, ...(firstPageOnly ? { first: new d.Footer({ children: [new d.Paragraph({ children: [] })] }) } : {}) } : undefined,\n children,\n }) as Docx.ISectionOptions;\n });\n\n const size = s.fontSize * 2;\n const heading = (id: string, name: string, pt: number, level: number) => ({\n id,\n name,\n basedOn: \"Normal\",\n next: \"Normal\",\n quickFormat: true,\n run: { font: \"Calibri\", size: Math.round(pt * 2), bold: true, color: HEX.heading },\n paragraph: { spacing: { before: Math.round(pt * 14), after: Math.round(pt * 5) }, keepNext: true, keepLines: true, outlineLevel: level },\n });\n const doc = new d.Document({\n creator: s.author ?? \"AI Matrx\",\n title: s.title ?? \"Document\",\n ...(s.subtitle ? { description: s.subtitle } : {}),\n features: { updateFields: true },\n hyphenation: { autoHyphenation: s.hyphenate, doNotHyphenateCaps: true },\n numbering: { config: [...c.numbering.entries()].map(([reference, levels]) => ({ reference, levels })) },\n styles: {\n default: {\n document: { run: { font: \"Cambria\", size, color: HEX.text }, paragraph: { spacing: { after: 140, line: 300 } } },\n },\n paragraphStyles: [\n heading(\"Heading1\", \"Heading 1\", s.fontSize * 1.8, 0),\n heading(\"Heading2\", \"Heading 2\", s.fontSize * 1.45, 1),\n heading(\"Heading3\", \"Heading 3\", s.fontSize * 1.2, 2),\n heading(\"Heading4\", \"Heading 4\", s.fontSize * 1.05, 3),\n heading(\"Heading5\", \"Heading 5\", s.fontSize, 4),\n heading(\"Heading6\", \"Heading 6\", s.fontSize, 5),\n { id: \"Title\", name: \"Title\", basedOn: \"Normal\", run: { font: \"Calibri\", size: 60, bold: true, color: HEX.heading }, paragraph: { spacing: { after: 200 } } },\n { id: \"Subtitle\", name: \"Subtitle\", basedOn: \"Normal\", run: { font: \"Calibri\", size: 32, color: \"4B5563\" } },\n { id: \"Caption\", name: \"Caption\", basedOn: \"Normal\", next: \"Normal\", run: { font: \"Calibri\", size: Math.round(s.fontSize * 1.8), color: HEX.muted }, paragraph: { spacing: { before: 60, after: 160 } } },\n { id: \"TOCHeading\", name: \"TOC Heading\", basedOn: \"Normal\", next: \"Normal\", run: { font: \"Calibri\", size: Math.round(s.fontSize * 2.9), bold: true, color: HEX.heading }, paragraph: { spacing: { after: 200 } } },\n { id: \"SourceCode\", name: \"Source Code\", basedOn: \"Normal\", run: { font: MONO, size: Math.round(s.fontSize * 1.6) }, paragraph: { spacing: { after: 0, line: 260 }, shading: { type: d.ShadingType.CLEAR, fill: HEX.codeBg, color: \"auto\" } } },\n ],\n },\n sections,\n });\n const buf = await d.Packer.toArrayBuffer(doc);\n return renumberBookmarks(new Uint8Array(buf));\n}\n\n/**\n * docx 9 gives EVERY bookmark `w:id=\"1\"` (a fresh id generator per Bookmark),\n * and Word pairs bookmarkStart/End by id — duplicates make cross-references\n * and the TOC's hyperlinks resolve to the wrong place. Our bookmarks never\n * nest, so each start pairs with the next end: renumber them in order.\n */\nexport function renumberBookmarkXml(xml: string): string {\n let n = 0;\n let open: number | null = null;\n return xml.replace(/<w:bookmark(Start|End)\\b([^>]*?)w:id=\"\\d+\"/g, (_m, kind: string, attrs: string) => {\n if (kind === \"Start\") {\n open = ++n;\n return `<w:bookmarkStart${attrs}w:id=\"${open}\"`;\n }\n const id = open ?? ++n;\n open = null;\n return `<w:bookmarkEnd${attrs}w:id=\"${id}\"`;\n });\n}\n\nasync function renumberBookmarks(bytes: Uint8Array): Promise<Uint8Array> {\n const JSZipMod = (await import(\"jszip\")) as unknown as { default?: unknown };\n const JSZip = (JSZipMod.default ?? JSZipMod) as {\n loadAsync: (b: Uint8Array) => Promise<{\n file: ((name: string) => { async: (t: \"string\") => Promise<string> } | null) & ((name: string, data: string) => void);\n generateAsync: (o: Record<string, unknown>) => Promise<Uint8Array>;\n }>;\n };\n const zip = await JSZip.loadAsync(bytes);\n const entry = zip.file(\"word/document.xml\");\n if (!entry) return bytes;\n const xml = await entry.async(\"string\");\n zip.file(\"word/document.xml\", renumberBookmarkXml(xml));\n return zip.generateAsync({ type: \"uint8array\", compression: \"DEFLATE\" });\n}\n","/**\n * DocTree → EPUB 3 (reflowable). The same block renderer as the HTML output\n * (XHTML mode), one chapter per top-level heading, a navigation document built\n * from the same TOC entries, images packaged inside the book.\n *\n * Container rules honoured: `mimetype` is the first entry and STORED\n * (uncompressed); META-INF/container.xml points at the package document;\n * nav.xhtml carries `epub:type=\"toc\"`; dcterms:modified is set.\n */\n\nimport { escapeHtml } from \"@ai-matrx/kit/html-escape\";\nimport { coverHtml, renderBlocksHtml, type HtmlRenderContext } from \"./html\";\nimport type { Block, DocTree, ImageMap } from \"./types\";\n\ninterface Chapter {\n file: string;\n title: string;\n blocks: Block[];\n}\n\nconst EPUB_CSS = `\nbody{font-family:Georgia,\"Times New Roman\",serif;line-height:1.5;color:#1f2937;margin:0 5%;}\nh1,h2,h3,h4,h5,h6{font-family:\"Helvetica Neue\",Arial,sans-serif;line-height:1.25;page-break-after:avoid;break-after:avoid;color:#111827;}\np{margin:0 0 0.7em;orphans:2;widows:2;hyphens:auto;-epub-hyphens:auto;}\npre.doc-code{font-family:Menlo,Consolas,monospace;font-size:0.8em;white-space:pre-wrap;background:#f6f8fa;padding:0.6em;border:1px solid #e5e7eb;page-break-inside:avoid;}\ncode{font-family:Menlo,Consolas,monospace;font-size:0.9em;}\ntable{border-collapse:collapse;width:100%;font-size:0.9em;}\nth,td{border-bottom:1px solid #e5e7eb;padding:0.25em 0.4em;text-align:left;vertical-align:top;}\nth{border-bottom:1.5px solid #111827;}\ncaption,figcaption,.doc-caption{font-size:0.9em;color:#4b5563;text-align:left;}\n.doc-caption-label{font-weight:bold;color:#111827;}\nfigure{margin:1em 0;text-align:center;page-break-inside:avoid;}\nfigure img{max-width:100%;}\nblockquote{margin:0 0 0.8em;padding-left:1em;border-left:3px solid #d1d5db;color:#4b5563;}\n.doc-task-list{list-style:none;padding-left:0.2em;}\n.doc-task-box{display:inline-block;width:0.8em;height:0.8em;border:1px solid #374151;margin-right:0.4em;}\n.doc-task-box.is-checked{background:#374151;}\n.doc-toc ol{list-style:none;padding-left:0;}\n.doc-bibliography .doc-ref{padding-left:2em;text-indent:-2em;}\n.doc-cover{text-align:center;margin-top:30%;}\n.doc-cover-logo{max-height:5em;}\n.doc-cover-title{font-size:2em;}\n.matrx-page-break{page-break-after:always;break-after:page;}\n`.trim();\n\nfunction extOf(mime: string): string {\n return mime === \"image/png\" ? \"png\" : mime === \"image/gif\" ? \"gif\" : \"jpg\";\n}\n\nfunction xhtml(title: string, lang: string, body: string): string {\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" lang=\"${escapeHtml(lang)}\" xml:lang=\"${escapeHtml(lang)}\">\n<head><meta charset=\"utf-8\"/><title>${escapeHtml(title)}</title><link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\"/></head>\n<body>\n${body}\n</body>\n</html>`;\n}\n\nfunction uuid(): string {\n const g = globalThis as unknown as { crypto?: { randomUUID?: () => string } };\n if (g.crypto?.randomUUID) return g.crypto.randomUUID();\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (ch) => {\n const r = (Math.random() * 16) | 0;\n return (ch === \"x\" ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\nexport interface EpubOptions {\n images?: ImageMap | undefined;\n /** Book identifier (defaults to a random urn:uuid). */\n identifier?: string | undefined;\n /** Modification time — injectable for deterministic tests. */\n now?: Date | undefined;\n}\n\nexport async function documentToEpub(tree: DocTree, options: EpubOptions = {}): Promise<Uint8Array> {\n const JSZipMod = (await import(\"jszip\")) as unknown as { default?: unknown };\n const JSZip = (JSZipMod.default ?? JSZipMod) as new () => {\n file: (name: string, data: string | Uint8Array, opts?: Record<string, unknown>) => void;\n generateAsync: (o: Record<string, unknown>) => Promise<Uint8Array>;\n };\n const s = tree.settings;\n const lang = s.lang || \"en\";\n\n // Chapters: split at the shallowest heading level.\n const levels: number[] = [];\n for (const sec of tree.sections) for (const b of sec.blocks) if (b.type === \"heading\") levels.push(b.level);\n const top = Math.min(7, ...levels);\n const chapters: Chapter[] = [];\n let current: Chapter | null = null;\n for (const sec of tree.sections) {\n for (const b of sec.blocks) {\n if (b.type === \"pageBreak\") continue;\n if (b.type === \"heading\" && b.level === top && current && current.blocks.length) current = null;\n if (!current) {\n current = { file: `chapter-${chapters.length + 1}.xhtml`, title: b.type === \"heading\" ? b.plain : (s.title ?? \"Start\"), blocks: [] };\n chapters.push(current);\n }\n current.blocks.push(b);\n }\n }\n if (chapters.length === 0) chapters.push({ file: \"chapter-1.xhtml\", title: s.title ?? \"Document\", blocks: [] });\n\n // Where every id lives, for cross-chapter links.\n const home = new Map<string, string>();\n const walk = (file: string, list: Block[]) => {\n for (const b of list) {\n if (b.type === \"heading\") home.set(b.id, file);\n if (b.type === \"figure\" && b.caption?.id) home.set(`fig:${b.caption.id}`, file);\n if (b.type === \"table\" && b.caption?.id) home.set(`tbl:${b.caption.id}`, file);\n if (b.type === \"bibliography\") for (const e of tree.bibliography) home.set(`ref-${e.id}`, file);\n if (b.type === \"notes\") for (const n of tree.notes) home.set(`note-${n.n}`, file);\n if (b.type === \"list\") for (const it of b.items) walk(file, it.children);\n if (b.type === \"blockquote\") walk(file, b.children);\n }\n };\n for (const ch of chapters) walk(ch.file, ch.blocks);\n\n // Images packaged in the book.\n const imagePaths = new Map<string, { path: string; mime: string; bytes: Uint8Array }>();\n let imgN = 0;\n for (const [url, img] of options.images ?? new Map()) {\n if (!img) continue;\n imgN++;\n imagePaths.set(url, { path: `images/img-${imgN}.${extOf(img.mime)}`, mime: img.mime, bytes: img.bytes });\n }\n\n const zip = new JSZip();\n zip.file(\"mimetype\", \"application/epub+zip\", { compression: \"STORE\" });\n zip.file(\n \"META-INF/container.xml\",\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<container version=\"1.0\" xmlns=\"urn:oasis:names:tc:opendocument:xmlns:container\">\n<rootfiles><rootfile full-path=\"OEBPS/content.opf\" media-type=\"application/oebps-package+xml\"/></rootfiles>\n</container>`,\n );\n zip.file(\"OEBPS/style.css\", EPUB_CSS);\n for (const img of imagePaths.values()) zip.file(`OEBPS/${img.path}`, img.bytes);\n\n const makeCtx = (file: string): HtmlRenderContext => ({\n tree,\n xhtml: true,\n hrefFor: (id) => {\n const target = home.get(id) ?? file;\n return target === file ? `#${id}` : `${target}#${id}`;\n },\n srcFor: (url) => imagePaths.get(url)?.path ?? url,\n });\n\n const spine: string[] = [];\n const manifest: string[] = [\n `<item id=\"nav\" href=\"nav.xhtml\" media-type=\"application/xhtml+xml\" properties=\"nav\"/>`,\n `<item id=\"css\" href=\"style.css\" media-type=\"text/css\"/>`,\n ];\n if (s.cover) {\n zip.file(\"OEBPS/cover.xhtml\", xhtml(s.title ?? \"Cover\", lang, coverHtml(s, makeCtx(\"cover.xhtml\"))));\n manifest.push(`<item id=\"cover\" href=\"cover.xhtml\" media-type=\"application/xhtml+xml\"/>`);\n spine.push(`<itemref idref=\"cover\"/>`);\n }\n chapters.forEach((ch, i) => {\n zip.file(`OEBPS/${ch.file}`, xhtml(ch.title, lang, renderBlocksHtml(ch.blocks, makeCtx(ch.file))));\n manifest.push(`<item id=\"ch${i + 1}\" href=\"${ch.file}\" media-type=\"application/xhtml+xml\"/>`);\n spine.push(`<itemref idref=\"ch${i + 1}\"/>`);\n });\n let n = 0;\n for (const img of imagePaths.values()) {\n n++;\n manifest.push(\n `<item id=\"img${n}\" href=\"${img.path}\" media-type=\"${img.mime}\"${s.logo && imagePaths.get(s.logo)?.path === img.path ? ' properties=\"cover-image\"' : \"\"}/>`,\n );\n }\n\n // Navigation document: every TOC entry (or one per chapter when none).\n const entries = tree.toc.length\n ? tree.toc\n : chapters.map((ch) => ({ id: \"\", level: 1, text: ch.title, file: ch.file }));\n const navItems = entries\n .map((e) => {\n const file = \"file\" in e ? (e.file as string) : (home.get(e.id) ?? chapters[0]!.file);\n const hrefAttr = e.id ? `${file}#${e.id}` : file;\n return `<li class=\"toc-l${e.level}\"><a href=\"${escapeHtml(hrefAttr)}\">${escapeHtml(e.text)}</a></li>`;\n })\n .join(\"\\n\");\n zip.file(\n \"OEBPS/nav.xhtml\",\n xhtml(\n s.toc.title,\n lang,\n `<nav epub:type=\"toc\" id=\"toc\"><h1>${escapeHtml(s.toc.title)}</h1><ol>\\n${navItems}\\n</ol></nav>`,\n ),\n );\n\n const modified = (options.now ?? new Date()).toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n const id = options.identifier ?? `urn:uuid:${uuid()}`;\n zip.file(\n \"OEBPS/content.opf\",\n `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" unique-identifier=\"bookid\" xml:lang=\"${escapeHtml(lang)}\">\n<metadata xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n<dc:identifier id=\"bookid\">${escapeHtml(id)}</dc:identifier>\n<dc:title>${escapeHtml(s.title ?? \"Document\")}</dc:title>\n<dc:language>${escapeHtml(lang)}</dc:language>\n${s.author ? `<dc:creator>${escapeHtml(s.author)}</dc:creator>` : \"\"}\n${s.date ? `<dc:date>${escapeHtml(s.date)}</dc:date>` : \"\"}\n<meta property=\"dcterms:modified\">${modified}</meta>\n</metadata>\n<manifest>\n${manifest.join(\"\\n\")}\n</manifest>\n<spine>\n${spine.join(\"\\n\")}\n</spine>\n</package>`,\n );\n\n return zip.generateAsync({ type: \"uint8array\", compression: \"DEFLATE\", mimeType: \"application/epub+zip\" });\n}\n","/**\n * DocTree → HTML. Two uses, one renderer:\n * • `documentToHtml` — a standalone, print-grade HTML file: CSS paged media\n * (@page size/margins/orientation, running header/footer margin boxes with\n * \"Page X of Y\", a different first page, named landscape pages per\n * section, columns, widow/orphan control, keep-with-next headings, no\n * breaks inside tables/code/figures, hyphenation), always light.\n * • `renderBlocksHtml` — the block renderer the EPUB writer reuses (XHTML).\n */\n\nimport { escapeHtml } from \"@ai-matrx/kit/html-escape\";\nimport { PAGE_BREAK_CLASS } from \"../directives\";\nimport { PAGE_SIZES, templateParts } from \"./settings\";\nimport type { Block, Caption, DocTree, DocumentSettings, ImageMap, Inline, RunningTemplate } from \"./types\";\n\nexport interface HtmlRenderContext {\n tree: DocTree;\n images?: ImageMap | undefined;\n /** XHTML output (EPUB): self-closed void elements. */\n xhtml?: boolean;\n /** Where an in-document id lives (EPUB chapters split the document). */\n hrefFor?: (id: string) => string;\n /** Image URL override (EPUB packages images inside the book). */\n srcFor?: (url: string) => string;\n}\n\nconst SAFE_URL = /^(?:https?:|mailto:|tel:|#|\\/|\\.{0,2}\\/|data:image\\/(?:png|jpe?g|gif|webp);)/i;\n\nfunction safeUrl(url: string): string | null {\n const u = url.trim();\n if (!u) return null;\n if (!/^[a-z][a-z0-9+.-]*:/i.test(u)) return u; // relative\n return SAFE_URL.test(u) ? u : null;\n}\n\nconst br = (x: HtmlRenderContext) => (x.xhtml ? \"<br/>\" : \"<br>\");\n\nexport function renderInlineHtml(nodes: Inline[], x: HtmlRenderContext): string {\n return nodes\n .map((n) => {\n switch (n.type) {\n case \"text\":\n return escapeHtml(n.value);\n case \"strong\":\n return `<strong>${renderInlineHtml(n.children, x)}</strong>`;\n case \"emphasis\":\n return `<em>${renderInlineHtml(n.children, x)}</em>`;\n case \"delete\":\n return `<del>${renderInlineHtml(n.children, x)}</del>`;\n case \"code\":\n return `<code>${escapeHtml(n.value)}</code>`;\n case \"break\":\n return br(x);\n case \"link\": {\n const href = safeUrl(n.url);\n const inner = renderInlineHtml(n.children, x);\n return href ? `<a href=\"${escapeHtml(href)}\">${inner}</a>` : inner;\n }\n case \"image\": {\n const src = imageSrc(n.url, x);\n if (!src) return escapeHtml(n.alt);\n return `<img class=\"doc-inline-img\" src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(n.alt)}\"${x.xhtml ? \"/\" : \"\"}>`;\n }\n case \"xref\": {\n if (!n.resolved) return `<span class=\"doc-xref-missing\">${escapeHtml(n.label)}</span>`;\n const id = n.target.startsWith(\"sec:\") ? n.target.slice(4) : n.target;\n return `<a class=\"doc-xref\" href=\"${escapeHtml(href(id, x))}\">${escapeHtml(n.label)}</a>`;\n }\n case \"cite\":\n return n.resolved\n ? `<a class=\"doc-cite\" href=\"${escapeHtml(href(\"ref-\" + (n.keys[0] ?? \"\"), x))}\">${escapeHtml(n.label)}</a>`\n : `<span class=\"doc-cite doc-cite-missing\">${escapeHtml(n.label)}</span>`;\n case \"noteRef\":\n return `<sup class=\"doc-note-ref\"><a href=\"${escapeHtml(href(`note-${n.n}`, x))}\" id=\"noteref-${n.n}\">${n.n}</a></sup>`;\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\nconst href = (id: string, x: HtmlRenderContext) => (x.hrefFor ? x.hrefFor(id) : `#${id}`);\n\nfunction imageSrc(url: string, x: HtmlRenderContext): string | null {\n if (x.srcFor) return x.srcFor(url);\n const resolved = x.images?.get(url);\n if (resolved) return resolved.dataUrl;\n return safeUrl(url);\n}\n\nfunction captionHtml(c: Caption, tag: \"figcaption\" | \"caption\", x: HtmlRenderContext): string {\n const text = renderInlineHtml(c.children, x);\n return `<${tag} class=\"doc-caption\"><span class=\"doc-caption-label\">${c.label}</span>${text ? `: ${text}` : \"\"}</${tag}>`;\n}\n\nfunction tocHtml(x: HtmlRenderContext): string {\n const { tree } = x;\n const items = tree.toc\n .map(\n (e) =>\n `<li class=\"toc-l${e.level}\"><a href=\"${escapeHtml(href(e.id, x))}\"><span class=\"toc-text\">${escapeHtml(e.text)}</span><span class=\"toc-page\"></span></a></li>`,\n )\n .join(\"\");\n return `<nav class=\"doc-toc\" role=\"doc-toc\"><h2 class=\"doc-toc-title\">${escapeHtml(\n tree.settings.toc.title,\n )}</h2><ol>${items}</ol></nav>`;\n}\n\nexport function renderBlocksHtml(blocks: Block[], x: HtmlRenderContext): string {\n return blocks.map((b) => renderBlockHtml(b, x)).join(\"\\n\");\n}\n\nfunction renderBlockHtml(b: Block, x: HtmlRenderContext): string {\n switch (b.type) {\n case \"heading\": {\n const num = b.number ? `<span class=\"doc-heading-number\">${b.number}</span> ` : \"\";\n return `<h${b.level} id=\"${escapeHtml(b.id)}\">${num}${renderInlineHtml(b.children, x)}</h${b.level}>`;\n }\n case \"paragraph\":\n return `<p>${renderInlineHtml(b.children, x)}</p>`;\n case \"list\": {\n const tag = b.ordered ? \"ol\" : \"ul\";\n const start = b.ordered && b.start !== 1 ? ` start=\"${b.start}\"` : \"\";\n const task = b.items.some((i) => i.checked !== null);\n const items = b.items\n .map((i) => {\n const box =\n i.checked === null\n ? \"\"\n : `<span class=\"doc-task-box${i.checked ? \" is-checked\" : \"\"}\" role=\"img\" aria-label=\"${i.checked ? \"done\" : \"not done\"}\"></span>`;\n const inner =\n i.children.length === 1 && i.children[0]?.type === \"paragraph\"\n ? renderInlineHtml(i.children[0].children, x)\n : renderBlocksHtml(i.children, x);\n return `<li${i.checked !== null ? ' class=\"doc-task\"' : \"\"}>${box}${inner}</li>`;\n })\n .join(\"\");\n return `<${tag}${start}${task ? ' class=\"doc-task-list\"' : \"\"}>${items}</${tag}>`;\n }\n case \"blockquote\":\n return `<blockquote>${renderBlocksHtml(b.children, x)}</blockquote>`;\n case \"code\":\n return `<pre class=\"doc-code\"${b.lang ? ` data-language=\"${escapeHtml(b.lang)}\"` : \"\"}><code>${escapeHtml(\n b.value,\n )}</code></pre>`;\n case \"table\": {\n const al = (i: number) => {\n const a = b.align[i];\n return a ? ` style=\"text-align:${a}\"` : \"\";\n };\n const head = `<thead><tr>${b.header.map((c, i) => `<th${al(i)}>${renderInlineHtml(c, x)}</th>`).join(\"\")}</tr></thead>`;\n const body = `<tbody>${b.rows\n .map((r) => `<tr>${r.map((c, i) => `<td${al(i)}>${renderInlineHtml(c, x)}</td>`).join(\"\")}</tr>`)\n .join(\"\")}</tbody>`;\n const id = b.caption?.id ? ` id=\"tbl:${escapeHtml(b.caption.id)}\"` : \"\";\n return `<div class=\"doc-table-wrap\"${id}><table>${b.caption ? captionHtml(b.caption, \"caption\", x) : \"\"}${head}${body}</table></div>`;\n }\n case \"figure\": {\n const src = imageSrc(b.url, x);\n const id = b.caption?.id ? ` id=\"fig:${escapeHtml(b.caption.id)}\"` : \"\";\n const img = src\n ? `<img src=\"${escapeHtml(src)}\" alt=\"${escapeHtml(b.alt)}\"${x.xhtml ? \"/\" : \"\"}>`\n : `<div class=\"doc-image-missing\">Image unavailable: ${escapeHtml(b.alt || b.url)}</div>`;\n return `<figure class=\"doc-figure\"${id}>${img}${b.caption ? captionHtml(b.caption, \"figcaption\", x) : \"\"}</figure>`;\n }\n case \"rule\":\n return `<hr${x.xhtml ? \"/\" : \"\"}>`;\n case \"pageBreak\":\n return `<div class=\"${PAGE_BREAK_CLASS}\" role=\"separator\" aria-label=\"Page break\"></div>`;\n case \"toc\":\n return tocHtml(x);\n case \"notes\":\n return `<ol class=\"doc-notes\">${x.tree.notes\n .map(\n (n) =>\n `<li id=\"note-${n.n}\">${renderBlocksHtml(n.children, x)} <a class=\"doc-note-back\" href=\"${escapeHtml(\n href(`noteref-${n.n}`, x),\n )}\" aria-label=\"Back to text\">↩</a></li>`,\n )\n .join(\"\")}</ol>`;\n case \"bibliography\":\n return `<div class=\"doc-bibliography\" role=\"doc-bibliography\">${x.tree.bibliography\n .map((e) => `<p class=\"doc-ref\" id=\"ref-${escapeHtml(e.id)}\">${renderInlineHtml(e.children, x)}</p>`)\n .join(\"\")}</div>`;\n }\n}\n\nexport function coverHtml(s: DocumentSettings, x: HtmlRenderContext): string {\n const logo = s.logo ? imageSrc(s.logo, x) : null;\n return `<section class=\"doc-cover\">${logo ? `<img class=\"doc-cover-logo\" src=\"${escapeHtml(logo)}\" alt=\"\"${x.xhtml ? \"/\" : \"\"}>` : \"\"}<h1 class=\"doc-cover-title\">${escapeHtml(\n s.title ?? \"\",\n )}</h1>${s.subtitle ? `<p class=\"doc-cover-subtitle\">${escapeHtml(s.subtitle)}</p>` : \"\"}${\n s.author ? `<p class=\"doc-cover-author\">${escapeHtml(s.author)}</p>` : \"\"\n }${s.date ? `<p class=\"doc-cover-date\">${escapeHtml(s.date)}</p>` : \"\"}</section>`;\n}\n\n// ── print CSS ──────────────────────────────────────────────────────────────\n\nconst cssString = (s: string) => `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \" \")}\"`;\n\nfunction marginContent(template: string | undefined, s: DocumentSettings): string {\n if (!template) return \"none\";\n return templateParts(template, s)\n .map((p) => (\"field\" in p ? `counter(${p.field})` : cssString(p.text)))\n .join(\" \");\n}\n\nfunction runningBoxes(t: RunningTemplate | null, where: \"top\" | \"bottom\", s: DocumentSettings): string {\n if (!t) return \"\";\n const box = (slot: \"left\" | \"center\" | \"right\") =>\n t[slot]\n ? `@${where}-${slot}{content:${marginContent(t[slot], s)};font:9pt/1.2 var(--doc-font);color:var(--matrx-print-muted,#6b7280);}`\n : \"\";\n return box(\"left\") + box(\"center\") + box(\"right\");\n}\n\nconst pt = (n: number) => `${Math.round(n * 100) / 100}pt`;\n\n/** The print stylesheet for a document's settings. Light mode, always. */\nexport function documentCss(s: DocumentSettings): string {\n const { width, height, margins: m } = s.page;\n const portrait = `${pt(width)} ${pt(height)}`;\n const landscape = `${pt(height)} ${pt(width)}`;\n const base = s.page.orientation === \"landscape\" ? landscape : portrait;\n const blankBoxes = [\"top\", \"bottom\"]\n .flatMap((w) => [\"left\", \"center\", \"right\"].map((sl) => `@${w}-${sl}{content:none;}`))\n .join(\"\");\n return `\n:root{color-scheme:light;--doc-font:\"Charter\",\"Georgia\",\"Cambria\",\"Times New Roman\",serif;--doc-sans:\"Inter\",\"Helvetica Neue\",\"Arial\",sans-serif;--doc-mono:\"SFMono-Regular\",\"Menlo\",\"Consolas\",\"Liberation Mono\",monospace;}\n@page{size:${base};margin:${pt(m.top)} ${pt(m.right)} ${pt(m.bottom)} ${pt(m.left)};${runningBoxes(s.header, \"top\", s)}${runningBoxes(s.footer, \"bottom\", s)}}\n@page doc-portrait{size:${portrait};}\n@page doc-landscape{size:${landscape};}\n${s.differentFirstPage ? `@page:first{${blankBoxes}}` : \"\"}\n@page doc-cover{${blankBoxes}}\nhtml{background:var(--matrx-print-page,#ffffff);}\nbody{margin:0;background:var(--matrx-print-page,#ffffff);color:var(--matrx-print-text,#1f2937);font:${pt(s.fontSize)}/1.5 var(--doc-font);-webkit-print-color-adjust:exact;print-color-adjust:exact;}\n.doc{max-width:${pt(width - m.left - m.right)};margin:0 auto;padding:48px 24px;}\n@media print{.doc{max-width:none;padding:0;}}\n.doc-section.doc-landscape{page:doc-landscape;}\n.doc-section.doc-portrait{page:doc-portrait;}\n@media screen{.doc-section.doc-landscape{max-width:none;}}\n.doc-section+.doc-section{break-before:page;}\n@media screen{.doc-section+.doc-section{border-top:1px dashed var(--matrx-print-rule,#d1d5db);margin-top:32px;padding-top:32px;}}\n.doc-cols-2{column-count:2;column-gap:0.3in;}\n.doc-cols-3{column-count:3;column-gap:0.25in;}\n.doc-cover{page:doc-cover;break-after:page;min-height:${pt(height - m.top - m.bottom)};display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:10pt;}\n@media screen{.doc-cover{min-height:60vh;border-bottom:1px dashed var(--matrx-print-rule,#d1d5db);margin-bottom:32px;}}\n.doc-cover-logo{max-height:72pt;max-width:40%;margin-bottom:24pt;}\n.doc-cover-title{font:700 30pt/1.15 var(--doc-sans);margin:0;letter-spacing:-0.01em;}\n.doc-cover-subtitle{font:400 16pt/1.3 var(--doc-sans);color:var(--matrx-print-muted,#4b5563);margin:0;}\n.doc-cover-author,.doc-cover-date{font:12pt/1.4 var(--doc-sans);color:var(--matrx-print-muted,#4b5563);margin:0;}\n.doc-cover-author{margin-top:36pt;}\np,li,dd{orphans:3;widows:3;}\np{margin:0 0 0.7em;${s.hyphenate ? \"hyphens:auto;-webkit-hyphens:auto;\" : \"\"}}\nh1,h2,h3,h4,h5,h6{font-family:var(--doc-sans);color:var(--matrx-print-heading,#111827);line-height:1.25;break-after:avoid;page-break-after:avoid;break-inside:avoid;hyphens:manual;}\nh1{font-size:${pt(s.fontSize * 1.8)};margin:1.2em 0 0.5em;}\nh2{font-size:${pt(s.fontSize * 1.45)};margin:1.1em 0 0.45em;}\nh3{font-size:${pt(s.fontSize * 1.2)};margin:1em 0 0.4em;}\nh4,h5,h6{font-size:${pt(s.fontSize * 1.05)};margin:0.9em 0 0.35em;}\n.doc-heading-number{color:var(--matrx-print-muted,#6b7280);margin-right:0.35em;}\na{color:var(--matrx-print-link,#1d4ed8);text-decoration:none;}\ncode{font:0.88em var(--doc-mono);background:var(--matrx-print-code-bg,#f3f4f6);padding:0.05em 0.3em;border-radius:3px;}\npre.doc-code{font:0.82em/1.45 var(--doc-mono);background:var(--matrx-print-code-bg,#f6f8fa);border:1px solid var(--matrx-print-rule,#e5e7eb);border-radius:4px;padding:8pt 10pt;white-space:pre-wrap;overflow-wrap:anywhere;break-inside:avoid;page-break-inside:avoid;}\npre.doc-code code{background:none;padding:0;font:inherit;}\nblockquote{margin:0 0 0.8em;padding:0.1em 0 0.1em 1em;border-left:3px solid var(--matrx-print-rule,#d1d5db);color:var(--matrx-print-muted,#4b5563);break-inside:avoid;}\nhr{border:0;border-top:1px solid var(--matrx-print-rule,#d1d5db);margin:1.2em 0;}\n.doc-table-wrap{margin:0 0 1em;break-inside:avoid;page-break-inside:avoid;}\ntable{border-collapse:collapse;width:100%;font-size:0.92em;}\nthead{display:table-header-group;}\ntr{break-inside:avoid;page-break-inside:avoid;}\nth,td{border-bottom:1px solid var(--matrx-print-rule,#e5e7eb);padding:4pt 6pt;text-align:left;vertical-align:top;}\nth{font-family:var(--doc-sans);font-weight:600;border-bottom:1.5px solid var(--matrx-print-heading,#111827);}\ntable caption{caption-side:top;text-align:left;margin-bottom:4pt;}\n.doc-caption{font:0.9em/1.4 var(--doc-sans);color:var(--matrx-print-muted,#4b5563);break-after:avoid;}\n.doc-caption-label{font-weight:600;color:var(--matrx-print-heading,#111827);}\n.doc-figure{margin:0 0 1em;text-align:center;break-inside:avoid;page-break-inside:avoid;}\n.doc-figure img{max-width:100%;max-height:${pt((height - m.top - m.bottom) * 0.7)};}\n.doc-figure figcaption{margin-top:4pt;}\n.doc-image-missing{border:1px dashed var(--matrx-print-rule,#d1d5db);padding:16pt;color:var(--matrx-print-muted,#6b7280);}\n.doc-inline-img{max-height:1.2em;vertical-align:middle;}\n.doc-task-list{list-style:none;padding-left:0.2em;}\n.doc-task-box{display:inline-block;width:0.8em;height:0.8em;border:1.2px solid var(--matrx-print-heading,#374151);border-radius:2px;margin-right:0.45em;vertical-align:-0.05em;}\n.doc-task-box.is-checked{background:var(--matrx-print-heading,#374151);}\n.doc-xref-missing,.doc-cite-missing{color:var(--matrx-print-danger,#b91c1c);font-weight:600;}\n.doc-toc{break-after:auto;}\n.doc-toc-title{font-size:${pt(s.fontSize * 1.45)};}\n.doc-toc ol{list-style:none;padding:0;margin:0;}\n.doc-toc li{margin:0.2em 0;}\n.doc-toc a{display:flex;gap:0.5em;color:inherit;}\n.doc-toc .toc-text{flex:1;}\n.doc-toc a::after{content:target-counter(attr(href url),page);}\n${[2, 3, 4, 5, 6].map((l) => `.doc-toc .toc-l${l}{padding-left:${(l - 1) * 1.2}em;}`).join(\"\")}\n.doc-toc .toc-l1{font-weight:600;}\n.doc-bibliography .doc-ref{padding-left:2em;text-indent:-2em;}\n.doc-notes{font-size:0.9em;}\n.doc-note-back{margin-left:0.3em;}\n.${PAGE_BREAK_CLASS}{break-after:page;page-break-after:always;height:0;}\n@media screen{.${PAGE_BREAK_CLASS}{height:auto;border-top:1px dashed var(--matrx-print-rule,#d1d5db);margin:24px 0;}}\n`.trim();\n}\n\nexport interface DocumentHtmlOptions {\n images?: ImageMap | undefined;\n}\n\n/** A complete, standalone print-grade HTML document. */\nexport function documentToHtml(tree: DocTree, options: DocumentHtmlOptions = {}): string {\n const s = tree.settings;\n const x: HtmlRenderContext = { tree, images: options.images };\n const sections = tree.sections\n .map((sec) => {\n const cls = [\n \"doc-section\",\n sec.orientation === s.page.orientation ? \"\" : `doc-${sec.orientation}`,\n sec.columns > 1 ? `doc-cols-${sec.columns}` : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n return `<section class=\"${cls}\">${renderBlocksHtml(sec.blocks, x)}</section>`;\n })\n .join(\"\\n\");\n const size = PAGE_SIZES[s.page.size].label;\n return `<!DOCTYPE html>\n<html lang=\"${escapeHtml(s.lang)}\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light\">\n<meta name=\"generator\" content=\"@ai-matrx/print/document (${size}, ${s.page.orientation})\">\n<title>${escapeHtml(s.title ?? \"Document\")}</title>\n${s.author ? `<meta name=\"author\" content=\"${escapeHtml(s.author)}\">` : \"\"}\n<style>${documentCss(s)}</style>\n</head>\n<body>\n<main class=\"doc\">\n${s.cover ? coverHtml(s, x) : \"\"}\n${sections}\n</main>\n</body>\n</html>`;\n}\n","/**\n * @ai-matrx/print/directives — the ONE definition of the print directives\n * markdown can carry, shared by every surface that reads markdown.\n *\n * Why a separate, zero-dependency entry: the directive syntax has three\n * readers — this package's two converters (print window / PDF / HTML page),\n * the chat renderer's remark plugin (the on-screen preview), and any editor\n * that inserts one. If each re-derived the regex they would drift the first\n * time someone added an alias. `/markdown` carries ~20KB of stylesheet, so the\n * chat bundle imports the syntax from here instead and pays nothing.\n *\n * ── Page break ────────────────────────────────────────────────────────────\n * A line that is exactly one of these (case-insensitive, surrounding\n * whitespace ignored) forces the next content onto a new printed page:\n *\n * <!-- pagebreak --> ← canonical; invisible in any other renderer\n * <!-- page-break --> <!-- page break --> <!-- newpage -->\n * \\pagebreak \\newpage ← LaTeX / pandoc habit\n * <div style=\"page-break-after: always\"></div> ← Typora / VS Code habit\n * (also `page-break-before`, `break-after: page`, `break-before: page`,\n * and `<div class=\"page-break\"></div>` / `class=\"pagebreak\"`)\n *\n * On screen every surface draws the same idea: a dashed rule labelled\n * \"Page break\" with generous padding. In print it is a zero-height element\n * with `break-after: page`.\n */\n\n/** The form editors insert and docs recommend. */\nexport const PAGE_BREAK_MARKDOWN = \"<!-- pagebreak -->\";\n\n/** The class every surface puts on a rendered page break. */\nexport const PAGE_BREAK_CLASS = \"matrx-page-break\";\n\n/** Screen label for a rendered page break. */\nexport const PAGE_BREAK_LABEL = \"Page break\";\n\nconst COMMENT_FORM = /^<!--\\s*(?:page[\\s_-]?break|new[\\s_-]?page)\\s*-->$/i;\nconst LATEX_FORM = /^\\\\(?:pagebreak|newpage|clearpage)\\s*(?:\\{\\s*\\})?$/i;\nconst DIV_FORM = /^<div\\b([^>]*)>\\s*<\\/div>$|^<div\\b([^>]*)\\/>$/i;\nconst DIV_BREAK_ATTR =\n /(?:page-break-(?:after|before)\\s*:\\s*always|break-(?:after|before)\\s*:\\s*page|class\\s*=\\s*[\"'](?:[^\"']*\\s)?page-?break(?:\\s[^\"']*)?[\"'])/i;\n\n/** Columns of leading indentation (tab = 4, NBSP counts as a space). */\nfunction indentColumns(line: string): number {\n let cols = 0;\n for (const ch of line) {\n if (ch === \" \" || ch === \"\\u00A0\") cols += 1;\n else if (ch === \"\\t\") cols += 4;\n else break;\n }\n return cols;\n}\n\n/**\n * Is this single line a page-break directive? Indented four or more columns\n * it is not — in markdown that is a code block, and every surface must agree.\n */\nexport function isPageBreakLine(line: string): boolean {\n if (indentColumns(line) >= 4) return false;\n const t = line.trim();\n if (t.length < 8 || t.length > 200) return false;\n if (COMMENT_FORM.test(t) || LATEX_FORM.test(t)) return true;\n const div = DIV_FORM.exec(t);\n if (!div) return false;\n return DIV_BREAK_ATTR.test(div[1] ?? div[2] ?? \"\");\n}\n\n// ── Section break ─────────────────────────────────────────────────────────\n//\n// A section break is a page break that can also change the page layout for\n// everything after it (Word's \"Section break (next page)\"):\n//\n// <!-- section --> ← new page, same layout\n// <!-- section: landscape --> ← new page, landscape from here on\n// <!-- section landscape columns=2 --> ← landscape AND two columns\n// <!-- section portrait columns=1 --> ← back to the default layout\n//\n// Recognised words: `landscape` / `portrait`, `columns=N` (or `cols=N`,\n// `N columns`, 1–3). Unknown words are ignored, never an error — the break\n// still happens. Every page-break reader treats a section break as a break.\n\n/** The form editors insert for a plain section break. */\nexport const SECTION_BREAK_MARKDOWN = \"<!-- section -->\";\n\nexport interface SectionBreakDirective {\n /** Absent = inherit the document's orientation. */\n orientation?: \"portrait\" | \"landscape\";\n /** Absent = inherit the document's column count. 1–3. */\n columns?: 1 | 2 | 3;\n}\n\nconst SECTION_FORM = /^<!--\\s*section(?:[\\s_-]?break)?\\b\\s*:?\\s*([^>]*?)\\s*-->$/i;\n\n/** Parse a section-break line; `null` when the line is not one. */\nexport function parseSectionBreakLine(line: string): SectionBreakDirective | null {\n if (indentColumns(line) >= 4) return null;\n const m = SECTION_FORM.exec(line.trim());\n if (!m) return null;\n const words = (m[1] ?? \"\").toLowerCase();\n const out: SectionBreakDirective = {};\n if (/\\blandscape\\b/.test(words)) out.orientation = \"landscape\";\n else if (/\\bportrait\\b/.test(words)) out.orientation = \"portrait\";\n const cols = /\\b(?:columns?|cols?)\\s*[=:]\\s*(\\d)\\b/.exec(words) ?? /\\b(\\d)\\s*[-\\s]?columns?\\b/.exec(words);\n if (cols) {\n const n = Math.min(3, Math.max(1, Number(cols[1])));\n out.columns = n as 1 | 2 | 3;\n }\n return out;\n}\n\n// ── Table of contents / bibliography placement ───────────────────────────\n//\n// `[[toc]]`, `[toc]`, `[TOC]`, `${toc}`, `<!-- toc -->`, `\\tableofcontents`\n// put the table of contents at that spot (otherwise frontmatter `toc: true`\n// puts it at the start). `<!-- bibliography -->`, `[[bibliography]]`,\n// `\\printbibliography` put the reference list there (otherwise it closes the\n// document whenever something is cited).\n\nexport const TOC_MARKDOWN = \"[[toc]]\";\nexport const BIBLIOGRAPHY_MARKDOWN = \"<!-- bibliography -->\";\n\nconst TOC_FORM = /^(?:\\[\\[\\s*toc\\s*\\]\\]|\\[toc\\]|\\$\\{toc\\}|<!--\\s*toc\\s*-->|\\\\tableofcontents)$/i;\nconst BIBLIOGRAPHY_FORM =\n /^(?:\\[\\[\\s*(?:bibliography|references)\\s*\\]\\]|<!--\\s*(?:bibliography|references)\\s*-->|\\\\printbibliography|\\\\bibliography\\{[^}]*\\})$/i;\n\nexport function isTocLine(line: string): boolean {\n return indentColumns(line) < 4 && TOC_FORM.test(line.trim());\n}\n\nexport function isBibliographyLine(line: string): boolean {\n return indentColumns(line) < 4 && BIBLIOGRAPHY_FORM.test(line.trim());\n}\n\n/** Any directive that ends the current printed page (page or section break). */\nexport function isBreakLine(line: string): boolean {\n return isPageBreakLine(line) || parseSectionBreakLine(line) !== null;\n}\n\n/**\n * Split markdown into the pieces that belong on separate pages. Fence-aware:\n * a directive inside a ``` / ~~~ code block is code, not a break. Always\n * returns at least one piece; empty pieces (two breaks in a row, a break at\n * the very start or end) are kept out so no blank page is produced.\n */\nexport function splitAtPageBreaks(markdown: string): string[] {\n const lines = markdown.split(/\\r?\\n/);\n const pieces: string[] = [];\n let current: string[] = [];\n let fence: string | null = null;\n\n for (const line of lines) {\n // Any indent — the converters accept list-nested fences, so must this.\n const fenceMatch = /^\\s*(`{3,}|~{3,})/.exec(line);\n if (fenceMatch) {\n const marker = fenceMatch[1] as string;\n if (fence === null) fence = marker;\n else if (marker[0] === fence[0] && marker.length >= fence.length) fence = null;\n } else if (fence === null && isBreakLine(line)) {\n if (current.join(\"\\n\").trim()) pieces.push(current.join(\"\\n\"));\n current = [];\n continue;\n }\n current.push(line);\n }\n if (current.join(\"\\n\").trim() || pieces.length === 0) pieces.push(current.join(\"\\n\"));\n return pieces;\n}\n","/**\n * DocTree → PDF (real text PDF via pdfmake — selectable, searchable,\n * link-bearing; never a screenshot). pdfmake is loaded lazily at call time.\n *\n * Print behaviours: page size / margins / orientation, per-section\n * orientation and 1–3 newspaper columns, cover page, running header/footer\n * with \"Page X of Y\", different first page, table of contents WITH page\n * numbers, numbered captions, cross-reference links, keep-with-next headings\n * (a heading is never the last thing on a page), short paragraphs never split\n * (orphan/widow control), table rows never split and header rows repeat,\n * tables/code/figures kept whole when they fit on a page.\n */\n\nimport { fillTemplate } from \"./settings\";\nimport type { Block, Caption, DocSection, DocTree, DocumentSettings, ImageMap, Inline, RunningTemplate } from \"./types\";\n\n// pdfmake's document-definition is a loose JSON shape; keep it local.\ntype Node = Record<string, unknown> | string;\n\nconst COLOR = {\n text: \"#1f2937\",\n heading: \"#111827\",\n muted: \"#6b7280\",\n link: \"#1d4ed8\",\n rule: \"#d1d5db\",\n codeBg: \"#f6f8fa\",\n danger: \"#b91c1c\",\n};\n\n/** Characters the built-in Courier (WinAnsi) can draw. */\nconst WIN_ANSI_EXTRA = new Set(\n \"€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ\",\n);\nconst courierCanDraw = (s: string): boolean => {\n for (const ch of s) {\n const c = ch.codePointAt(0) as number;\n if ((c >= 0x20 && c <= 0x7e) || (c >= 0xa0 && c <= 0xff) || c === 0x09 || WIN_ANSI_EXTRA.has(ch)) continue;\n return false;\n }\n return true;\n};\n\ninterface Ctx {\n /** Set once the missing-glyph notice has been raised for this render. */\n glyphs: { announced: boolean };\n tree: DocTree;\n images?: ImageMap | undefined;\n s: DocumentSettings;\n /** Usable width of the current column, in points. */\n width: number;\n tocIds: Set<string>;\n minLevel: number;\n}\n\ninterface RunStyle {\n bold?: boolean;\n italics?: boolean;\n strike?: boolean;\n link?: string;\n dest?: string;\n}\n\n/**\n * The embedded fonts (Roboto, Courier) have no emoji / pictograph glyphs:\n * pdfkit would draw an empty box. Drop them and say so once, with a remedy.\n */\nconst NO_GLYPH = /[\\p{Extended_Pictographic}\\u{1F1E6}-\\u{1F1FF}\\u200D\\uFE0F\\u20E3]/gu;\nfunction drawable(text: string, c: Ctx): string {\n if (!NO_GLYPH.test(text)) return text;\n NO_GLYPH.lastIndex = 0;\n if (!c.glyphs.announced) {\n c.glyphs.announced = true;\n c.tree.notices.push({\n code: \"glyph-substituted\",\n message: \"Emoji and pictographs were left out of the PDF: its fonts cannot draw them (Word, EPUB and HTML keep them).\",\n remedy: \"Use words or plain symbols instead of emoji if they must appear in the PDF.\",\n });\n }\n return text.replace(NO_GLYPH, \"\").replace(/ {2,}/g, \" \");\n}\n\nfunction runs(nodes: Inline[], c: Ctx, st: RunStyle = {}): Node[] {\n const out: Node[] = [];\n const base = (raw: string): Record<string, unknown> => {\n const text = drawable(raw, c);\n const r: Record<string, unknown> = { text };\n if (st.bold) r.bold = true;\n if (st.italics) r.italics = true;\n if (st.strike) r.decoration = \"lineThrough\";\n if (st.link) {\n r.link = st.link;\n r.color = COLOR.link;\n }\n if (st.dest) {\n r.linkToDestination = st.dest;\n r.color = COLOR.link;\n }\n return r;\n };\n for (const n of nodes) {\n switch (n.type) {\n case \"text\":\n out.push(base(n.value));\n break;\n case \"strong\":\n out.push(...runs(n.children, c, { ...st, bold: true }));\n break;\n case \"emphasis\":\n out.push(...runs(n.children, c, { ...st, italics: true }));\n break;\n case \"delete\":\n out.push(...runs(n.children, c, { ...st, strike: true }));\n break;\n case \"code\": {\n const r = base(n.value);\n if (courierCanDraw(n.value)) r.font = \"Courier\";\n r.fontSize = c.s.fontSize * 0.92;\n r.background = \"#f3f4f6\";\n out.push(r);\n break;\n }\n case \"break\":\n out.push(base(\"\\n\"));\n break;\n case \"link\":\n out.push(...runs(n.children, c, /^(https?:|mailto:|tel:)/i.test(n.url) ? { ...st, link: n.url } : st));\n break;\n case \"image\":\n out.push(base(n.alt));\n break;\n case \"xref\": {\n if (!n.resolved) {\n out.push({ ...base(n.label), bold: true, color: COLOR.danger });\n break;\n }\n const id = n.target.startsWith(\"sec:\") ? n.target.slice(4) : n.target;\n out.push({ ...base(n.label), linkToDestination: id, color: COLOR.link });\n break;\n }\n case \"cite\": {\n const r = base(n.label);\n if (n.resolved) {\n r.linkToDestination = `ref-${n.keys[0]}`;\n } else {\n r.bold = true;\n r.color = COLOR.danger;\n }\n out.push(r);\n break;\n }\n case \"noteRef\":\n out.push({ text: String(n.n), sup: true, linkToDestination: `note-${n.n}`, color: COLOR.link });\n break;\n }\n }\n return out;\n}\n\nconst capNode = (cap: Caption, c: Ctx, where: \"above\" | \"below\"): Node => ({\n text: [{ text: cap.label, bold: true, color: COLOR.heading }, ...(cap.children.length ? [\": \", ...runs(cap.children, c)] : [])],\n style: \"caption\",\n id: cap.id ? `${cap.kind}:${cap.id}` : undefined,\n // A caption above its table is never the last line on a page.\n ...(where === \"above\" ? { headlineLevel: 9 } : {}),\n margin: where === \"above\" ? [0, 0, 0, 4] : [0, 4, 0, 0],\n});\n\nfunction estimateLines(text: string, c: Ctx): number {\n const charsPerLine = Math.max(20, c.width / (c.s.fontSize * 0.5));\n return Math.ceil(Math.max(1, text.length) / charsPerLine);\n}\n\nconst plain = (nodes: Inline[]): string =>\n nodes.map((n) => (\"value\" in n ? n.value : \"label\" in n ? n.label : \"children\" in n ? plain(n.children) : \"\")).join(\"\");\n\nfunction taskItem(checked: boolean, content: Node[], c: Ctx): Node {\n const size = c.s.fontSize * 0.75;\n return {\n columns: [\n {\n width: size + 6,\n canvas: [\n { type: \"rect\", x: 0, y: c.s.fontSize * 0.3, w: size, h: size, r: 1.5, lineWidth: 1, lineColor: COLOR.heading, ...(checked ? { color: COLOR.heading } : {}) },\n ],\n },\n { width: \"*\", stack: content },\n ],\n columnGap: 2,\n };\n}\n\n/**\n * Small enough that a heading can be glued to it (keep-with-next). ONLY\n * blocks that can never exceed a page: pdfmake silently DROPS an unbreakable\n * block taller than the page (a heading glued to a long table vanished,\n * table and all). Tables and code keep their own page rules instead.\n */\nfunction gluable(b: Block | undefined, c: Ctx): boolean {\n if (!b) return false;\n if (b.type === \"paragraph\") return estimateLines(plain(b.children), c) <= 5;\n if (b.type === \"figure\" || b.type === \"rule\") return true;\n if (b.type === \"list\")\n return b.items.length <= 4 && b.items.every((i) => i.children.length === 1 && i.children[0]?.type === \"paragraph\");\n return false;\n}\n\nfunction blocks(list: Block[], c: Ctx): Node[] {\n const out: Node[] = [];\n let breakNext = false;\n for (let i = 0; i < list.length; i++) {\n const b = list[i] as Block;\n let node = block(b, c);\n // Keep-with-next: a heading travels with the block after it, so it can\n // never be stranded as the last line of a page.\n if (node && b.type === \"heading\" && gluable(list[i + 1], c)) {\n const next = block(list[i + 1] as Block, c);\n if (next) {\n node = { stack: [node, next], unbreakable: true };\n i++;\n }\n }\n if (node === null) {\n if (b.type === \"pageBreak\") breakNext = true;\n continue;\n }\n if (breakNext && typeof node === \"object\") {\n node.pageBreak = \"before\";\n breakNext = false;\n }\n out.push(node);\n }\n return out;\n}\n\nfunction block(b: Block, c: Ctx): Node | null {\n switch (b.type) {\n case \"heading\": {\n const rel = Math.min(6, b.level - c.minLevel + 1);\n const node: Record<string, unknown> = {\n text: [...(b.number ? [{ text: `${b.number} `, color: COLOR.muted }] : []), ...runs(b.children, c)],\n style: `h${Math.min(6, b.level)}`,\n headlineLevel: b.level,\n id: b.id,\n };\n if (c.tocIds.has(b.id)) {\n node.tocItem = true;\n node.tocMargin = [(rel - 1) * 14, rel === 1 ? 4 : 1, 0, 0];\n node.tocStyle = rel === 1 ? \"tocL1\" : \"toc\";\n }\n return node;\n }\n case \"paragraph\": {\n const text = runs(b.children, c);\n const p = { text, style: \"p\" };\n // Orphan/widow control: a paragraph short enough to fit is never split.\n return estimateLines(plain(b.children), c) <= 5 ? { stack: [p], unbreakable: true } : p;\n }\n case \"list\": {\n const items = b.items.map((it) => {\n const content =\n it.children.length === 1 && it.children[0]?.type === \"paragraph\"\n ? [{ text: runs(it.children[0].children, c), margin: [0, 0, 0, 2] } as Node]\n : blocks(it.children, { ...c, width: c.width - 18 });\n if (it.checked !== null) return { ...(taskItem(it.checked, content, c) as object), listType: \"none\" };\n return content.length === 1 ? content[0] : { stack: content };\n });\n const node: Record<string, unknown> = b.ordered ? { ol: items, start: b.start } : { ul: items };\n node.margin = [0, 0, 0, 6];\n node.markerColor = COLOR.muted;\n return node;\n }\n case \"blockquote\":\n return {\n table: { widths: [\"*\"], body: [[{ stack: blocks(b.children, { ...c, width: c.width - 16 }), color: COLOR.muted }]] },\n layout: {\n hLineWidth: () => 0,\n vLineWidth: (i: number) => (i === 0 ? 3 : 0),\n vLineColor: () => COLOR.rule,\n paddingLeft: () => 10,\n paddingRight: () => 0,\n paddingTop: () => 2,\n paddingBottom: () => 2,\n },\n margin: [0, 0, 0, 8],\n };\n case \"code\": {\n const lines = b.value.replace(/\\n$/, \"\").split(\"\\n\");\n const size = c.s.fontSize * 0.8;\n const stack = lines.map((l) => {\n const t = drawable(l.replace(/\\t/g, \" \"), c) || \" \";\n return courierCanDraw(t)\n ? { text: t, font: \"Courier\", fontSize: size, preserveLeadingSpaces: true }\n : { text: t, fontSize: size, preserveLeadingSpaces: true };\n });\n return {\n table: { widths: [\"*\"], body: [[{ stack, fillColor: COLOR.codeBg }]] },\n layout: {\n hLineWidth: () => 0.5,\n vLineWidth: () => 0.5,\n hLineColor: () => \"#e5e7eb\",\n vLineColor: () => \"#e5e7eb\",\n paddingLeft: () => 8,\n paddingRight: () => 8,\n paddingTop: () => 6,\n paddingBottom: () => 6,\n },\n margin: [0, 0, 0, 8],\n // Keep a block that fits on one page together (30 lines fits even a\n // landscape page; a taller unbreakable block would be dropped).\n unbreakable: lines.length <= 30,\n };\n }\n case \"table\": {\n const n = Math.max(b.header.length, ...b.rows.map((r) => r.length), 1);\n const cell = (inl: Inline[] | undefined, i: number, head: boolean) => ({\n text: runs(inl ?? [], c),\n bold: head,\n alignment: b.align[i] ?? \"left\",\n fontSize: c.s.fontSize * 0.92,\n color: head ? COLOR.heading : COLOR.text,\n });\n const row = (r: Inline[][], head: boolean) => Array.from({ length: n }, (_, i) => cell(r[i], i, head));\n const table = {\n table: {\n headerRows: 1,\n dontBreakRows: true,\n keepWithHeaderRows: 1,\n widths: Array.from({ length: n }, () => \"*\"),\n body: [row(b.header, true), ...b.rows.map((r) => row(r, false))],\n },\n layout: {\n hLineWidth: (i: number) => (i === 1 ? 1.2 : i === 0 ? 0 : 0.5),\n vLineWidth: () => 0,\n hLineColor: (i: number) => (i === 1 ? COLOR.heading : \"#e5e7eb\"),\n paddingLeft: () => 5,\n paddingRight: () => 5,\n paddingTop: () => 3,\n paddingBottom: () => 3,\n },\n };\n const stack: Node[] = [];\n if (b.caption) stack.push(capNode(b.caption, c, \"above\"));\n stack.push(table);\n // Never `unbreakable`: a table taller than a page would be dropped.\n // Rows never split, the header row repeats, and the caption keeps\n // with the table through the keep-with-next rule (headlineLevel).\n return { stack, margin: [0, 2, 0, 10] };\n }\n case \"figure\": {\n const img = c.images?.get(b.url);\n const maxH = (c.s.page.height - c.s.page.margins.top - c.s.page.margins.bottom) * 0.6;\n const stack: Node[] = [];\n if (img) {\n const scale = Math.min(1, c.width / img.width, maxH / img.height);\n stack.push({ image: img.dataUrl, width: img.width * scale, height: img.height * scale, alignment: \"center\" });\n } else {\n stack.push({ text: `[Image unavailable: ${b.alt || b.url}]`, italics: true, color: COLOR.muted, alignment: \"center\" });\n }\n if (b.caption) stack.push({ ...(capNode(b.caption, c, \"below\") as object), alignment: \"center\" });\n return { stack, margin: [0, 4, 0, 10], unbreakable: true };\n }\n case \"rule\":\n return {\n canvas: [{ type: \"line\", x1: 0, y1: 0, x2: c.width, y2: 0, lineWidth: 0.75, lineColor: COLOR.rule }],\n margin: [0, 6, 0, 10],\n };\n case \"pageBreak\":\n return null;\n case \"toc\":\n return {\n toc: {\n title: { text: c.s.toc.title, style: \"tocTitle\" },\n numberStyle: { color: COLOR.muted },\n },\n margin: [0, 0, 0, 12],\n };\n case \"notes\":\n return {\n stack: c.tree.notes.map((n) => ({\n columns: [\n { width: 18, text: `${n.n}.`, color: COLOR.muted, id: `note-${n.n}` },\n { width: \"*\", stack: blocks(n.children, { ...c, width: c.width - 18 }) },\n ],\n fontSize: c.s.fontSize * 0.9,\n })),\n };\n case \"bibliography\":\n return {\n stack: c.tree.bibliography.map((e) => ({\n text: runs(e.children, c),\n id: `ref-${e.id}`,\n margin: [0, 0, 0, 6],\n leadingIndent: 0,\n })),\n };\n }\n}\n\nfunction running(t: RunningTemplate | null, s: DocumentSettings, page: number, pages: number, margins: [number, number]): Node | null {\n if (!t) return null;\n const slot = (v: string | undefined, alignment: string) => ({ text: v ? fillTemplate(v, s, page, pages) : \"\", alignment, width: \"*\" });\n return {\n columns: [slot(t.left, \"left\"), slot(t.center, \"center\"), slot(t.right, \"right\")],\n fontSize: 9,\n color: COLOR.muted,\n margin: [margins[0], 0, margins[1], 0],\n };\n}\n\nfunction sectionContent(sec: DocSection, c: Ctx): Node[] {\n const landscape = sec.orientation === \"landscape\";\n const pageW = landscape ? c.s.page.height : c.s.page.width;\n const full = pageW - c.s.page.margins.left - c.s.page.margins.right;\n const gap = 18;\n const colW = (full - gap * (sec.columns - 1)) / sec.columns;\n const inner = blocks(sec.blocks, { ...c, width: colW });\n if (sec.columns === 1) return inner;\n return [\n {\n columns: [\n { width: colW, stack: inner },\n ...Array.from({ length: sec.columns - 1 }, () => ({ width: colW, stack: [] })),\n ],\n columnGap: gap,\n snakingColumns: true,\n },\n ];\n}\n\n/** Build the pdfmake document definition (exported for tests and hosts). */\nexport function buildPdfDefinition(tree: DocTree, images?: ImageMap, pageCountSink?: (n: number) => void): Record<string, unknown> {\n const s = tree.settings;\n const m = s.page.margins;\n const headings: number[] = [];\n for (const sec of tree.sections) for (const b of sec.blocks) if (b.type === \"heading\") headings.push(b.level);\n const c: Ctx = {\n glyphs: { announced: false },\n tree,\n images,\n s,\n width: s.page.width - m.left - m.right,\n tocIds: new Set(tree.toc.map((e) => e.id)),\n minLevel: Math.min(7, ...headings),\n };\n\n const content: Node[] = [];\n if (s.cover) {\n const logo = s.logo ? images?.get(s.logo) : undefined;\n const pageH = (s.page.orientation === \"landscape\" ? s.page.width : s.page.height) - m.top - m.bottom;\n const cover: Node[] = [];\n if (logo) {\n const scale = Math.min(1, 160 / logo.width, 72 / logo.height);\n cover.push({ image: logo.dataUrl, width: logo.width * scale, height: logo.height * scale, margin: [0, 0, 0, 24] });\n }\n cover.push({ text: s.title ?? \"\", style: \"coverTitle\" });\n if (s.subtitle) cover.push({ text: s.subtitle, style: \"coverSubtitle\" });\n if (s.author) cover.push({ text: s.author, style: \"coverMeta\", margin: [0, 36, 0, 0] });\n if (s.date) cover.push({ text: s.date, style: \"coverMeta\" });\n content.push({ stack: cover, margin: [0, pageH * 0.28, 0, 0] });\n }\n tree.sections.forEach((sec, idx) => {\n const nodes = sectionContent(sec, c);\n const first = nodes[0];\n if (first && typeof first === \"object\" && (idx > 0 || s.cover)) {\n first.pageBreak = \"before\";\n first.pageOrientation = sec.orientation;\n }\n content.push(...nodes);\n });\n\n const hs = s.fontSize;\n let pageCount = 0;\n const hidden = (page: number) => s.differentFirstPage && page === 1;\n return {\n info: { title: s.title ?? \"Document\", author: s.author, subject: s.subtitle, creator: \"AI Matrx\", producer: \"@ai-matrx/print\" },\n pageSize: { width: s.page.width, height: s.page.height },\n pageOrientation: s.page.orientation,\n pageMargins: [m.left, m.top, m.right, m.bottom],\n language: s.lang,\n header: (page: number, pages: number) => {\n pageCount = pages;\n pageCountSink?.(pageCount);\n if (hidden(page)) return null;\n const r = running(s.header, s, page, pages, [m.left, m.right]);\n return r ? { stack: [r], margin: [0, Math.max(14, m.top / 2 - 6), 0, 0] } : null;\n },\n footer: (page: number, pages: number) => {\n if (hidden(page)) return null;\n const r = running(s.footer, s, page, pages, [m.left, m.right]);\n return r ? { stack: [r], margin: [0, Math.max(10, m.bottom / 2 - 6), 0, 0] } : null;\n },\n // Keep-with-next: a heading never ends a page.\n // (A container stack reports every page its children touch, so only real\n // content nodes that START on the heading's page count as \"following\".)\n pageBreakBefore: (node: PbNode, q: { getFollowingNodesOnPage: () => PbNode[] }) => {\n if (!node.headlineLevel) return false;\n const page = node.startPosition?.pageNumber;\n return !q.getFollowingNodesOnPage().some((n) => !n.stack && n.startPosition?.pageNumber === page);\n },\n content,\n defaultStyle: { font: \"Roboto\", fontSize: hs, lineHeight: 1.3, color: COLOR.text },\n styles: {\n p: { margin: [0, 0, 0, 7] },\n h1: { fontSize: hs * 1.8, bold: true, color: COLOR.heading, margin: [0, 14, 0, 6] },\n h2: { fontSize: hs * 1.45, bold: true, color: COLOR.heading, margin: [0, 12, 0, 5] },\n h3: { fontSize: hs * 1.2, bold: true, color: COLOR.heading, margin: [0, 10, 0, 4] },\n h4: { fontSize: hs * 1.05, bold: true, color: COLOR.heading, margin: [0, 8, 0, 3] },\n h5: { fontSize: hs, bold: true, color: COLOR.heading, margin: [0, 8, 0, 3] },\n h6: { fontSize: hs, bold: true, italics: true, color: COLOR.heading, margin: [0, 8, 0, 3] },\n caption: { fontSize: hs * 0.9, color: COLOR.muted },\n tocTitle: { fontSize: hs * 1.45, bold: true, color: COLOR.heading, margin: [0, 0, 0, 10] },\n toc: { fontSize: hs },\n tocL1: { fontSize: hs, bold: true },\n coverTitle: { fontSize: 30, bold: true, color: COLOR.heading, lineHeight: 1.1 },\n coverSubtitle: { fontSize: 16, color: \"#4b5563\", margin: [0, 10, 0, 0] },\n coverMeta: { fontSize: 12, color: \"#4b5563\", margin: [0, 4, 0, 0] },\n },\n };\n}\n\ninterface PbNode {\n headlineLevel?: number;\n stack?: boolean;\n startPosition?: { pageNumber?: number };\n}\n\nconst FONTS_READY = Symbol.for(\"ai-matrx.print.document.pdfmake-fonts\");\n\n/** Load pdfmake once, with Roboto (body) and Courier (code) registered. */\nasync function loadPdfMake(): Promise<{ createPdf: (d: unknown) => { getBuffer: () => Promise<Uint8Array> } }> {\n const mod = (await import(\"pdfmake\")) as unknown as Record<string, unknown>;\n const pdfMake = (mod.default ?? mod) as Record<string | symbol, unknown> & {\n addVirtualFileSystem?: (v: unknown) => void;\n addFontContainer?: (c: unknown) => void;\n addFonts: (f: unknown) => void;\n virtualfs?: { writeFileSync: (k: string, v: unknown) => void };\n setUrlAccessPolicy?: (f: (u: string) => boolean) => void;\n setLocalAccessPolicy?: (f: (p: string) => boolean) => void;\n createPdf: (d: unknown) => { getBuffer: () => Promise<Uint8Array> };\n };\n if (!pdfMake[FONTS_READY]) {\n const vfsMod = (await import(\"pdfmake/build/vfs_fonts.js\")) as unknown as Record<string, unknown>;\n const vfs = (vfsMod.default ?? vfsMod) as Record<string, string>;\n if (typeof pdfMake.addVirtualFileSystem === \"function\") {\n pdfMake.addVirtualFileSystem(vfs);\n const courier = (await import(\"pdfmake/build/standard-fonts/Courier.js\")) as unknown as Record<string, unknown>;\n pdfMake.addFontContainer?.(courier.default ?? courier);\n } else {\n const B = (globalThis as unknown as { Buffer: { from: (s: string, e: string) => unknown } }).Buffer;\n for (const [k, v] of Object.entries(vfs)) pdfMake.virtualfs?.writeFileSync(k, B.from(v, \"base64\"));\n }\n pdfMake.addFonts({\n Roboto: {\n normal: \"Roboto-Regular.ttf\",\n bold: \"Roboto-Medium.ttf\",\n italics: \"Roboto-Italic.ttf\",\n bolditalics: \"Roboto-MediumItalic.ttf\",\n },\n Courier: { normal: \"Courier\", bold: \"Courier-Bold\", italics: \"Courier-Oblique\", bolditalics: \"Courier-BoldOblique\" },\n });\n // Images arrive pre-resolved as data URLs; nothing is fetched by pdfmake.\n pdfMake.setUrlAccessPolicy?.(() => false);\n pdfMake.setLocalAccessPolicy?.((p) => /^Courier(-Bold|-Oblique|-BoldOblique)?$/.test(p));\n pdfMake[FONTS_READY] = true;\n }\n return pdfMake;\n}\n\nexport interface PdfResult {\n bytes: Uint8Array;\n pageCount: number;\n}\n\nexport async function documentToPdf(tree: DocTree, images?: ImageMap): Promise<PdfResult> {\n const pdfMake = await loadPdfMake();\n let pageCount = 0;\n const def = buildPdfDefinition(tree, images, (n) => {\n pageCount = n;\n });\n const buf = await pdfMake.createPdf(def).getBuffer();\n return { bytes: buf instanceof Uint8Array ? new Uint8Array(buf) : new Uint8Array(buf as ArrayBuffer), pageCount };\n}\n\n/**\n * The page each TOC heading landed on, read from a laid-out PDF definition.\n * Used by the DOCX writer so its cached table of contents shows real numbers\n * before Word refreshes the fields.\n */\nexport async function headingPages(tree: DocTree, images?: ImageMap): Promise<Map<string, number>> {\n const pdfMake = await loadPdfMake();\n // A measuring pass: its notices (PDF-only) must not leak into another export.\n const def = buildPdfDefinition({ ...tree, notices: [] }, images);\n await pdfMake.createPdf(def).getBuffer();\n // pdfmake lays out the definition in place: every node gains `positions`.\n const want = new Set(tree.toc.map((e) => e.id));\n const pages = new Map<string, number>();\n const walk = (n: unknown): void => {\n if (Array.isArray(n)) {\n for (const x of n) walk(x);\n return;\n }\n if (!n || typeof n !== \"object\") return;\n const o = n as Record<string, unknown>;\n const pos = (o.positions as Array<{ pageNumber?: number }> | undefined)?.[0];\n if (typeof o.id === \"string\" && want.has(o.id) && pos?.pageNumber && !pages.has(o.id)) pages.set(o.id, pos.pageNumber);\n for (const key of [\"stack\", \"columns\", \"ul\", \"ol\", \"content\"]) if (key in o) walk(o[key]);\n const table = o.table as { body?: unknown } | undefined;\n if (table?.body) walk(table.body);\n };\n walk(def.content);\n return pages;\n}\n","/**\n * markdown (+ frontmatter) → DocTree. The ONE parse every document output\n * (PDF, DOCX, EPUB, HTML) renders from.\n *\n * Grammar:\n * • CommonMark + GFM (tables, task lists, strikethrough, autolinks,\n * footnotes) via micromark/mdast — the reference parser, not a regex.\n * • Page/section breaks, TOC and bibliography placement come ONLY from\n * `../directives` (the grammar the chat preview and the print skins share).\n * • Captions + cross-references follow pandoc-crossref:\n * {#fig:growth} figure, numbered \"Figure N\"\n * Table: A caption {#tbl:sales} caption line before/after a table\n * ## Methods {#sec:methods} heading id (`{-}` = unnumbered)\n * see @fig:growth, @tbl:sales, @sec:methods\n * • Citations follow pandoc: [@key], [@key, p. 4], [@a; @b], [-@key], @key.\n */\n\nimport { fromMarkdown } from \"mdast-util-from-markdown\";\nimport { gfmFromMarkdown } from \"mdast-util-gfm\";\nimport { gfm } from \"micromark-extension-gfm\";\nimport type {\n Nodes as MdNode,\n Parents as MdParent,\n PhrasingContent,\n Root,\n RootContent,\n Table as MdTable,\n} from \"mdast\";\nimport {\n isBibliographyLine,\n isPageBreakLine,\n isTocLine,\n parseSectionBreakLine,\n type SectionBreakDirective,\n} from \"../directives\";\nimport { removeThinkingContent } from \"../markdown\";\nimport { formatBibliography, formatCitation, parseCitationGroup } from \"./citations\";\nimport { resolveSettings, splitFrontmatter, type ResolveSettingsOptions } from \"./settings\";\nimport type {\n Block,\n Caption,\n CslItem,\n DocSection,\n DocTree,\n DocumentNotice,\n DocumentSettings,\n Inline,\n ListItem,\n} from \"./types\";\n\nexport interface ParseDocumentOptions extends ResolveSettingsOptions {\n /** Where dropped/degraded content is announced (also collected on the tree). */\n onNotice?: (notice: DocumentNotice) => void;\n}\n\nconst MARK = \"matrx:\";\nconst FENCE_RE = /^\\s*(`{3,}|~{3,})/;\nconst TABLE_CAPTION_RE = /^\\s{0,3}(?:Table:|:)\\s+\\S/;\n\n/** Rewrite directive lines into canonical HTML comments the tree reads. Fence-aware. */\nfunction prepass(body: string): string {\n const lines = body.split(/\\r?\\n/);\n const out: string[] = [];\n let fence: string | null = null;\n const isTableLine = (l: string | undefined) => l !== undefined && /^\\s{0,3}\\|/.test(l);\n const prevNonBlank = (i: number) => {\n for (let j = i - 1; j >= 0; j--) if ((lines[j] as string).trim()) return lines[j];\n return undefined;\n };\n const nextNonBlank = (i: number) => {\n for (let j = i + 1; j < lines.length; j++) if ((lines[j] as string).trim()) return lines[j];\n return undefined;\n };\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] as string;\n const fm = FENCE_RE.exec(line);\n if (fm) {\n const marker = fm[1] as string;\n if (fence === null) fence = marker;\n else if (marker[0] === fence[0] && marker.length >= fence.length) fence = null;\n out.push(line);\n continue;\n }\n if (fence !== null) {\n out.push(line);\n continue;\n }\n let directive: string | null = null;\n const section = parseSectionBreakLine(line);\n if (section) directive = `<!--${MARK}section ${JSON.stringify(section)}-->`;\n else if (isPageBreakLine(line)) directive = `<!--${MARK}pagebreak-->`;\n else if (isTocLine(line)) directive = `<!--${MARK}toc-->`;\n else if (isBibliographyLine(line)) directive = `<!--${MARK}bibliography-->`;\n if (directive) {\n out.push(\"\", directive, \"\");\n continue;\n }\n // A pandoc table caption glued to its table would otherwise become a row.\n if (TABLE_CAPTION_RE.test(line) && (isTableLine(prevNonBlank(i)) || isTableLine(nextNonBlank(i)))) {\n out.push(\"\", line.trim().replace(/^:\\s+/, \"Table: \"), \"\");\n continue;\n }\n out.push(line);\n }\n return out.join(\"\\n\");\n}\n\nconst slugify = (s: string): string =>\n s\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^\\w\\s-]/g, \"\")\n .trim()\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\") || \"section\";\n\nexport function plainText(inlines: Inline[]): string {\n return inlines\n .map((n) => {\n switch (n.type) {\n case \"text\":\n case \"code\":\n return n.value;\n case \"strong\":\n case \"emphasis\":\n case \"delete\":\n case \"link\":\n return plainText(n.children);\n case \"xref\":\n case \"cite\":\n return n.label;\n case \"image\":\n return n.alt;\n case \"break\":\n return \" \";\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\ninterface Ctx {\n settings: DocumentSettings;\n notices: DocumentNotice[];\n notify: (n: DocumentNotice) => void;\n defs: Map<string, { url: string; title?: string | null | undefined }>;\n footnoteDefs: Map<string, RootContent[]>;\n noteOrder: Map<string, number>;\n refs: Map<string, CslItem>;\n cited: Set<string>;\n htmlAnnounced: boolean;\n ids: Set<string>;\n figN: number;\n tblN: number;\n figures: Caption[];\n tables: Caption[];\n /** Pending xrefs, resolved once every id is known. */\n xrefs: Array<Extract<Inline, { type: \"xref\" }>>;\n headingIndex: Map<string, Extract<Block, { type: \"heading\" }>>;\n}\n\nfunction uniqueId(ctx: Ctx, base: string): string {\n let id = base;\n for (let n = 2; ctx.ids.has(id); n++) id = `${base}-${n}`;\n ctx.ids.add(id);\n return id;\n}\n\n// ── inline scanning: citations and cross-references inside text ────────────\n\nconst CITE_GROUP_RE = /\\[(-?@[^[\\]]+)\\]/g;\nconst BARE_RE = /(^|[^\\w@.\\\\])@((?:fig|tbl|sec|eq):[\\w-]+|[A-Za-z0-9_](?:[\\w:.#$%&+?<>~/-]*\\w)?)/g;\n\nfunction scanText(value: string, ctx: Ctx): Inline[] {\n const out: Inline[] = [];\n const pushText = (s: string) => {\n if (!s) return;\n const last = out[out.length - 1];\n if (last?.type === \"text\") last.value += s;\n else out.push({ type: \"text\", value: s });\n };\n const scanBare = (s: string) => {\n let last = 0;\n for (const m of s.matchAll(BARE_RE)) {\n const key = m[2] as string;\n const start = m.index! + (m[1] as string).length;\n const xm = /^(fig|tbl|sec|eq):(.+)$/.exec(key);\n if (xm) {\n pushText(s.slice(last, start));\n out.push(makeXref(`${xm[1]}:${xm[2]}`, ctx));\n last = start + key.length + 1;\n } else if (ctx.refs.has(key)) {\n pushText(s.slice(last, start));\n ctx.cited.add(key);\n const { label, resolved } = formatCitation(\n [{ key, suppressAuthor: false }],\n (k) => ctx.refs.get(k),\n ctx.settings.citationStyle,\n true,\n );\n out.push({ type: \"cite\", keys: [key], label, resolved });\n last = start + key.length + 1;\n }\n }\n pushText(s.slice(last));\n };\n let last = 0;\n for (const m of value.matchAll(CITE_GROUP_RE)) {\n const inner = m[1] as string;\n const refs = parseCitationGroup(inner);\n const single = /^@((?:fig|tbl|sec|eq):[\\w-]+)$/.exec(inner.trim());\n if (!refs && !single) continue;\n scanBare(value.slice(last, m.index));\n if (single) out.push(makeXref(single[1] as string, ctx));\n else if (refs) {\n const { label, resolved } = formatCitation(refs, (k) => ctx.refs.get(k), ctx.settings.citationStyle);\n for (const r of refs) if (ctx.refs.has(r.key)) ctx.cited.add(r.key);\n if (!resolved) {\n const missing = refs.filter((r) => !ctx.refs.has(r.key)).map((r) => r.key);\n ctx.notify({\n code: \"citation-unresolved\",\n message: `No reference was found for ${missing.map((k) => `@${k}`).join(\", \")}.`,\n remedy: \"Add it under `references:` in the settings at the top (id, title, author, issued), or fix the key's spelling.\",\n });\n }\n out.push({ type: \"cite\", keys: refs.map((r) => r.key), label, resolved });\n }\n last = m.index! + m[0].length;\n }\n scanBare(value.slice(last));\n return out;\n}\n\nfunction makeXref(target: string, ctx: Ctx): Extract<Inline, { type: \"xref\" }> {\n const x = { type: \"xref\" as const, target, label: target, resolved: false };\n ctx.xrefs.push(x);\n return x;\n}\n\nfunction inlines(nodes: PhrasingContent[] | readonly MdNode[], ctx: Ctx): Inline[] {\n const out: Inline[] = [];\n for (const n of nodes as MdNode[]) {\n switch (n.type) {\n case \"text\":\n out.push(...scanText(n.value, ctx));\n break;\n case \"strong\":\n out.push({ type: \"strong\", children: inlines(n.children, ctx) });\n break;\n case \"emphasis\":\n out.push({ type: \"emphasis\", children: inlines(n.children, ctx) });\n break;\n case \"delete\":\n out.push({ type: \"delete\", children: inlines(n.children, ctx) });\n break;\n case \"inlineCode\":\n out.push({ type: \"code\", value: n.value });\n break;\n case \"break\":\n out.push({ type: \"break\" });\n break;\n case \"link\":\n out.push({ type: \"link\", url: n.url, children: inlines(n.children, ctx) });\n break;\n case \"image\":\n out.push({ type: \"image\", url: n.url, alt: n.alt ?? \"\" });\n break;\n case \"linkReference\": {\n const def = ctx.defs.get(n.identifier);\n const kids = inlines(n.children, ctx);\n if (def) out.push({ type: \"link\", url: def.url, children: kids });\n else out.push({ type: \"text\", value: \"[\" }, ...kids, { type: \"text\", value: \"]\" });\n break;\n }\n case \"imageReference\": {\n const def = ctx.defs.get(n.identifier);\n if (def) out.push({ type: \"image\", url: def.url, alt: n.alt ?? \"\" });\n break;\n }\n case \"footnoteReference\": {\n let num = ctx.noteOrder.get(n.identifier);\n if (num === undefined) {\n num = ctx.noteOrder.size + 1;\n ctx.noteOrder.set(n.identifier, num);\n }\n out.push({ type: \"noteRef\", n: num });\n break;\n }\n case \"html\":\n // Inline raw HTML: <br> is a line break; any other tag is dropped and\n // its text kept (the tags are separate nodes, the text between survives).\n if (/^<br\\s*\\/?>$/i.test(n.value.trim())) out.push({ type: \"break\" });\n else if (!/^<!--/.test(n.value)) announceHtml(ctx);\n break;\n default:\n break;\n }\n }\n return out;\n}\n\nfunction announceHtml(ctx: Ctx) {\n if (ctx.htmlAnnounced) return;\n ctx.htmlAnnounced = true;\n ctx.notify({\n code: \"html-stripped\",\n message: \"Raw HTML tags in the document were left out of the printed/exported file (their text is kept).\",\n remedy: \"Use markdown formatting instead of HTML tags; a page break is the line <!-- pagebreak -->.\",\n });\n}\n\n// ── blocks ─────────────────────────────────────────────────────────────────\n\ntype Directive =\n | { type: \"section\"; value: SectionBreakDirective }\n | { type: \"pagebreak\" }\n | { type: \"toc\" }\n | { type: \"bibliography\" };\n\nfunction directiveOf(node: RootContent): Directive | null {\n if (node.type !== \"html\") return null;\n const m = /^<!--matrx:(section|pagebreak|toc|bibliography)\\s*(.*?)-->$/.exec(node.value.trim());\n if (!m) return null;\n if (m[1] === \"section\") {\n try {\n return { type: \"section\", value: JSON.parse(m[2] || \"{}\") as SectionBreakDirective };\n } catch {\n return { type: \"section\", value: {} };\n }\n }\n return { type: m[1] as \"pagebreak\" | \"toc\" | \"bibliography\" };\n}\n\nconst ATTR_RE = /\\s*\\{([^{}]*)\\}\\s*$/;\n\n/** Pull a trailing pandoc attribute block `{#id .class -}` off inline content. */\nfunction takeAttributes(kids: Inline[]): { id?: string | undefined; unnumbered: boolean } {\n const last = kids[kids.length - 1];\n if (last?.type !== \"text\") return { unnumbered: false };\n const m = ATTR_RE.exec(last.value);\n if (!m) return { unnumbered: false };\n const attrs = (m[1] as string).trim().split(/\\s+/);\n if (!attrs.every((a) => /^(#[\\w:.-]+|\\.[\\w-]+|-|[\\w-]+=\\S+)$/.test(a))) return { unnumbered: false };\n last.value = last.value.slice(0, m.index).replace(/\\s+$/, \"\");\n if (!last.value) kids.pop();\n const id = attrs.find((a) => a.startsWith(\"#\"))?.slice(1);\n const unnumbered = attrs.includes(\"-\") || attrs.includes(\".unnumbered\");\n return { id, unnumbered };\n}\n\nfunction figureOf(node: RootContent, ctx: Ctx): Block | null {\n if (node.type !== \"paragraph\") return null;\n const kids = node.children.filter((c) => !(c.type === \"text\" && !c.value.trim()));\n const img = kids[0];\n if (!img || (img.type !== \"image\" && img.type !== \"imageReference\")) return null;\n let url: string;\n let alt = img.alt ?? \"\";\n if (img.type === \"image\") {\n url = img.url;\n if (!alt && img.title) alt = img.title;\n } else {\n const def = ctx.defs.get(img.identifier);\n if (!def) return null;\n url = def.url;\n }\n let id: string | undefined;\n if (kids.length === 2) {\n const tail = kids[1];\n const m = tail?.type === \"text\" ? /^\\s*\\{#fig:([\\w-]+)[^}]*\\}\\s*$/.exec(tail.value) : null;\n if (!m) return null;\n id = m[1];\n } else if (kids.length > 2) return null;\n const figure: Extract<Block, { type: \"figure\" }> = { type: \"figure\", url, alt };\n if (alt.trim() || id) {\n const number = ++ctx.figN;\n const children = alt.trim() ? scanText(alt, ctx) : [];\n const caption: Caption = { kind: \"fig\", id, number, label: `Figure ${number}`, children };\n if (id) uniqueId(ctx, `fig:${id}`);\n figure.caption = caption;\n ctx.figures.push(caption);\n }\n return figure;\n}\n\nfunction tableCaptionText(node: RootContent | undefined): PhrasingContent[] | null {\n if (!node || node.type !== \"paragraph\") return null;\n const first = node.children[0];\n if (first?.type !== \"text\" || !/^Table:\\s+/.test(first.value)) return null;\n const rest = [{ ...first, value: first.value.replace(/^Table:\\s+/, \"\") }, ...node.children.slice(1)];\n return rest as PhrasingContent[];\n}\n\nfunction convertBlocks(nodes: RootContent[], ctx: Ctx, out: Block[], allowDirectives = false): void {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i] as RootContent;\n const block = convertBlock(nodes, i, ctx, allowDirectives);\n if (block === \"skip-next\") {\n i++;\n continue;\n }\n if (block) out.push(block);\n }\n}\n\nfunction convertTable(node: MdTable, captionNodes: PhrasingContent[] | null, ctx: Ctx): Block {\n const rows = node.children.map((row) => row.children.map((cell) => inlines(cell.children, ctx)));\n const table: Extract<Block, { type: \"table\" }> = {\n type: \"table\",\n align: (node.align ?? []).map((a) => a ?? null),\n header: rows[0] ?? [],\n rows: rows.slice(1),\n };\n if (captionNodes) {\n const kids = inlines(captionNodes, ctx);\n const { id } = takeAttributes(kids);\n const tid = id?.replace(/^tbl:/, \"\");\n const number = ++ctx.tblN;\n const caption: Caption = { kind: \"tbl\", id: tid, number, label: `Table ${number}`, children: kids };\n if (tid) uniqueId(ctx, `tbl:${tid}`);\n table.caption = caption;\n ctx.tables.push(caption);\n }\n return table;\n}\n\nfunction convertBlock(\n nodes: RootContent[],\n i: number,\n ctx: Ctx,\n allowDirectives: boolean,\n): Block | null | \"skip-next\" {\n const node = nodes[i] as RootContent;\n switch (node.type) {\n case \"heading\": {\n const children = inlines(node.children, ctx);\n const { id, unnumbered } = takeAttributes(children);\n const plain = plainText(children).trim();\n const hid = uniqueId(ctx, id ?? slugify(plain));\n const h: Extract<Block, { type: \"heading\" }> = {\n type: \"heading\",\n level: node.depth,\n id: hid,\n plain,\n children,\n numbered: !unnumbered,\n };\n ctx.headingIndex.set(hid, h);\n return h;\n }\n case \"paragraph\": {\n const fig = figureOf(node, ctx);\n if (fig) return fig;\n // A caption paragraph belongs to the adjacent table.\n const cap = tableCaptionText(node);\n if (cap) {\n const next = nodes[i + 1];\n const prev = nodes[i - 1];\n if (next?.type === \"table\") {\n const t = convertTable(next, cap, ctx);\n nodes[i + 1] = { type: \"html\", value: \"<!--matrx:consumed-->\" };\n return t;\n }\n if (prev?.type === \"table\") return null; // consumed by the table (below)\n }\n return { type: \"paragraph\", children: inlines(node.children, ctx) };\n }\n case \"table\": {\n const next = nodes[i + 1];\n const cap = tableCaptionText(next);\n if (cap) {\n const t = convertTable(node, cap, ctx);\n nodes[i + 1] = { type: \"html\", value: \"<!--matrx:consumed-->\" };\n return t;\n }\n return convertTable(node, null, ctx);\n }\n case \"list\": {\n const items: ListItem[] = node.children.map((li) => {\n const children: Block[] = [];\n convertBlocks(li.children as RootContent[], ctx, children);\n return { checked: li.checked ?? null, children };\n });\n return { type: \"list\", ordered: Boolean(node.ordered), start: node.start ?? 1, items };\n }\n case \"blockquote\": {\n const children: Block[] = [];\n convertBlocks(node.children as RootContent[], ctx, children);\n return { type: \"blockquote\", children };\n }\n case \"code\":\n return { type: \"code\", lang: node.lang ?? \"\", value: node.value };\n case \"thematicBreak\":\n return { type: \"rule\" };\n case \"html\": {\n if (/^<!--matrx:consumed-->$/.test(node.value)) return null;\n if (/^\\s*<!--[\\s\\S]*-->\\s*$/.test(node.value)) return null; // comments are invisible\n if (/^\\s*<br\\s*\\/?>\\s*$/i.test(node.value)) return null;\n // Block HTML: keep the words, drop the tags.\n const text = node.value\n .replace(/<(script|style)\\b[\\s\\S]*?<\\/\\1>/gi, \"\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n if (/<(?!\\/?(?:artifact|flashcards)\\b)[a-z]/i.test(node.value)) announceHtml(ctx);\n return text ? { type: \"paragraph\", children: [{ type: \"text\", value: text }] } : null;\n }\n case \"math\" as string:\n return { type: \"code\", lang: \"math\", value: (node as unknown as { value: string }).value };\n default:\n void allowDirectives;\n return null;\n }\n}\n\nfunction resolveXrefs(ctx: Ctx) {\n const figs = new Map(ctx.figures.filter((c) => c.id).map((c) => [c.id as string, c]));\n const tbls = new Map(ctx.tables.filter((c) => c.id).map((c) => [c.id as string, c]));\n for (const x of ctx.xrefs) {\n const [kind, id] = x.target.split(/:(.*)/s) as [string, string];\n let label: string | undefined;\n if (kind === \"fig\") label = figs.get(id)?.label;\n else if (kind === \"tbl\") label = tbls.get(id)?.label;\n else if (kind === \"sec\") {\n const h = ctx.headingIndex.get(`sec:${id}`) ?? ctx.headingIndex.get(id);\n if (h) {\n label = h.number ? `Section ${h.number}` : `“${h.plain}”`;\n x.target = `sec:${h.id}`;\n }\n }\n if (label) {\n x.label = label;\n x.resolved = true;\n } else {\n x.label = \"??\";\n ctx.notify({\n code: \"xref-unresolved\",\n message: `The cross-reference @${x.target} points at nothing in this document.`,\n remedy:\n kind === \"sec\"\n ? `Give the heading an id: \\`## Title {#sec:${id}}\\`.`\n : kind === \"fig\"\n ? `Label the image: \\`{#fig:${id}}\\`.`\n : `Caption the table: a line \\`Table: Caption {#tbl:${id}}\\` right before or after it.`,\n });\n }\n }\n}\n\n/** Parse a markdown source (with optional frontmatter) into the document tree. */\nexport function parseDocument(source: string, options: ParseDocumentOptions = {}): DocTree {\n const notices: DocumentNotice[] = [];\n const notify = (n: DocumentNotice) => {\n notices.push(n);\n options.onNotice?.(n);\n };\n const sink: DocumentNotice[] = [];\n const fm = splitFrontmatter(source ?? \"\", sink);\n const settings = resolveSettings(fm.data, sink, options);\n for (const n of sink) notify(n);\n\n const body = removeThinkingContent(fm.body);\n const root = fromMarkdown(prepass(body), {\n extensions: [gfm()],\n mdastExtensions: [gfmFromMarkdown()],\n }) as Root;\n\n const ctx: Ctx = {\n settings,\n notices,\n notify,\n defs: new Map(),\n footnoteDefs: new Map(),\n noteOrder: new Map(),\n refs: new Map(settings.references.map((r) => [r.id, r])),\n cited: new Set(),\n htmlAnnounced: false,\n ids: new Set(),\n figN: 0,\n tblN: 0,\n figures: [],\n tables: [],\n xrefs: [],\n headingIndex: new Map(),\n };\n const visit = (n: MdNode) => {\n if (n.type === \"definition\") ctx.defs.set(n.identifier, { url: n.url, title: n.title });\n if (n.type === \"footnoteDefinition\") ctx.footnoteDefs.set(n.identifier, n.children as RootContent[]);\n if (\"children\" in n) for (const c of (n as MdParent).children) visit(c as MdNode);\n };\n visit(root);\n\n // Sections at section breaks; page breaks / toc / bibliography as blocks.\n const sections: DocSection[] = [\n { orientation: settings.page.orientation, columns: settings.columns, blocks: [] },\n ];\n let hasTocBlock = false;\n let hasBibBlock = false;\n const top = root.children.filter((n) => n.type !== \"definition\" && n.type !== \"footnoteDefinition\");\n for (let i = 0; i < top.length; i++) {\n const node = top[i] as RootContent;\n const d = directiveOf(node);\n const current = sections[sections.length - 1] as DocSection;\n if (d?.type === \"section\") {\n sections.push({\n orientation: d.value.orientation ?? settings.page.orientation,\n columns: d.value.columns ?? settings.columns,\n blocks: [],\n });\n continue;\n }\n if (d?.type === \"pagebreak\") {\n current.blocks.push({ type: \"pageBreak\" });\n continue;\n }\n if (d?.type === \"toc\") {\n if (!hasTocBlock) current.blocks.push({ type: \"toc\" });\n hasTocBlock = true;\n continue;\n }\n if (d?.type === \"bibliography\") {\n current.blocks.push({ type: \"bibliography\" });\n hasBibBlock = true;\n continue;\n }\n const block = convertBlock(top, i, ctx, true);\n if (block && block !== \"skip-next\") current.blocks.push(block);\n }\n // Drop sections a trailing/leading break left empty (no blank pages).\n const nonEmpty = sections.filter((s, idx) => s.blocks.length > 0 || idx === 0);\n sections.length = 0;\n sections.push(...nonEmpty);\n for (const s of sections) {\n while (s.blocks[0]?.type === \"pageBreak\") s.blocks.shift();\n while (s.blocks[s.blocks.length - 1]?.type === \"pageBreak\") s.blocks.pop();\n }\n\n // Section numbering (relative to the shallowest numbered heading level).\n const allHeadings: Array<Extract<Block, { type: \"heading\" }>> = [];\n const collect = (blocks: Block[]) => {\n for (const b of blocks) if (b.type === \"heading\") allHeadings.push(b);\n };\n for (const s of sections) collect(s.blocks);\n const minLevel = Math.min(7, ...allHeadings.map((h) => h.level));\n if (settings.numberSections) {\n const counters = [0, 0, 0, 0, 0, 0];\n for (const h of allHeadings) {\n if (!h.numbered) continue;\n const depth = h.level - minLevel;\n counters[depth] = (counters[depth] ?? 0) + 1;\n for (let d = depth + 1; d < 6; d++) counters[d] = 0;\n h.number = counters\n .slice(0, depth + 1)\n .map((c) => c || 1)\n .join(\".\");\n }\n }\n\n // Footnotes → endnotes.\n const notes: DocTree[\"notes\"] = [];\n for (const [identifier, n] of [...ctx.noteOrder.entries()].sort((a, b) => a[1] - b[1])) {\n const children: Block[] = [];\n convertBlocks(ctx.footnoteDefs.get(identifier) ?? [], ctx, children);\n notes.push({ n, children });\n }\n const last = sections[sections.length - 1] as DocSection;\n const backLevel = minLevel <= 6 ? minLevel : 1;\n const backHeading = (plain: string, id: string): Block => {\n const h: Extract<Block, { type: \"heading\" }> = {\n type: \"heading\",\n level: backLevel,\n id: uniqueId(ctx, id),\n plain,\n children: [{ type: \"text\", value: plain }],\n numbered: false,\n };\n allHeadings.push(h);\n return h;\n };\n if (notes.length) last.blocks.push(backHeading(\"Notes\", \"notes\"), { type: \"notes\" });\n\n // Bibliography.\n const citedItems = [...ctx.cited].map((k) => ctx.refs.get(k)).filter((x): x is CslItem => Boolean(x));\n const bibliography = formatBibliography(citedItems, settings.citationStyle);\n if (bibliography.length || hasBibBlock) {\n const heading = backHeading(settings.bibliographyTitle, \"references\");\n if (hasBibBlock) {\n for (const s of sections) {\n const idx = s.blocks.findIndex((b) => b.type === \"bibliography\");\n if (idx >= 0) {\n s.blocks.splice(idx, 0, heading);\n break;\n }\n }\n } else {\n last.blocks.push(heading, { type: \"bibliography\" });\n }\n }\n\n // Table of contents.\n if (settings.toc.enabled && !hasTocBlock) {\n (sections[0] as DocSection).blocks.unshift({ type: \"toc\" }, { type: \"pageBreak\" });\n }\n const order: Array<Extract<Block, { type: \"heading\" }>> = [];\n for (const s of sections) for (const b of s.blocks) if (b.type === \"heading\") order.push(b);\n const toc = order\n .filter((h) => h.level - minLevel + 1 <= settings.toc.depth)\n .map((h) => ({ id: h.id, level: h.level - minLevel + 1, text: h.number ? `${h.number} ${h.plain}` : h.plain }));\n\n resolveXrefs(ctx);\n\n if (!sections.some((s) => s.blocks.length) && !settings.cover) {\n notify({\n code: \"empty-document\",\n message: \"The document has no content to print or export.\",\n remedy: \"Write something below the settings block (or remove the --- lines if they are not settings).\",\n });\n }\n\n return {\n settings,\n body,\n sections,\n toc,\n figures: ctx.figures,\n tables: ctx.tables,\n bibliography,\n notes,\n notices,\n };\n}\n","/**\n * @ai-matrx/print/markdown — the SHIPPED DEFAULT markdown→HTML converter and\n * print stylesheet.\n *\n * Why this entry exists: `markdownToPdfBlob` used to declare its converter and\n * its stylesheet as REQUIRED injected ports (\"bring your own converter +\n * stylesheet\"). That is the exact failure THE ALL-INCLUSIVE LAW names — every\n * host had to build the hard half itself, and both hosts that tried ended up\n * with a different converter, a different stylesheet, and a different set of\n * bugs. The package now ships a complete, working default for both ports; the\n * injection seam survives as the OVERRIDE path, never as a prerequisite.\n *\n * Two skins, one vocabulary:\n * • \"document\" — `markdownToHtml` emits `.matrx-*`-classed HTML (tables,\n * nested lists, images, links, code, FAQ blocks, flashcards) and\n * `MARKDOWN_DOCUMENT_CSS` styles it. This is the PDF/publish/WordPress\n * lane.\n * • \"article\" — `markdownToArticleHtml` emits bare semantic tags and\n * `MARKDOWN_ARTICLE_CSS` gives them the serif AI-response look. This is\n * the print-window lane.\n *\n * Nothing here touches `window`/`document` at import time, and nothing here is\n * heavy — but it IS ~20KB of CSS, so `markdownToPdfBlob` reaches it through a\n * lazy `import(\"./markdown\")` and a consumer that never prints markdown pays\n * nothing.\n *\n * NOTHING FAILS SILENTLY: every case where the converter drops input it cannot\n * represent (a malformed flashcard, an empty document) is reported through the\n * optional `onNotice` sink with a concrete remedy, instead of vanishing.\n */\n\nimport { openPrintWindow, type PrintOutcome } from \"./core\";\nimport { escapeHtml } from \"@ai-matrx/kit/html-escape\";\nimport {\n MARKDOWN_ARTICLE_CSS,\n MARKDOWN_ARTICLE_TOKENS_CSS,\n MARKDOWN_DOCUMENT_CSS,\n MARKDOWN_DOCUMENT_TOKENS_CSS,\n MARKDOWN_PAGE_CSS,\n MARKDOWN_PAGE_PLAIN_CSS,\n MARKDOWN_SHARED_CSS,\n} from \"./markdown-css\";\nimport {\n PAGE_BREAK_CLASS,\n PAGE_BREAK_LABEL,\n PAGE_BREAK_MARKDOWN,\n isBibliographyLine,\n isBreakLine,\n isPageBreakLine,\n isTocLine,\n splitAtPageBreaks,\n} from \"./directives\";\n\nexport {\n MARKDOWN_ARTICLE_CSS,\n MARKDOWN_ARTICLE_TOKENS_CSS,\n MARKDOWN_DOCUMENT_CSS,\n MARKDOWN_DOCUMENT_TOKENS_CSS,\n MARKDOWN_PAGE_CSS,\n MARKDOWN_SHARED_CSS,\n PAGE_BREAK_CLASS,\n PAGE_BREAK_MARKDOWN,\n isPageBreakLine,\n splitAtPageBreaks,\n};\n\n/** Which shipped look to render markdown in. */\nexport type MarkdownSkin = \"document\" | \"article\";\n\n/**\n * A thing the converter could not represent, with the remedy. Announced, never\n * swallowed — a dropped card that says nothing is indistinguishable from a card\n * the author never wrote.\n */\nexport interface MarkdownNotice {\n code: \"flashcard-malformed\" | \"empty-output\" | \"html-stripped\";\n message: string;\n /** What the caller (or the author of the markdown) should do about it. */\n remedy: string;\n}\n\nexport interface MarkdownToHtmlOptions {\n /** Keep `<thinking>` / `<think>` / `<reasoning>` blocks. Default: false. */\n includeThinking?: boolean;\n /** Where dropped/degraded content is announced. */\n onNotice?: (notice: MarkdownNotice) => void;\n}\n\n// ─── thinking-block stripping ────────────────────────────────────────────────\n\n/**\n * Strip `<thinking>` / `<think>` / `<reasoning>` blocks from model output.\n *\n * All three tags are treated as equivalent — a host that handled only\n * `<thinking>` leaked raw reasoning into printed documents the moment a model\n * switched tag names, which is exactly the bug this package exists to stop\n * being re-solved per app.\n */\nexport function removeThinkingContent(content: string): string {\n if (!content) return \"\";\n\n let result = content\n .replace(/\\n*<thinking>[\\s\\S]*?<\\/thinking>\\n*/gi, \"\\n\")\n .replace(/\\n*<think>[\\s\\S]*?<\\/think>\\n*/gi, \"\\n\")\n .replace(/\\n*<reasoning>[\\s\\S]*?<\\/reasoning>\\n*/gi, \"\\n\");\n\n // 3+ newlines collapse to 2 — intentional paragraph breaks survive.\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n return result.trim();\n}\n\n/** Does this content carry any reasoning block? */\nexport function hasThinkingContent(content: string): boolean {\n if (!content) return false;\n return /<thinking>|<think>|<reasoning>/i.test(content);\n}\n\n// ─── shared machinery: ONE pre-pass, ONE table/list/rule grammar ────────────\n//\n// Both skins used to carry their own table parser, their own list builder,\n// their own rule regex, and their own (or no) code-fence handling — and they\n// had drifted: the article skin had no nested lists, the document skin ran the\n// emphasis pass over code, neither understood a page break, and both pasted an\n// `<artifact>`'s raw HTML (its <html>, <body> and <script>) straight into the\n// host page. Everything below is shared; a skin supplies only class names and\n// the HTML for a code block / flashcard deck.\n\n// Private-use delimiters: they cannot collide with author text (the input is\n// scrubbed of them first) and no markdown pass treats them as syntax.\nconst TOKEN_OPEN = \"\\uE000\";\nconst TOKEN_CLOSE = \"\\uE001\";\nconst BLOCK_TOKEN = (i: number): string => `${TOKEN_OPEN}B${i}${TOKEN_CLOSE}`;\nconst INLINE_TOKEN = (i: number): string => `${TOKEN_OPEN}I${i}${TOKEN_CLOSE}`;\nconst TOKEN_RE = /\\uE000([BI])(\\d+)\\uE001/g;\nconst PARAGRAPH_WRAPPED_BLOCK_RE = /<p[^>]*>\\s*(\\uE000B\\d+\\uE001)\\s*<\\/p>/g;\n\n/** Converted HTML parked behind a placeholder so later passes cannot touch it. */\nclass Stash {\n private readonly items: string[] = [];\n\n block(html: string): string {\n return BLOCK_TOKEN(this.items.push(html) - 1);\n }\n\n inline(html: string): string {\n return INLINE_TOKEN(this.items.push(html) - 1);\n }\n\n restore(html: string): string {\n // Items can hold tokens of their own (inline code inside a link), so\n // restore until nothing is left — bounded, since items never self-nest.\n let out = html;\n for (let pass = 0; pass < 8 && out.includes(TOKEN_OPEN); pass++) {\n out = out\n .replace(PARAGRAPH_WRAPPED_BLOCK_RE, \"$1\")\n .replace(TOKEN_RE, (_m: string, _k: string, i: string) => this.items[Number(i)] ?? \"\");\n }\n return out;\n }\n}\n\ninterface SkinGrammar {\n skin: MarkdownSkin;\n table: string;\n thead: string;\n tbody: string;\n tr: string;\n th: string;\n td: string;\n ul: string;\n ol: string;\n ulNested: string;\n olNested: string;\n li: string;\n hr: string;\n del: string;\n strong: string;\n em: string;\n inlineCode: string;\n}\n\nconst DOCUMENT_GRAMMAR: SkinGrammar = {\n skin: \"document\",\n table: \"matrx-table\",\n thead: \"matrx-table-head\",\n tbody: \"matrx-table-body\",\n tr: \"matrx-table-row\",\n th: \"matrx-table-header\",\n td: \"matrx-table-cell\",\n ul: \"matrx-list matrx-bullet-list\",\n ol: \"matrx-list matrx-numbered-list\",\n ulNested: \"matrx-list matrx-bullet-list matrx-nested-list\",\n olNested: \"matrx-list matrx-numbered-list matrx-nested-list\",\n li: \"matrx-list-item\",\n hr: \"matrx-hr\",\n del: \"matrx-del\",\n strong: \"matrx-strong\",\n em: \"matrx-em\",\n inlineCode: \"matrx-inline-code\",\n};\n\nconst ARTICLE_GRAMMAR: SkinGrammar = {\n skin: \"article\",\n table: \"print-table\",\n thead: \"\",\n tbody: \"\",\n tr: \"\",\n th: \"\",\n td: \"\",\n ul: \"\",\n ol: \"\",\n ulNested: \"\",\n olNested: \"\",\n li: \"\",\n hr: \"\",\n del: \"\",\n strong: \"\",\n em: \"\",\n inlineCode: \"inline-code\",\n};\n\nconst cls = (...names: string[]): string => {\n const joined = names.filter(Boolean).join(\" \");\n return joined ? ` class=\"${joined}\"` : \"\";\n};\n\n/** The rendered page break — identical markup in both skins. */\nconst PAGE_BREAK_HTML = `<div class=\"${PAGE_BREAK_CLASS}\" role=\"separator\" aria-label=\"${PAGE_BREAK_LABEL}\" data-label=\"${PAGE_BREAK_LABEL}\"></div>`;\n\nfunction codeBlockHtml(g: SkinGrammar, code: string, language: string): string {\n const body = escapeHtml(code.replace(/\\n$/, \"\"));\n const lang = language.trim();\n if (g.skin === \"article\") {\n const label = lang ? `<span class=\"code-lang\">${escapeHtml(lang)}</span>` : \"\";\n return `<div class=\"code-block-wrapper\">${label}<pre class=\"code-block\"><code>${body}</code></pre></div>`;\n }\n const dataLang = lang ? ` data-language=\"${escapeHtml(lang)}\"` : \"\";\n return `<pre class=\"matrx-code-block\"${dataLang}><code class=\"matrx-code\">${body}</code></pre>`;\n}\n\n// ── artifacts ───────────────────────────────────────────────────────────────\n\n/** Artifact types whose body is source code, printed as its source. */\nconst CODE_ARTIFACT_LANGUAGE: Readonly<Record<string, string>> = {\n html: \"html\",\n react: \"tsx\",\n svg: \"svg\",\n mermaid: \"mermaid\",\n diff: \"diff\",\n iframe: \"html\",\n code: \"\",\n};\n\nconst ARTIFACT_TYPE_LABEL: Readonly<Record<string, string>> = {\n html: \"HTML\",\n svg: \"SVG\",\n react: \"React\",\n iframe: \"Embed\",\n};\n\nfunction parseTagAttributes(tag: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n for (const m of tag.matchAll(/([a-zA-Z_][\\w-]*)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/g)) {\n attrs[(m[1] as string).toLowerCase()] = m[2] ?? m[3] ?? \"\";\n }\n return attrs;\n}\n\nfunction artifactLabel(type: string): string {\n if (!type) return \"Artifact\";\n return (\n ARTIFACT_TYPE_LABEL[type] ??\n type.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n );\n}\n\nfunction looksLikeJson(body: string): boolean {\n const t = body.trim();\n if (!/^[[{]/.test(t)) return false;\n try {\n JSON.parse(t);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * An `<artifact type id version title>body</artifact>` block, rendered as a\n * titled panel. Source-code artifacts (html, react, svg, mermaid, diff, code)\n * and JSON bodies print as escaped source — never as live markup, which is\n * what used to inject a whole `<html>…<script>` document into the host page.\n * Everything else (checklists, flashcards, research, notes) is markdown and is\n * converted in the same skin.\n */\nfunction artifactHtml(\n g: SkinGrammar,\n attrs: Record<string, string>,\n body: string | null,\n ctx: ConvertContext,\n): string {\n const type = (attrs.type ?? \"\").toLowerCase();\n const title = attrs.title?.trim() ?? \"\";\n const header = `<div class=\"matrx-artifact-header\"><span class=\"matrx-artifact-kind\">${escapeHtml(\n artifactLabel(type),\n )}</span>${title ? `<span class=\"matrx-artifact-title\">${escapeHtml(title)}</span>` : \"\"}</div>`;\n\n let inner: string;\n const trimmed = (body ?? \"\").replace(/^\\n+|\\n+$/g, \"\");\n if (body === null || !trimmed.trim()) {\n inner = `<p class=\"matrx-artifact-empty\">Saved artifact — open it in AI Matrx to view its content.</p>`;\n } else if (/^\\s*(`{3,}|~{3,})/.test(trimmed)) {\n inner = convertBody(g.skin, trimmed, ctx);\n } else if (type in CODE_ARTIFACT_LANGUAGE) {\n inner = codeBlockHtml(g, trimmed, CODE_ARTIFACT_LANGUAGE[type] || attrs.language || attrs.lang || \"\");\n } else if (looksLikeJson(trimmed)) {\n inner = codeBlockHtml(g, JSON.stringify(JSON.parse(trimmed), null, 2), \"json\");\n } else {\n inner = convertBody(g.skin, trimmed, ctx);\n }\n\n return `<section class=\"matrx-artifact\" data-artifact-type=\"${escapeHtml(type || \"artifact\")}\">${header}<div class=\"matrx-artifact-body\">${inner}</div></section>`;\n}\n\n// ── flashcards ──────────────────────────────────────────────────────────────\n\ninterface ParsedCard {\n front: string;\n back: string;\n}\n\nfunction parseFlashcards(content: string, notice: MarkdownToHtmlOptions[\"onNotice\"]): ParsedCard[] {\n const cards: ParsedCard[] = [];\n for (const card of content.split(/\\n*---\\n*/g).map((c) => c.trim()).filter(Boolean)) {\n const front = card.match(/Front:\\s*(.+?)(?=\\n|$)/i)?.[1]?.trim();\n const back = card.match(/Back:\\s*([\\s\\S]+?)$/i)?.[1]?.trim();\n if (!front || !back) {\n // A card that silently disappears from a printed deck is a defect the\n // printer can see and the author cannot.\n notice?.({\n code: \"flashcard-malformed\",\n message: `A flashcard was skipped: it is missing a ${front ? \"Back:\" : \"Front:\"} line.`,\n remedy:\n 'Every card inside <flashcards> needs both \"Front: …\" and \"Back: …\", separated from the next card by ---.',\n });\n continue;\n }\n cards.push({ front, back });\n }\n return cards;\n}\n\nfunction flashcardsHtml(g: SkinGrammar, cards: ParsedCard[], ctx: ConvertContext): string {\n if (g.skin === \"article\") {\n // Paper cannot flip: print the deck as question / answer pairs.\n return `<div class=\"matrx-flashcards-print\">${cards\n .map(\n (c, i) =>\n `<div class=\"matrx-fc\"><div class=\"matrx-fc-front\"><span class=\"matrx-fc-num\">${\n i + 1\n }</span>${c.front}</div><div class=\"matrx-fc-back\">${c.back}</div></div>`,\n )\n .join(\"\")}</div>`;\n }\n let out = '<div class=\"matrx-flashcards-container\">\\n';\n for (const { front, back } of cards) {\n ctx.cardIndex++;\n const cardId = `card${ctx.cardIndex}`;\n out += ` <div class=\"matrx-flashcard\">\n <input type=\"checkbox\" class=\"matrx-flashcard-input\" id=\"${cardId}\">\n <label for=\"${cardId}\" class=\"matrx-flashcard-label\"></label>\n <div class=\"matrx-flashcard-inner\">\n <div class=\"matrx-flashcard-front\">\n <div class=\"matrx-flashcard-content\">\n <strong>${front}</strong>\n </div>\n <span class=\"matrx-flashcard-indicator\">CLICK TO FLIP</span>\n </div>\n <div class=\"matrx-flashcard-back\">\n <div class=\"matrx-flashcard-content\">\n ${back}\n </div>\n <span class=\"matrx-flashcard-indicator\">CLICK TO FLIP</span>\n </div>\n </div>\n </div>\n\n`;\n }\n return `${out}</div>\\n`;\n}\n\n// ── the pre-pass ────────────────────────────────────────────────────────────\n\ninterface ConvertContext {\n options: MarkdownToHtmlOptions;\n depth: number;\n cardIndex: number;\n strippedAnnounced: boolean;\n}\n\nconst FENCE_OPEN = /^(\\s*)(`{3,}|~{3,})\\s*([^\\s`]*)[^`]*$/;\n\n/**\n * Pull every region the markdown passes must not touch out of the text:\n * fenced code, `<artifact>` blocks, page-break directives, `<flashcards>`,\n * inline code — and remove what must never reach a printed page (scripts,\n * styles, a document shell, HTML comments). Returns the text with\n * placeholders; `stash.restore` puts the finished HTML back.\n */\nfunction protectRegions(markdown: string, g: SkinGrammar, stash: Stash, ctx: ConvertContext): string {\n const lines = markdown.split(/\\r?\\n/);\n const out: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] as string;\n\n // Fenced code (``` or ~~~, any indent, unclosed = to the end).\n const fence = FENCE_OPEN.exec(line);\n if (fence) {\n const marker = fence[2] as string;\n const code: string[] = [];\n let j = i + 1;\n for (; j < lines.length; j++) {\n const close = /^\\s*(`{3,}|~{3,})\\s*$/.exec(lines[j] as string);\n if (close && (close[1] as string)[0] === marker[0] && (close[1] as string).length >= marker.length) break;\n code.push(lines[j] as string);\n }\n const indent = (fence[1] as string).length;\n const dedented = code.map((l) => l.slice(Math.min(indent, l.length - l.trimStart().length)));\n out.push(stash.block(codeBlockHtml(g, dedented.join(\"\\n\"), fence[3] ?? \"\")));\n i = j;\n continue;\n }\n\n if (isBreakLine(line)) {\n out.push(stash.block(PAGE_BREAK_HTML));\n continue;\n }\n // Placement directives only mean something to the document pipeline\n // (@ai-matrx/print/document); a skin never prints them as literal text.\n if (isTocLine(line) || isBibliographyLine(line)) continue;\n\n // <artifact …>body</artifact> — the canonical materialized wire form.\n const open = /^\\s*<artifact\\b((?:[^>\"']|\"[^\"]*\"|'[^']*')*?)(\\/?)>(.*)$/i.exec(line);\n if (open) {\n const attrs = parseTagAttributes(open[1] ?? \"\");\n if (open[2] === \"/\") {\n out.push(stash.block(artifactHtml(g, attrs, null, ctx)));\n if (open[3]?.trim()) out.push(open[3]);\n continue;\n }\n const bodyLines: string[] = [];\n let rest = open[3] ?? \"\";\n let after = \"\";\n let j = i;\n let inFence: string | null = null;\n for (;;) {\n const closeAt = inFence ? -1 : rest.search(/<\\/artifact\\s*>/i);\n if (closeAt >= 0) {\n bodyLines.push(rest.slice(0, closeAt));\n after = rest.slice(closeAt).replace(/^<\\/artifact\\s*>/i, \"\");\n break;\n }\n bodyLines.push(rest);\n const f = /^\\s*(`{3,}|~{3,})/.exec(rest);\n if (f) {\n const m = f[1] as string;\n if (inFence === null) inFence = m;\n else if (m[0] === inFence[0] && m.length >= inFence.length) inFence = null;\n }\n j++;\n if (j >= lines.length) break;\n rest = lines[j] as string;\n }\n const html =\n ctx.depth >= 3\n ? codeBlockHtml(g, bodyLines.join(\"\\n\"), \"\")\n : artifactHtml(g, attrs, bodyLines.join(\"\\n\"), { ...ctx, depth: ctx.depth + 1 });\n out.push(stash.block(html));\n if (after.trim()) out.push(after);\n i = j;\n continue;\n }\n\n out.push(line);\n }\n\n let text = out.join(\"\\n\");\n\n // Inline code FIRST: prose about HTML (\"put it in a `<script>` tag\") must\n // reach the page as code, not be read as markup by the passes below.\n text = text.replace(/`([^`\\n]+)`/g, (_m: string, code: string) =>\n stash.inline(`<code${cls(g.inlineCode)}>${escapeHtml(code)}</code>`),\n );\n\n // Comments are invisible by definition — page-break comments were already\n // taken above, so what remains is safe to drop without a notice.\n text = text.replace(/<!--[\\s\\S]*?-->/g, \"\");\n\n // A printed page and a published HTML page are not a place to run someone\n // else's script or restyle the host. Paired regions go whole; a stray\n // opening/closing tag goes alone (never \"everything to the end\"). Repeat\n // until stable so a split `<scr<script></script>ipt>` cannot reassemble.\n const before = text;\n for (let pass = 0; pass < 8; pass++) {\n const next = text\n .replace(/<(script|style|head)\\b[^>]*>[\\s\\S]*?<\\/\\1\\s*>/gi, \"\")\n .replace(/<\\/?(?:script|style|head|html|body)\\b[^>]*>/gi, \"\")\n .replace(/<!DOCTYPE[^>]*>/gi, \"\");\n if (next === text) break;\n text = next;\n }\n text = sanitizeRawTags(text);\n if (text !== before && !ctx.strippedAnnounced) {\n ctx.strippedAnnounced = true;\n ctx.options.onNotice?.({\n code: \"html-stripped\",\n message:\n \"Unsafe or page-level markup (a <script>, <style>, <head>, an <html>/<body> shell, an on… event handler, or a javascript: URL) was removed from the rendered copy.\",\n remedy:\n 'To show a full HTML page, put it in an ```html fence or an <artifact type=\"html\"> block — it is printed as its source.',\n });\n }\n\n // Flashcard decks — behind placeholders so no markdown pass re-processes them.\n text = text.replace(/<flashcards>([\\s\\S]*?)<\\/flashcards>/gi, (_m: string, content: string) => {\n const cards = parseFlashcards(content, ctx.options.onNotice);\n return cards.length ? `\\n${stash.block(flashcardsHtml(g, cards, ctx))}\\n` : \"\";\n });\n\n return text;\n}\n\nconst URL_ATTRS = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\", \"poster\", \"background\"]);\n\nfunction decodeForSchemeCheck(value: string): string {\n return value\n .replace(/&#x([0-9a-f]+);?/gi, (_m: string, h: string) => String.fromCharCode(parseInt(h, 16)))\n .replace(/&#(\\d+);?/g, (_m: string, d: string) => String.fromCharCode(Number(d)))\n .replace(/:/gi, \":\")\n .replace(/[\\u0000-\\u0020]+/g, \"\")\n .toLowerCase();\n}\n\n/**\n * Author raw HTML survives (the document skin feeds WordPress), but never with\n * an `on…` handler, a `srcdoc`, or a script-scheme URL — entity- and\n * whitespace-obfuscated forms included.\n */\nfunction sanitizeRawTags(text: string): string {\n return text.replace(\n /<([a-zA-Z][\\w:-]*)((?:[^>\"']|\"[^\"]*\"|'[^']*')*)>/g,\n (whole: string, tag: string, rawAttrs: string) => {\n if (!/[=\\s]/.test(rawAttrs)) return whole;\n let changed = false;\n const attrs = rawAttrs.replace(\n /(\\s+)([^\\s\"'=<>/]+)(\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'>]+)))?/g,\n (m: string, _sp: string, name: string, _eq: string, dq?: string, sq?: string, bare?: string) => {\n const lower = name.toLowerCase();\n if (lower.startsWith(\"on\") || lower === \"srcdoc\") {\n changed = true;\n return \"\";\n }\n if (URL_ATTRS.has(lower)) {\n const value = decodeForSchemeCheck(dq ?? sq ?? bare ?? \"\");\n if (/^(?:javascript|vbscript):|^data:text\\/html/.test(value)) {\n changed = true;\n return ` ${name}=\"#\"`;\n }\n }\n return m;\n },\n );\n return changed ? `<${tag}${attrs}>` : whole;\n },\n );\n}\n\n/** A URL that can go in an attribute: no script schemes, no attribute breakout. */\nfunction safeUrl(url: string): string {\n const u = url.trim();\n if (/^(?:javascript|vbscript):|^data:text\\/html/.test(decodeForSchemeCheck(u))) return \"#\";\n return u.replace(/\"/g, \"%22\");\n}\n\n/**\n * Bold / italic / strikethrough, shared by both skins. Underscores follow the\n * CommonMark intraword rule — `snake_case_name` stays literal.\n */\nfunction convertEmphasis(html: string, g: SkinGrammar): string {\n const strong = `<strong${cls(g.strong)}>`;\n const em = `<em${cls(g.em)}>`;\n return html\n .replace(/\\*\\*\\*(?!\\s)(.+?)(?<!\\s)\\*\\*\\*/g, `${strong}${em}$1</em></strong>`)\n .replace(/\\*\\*(?!\\s)(.+?)(?<!\\s)\\*\\*/g, `${strong}$1</strong>`)\n .replace(/(?<![\\w*])\\*(?![\\s*])(.+?)(?<![\\s*])\\*(?![\\w*])/g, `${em}$1</em>`)\n .replace(/(?<![\\w_])___(?!\\s)(.+?)(?<!\\s)___(?![\\w_])/g, `${strong}${em}$1</em></strong>`)\n .replace(/(?<![\\w_])__(?!\\s)(.+?)(?<!\\s)__(?![\\w_])/g, `${strong}$1</strong>`)\n .replace(/(?<![\\w_])_(?![\\s_])(.+?)(?<![\\s_])_(?![\\w_])/g, `${em}$1</em>`)\n .replace(/~~(?!\\s)(.+?)(?<!\\s)~~/g, `<del${cls(g.del)}>$1</del>`);\n}\n\n/** `[text](url)` / `` with one level of parentheses in the URL. */\nconst LINK_URL = String.raw`((?:[^()\\s]|\\([^()\\s]*\\))+)(?:\\s+\"[^\"]*\")?`;\nconst IMAGE_RE = new RegExp(String.raw`!\\[([^\\]]*)\\]\\(` + LINK_URL + String.raw`\\)`, \"g\");\nconst LINK_RE = new RegExp(String.raw`\\[([^\\]]+)\\]\\(` + LINK_URL + String.raw`\\)`, \"g\");\n\n/** `***` accent rule, `#===` heavy rule, `---` / `___` plain rule. */\nfunction convertRules(html: string, g: SkinGrammar): string {\n return html\n .replace(/^\\s{0,3}#\\s*={3,}\\s*$/gm, `<hr${cls(g.hr, \"matrx-hr-heavy\")}>`)\n .replace(/^\\s{0,3}\\*(?:\\s*\\*){2,}\\s*$/gm, `<hr${cls(g.hr, \"matrx-hr-accent\")}>`)\n .replace(/^\\s{0,3}(?:-\\s*){3,}$/gm, `<hr${cls(g.hr)}>`)\n .replace(/^\\s{0,3}(?:_\\s*){3,}$/gm, `<hr${cls(g.hr)}>`);\n}\n\nfunction splitTableRow(row: string): string[] {\n let r = row.trim();\n if (r.startsWith(\"|\")) r = r.slice(1);\n if (r.endsWith(\"|\") && !r.endsWith(\"\\\\|\")) r = r.slice(0, -1);\n return r.split(/(?<!\\\\)\\|/).map((c) => c.trim().replace(/\\\\\\|/g, \"|\"));\n}\n\nfunction cellAlign(separator: string): string {\n const s = separator.trim();\n const left = s.startsWith(\":\");\n const right = s.endsWith(\":\");\n if (left && right) return ' style=\"text-align:center\"';\n if (right) return ' style=\"text-align:right\"';\n return \"\";\n}\n\n/** GFM tables — empty cells kept (columns never shift), `:---:` alignment honoured. */\nfunction convertTables(html: string, g: SkinGrammar): string {\n const tableRegex = /^(\\|.*\\|)\\s*\\n(\\|[-\\s:|]*\\|)\\s*\\n((?:\\|.*\\|\\s*\\n?)*)/gm;\n return html.replace(\n tableRegex,\n (_m: string, headerRow: string, separatorRow: string, bodyRows: string) => {\n const headers = splitTableRow(headerRow);\n const aligns = splitTableRow(separatorRow).map(cellAlign);\n const rows = bodyRows\n .trim()\n .split(\"\\n\")\n .filter((r) => r.trim())\n .map(splitTableRow);\n\n let t = `<table${cls(g.table)}>\\n<thead${cls(g.thead)}>\\n<tr${cls(g.tr)}>\\n`;\n headers.forEach((h, i) => {\n t += `<th${cls(g.th)}${aligns[i] ?? \"\"}>${h}</th>\\n`;\n });\n t += \"</tr>\\n</thead>\\n\";\n if (rows.length > 0) {\n t += `<tbody${cls(g.tbody)}>\\n`;\n for (const row of rows) {\n t += `<tr${cls(g.tr)}>\\n`;\n row.forEach((c, i) => {\n t += `<td${cls(g.td)}${aligns[i] ?? \"\"}>${c}</td>\\n`;\n });\n t += \"</tr>\\n\";\n }\n t += \"</tbody>\\n\";\n }\n return `${t}</table>\\n`;\n },\n );\n}\n\ninterface OpenList {\n type: \"ul\" | \"ol\";\n indent: number;\n}\n\n/** Nested ordered/bullet lists — indentation-driven open/close bookkeeping. */\nfunction convertLists(html: string, g: SkinGrammar): string {\n const lines = html.split(\"\\n\");\n let processed = \"\";\n const listStack: OpenList[] = [];\n let lastListItem: \"\" | \"ul\" | \"ol\" = \"\";\n const li = `<li${cls(g.li)}>`;\n\n const top = (): OpenList | undefined => listStack[listStack.length - 1];\n const openTag = (type: \"ul\" | \"ol\", nested: boolean): string =>\n type === \"ol\"\n ? `<ol${cls(nested ? g.olNested : g.ol)}>\\n`\n : `<ul${cls(nested ? g.ulNested : g.ul)}>\\n`;\n\n const popOne = (): void => {\n if (lastListItem) {\n processed += \"</li>\\n\";\n lastListItem = \"\";\n }\n const closing = listStack.pop();\n if (!closing) return;\n processed += closing.type === \"ol\" ? \"</ol>\\n\" : \"</ul>\\n\";\n if (listStack.length > 0) processed += \"</li>\\n\";\n };\n\n const closeDeeperThan = (indent: number): void => {\n while (listStack.length > 0 && (top() as OpenList).indent > indent) popOne();\n };\n\n for (const line of lines) {\n const numbered = line.match(/^(\\s*)(\\d+)[.)]\\s+(.+)$/);\n const bullet = numbered ? null : line.match(/^(\\s*)[*\\-+]\\s+(.+)$/);\n if (numbered || bullet) {\n const type: \"ul\" | \"ol\" = numbered ? \"ol\" : \"ul\";\n const indent = ((numbered ?? bullet) as RegExpMatchArray)[1]?.length ?? 0;\n const content = (numbered ? numbered[3] : (bullet as RegExpMatchArray)[2]) ?? \"\";\n const current = top();\n\n if (current && indent > current.indent) {\n processed += `\\n${openTag(type, true)}`;\n listStack.push({ type, indent });\n } else {\n closeDeeperThan(indent);\n if (lastListItem && top()?.indent === indent) processed += \"</li>\\n\";\n const now = top();\n if (now && now.indent === indent && now.type !== type) {\n // Same depth, other list type: close the old list, open the new one.\n const closing = listStack.pop() as OpenList;\n processed += closing.type === \"ol\" ? \"</ol>\\n\" : \"</ul>\\n\";\n }\n const after = top();\n if (!after || after.indent !== indent || after.type !== type) {\n processed += openTag(type, listStack.length > 0);\n listStack.push({ type, indent });\n }\n }\n processed += `${li}${content}`;\n lastListItem = type;\n continue;\n }\n\n if (line.trim() !== \"\") {\n while (listStack.length > 0) popOne();\n }\n processed += `${line}\\n`;\n }\n while (listStack.length > 0) popOne();\n\n // GFM task items: `- [ ] todo` / `- [x] done` print as real boxes.\n return processed.replace(\n /<li( class=\"([^\"]*)\")?>\\s*\\[([ xX])\\]\\s+/g,\n (_m: string, _c: string | undefined, classes: string | undefined, mark: string) =>\n `<li${cls(classes ?? \"\", \"matrx-task-item\")}><span class=\"matrx-task-box${\n mark === \" \" ? \"\" : \" is-checked\"\n }\" aria-hidden=\"true\"></span>`,\n );\n}\n\nfunction convertBody(skin: MarkdownSkin, markdown: string, ctx: ConvertContext): string {\n return skin === \"article\" ? articleBody(markdown, ctx) : documentBody(markdown, ctx);\n}\n\n/** Author text can never forge a placeholder. */\nfunction scrubTokens(markdown: string): string {\n return markdown.replace(/[\\uE000\\uE001]/g, \"\");\n}\n\nfunction newContext(options: MarkdownToHtmlOptions): ConvertContext {\n return { options, depth: 0, cardIndex: 0, strippedAnnounced: false };\n}\n\n// ─── document skin: markdown → `.matrx-*` HTML ───────────────────────────────\n\n/**\n * markdown → `.matrx-*`-classed HTML wrapped in `.matrx-content-container`.\n *\n * The class vocabulary is deliberate and non-configurable: it is what\n * `MARKDOWN_DOCUMENT_CSS` styles, what the PDF lane renders, and what a\n * WordPress theme targets. Handles (in this order, because the order is the\n * whole trick): the shared pre-pass (code, artifacts, page breaks, flashcards,\n * inline code, unsafe page markup) → rules → images → links → headings →\n * emphasis → nested/task lists → blockquotes → tables → block elements →\n * paragraphs → FAQ promotion → placeholder restoration.\n */\nexport function markdownToHtml(\n markdown: string,\n options: MarkdownToHtmlOptions = {},\n): string {\n if (!markdown) {\n options.onNotice?.({\n code: \"empty-output\",\n message: \"markdownToHtml received an empty string.\",\n remedy: \"Check the content is loaded before converting; nothing was rendered.\",\n });\n return \"\";\n }\n const source = scrubTokens(options.includeThinking ? markdown : removeThinkingContent(markdown));\n return `<div class=\"matrx-content-container\">${documentBody(source, newContext(options))}</div>`;\n}\n\nfunction documentBody(markdown: string, ctx: ConvertContext): string {\n const g = DOCUMENT_GRAMMAR;\n const stash = new Stash();\n let html = protectRegions(markdown, g, stash, ctx);\n\n // Rules before headings/lists so `---` / `#===` / `***` are never eaten.\n html = convertRules(html, g);\n\n // Images BEFORE links — `` is a superset of `[a](u)`.\n html = html.replace(IMAGE_RE, (_m: string, alt: string, url: string) =>\n stash.block(`<img class=\"matrx-image\" src=\"${safeUrl(url)}\" alt=\"${escapeHtml(alt)}\" />`),\n );\n html = html.replace(LINK_RE, (_m: string, text: string, url: string) =>\n stash.inline(`<a class=\"matrx-link\" href=\"${safeUrl(url)}\">${convertEmphasis(text, g)}</a>`),\n );\n\n html = html\n .replace(/^# (.+)$/gm, '<h1 class=\"matrx-h1\">$1</h1>')\n .replace(/^## (.+)$/gm, '<h2 class=\"matrx-h2\">$1</h2>')\n .replace(/^### (.+)$/gm, '<h3 class=\"matrx-h3\">$1</h3>')\n .replace(/^#### (.+)$/gm, '<h4 class=\"matrx-h4\">$1</h4>')\n .replace(/^##### (.+)$/gm, '<h5 class=\"matrx-h5\">$1</h5>')\n .replace(/^###### (.+)$/gm, '<h6 class=\"matrx-h6\">$1</h6>');\n\n // Lists BEFORE emphasis, so a bullet opening with bold (`* **A** and *b*`)\n // is still a bullet.\n html = convertLists(html, g);\n html = convertEmphasis(html, g);\n\n html = html.replace(/^> ?(.+)$/gm, '<blockquote class=\"matrx-blockquote\">$1</blockquote>');\n\n html = convertTables(html, g);\n\n html = html\n .replace(/<table>/g, '<table class=\"matrx-table\">')\n .replace(/<thead>/g, '<thead class=\"matrx-table-head\">')\n .replace(/<tbody>/g, '<tbody class=\"matrx-table-body\">')\n .replace(/<tr>/g, '<tr class=\"matrx-table-row\">')\n .replace(/<th>/g, '<th class=\"matrx-table-header\">')\n .replace(/<td>/g, '<td class=\"matrx-table-cell\">');\n\n html = html.replace(/<img(?![^>]*class=)([^>]*)>/g, '<img class=\"matrx-image\"$1>');\n // Author divs join the vocabulary without losing their own class\n // (the old rewrite emitted two class attributes and the browser kept one).\n html = html.replace(/<div\\b([^>]*)>/g, (m: string, attrs: string) => {\n if (/\\bclass=\"matrx-/.test(attrs)) return m;\n if (/\\bclass=\"/.test(attrs)) return `<div${attrs.replace(/\\bclass=\"/, 'class=\"matrx-div ')}>`;\n return `<div class=\"matrx-div\"${attrs}>`;\n });\n html = html.replace(/<span(?![^>]*class=)([^>]*)>/g, '<span class=\"matrx-span\"$1>');\n\n html = html.replace(/^([^<\\n].+)$/gm, '<p class=\"matrx-paragraph\">$1</p>');\n html = html.replace(/<\\/p>\\s*<p class=\"matrx-paragraph\">/g, '</p><p class=\"matrx-paragraph\">');\n\n // Intro paragraph (first <p> after the h1) — before FAQ promotion.\n html = html.replace(\n /(<h1 class=\"matrx-h1\">[\\s\\S]*?<\\/h1>\\s*)<p class=\"matrx-paragraph\">((?:(?!\\uE000B)[\\s\\S])*?)<\\/p>/g,\n '$1<p class=\"matrx-intro\">$2</p>',\n );\n\n // FAQ promotion: bold questions and question headings become FAQ items.\n html = html.replace(\n /^<strong class=\"matrx-strong\">([^<]*\\?[^<]*)<\\/strong>$/gm,\n '<h3 class=\"matrx-h3\">$1</h3>',\n );\n html = html.replace(\n /<p class=\"matrx-paragraph\"><strong class=\"matrx-strong\">([^<]*\\?[^<]*)<\\/strong><\\/p>/g,\n '<h3 class=\"matrx-h3\">$1</h3>',\n );\n html = html.replace(\n /<h3 class=\"matrx-h3\">([^<]*\\?[^<]*)<\\/h3>/g,\n '<div class=\"matrx-faq-question\">$1</div>',\n );\n html = html.replace(\n /(<div class=\"matrx-faq-question\">[^<]*<\\/div>)\\s*(<p class=\"matrx-paragraph\">[\\s\\S]*?<\\/p>)/g,\n '<div class=\"matrx-faq-item\">$1<div class=\"matrx-faq-answer\">$2</div></div>',\n );\n html = html.replace(\n /(<div class=\"matrx-faq-question\">[^<]*<\\/div>)(?!\\s*<div class=\"matrx-faq-answer\">)/g,\n '<div class=\"matrx-faq-item\">$1<div class=\"matrx-faq-answer\"></div></div>',\n );\n html = html.replace(\n /(<div class=\"matrx-faq-answer\">)<p class=\"matrx-paragraph\">([\\s\\S]*?)<\\/p>(<\\/div>)/g,\n \"$1$2$3\",\n );\n\n return stash.restore(html);\n}\n\n// ─── article skin: markdown → bare semantic HTML ─────────────────────────────\n\n/**\n * markdown → bare semantic HTML (`h1`…`h6`, `p`, `ul`/`ol`, `blockquote`,\n * `.code-block-wrapper`, `.print-table`) for the article skin.\n *\n * Code is HTML-escaped in both skins (the shared pre-pass); a print window\n * never re-escapes, so unescaped code would render as markup.\n */\nexport function markdownToArticleHtml(\n markdown: string,\n options: MarkdownToHtmlOptions = {},\n): string {\n if (!markdown) {\n options.onNotice?.({\n code: \"empty-output\",\n message: \"markdownToArticleHtml received an empty string.\",\n remedy: \"Check the content is loaded before printing; nothing was rendered.\",\n });\n return \"\";\n }\n const source = scrubTokens(options.includeThinking ? markdown : removeThinkingContent(markdown));\n return articleBody(source, newContext(options));\n}\n\nfunction articleBody(markdown: string, ctx: ConvertContext): string {\n const g = ARTICLE_GRAMMAR;\n const stash = new Stash();\n let html = protectRegions(markdown, g, stash, ctx);\n html = convertTables(html, g);\n html = convertRules(html, g);\n\n // Images BEFORE links — `` is a superset of `[a](u)`. Without this\n // pass an image fell through to the link pass and printed as a literal\n // \"!\" followed by a link (chat \"Print\", 2026-09-21).\n html = html.replace(IMAGE_RE, (_m: string, alt: string, url: string) =>\n stash.block(\n `<figure class=\"print-figure\"><img class=\"print-image\" src=\"${safeUrl(url)}\" alt=\"${escapeHtml(alt)}\" />${\n alt ? `<figcaption>${escapeHtml(alt)}</figcaption>` : \"\"\n }</figure>`,\n ),\n );\n html = html.replace(LINK_RE, (_m: string, text: string, url: string) =>\n stash.inline(`<a href=\"${safeUrl(url)}\">${convertEmphasis(text, g)}</a>`),\n );\n\n html = html\n .replace(/^#{6}\\s+(.+)$/gm, \"<h6>$1</h6>\")\n .replace(/^#{5}\\s+(.+)$/gm, \"<h5>$1</h5>\")\n .replace(/^#{4}\\s+(.+)$/gm, \"<h4>$1</h4>\")\n .replace(/^#{3}\\s+(.+)$/gm, \"<h3>$1</h3>\")\n .replace(/^#{2}\\s+(.+)$/gm, \"<h2>$1</h2>\")\n .replace(/^#{1}\\s+(.+)$/gm, \"<h1>$1</h1>\");\n\n html = html.replace(/^> ?(.+)$/gm, \"<blockquote>$1</blockquote>\");\n html = convertLists(html, g);\n html = convertEmphasis(html, g);\n\n html = html\n .split(\"\\n\")\n .map((line) => {\n const t = line.trim();\n if (!t) return \"\";\n if (\n /^<\\/?(h[1-6]|ul|ol|li|blockquote|pre|hr|table|thead|tbody|tr|th|td|div|figure|section)/.test(t) ||\n /^\\uE000B\\d+\\uE001$/.test(t)\n ) {\n return line;\n }\n return `<p>${t}</p>`;\n })\n .join(\"\\n\");\n\n return stash.restore(html).replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\n// ─── stylesheet + document composition ───────────────────────────────────────\n\n/**\n * The Print / Close action bar. The article sheet styles it already; the\n * document sheet is a content stylesheet with no chrome, so this ships beside\n * it — otherwise every host printing document-skin markdown gets two unstyled\n * browser buttons at the top of the page.\n */\nexport const PRINT_ACTIONS_CSS = `\n.print-actions { display: flex; gap: 10px; margin: 0 auto 28px; max-width: 800px; padding: 0 2rem 20px; border-bottom: 2px solid var(--matrx-print-border, #e1e1e1); }\n.print-btn { display: inline-flex; align-items: center; gap: 6px; padding: 8px 20px; border-radius: 8px; font-size: 13px; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; cursor: pointer; border: none; font-weight: 600; }\n.print-btn-primary { background: var(--matrx-print-accent, #667eea); color: var(--matrx-print-bg, #ffffff); }\n.print-btn-secondary { background: var(--matrx-print-surface, #f8f9fa); color: var(--matrx-print-fg-strong, #374151); border: 1px solid var(--matrx-print-border-muted, #d1d5db); }\n@media print { .print-actions { display: none !important; } }\n`;\n\nexport interface MarkdownStylesheetOptions {\n /** Which shipped look. Default: `\"document\"`. */\n skin?: MarkdownSkin;\n /**\n * Host brand overrides — a CSS string appended AFTER the package's default\n * token values, so `:root { --matrx-print-accent: #0f766e; }` wins. Token\n * VALUES are host-owned; the token CONTRACT and the structural CSS are not.\n */\n tokens?: string;\n /** Extra rules appended after everything else. */\n extraCss?: string;\n /**\n * Number printed pages (\"3 / 12\", bottom centre) via `@page` margin boxes.\n * Default: true. Page margins are set either way.\n */\n pageNumbers?: boolean;\n}\n\n/**\n * The complete default stylesheet for a skin: default token values, the\n * structural sheet, the rules both skins share (page breaks, artifacts, task\n * boxes, print hard parts), page geometry, then the host's overrides. Never returns an empty string.\n */\nexport function getMarkdownStylesheet(\n options: MarkdownStylesheetOptions = {},\n): string {\n const skin: MarkdownSkin = options.skin ?? \"document\";\n const base =\n skin === \"article\"\n ? `${MARKDOWN_ARTICLE_TOKENS_CSS}\\n${MARKDOWN_ARTICLE_CSS}`\n : `${MARKDOWN_DOCUMENT_TOKENS_CSS}\\n${MARKDOWN_DOCUMENT_CSS}`;\n const page = options.pageNumbers === false ? MARKDOWN_PAGE_PLAIN_CSS : MARKDOWN_PAGE_CSS;\n return [base, MARKDOWN_SHARED_CSS, page, options.tokens ?? \"\", options.extraCss ?? \"\"]\n .filter((part) => part.trim().length > 0)\n .join(\"\\n\");\n}\n\n/** Convert markdown with the converter that matches a skin. */\nexport function markdownToHtmlForSkin(\n markdown: string,\n skin: MarkdownSkin,\n options: MarkdownToHtmlOptions = {},\n): string {\n return skin === \"article\"\n ? markdownToArticleHtml(markdown, options)\n : markdownToHtml(markdown, options);\n}\n\nexport interface RenderMarkdownDocumentOptions extends MarkdownStylesheetOptions {\n title?: string;\n /** Override the shipped converter. The seam survives; it is no longer required. */\n convertToHtml?: (markdown: string) => string;\n /** Replace the whole stylesheet (not merely the tokens). */\n css?: string;\n onNotice?: (notice: MarkdownNotice) => void;\n /** Include the Print / Close action bar (hidden by `@media print`). */\n withPrintActions?: boolean;\n}\n\n/**\n * markdown → a complete, standalone, styled HTML document string.\n *\n * This is the one composition every lane uses — the print window, the PDF\n * capture host, and \"copy a full HTML page\". A host that builds its own\n * `<!DOCTYPE html>` wrapper around package CSS is re-implementing this.\n */\nexport function renderMarkdownDocument(\n markdown: string,\n options: RenderMarkdownDocumentOptions = {},\n): string {\n const skin: MarkdownSkin = options.skin ?? \"document\";\n const title = options.title ?? \"AI Response\";\n const convert =\n options.convertToHtml ??\n ((md: string) =>\n markdownToHtmlForSkin(\n md,\n skin,\n options.onNotice ? { onNotice: options.onNotice } : {},\n ));\n const bodyHtml = convert(markdown);\n const css =\n options.css ??\n getMarkdownStylesheet({\n skin,\n ...(options.tokens === undefined ? {} : { tokens: options.tokens }),\n ...(options.extraCss === undefined ? {} : { extraCss: options.extraCss }),\n });\n\n // The article sheet already styles the action bar; the document sheet is a\n // pure content stylesheet, so it gets the shared chrome appended.\n const chrome =\n options.withPrintActions && skin !== \"article\" ? PRINT_ACTIONS_CSS : \"\";\n\n const actions = options.withPrintActions\n ? '<div class=\"print-actions\"><button class=\"print-btn print-btn-primary\" onclick=\"window.print()\">Print / Save as PDF</button><button class=\"print-btn print-btn-secondary\" onclick=\"window.close()\">Close</button></div>'\n : \"\";\n\n return `<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1.0\"><title>${escapeHtml(\n title,\n )}</title>\n<style>${css}${chrome}</style></head>\n<body>${actions}<div class=\"content\">${bodyHtml}</div></body></html>`;\n}\n\nexport interface PrintMarkdownOptions extends RenderMarkdownDocumentOptions {\n /** Window features for the print window. */\n windowFeatures?: string;\n}\n\n/**\n * Open a print window for a markdown string, in one call.\n *\n * Returns the `PrintOutcome` so the host can tell the user when the popup was\n * blocked and the `.html` download fallback fired instead — a silent fallback\n * is indistinguishable from \"print did nothing\".\n */\nexport function printMarkdown(\n markdown: string,\n options: PrintMarkdownOptions = {},\n): PrintOutcome {\n const title = options.title ?? \"AI Response\";\n const doc = renderMarkdownDocument(markdown, {\n ...options,\n title,\n withPrintActions: options.withPrintActions ?? true,\n });\n return options.windowFeatures === undefined\n ? openPrintWindow(doc, title)\n : openPrintWindow(doc, title, options.windowFeatures);\n}\n","/**\n * Citations and the reference list — pandoc citation syntax over CSL-JSON\n * reference items, formatted in three built-in styles:\n *\n * apa APA 7th edition (author–date) (Smith & Jones, 2020, p. 4)\n * mla MLA 9th edition (author–page) (Smith and Jones 4)\n * chicago Chicago 17th, author–date (Smith and Jones 2020, 4)\n *\n * Syntax (pandoc): `[@smith2020]`, `[@smith2020, p. 4]`, `[@a; @b]`,\n * `[-@smith2020]` (suppress the author), and a bare `@smith2020` in running\n * text (narrative: \"Smith (2020)\") — the bare form only fires for a key that\n * is actually in the reference list, so an email or an @-handle is never\n * mistaken for a citation.\n */\n\nimport type { BibliographyEntry, CitationStyle, CslItem, CslName, Inline } from \"./types\";\n\nconst t = (value: string): Inline => ({ type: \"text\", value });\nconst em = (value: string): Inline => ({ type: \"emphasis\", children: [t(value)] });\n\nexport interface CiteRef {\n key: string;\n locator?: string | undefined;\n suppressAuthor: boolean;\n}\n\n/** Parse the inside of `[...]` into cite refs; null if it is not a citation. */\nexport function parseCitationGroup(inner: string): CiteRef[] | null {\n const parts = inner.split(\";\").map((p) => p.trim());\n if (parts.length === 0) return null;\n const refs: CiteRef[] = [];\n for (const part of parts) {\n const m = /^(-?)@([A-Za-z0-9_][\\w:.#$%&+?<>~/-]*?)(?:\\s*,\\s*(.+))?$/.exec(part);\n if (!m) return null;\n // `@fig:x` / `@tbl:x` / `@sec:x` are cross-references, not citations.\n if (/^(fig|tbl|sec|eq|lst):/i.test(m[2] as string)) return null;\n refs.push({ key: m[2] as string, locator: m[3]?.trim(), suppressAuthor: m[1] === \"-\" });\n }\n return refs;\n}\n\nfunction year(item: CslItem): string {\n const dp = item.issued?.[\"date-parts\"]?.[0]?.[0];\n if (dp !== undefined && dp !== null && String(dp).trim()) return String(dp);\n return item.issued?.literal ?? \"n.d.\";\n}\n\nconst family = (n: CslName): string => n.literal ?? n.family ?? n.given ?? \"\";\n\nfunction initials(given: string | undefined): string {\n if (!given) return \"\";\n return given\n .split(/[\\s]+/)\n .filter(Boolean)\n .map((g) =>\n g\n .split(\"-\")\n .map((p) => `${p[0]?.toUpperCase() ?? \"\"}.`)\n .join(\"-\"),\n )\n .join(\" \");\n}\n\nfunction authorsOf(item: CslItem): CslName[] {\n return item.author?.length ? item.author : (item.editor ?? []);\n}\n\n/** The short author form used in an in-text citation. */\nfunction shortAuthors(item: CslItem, style: CitationStyle, narrative = false): string {\n const a = authorsOf(item);\n if (a.length === 0) return item.title ? `\"${item.title}\"` : item.id;\n // APA: \"&\" inside parentheses, \"and\" in running text.\n const and = style === \"apa\" && !narrative ? \"&\" : \"and\";\n if (a.length === 1) return family(a[0] as CslName);\n if (a.length === 2) return `${family(a[0] as CslName)} ${and} ${family(a[1] as CslName)}`;\n if (style === \"chicago\" && a.length === 3)\n return `${family(a[0] as CslName)}, ${family(a[1] as CslName)}, and ${family(a[2] as CslName)}`;\n return `${family(a[0] as CslName)} et al.`;\n}\n\nfunction mlaLocator(locator: string): string {\n return locator.replace(/^(?:pp?\\.|pages?)\\s*/i, \"\");\n}\n\n/** Format one citation group as in-text text, e.g. \"(Smith, 2020, p. 4; Lee, 2019)\". */\nexport function formatCitation(\n refs: CiteRef[],\n lookup: (key: string) => CslItem | undefined,\n style: CitationStyle,\n narrative = false,\n): { label: string; resolved: boolean } {\n let resolved = true;\n const pieces = refs.map((r) => {\n const item = lookup(r.key);\n if (!item) {\n resolved = false;\n return `${r.key}?`;\n }\n const who = shortAuthors(item, style);\n const when = year(item);\n const loc = r.locator;\n if (style === \"mla\") {\n const l = loc ? mlaLocator(loc) : \"\";\n if (r.suppressAuthor || narrative) return l;\n return l ? `${who} ${l}` : who;\n }\n if (style === \"chicago\") {\n const l = loc ? mlaLocator(loc) : \"\";\n const core = r.suppressAuthor || narrative ? when : `${who} ${when}`;\n return l ? `${core}, ${l}` : core;\n }\n const core = r.suppressAuthor || narrative ? when : `${who}, ${when}`;\n return loc ? `${core}, ${loc}` : core;\n });\n if (narrative && refs.length === 1) {\n const item = lookup(refs[0]!.key);\n if (item) {\n const inner = pieces[0];\n const who = shortAuthors(item, style, true);\n return { label: inner ? `${who} (${inner})` : who, resolved };\n }\n }\n const body = pieces.filter(Boolean).join(\"; \");\n return { label: body ? `(${body})` : \"\", resolved };\n}\n\n// ── reference list ─────────────────────────────────────────────────────────\n\nfunction apaNames(names: CslName[]): string {\n const fmt = (n: CslName) =>\n n.literal ?? [n.family, initials(n.given)].filter(Boolean).join(\", \");\n if (names.length === 1) return fmt(names[0] as CslName);\n if (names.length <= 20) {\n return `${names.slice(0, -1).map(fmt).join(\", \")}, & ${fmt(names[names.length - 1] as CslName)}`;\n }\n return `${names.slice(0, 19).map(fmt).join(\", \")}, … ${fmt(names[names.length - 1] as CslName)}`;\n}\n\nfunction invertedFirst(names: CslName[], and: string, etAlAt: number): string {\n const first = (n: CslName) => n.literal ?? [n.family, n.given].filter(Boolean).join(\", \");\n const rest = (n: CslName) => n.literal ?? [n.given, n.family].filter(Boolean).join(\" \");\n if (names.length === 1) return first(names[0] as CslName);\n if (names.length >= etAlAt) return `${first(names[0] as CslName)}, et al.`;\n if (names.length === 2) return `${first(names[0] as CslName)}, ${and} ${rest(names[1] as CslName)}`;\n return `${first(names[0] as CslName)}, ${names\n .slice(1, -1)\n .map(rest)\n .join(\", \")}, ${and} ${rest(names[names.length - 1] as CslName)}`;\n}\n\nconst endDot = (s: string): string => (/[.?!]$/.test(s) ? s : `${s}.`);\nconst isArticle = (i: CslItem) => /article|chapter|paper-conference|entry/.test(i.type ?? \"\") || Boolean(i[\"container-title\"] && (i.volume || i.issue || i.page));\nconst isWeb = (i: CslItem) => /webpage|post|post-weblog/.test(i.type ?? \"\") || (!i.publisher && !i[\"container-title\"] && Boolean(i.URL));\nconst link = (i: CslItem): string | undefined => (i.DOI ? `https://doi.org/${i.DOI.replace(/^https?:\\/\\/doi\\.org\\//, \"\")}` : i.URL);\n\nfunction formatApa(i: CslItem): Inline[] {\n const out: Inline[] = [];\n const names = authorsOf(i);\n const y = year(i);\n if (names.length) out.push(t(`${endDot(apaNames(names))} (${y}). `));\n if (isArticle(i)) {\n if (i.title) out.push(t(`${endDot(i.title)} `));\n if (!names.length) out.push(t(`(${y}). `));\n if (i[\"container-title\"]) {\n out.push(em(i[\"container-title\"]));\n if (i.volume) {\n out.push(t(\", \"), em(String(i.volume)));\n }\n if (i.issue) out.push(t(`(${i.issue})`));\n if (i.page) out.push(t(`, ${i.page}`));\n out.push(t(\". \"));\n }\n } else {\n if (i.title) out.push(em(i.title));\n if (i.edition) out.push(t(` (${i.edition} ed.)`));\n out.push(t(\". \"));\n if (!names.length) out.push(t(`(${y}). `));\n if (isWeb(i) && i[\"container-title\"]) out.push(t(`${endDot(i[\"container-title\"])} `));\n if (i.publisher) out.push(t(`${endDot(i.publisher)} `));\n }\n const l = link(i);\n if (l) out.push({ type: \"link\", url: l, children: [t(l)] });\n return trimTail(out);\n}\n\nfunction formatMla(i: CslItem): Inline[] {\n const out: Inline[] = [];\n const names = authorsOf(i);\n if (names.length) out.push(t(`${endDot(invertedFirst(names, \"and\", 3))} `));\n const y = year(i);\n if (isArticle(i) || isWeb(i)) {\n if (i.title) out.push(t(`“${endDot(i.title)}” `));\n if (i[\"container-title\"]) out.push(em(i[\"container-title\"]));\n const tail: string[] = [];\n if (i.volume) tail.push(`vol. ${i.volume}`);\n if (i.issue) tail.push(`no. ${i.issue}`);\n if (i.publisher && isWeb(i)) tail.push(i.publisher);\n if (y !== \"n.d.\") tail.push(y);\n if (i.page) tail.push(`${/[-–]/.test(i.page) ? \"pp.\" : \"p.\"} ${i.page}`);\n if (tail.length) out.push(t(`${i[\"container-title\"] ? \", \" : \"\"}${tail.join(\", \")}`));\n const l = link(i);\n if (l) out.push(t(\", \"), { type: \"link\", url: l, children: [t(l.replace(/^https?:\\/\\//, \"\"))] });\n out.push(t(\".\"));\n } else {\n if (i.title) out.push(em(i.title), t(\". \"));\n const tail = [i.publisher, y !== \"n.d.\" ? y : undefined].filter(Boolean);\n if (tail.length) out.push(t(`${tail.join(\", \")}.`));\n }\n return trimTail(out);\n}\n\nfunction formatChicago(i: CslItem): Inline[] {\n const out: Inline[] = [];\n const names = authorsOf(i);\n if (names.length) out.push(t(`${endDot(invertedFirst(names, \"and\", 11))} `));\n out.push(t(`${year(i)}. `));\n if (isArticle(i) || isWeb(i)) {\n if (i.title) out.push(t(`“${endDot(i.title)}” `));\n if (i[\"container-title\"]) {\n out.push(em(i[\"container-title\"]));\n if (i.volume) out.push(t(` ${i.volume}`));\n if (i.issue) out.push(t(` (${i.issue})`));\n if (i.page) out.push(t(`: ${i.page}`));\n out.push(t(\". \"));\n }\n } else {\n if (i.title) out.push(em(i.title), t(\". \"));\n const pub = [i[\"publisher-place\"], i.publisher].filter(Boolean).join(\": \");\n if (pub) out.push(t(`${endDot(pub)} `));\n }\n const l = link(i);\n if (l) out.push({ type: \"link\", url: l, children: [t(l)] }, t(\".\"));\n return trimTail(out);\n}\n\nfunction trimTail(out: Inline[]): Inline[] {\n const last = out[out.length - 1];\n if (last?.type === \"text\") last.value = last.value.replace(/\\s+$/, \"\");\n return out;\n}\n\n/** Format the reference list for the cited keys, sorted as the style requires. */\nexport function formatBibliography(items: CslItem[], style: CitationStyle): BibliographyEntry[] {\n const sortKey = (i: CslItem) => {\n const a = authorsOf(i)[0];\n return `${(a ? family(a) : (i.title ?? i.id)).toLowerCase()}\\u0000${year(i)}\\u0000${(i.title ?? \"\").toLowerCase()}`;\n };\n const fmt = style === \"mla\" ? formatMla : style === \"chicago\" ? formatChicago : formatApa;\n return [...items]\n .sort((a, b) => sortKey(a).localeCompare(sortKey(b)))\n .map((i) => ({ id: i.id, children: fmt(i) }));\n}\n","/**\n * @ai-matrx/print/document — print-grade documents from markdown.\n *\n * ONE parsed tree (`parseDocument`) → PDF, DOCX, EPUB, HTML (+ the markdown\n * source itself), so every format carries the same page setup, cover, TOC,\n * numbered captions, cross-references, citations and bibliography.\n *\n * Settings live in the markdown's YAML frontmatter:\n *\n * ---\n * title: Quarterly Review\n * subtitle: Operations\n * author: Jane Park\n * date: today\n * cover: true\n * toc: true # or { depth: 2, title: Contents }\n * page: { size: a4, orientation: portrait, margins: 1in }\n * header: \"{title} | | {date}\" # left | center | right\n * footer: \"Page {page} of {pages}\"\n * firstPage: different\n * columns: 2\n * numberSections: true\n * csl: apa # apa | mla | chicago\n * references:\n * - id: smith2020\n * title: Paper Cuts\n * author: [Smith, Jane]\n * issued: 2020\n * ---\n *\n * Heavy engines (pdfmake, docx, jszip) load lazily when an export is called;\n * parsing and HTML are pure string work and safe on the server.\n */\n\nimport { documentToDocx } from \"./document/docx\";\nimport { documentToEpub } from \"./document/epub\";\nimport { documentToHtml } from \"./document/html\";\nimport { documentToPdf, headingPages } from \"./document/pdf\";\nimport { parseDocument, type ParseDocumentOptions } from \"./document/tree\";\nimport type { Block, DocTree, DocumentNotice, ImageMap, ResolvedImage } from \"./document/types\";\n\nexport { parseDocument, plainText } from \"./document/tree\";\nexport type { ParseDocumentOptions } from \"./document/tree\";\nexport { documentToHtml, documentCss, renderBlocksHtml } from \"./document/html\";\nexport { buildPdfDefinition, documentToPdf } from \"./document/pdf\";\nexport { documentToDocx } from \"./document/docx\";\nexport { documentToEpub } from \"./document/epub\";\nexport {\n PAGE_SIZES,\n DEFAULT_FOOTER,\n splitFrontmatter,\n resolveSettings,\n normalizeReference,\n parseLength,\n fillTemplate,\n} from \"./document/settings\";\nexport { formatCitation, formatBibliography, parseCitationGroup } from \"./document/citations\";\nexport type * from \"./document/types\";\n\nexport type DocumentFormat = \"pdf\" | \"docx\" | \"epub\" | \"html\" | \"markdown\";\n\nexport const DOCUMENT_FORMATS: ReadonlyArray<{ format: DocumentFormat; label: string; extension: string; mime: string }> = [\n { format: \"pdf\", label: \"PDF\", extension: \"pdf\", mime: \"application/pdf\" },\n { format: \"docx\", label: \"Word (.docx)\", extension: \"docx\", mime: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\" },\n { format: \"epub\", label: \"EPUB\", extension: \"epub\", mime: \"application/epub+zip\" },\n { format: \"html\", label: \"Web page (.html)\", extension: \"html\", mime: \"text/html\" },\n { format: \"markdown\", label: \"Markdown\", extension: \"md\", mime: \"text/markdown\" },\n];\n\n// ── images: fetched once, shared by every format ──────────────────────────\n\nfunction sniff(bytes: Uint8Array): { mime: ResolvedImage[\"mime\"]; width: number; height: number } | null {\n const b = bytes;\n if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) {\n const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);\n return { mime: \"image/png\", width: dv.getUint32(16), height: dv.getUint32(20) };\n }\n if (b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46) {\n return { mime: \"image/gif\", width: b[6]! | (b[7]! << 8), height: b[8]! | (b[9]! << 8) };\n }\n if (b[0] === 0xff && b[1] === 0xd8) {\n let i = 2;\n while (i + 9 < b.length) {\n if (b[i] !== 0xff) {\n i++;\n continue;\n }\n const marker = b[i + 1]!;\n const len = (b[i + 2]! << 8) | b[i + 3]!;\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n return { mime: \"image/jpeg\", height: (b[i + 5]! << 8) | b[i + 6]!, width: (b[i + 7]! << 8) | b[i + 8]! };\n }\n i += 2 + len;\n }\n }\n return null;\n}\n\nfunction toBase64(bytes: Uint8Array): string {\n const g = globalThis as unknown as { Buffer?: { from: (b: Uint8Array) => { toString: (e: string) => string } } };\n if (g.Buffer) return g.Buffer.from(bytes).toString(\"base64\");\n let s = \"\";\n for (let i = 0; i < bytes.length; i += 0x8000) s += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n return btoa(s);\n}\n\nfunction fromBase64(b64: string): Uint8Array {\n const g = globalThis as unknown as { Buffer?: { from: (s: string, e: string) => Uint8Array } };\n if (g.Buffer) return new Uint8Array(g.Buffer.from(b64, \"base64\"));\n const bin = atob(b64);\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n}\n\n/** Load image bytes for a URL. Default: data: URLs decode, http(s) fetches. */\nexport type ImageLoader = (url: string) => Promise<Uint8Array | null>;\n\nexport const defaultImageLoader: ImageLoader = async (url) => {\n const data = /^data:image\\/[\\w.+-]+;base64,(.*)$/i.exec(url);\n if (data) return fromBase64(data[1] as string);\n if (!/^https?:\\/\\//i.test(url) || typeof fetch !== \"function\") return null;\n const res = await fetch(url, { credentials: \"omit\" });\n if (!res.ok) return null;\n return new Uint8Array(await res.arrayBuffer());\n};\n\nfunction imageUrls(tree: DocTree): string[] {\n const urls = new Set<string>();\n const walk = (blocks: Block[]) => {\n for (const b of blocks) {\n if (b.type === \"figure\") urls.add(b.url);\n if (b.type === \"list\") for (const it of b.items) walk(it.children);\n if (b.type === \"blockquote\") walk(b.children);\n }\n };\n for (const s of tree.sections) walk(s.blocks);\n if (tree.settings.cover && tree.settings.logo) urls.add(tree.settings.logo);\n return [...urls];\n}\n\n/** Resolve every figure/logo image once. Failures are announced, never fatal. */\nexport async function resolveDocumentImages(\n tree: DocTree,\n loader: ImageLoader = defaultImageLoader,\n onNotice?: (n: DocumentNotice) => void,\n): Promise<ImageMap> {\n const map: ImageMap = new Map();\n await Promise.all(\n imageUrls(tree).map(async (url) => {\n let bytes: Uint8Array | null = null;\n try {\n bytes = await loader(url);\n } catch {\n bytes = null;\n }\n const info = bytes ? sniff(bytes) : null;\n if (!bytes || !info || !info.width || !info.height) {\n map.set(url, null);\n const n: DocumentNotice = {\n code: \"image-unavailable\",\n message: `An image could not be included: ${url.length > 90 ? `${url.slice(0, 87)}…` : url}`,\n remedy: bytes\n ? \"Use a PNG, JPEG or GIF image.\"\n : \"Use an image stored in AI Matrx (or any public https link that allows downloads); private or expired links cannot be printed.\",\n };\n tree.notices.push(n);\n onNotice?.(n);\n return;\n }\n map.set(url, { ...info, bytes, dataUrl: `data:${info.mime};base64,${toBase64(bytes)}` });\n }),\n );\n return map;\n}\n\n// ── one-call export ────────────────────────────────────────────────────────\n\nexport interface ExportDocumentOptions extends ParseDocumentOptions {\n /** File name without extension (default: the document title). */\n fileName?: string | undefined;\n imageLoader?: ImageLoader | undefined;\n}\n\nexport interface DocumentExport {\n format: DocumentFormat;\n bytes: Uint8Array;\n mime: string;\n fileName: string;\n /** PDF only. */\n pageCount?: number | undefined;\n tree: DocTree;\n notices: DocumentNotice[];\n}\n\nconst safeName = (s: string) =>\n s\n .replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 120) || \"document\";\n\n/** Export a markdown source to any document format. */\nexport async function exportDocument(\n source: string,\n format: DocumentFormat,\n options: ExportDocumentOptions = {},\n): Promise<DocumentExport> {\n const tree = parseDocument(source, options);\n const meta = DOCUMENT_FORMATS.find((f) => f.format === format);\n if (!meta) throw new Error(`Unknown document format \"${format}\". Use one of: ${DOCUMENT_FORMATS.map((f) => f.format).join(\", \")}.`);\n const fileName = `${safeName(options.fileName ?? tree.settings.title ?? \"document\")}.${meta.extension}`;\n const enc = new TextEncoder();\n let bytes: Uint8Array;\n let pageCount: number | undefined;\n if (format === \"markdown\") {\n bytes = enc.encode(source);\n } else {\n const images = await resolveDocumentImages(tree, options.imageLoader, options.onNotice);\n if (format === \"html\") bytes = enc.encode(documentToHtml(tree, { images }));\n else if (format === \"pdf\") {\n const r = await documentToPdf(tree, images);\n bytes = r.bytes;\n pageCount = r.pageCount;\n } else if (format === \"docx\") {\n const pages = tree.toc.length ? await headingPages(tree, images) : undefined;\n bytes = await documentToDocx(tree, { images, headingPages: pages });\n } else bytes = await documentToEpub(tree, { images });\n }\n return { format, bytes, mime: meta.mime, fileName, pageCount, tree, notices: tree.notices };\n}\n\n/** Browser helper: save an export through a download link. */\nexport function downloadDocumentExport(exp: DocumentExport): void {\n const blob = new Blob([exp.bytes as BlobPart], { type: exp.mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = exp.fileName;\n a.rel = \"noopener\";\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 30_000);\n}\n"],"mappings":"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","names":["t","family","year","t","pt","levels","escapeHtml","t","href","blocks","t","escapeHtml","n","id","runs","blocks","block","t","escapeHtml","core","inlines","last","block","plain","t","blocks","blocks"]}
|