@forevka/wordcanvas 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist-lib/assets/{worker-D8rUOKfg.js → worker-CqU4Popa.js} +10903 -10736
- package/dist-lib/assets/worker-Cw5cYW5z.js +2418 -0
- package/dist-lib/blockFactory-DDCRWDnA.js +91 -0
- package/dist-lib/browser-BUrsjziD.js +612 -0
- package/dist-lib/builder.js +13 -13
- package/dist-lib/editorApp-CB_ZArIF.js +9566 -0
- package/dist-lib/export.js +4507 -4456
- package/dist-lib/generate-toc.js +7 -7
- package/dist-lib/import.js +2 -2
- package/dist-lib/lists-DpmgbDyt.js +110 -0
- package/dist-lib/measure.js +2 -2
- package/dist-lib/{measureHost-CMiJKdlk.js → measureHost-BlukHGwx.js} +1 -1
- package/dist-lib/metrics-bvGO8KDK.js +96 -0
- package/dist-lib/paintStyle-vT6jtWbH.js +74 -0
- package/dist-lib/pipeline-UryP-u7Z.js +1850 -0
- package/dist-lib/recalc-docx.js +2 -2
- package/dist-lib/recalcToc-BfXlXZik.js +3985 -0
- package/dist-lib/styleProps-DhqDEfvc.js +149 -0
- package/dist-lib/stylesheet-LTBEGkvG.js +146 -0
- package/dist-lib/toc-D09f4PrI.js +939 -0
- package/dist-lib/{webmcp-6WxRNKCc.js → webmcp-K6UZgQJ0.js} +60 -68
- package/dist-lib/wordcanvas-DBx2ana_.js +734 -0
- package/dist-lib/wordcanvas.js +4 -2
- package/dist-node/{chunk-CDN6WU2P.js → chunk-373K2XRY.js} +40 -22
- package/dist-node/chunk-373K2XRY.js.map +7 -0
- package/dist-node/{chunk-22JHAERT.js → chunk-3PUV3BG6.js} +235 -39
- package/dist-node/chunk-3PUV3BG6.js.map +7 -0
- package/dist-node/{chunk-4ICCHZX4.js → chunk-5RX3IHWE.js} +39 -3
- package/dist-node/chunk-5RX3IHWE.js.map +7 -0
- package/dist-node/{chunk-4PDVRJF6.js → chunk-EMY2P524.js} +32 -2
- package/dist-node/chunk-EMY2P524.js.map +7 -0
- package/dist-node/{chunk-BRAPV465.js → chunk-HWQKGDS2.js} +2 -2
- package/dist-node/{chunk-6AJJMHKY.js → chunk-KJV7GJ3H.js} +1 -1
- package/dist-node/chunk-KJV7GJ3H.js.map +7 -0
- package/dist-node/{chunk-RNB336F3.js → chunk-ZLLSXOO2.js} +92 -14
- package/dist-node/{chunk-RNB336F3.js.map → chunk-ZLLSXOO2.js.map} +2 -2
- package/dist-node/{engine-5FGDJD2H.js → engine-LLA6PCS5.js} +4 -4
- package/dist-node/export.js +89 -24
- package/dist-node/export.js.map +2 -2
- package/dist-node/generate-toc.js +6 -6
- package/dist-node/import.js +3 -3
- package/dist-node/measure.js +2 -2
- package/dist-node/recalc-docx.js +4 -4
- package/package.json +1 -1
- package/types/model.d.ts +46 -0
- package/types/wordcanvas.d.ts +493 -1
- package/dist-lib/assets/worker-wXuuyshQ.js +0 -2258
- package/dist-lib/blockFactory-CUI4Rqiq.js +0 -186
- package/dist-lib/browser-DkKxreJM.js +0 -1305
- package/dist-lib/editorApp-DLXMmtu5.js +0 -8023
- package/dist-lib/lists-Sc5I40JO.js +0 -110
- package/dist-lib/metrics-CkAo4zh8.js +0 -143
- package/dist-lib/pipeline-CbxmCE84.js +0 -1705
- package/dist-lib/recalcToc-g1hFKSNs.js +0 -3935
- package/dist-lib/styleProps-Db5pEkG8.js +0 -127
- package/dist-lib/toc-B6VpkJge.js +0 -213
- package/dist-lib/wordcanvas-CFqpDK0k.js +0 -125
- package/dist-node/chunk-22JHAERT.js.map +0 -7
- package/dist-node/chunk-4ICCHZX4.js.map +0 -7
- package/dist-node/chunk-4PDVRJF6.js.map +0 -7
- package/dist-node/chunk-6AJJMHKY.js.map +0 -7
- package/dist-node/chunk-CDN6WU2P.js.map +0 -7
- /package/dist-node/{chunk-BRAPV465.js.map → chunk-HWQKGDS2.js.map} +0 -0
- /package/dist-node/{engine-5FGDJD2H.js.map → engine-LLA6PCS5.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/import/docx/units.ts", "../src/import/docx/borders.ts", "../src/import/docx/props.ts", "../src/import/docx/documentParser.ts", "../src/import/docx/mapToModel.ts", "../src/import/docx/media.ts", "../src/import/docx/numbering.ts", "../src/import/docx/relationships.ts", "../src/import/docx/theme.ts", "../src/import/docx/styles.ts", "../src/import/docx/zip.ts", "../src/import/docx/pipeline.ts"],
|
|
4
|
+
"sourcesContent": ["// OOXML unit conversions \u2192 CSS px at 96dpi. All pure.\r\n//\r\n// twips 1/20 pt margins, indents, spacing\r\n// half-points w:sz font size\r\n// EMU 914400/inch image extents\r\n// w:line 240ths of a line when lineRule=\"auto\"\r\n\r\n/** twips \u2192 px: tw/20 pt \u00D7 96/72 = tw/15. */\r\nexport const twipsToPx = (tw: number): number => tw / 15;\r\n\r\n/** half-points \u2192 px: hp/2 pt \u00D7 96/72 = hp \u00D7 2/3. */\r\nexport const halfPointsToPx = (hp: number): number => (hp * 2) / 3;\r\n\r\n/** EMU \u2192 px: 914400 EMU/inch \u00F7 96 px/inch = 9525 EMU/px. */\r\nexport const emuToPx = (emu: number): number => emu / 9525;\r\n\r\n/** w:spacing w:line with lineRule=\"auto\" (or absent): 240ths of a single line. */\r\nexport const lineAutoToMultiplier = (line: number): number => line / 240;\r\n\r\n/** Round to 2 decimals \u2014 keeps layout math in floats but model JSON readable. */\r\nexport const round2 = (v: number): number => Math.round(v * 100) / 100;\r\n\r\n/** A four-sided box in twips. */\r\nexport interface TwipsBox { top: number; right: number; bottom: number; left: number }\r\n\r\n/** Convert a four-sided twips box (page/cell margins) to rounded px. */\r\nexport const marginTwipsToPx = (m: TwipsBox): TwipsBox => ({\r\n top: round2(twipsToPx(m.top)),\r\n right: round2(twipsToPx(m.right)),\r\n bottom: round2(twipsToPx(m.bottom)),\r\n left: round2(twipsToPx(m.left)),\r\n});\r\n", "// Table border & shading decode + cascade resolution.\n//\n// OOXML resolves a cell edge through: table style (styles.xml) \u2192 table direct\n// (w:tblBorders) \u2192 cell direct (w:tcBorders), with the table layer choosing its\n// OUTER edge (top/left/bottom/right) on the table boundary and its INTERIOR\n// edge (insideH/insideV) between cells. A cell's own w:tcBorders are already\n// written per-edge by Word, so they map straight onto the named edge.\n//\n// \"First definition wins\" (incl. an explicit w:val=\"nil\" \u2192 no line), so the\n// cascade picks the most-specific source that DEFINES the edge, even to suppress.\n\nimport type { CellBorder, CellBorders } from \"@cw/shared\";\nimport type { IRBorders, IRRawBorder } from \"./types\";\nimport { round2 } from \"./units\";\nimport { attr, el, numAttr, type XmlNode } from \"./xml\";\n\nconst EDGES: [keyof IRBorders, string][] = [\n [\"top\", \"w:top\"],\n [\"left\", \"w:left\"],\n [\"bottom\", \"w:bottom\"],\n [\"right\", \"w:right\"],\n [\"insideH\", \"w:insideH\"],\n [\"insideV\", \"w:insideV\"],\n];\n\nexport function decodeBorders(bordersEl: XmlNode | undefined): IRBorders | undefined {\n if (!bordersEl) return undefined;\n const out: IRBorders = {};\n for (const [key, tag] of EDGES) {\n const e = el(bordersEl, tag);\n if (!e) continue;\n const raw: IRRawBorder = { val: attr(e, \"w:val\") ?? \"single\" };\n const sz = numAttr(e, \"w:sz\");\n if (sz !== undefined) raw.sizeEighthPt = sz;\n const color = attr(e, \"w:color\");\n if (color) raw.color = color;\n out[key] = raw;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/** w:shd \u2192 CSS fill, or undefined when there's no real fill. */\nexport function decodeShdFill(shd: XmlNode | undefined): string | undefined {\n if (!shd) return undefined;\n const fill = attr(shd, \"w:fill\");\n if (fill && fill !== \"auto\") return `#${fill.toLowerCase()}`;\n // Pattern shading with a foreground color but \"auto\" fill \u2014 approximate with\n // the pattern color so e.g. a solid-color cell still shows.\n const val = attr(shd, \"w:val\");\n const color = attr(shd, \"w:color\");\n if (val && val !== \"clear\" && val !== \"nil\" && color && color !== \"auto\") {\n return `#${color.toLowerCase()}`;\n }\n return undefined;\n}\n\n/** Merge two border sets edge-by-edge (child overrides parent) \u2014 for resolving\n * a table style's basedOn chain. */\nexport function mergeBorders(base: IRBorders | undefined, over: IRBorders | undefined): IRBorders | undefined {\n if (!base) return over;\n if (!over) return base;\n return { ...base, ...over };\n}\n\nexport interface BorderSources {\n cell?: IRBorders | undefined;\n table?: IRBorders | undefined;\n style?: IRBorders | undefined;\n}\n\nexport interface CellPosition {\n top: boolean;\n bottom: boolean;\n left: boolean;\n right: boolean;\n}\n\n/** Collapse the cascade for one cell into concrete per-edge borders. */\nexport function resolveCellBorders(src: BorderSources, pos: CellPosition): CellBorders {\n const pick = (named: keyof IRBorders, inside: keyof IRBorders, outer: boolean): IRRawBorder | undefined =>\n // Cell edges are named directly; the table/style layers use the named edge\n // on the boundary and the inside edge between cells.\n src.cell?.[named] ?? src.table?.[outer ? named : inside] ?? src.style?.[outer ? named : inside];\n\n const out: CellBorders = {};\n const top = toCellBorder(pick(\"top\", \"insideH\", pos.top));\n if (top) out.top = top;\n const bottom = toCellBorder(pick(\"bottom\", \"insideH\", pos.bottom));\n if (bottom) out.bottom = bottom;\n const left = toCellBorder(pick(\"left\", \"insideV\", pos.left));\n if (left) out.left = left;\n const right = toCellBorder(pick(\"right\", \"insideV\", pos.right));\n if (right) out.right = right;\n return out;\n}\n\n/** Map an IRBorders' four outer edges to model CellBorders (used by table-style\n * conditional bands, which apply per-cell). Inside edges (insideH/V) are not\n * represented in per-cell CellBorders and are dropped. */\nexport function cellBordersFromIR(b: IRBorders | undefined): CellBorders | undefined {\n if (!b) return undefined;\n const out: CellBorders = {};\n const t = toCellBorder(b.top); if (t) out.top = t;\n const r = toCellBorder(b.right); if (r) out.right = r;\n const bot = toCellBorder(b.bottom); if (bot) out.bottom = bot;\n const l = toCellBorder(b.left); if (l) out.left = l;\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction toCellBorder(raw: IRRawBorder | undefined): CellBorder | undefined {\n if (!raw || raw.val === \"nil\" || raw.val === \"none\") return undefined;\n // w:sz is eighths of a point: px = sz/8 pt \u00D7 96/72 = sz/6. Hairlines clamp up\n // so a 2-eighths (0.25pt) rule stays visible at 96dpi.\n const widthPx = round2(Math.max(0.5, (raw.sizeEighthPt ?? 4) / 6));\n const color = !raw.color || raw.color === \"auto\" ? \"#000000\" : `#${raw.color.toLowerCase()}`;\n const border: CellBorder = { color, widthPx };\n const style = mapBorderStyle(raw.val);\n if (style !== \"single\") border.style = style;\n return border;\n}\n\nfunction mapBorderStyle(val: string): NonNullable<CellBorder[\"style\"]> {\n if (val === \"double\") return \"double\";\n if (/dash/i.test(val)) return \"dashed\";\n if (/dot/i.test(val)) return \"dotted\";\n return \"single\"; // single, thick, wave, 3D variants \u2192 a plain line\n}\n", "// Decoders for w:rPr / w:pPr property bags \u2014 shared by documentParser.ts\n// (direct formatting on runs/paragraphs) and styles.ts (the same bags appear\n// inside w:style and w:docDefaults). Decode only; no resolution here.\n\nimport type { IRParaProps, IRRunProps } from \"./types\";\nimport { WarningSink } from \"./types\";\nimport { lineAutoToMultiplier } from \"./units\";\nimport { attr, el, els, numAttr, onOff, val, type XmlNode } from \"./xml\";\n\nexport function decodeRunProps(rPr: XmlNode): IRRunProps {\n const props: IRRunProps = {};\n const styleId = val(rPr, \"w:rStyle\");\n if (styleId) props.styleId = styleId;\n const bold = onOff(el(rPr, \"w:b\"));\n if (bold !== undefined) props.bold = bold;\n const italic = onOff(el(rPr, \"w:i\"));\n if (italic !== undefined) props.italic = italic;\n const strike = onOff(el(rPr, \"w:strike\"));\n if (strike !== undefined) props.strikethrough = strike;\n const u = el(rPr, \"w:u\");\n if (u) props.underline = attr(u, \"w:val\") !== \"none\";\n const color = el(rPr, \"w:color\");\n if (color) {\n const hex = attr(color, \"w:val\");\n if (hex) props.color = hex;\n const themeColor = attr(color, \"w:themeColor\");\n if (themeColor) props.colorTheme = themeColor;\n }\n const sz = numAttr(el(rPr, \"w:sz\"), \"w:val\");\n if (sz !== undefined) props.sizeHalfPoints = sz;\n const rFonts = el(rPr, \"w:rFonts\");\n if (rFonts) {\n const font = attr(rFonts, \"w:ascii\");\n if (font) props.fontAscii = font;\n const themeFont = attr(rFonts, \"w:asciiTheme\");\n if (themeFont) props.fontThemeAscii = themeFont;\n }\n const highlight = val(rPr, \"w:highlight\");\n if (highlight && highlight !== \"none\") props.highlight = highlight;\n const vertAlign = val(rPr, \"w:vertAlign\");\n if (vertAlign) props.vertAlign = vertAlign;\n const vanish = onOff(el(rPr, \"w:vanish\"));\n if (vanish !== undefined) props.vanish = vanish;\n return props;\n}\n\nconst JC_MAP: Record<string, IRParaProps[\"align\"]> = {\n left: \"left\",\n start: \"left\",\n center: \"center\",\n right: \"right\",\n end: \"right\",\n both: \"justify\",\n distribute: \"justify\",\n};\n\nexport function decodeParaProps(pPr: XmlNode, warnings: WarningSink): IRParaProps {\n const props: IRParaProps = {};\n const styleId = val(pPr, \"w:pStyle\");\n if (styleId) props.styleId = styleId;\n\n const jc = val(pPr, \"w:jc\");\n const align = jc !== undefined ? JC_MAP[jc] : undefined;\n if (align) props.align = align;\n\n const spacing = el(pPr, \"w:spacing\");\n if (spacing) {\n const before = numAttr(spacing, \"w:before\");\n if (before !== undefined) props.spaceBeforeTwips = before;\n const after = numAttr(spacing, \"w:after\");\n if (after !== undefined) props.spaceAfterTwips = after;\n const line = numAttr(spacing, \"w:line\");\n const rule = attr(spacing, \"w:lineRule\") ?? \"auto\";\n if (line !== undefined) {\n if (rule === \"auto\") props.lineHeight = lineAutoToMultiplier(line);\n else warnings.add(\"line-rule-exact\", \"Exact/atLeast line spacing was ignored (model is multiplier-only).\");\n }\n }\n\n const ind = el(pPr, \"w:ind\");\n if (ind) {\n const left = numAttr(ind, \"w:left\") ?? numAttr(ind, \"w:start\");\n if (left !== undefined) props.indentLeftTwips = left;\n const right = numAttr(ind, \"w:right\") ?? numAttr(ind, \"w:end\");\n if (right !== undefined) props.indentRightTwips = right;\n const firstLine = numAttr(ind, \"w:firstLine\");\n const hanging = numAttr(ind, \"w:hanging\");\n if (firstLine !== undefined) props.indentFirstLineTwips = firstLine;\n else if (hanging !== undefined) props.indentFirstLineTwips = -hanging;\n }\n\n const keepNext = onOff(el(pPr, \"w:keepNext\"));\n if (keepNext !== undefined) props.keepWithNext = keepNext;\n\n const keepLines = onOff(el(pPr, \"w:keepLines\"));\n if (keepLines !== undefined) props.keepLinesTogether = keepLines;\n\n const tabs = el(pPr, \"w:tabs\");\n if (tabs) {\n const stops: NonNullable<IRParaProps[\"tabStops\"]> = [];\n for (const t of els(tabs, \"w:tab\")) {\n const pos = numAttr(t, \"w:pos\");\n const tabVal = attr(t, \"w:val\");\n // \"clear\" removes a stop; \"bar\" is a vertical rule, not a tab stop.\n if (pos === undefined || tabVal === \"clear\" || tabVal === \"bar\") continue;\n const stop: { posTwips: number; val?: string; leader?: string } = { posTwips: pos };\n if (tabVal) stop.val = tabVal;\n const leader = attr(t, \"w:leader\");\n if (leader) stop.leader = leader;\n stops.push(stop);\n }\n if (stops.length > 0) props.tabStops = stops;\n }\n\n const pageBreakBefore = onOff(el(pPr, \"w:pageBreakBefore\"));\n if (pageBreakBefore !== undefined) props.pageBreakBefore = pageBreakBefore;\n\n // w:outlineLvl (0-8) \u2014 heading styles set it; absent = body text. Resolved\n // through the style cascade (mergeProps), so a heading paragraph inherits it.\n const outline = val(pPr, \"w:outlineLvl\");\n if (outline !== undefined) {\n const n = Number(outline);\n if (Number.isFinite(n) && n >= 0 && n <= 8) props.outlineLevel = n;\n }\n\n const numPr = el(pPr, \"w:numPr\");\n if (numPr) {\n const numId = val(numPr, \"w:numId\");\n if (numId !== undefined) {\n // numId 0 = Word's \"remove numbering\" sentinel (overrides an inherited list).\n props.list = numId === \"0\" ? null : { numId, level: numAttr(el(numPr, \"w:ilvl\"), \"w:val\") ?? 0 };\n }\n }\n\n const rPr = el(pPr, \"w:rPr\");\n if (rPr) props.markRunProps = decodeRunProps(rPr);\n\n const sectPr = el(pPr, \"w:sectPr\");\n if (sectPr) {\n // Page geometry of non-last sections is still lossy (last wins), but the\n // page boundary the break implies IS respected via pageBreakBefore \u2014 when\n // the geometry actually changes (mapToModel compares sectionPgSize).\n props.sectionBreak = val(sectPr, \"w:type\") === \"continuous\" ? \"continuous\" : \"page\";\n const pgSz = el(sectPr, \"w:pgSz\");\n const w = numAttr(pgSz, \"w:w\");\n const h = numAttr(pgSz, \"w:h\");\n if (w !== undefined && h !== undefined) props.sectionPgSize = { w, h };\n const pgMar = el(sectPr, \"w:pgMar\");\n if (pgMar) {\n const top = numAttr(pgMar, \"w:top\");\n const right = numAttr(pgMar, \"w:right\");\n const bottom = numAttr(pgMar, \"w:bottom\");\n const left = numAttr(pgMar, \"w:left\");\n if (top !== undefined && right !== undefined && bottom !== undefined && left !== undefined) {\n props.sectionMarginTwips = { top, right, bottom, left };\n }\n const headerDist = numAttr(pgMar, \"w:header\");\n if (headerDist !== undefined) props.sectionHeaderDistTwips = headerDist;\n const footerDist = numAttr(pgMar, \"w:footer\");\n if (footerDist !== undefined) props.sectionFooterDistTwips = footerDist;\n }\n const cols = el(sectPr, \"w:cols\");\n if (cols) {\n const colEls = els(cols, \"w:col\");\n const colCount = numAttr(cols, \"w:num\") ?? (colEls.length > 1 ? colEls.length : 1);\n if (colCount > 1) {\n props.sectionColumns = { count: colCount };\n const space = numAttr(cols, \"w:space\");\n if (space !== undefined) props.sectionColumns.spaceTwips = space;\n if (attr(cols, \"w:sep\") === \"1\" || attr(cols, \"w:sep\") === \"true\") props.sectionColumns.sep = true;\n if (colEls.length === colCount) {\n const list = colEls.map((cel) => ({\n wTwips: numAttr(cel, \"w:w\") ?? 0,\n spaceTwips: numAttr(cel, \"w:space\") ?? 0,\n }));\n if (list.some((c) => c.wTwips > 0)) props.sectionColumns.cols = list;\n }\n }\n }\n const pgBorders = el(sectPr, \"w:pgBorders\");\n if (pgBorders) {\n const offsetFrom = attr(pgBorders, \"w:offsetFrom\");\n const borders: import(\"./types\").IRPageBorders = { offsetFrom: offsetFrom === \"text\" ? \"text\" : \"page\" };\n const edge = (name: \"top\" | \"right\" | \"bottom\" | \"left\"): void => {\n const e = el(pgBorders, \"w:\" + name);\n if (!e) return;\n const sz = numAttr(e, \"w:sz\");\n const space = numAttr(e, \"w:space\");\n const color = attr(e, \"w:color\");\n borders[name] = {\n style: attr(e, \"w:val\") ?? \"single\",\n ...(sz !== undefined ? { sz } : {}),\n ...(space !== undefined ? { space } : {}),\n ...(color !== undefined ? { color } : {}),\n };\n };\n edge(\"top\");\n edge(\"right\");\n edge(\"bottom\");\n edge(\"left\");\n if (borders.top || borders.right || borders.bottom || borders.left) props.sectionPgBorders = borders;\n }\n const pgNumStart = numAttr(el(sectPr, \"w:pgNumType\"), \"w:start\");\n if (pgNumStart !== undefined) props.sectionPageNumberStart = pgNumStart;\n if (els(sectPr, \"w:headerReference\").length > 0 || els(sectPr, \"w:footerReference\").length > 0) {\n props.sectionHasBands = true;\n }\n }\n return props;\n}\n", "// document.xml / header / footer body walk \u2192 IR. Pure: XML text in, IR + warnings out.\r\n//\r\n// Decodes direct formatting only. Style references (w:pStyle, w:rStyle) are\r\n// recorded in the IR unresolved \u2014 styles.ts resolves them into effective\r\n// properties during mapping. Everything the parser understands goes into the\r\n// IR; mapToModel decides what the model can hold.\r\n\r\nimport type { CharStyle, FieldDef, FieldSpec } from \"@cw/shared\";\r\nimport { isCustomFieldInstruction, parseFieldInstruction, parseFieldSpec } from \"@cw/shared\";\r\nimport { ImportError, WarningSink } from \"./types\";\r\nimport type {\r\n BandRefs,\r\n BookmarkMarker,\r\n IRBlock,\r\n IRCellMargin,\r\n IRDocument,\r\n IRInline,\r\n IRParagraph,\r\n IRRunProps,\r\n IRSdtProps,\r\n IRSection,\r\n IRTable,\r\n IRTableCell,\r\n IRTableRow,\r\n} from \"./types\";\r\nimport { decodeBorders, decodeShdFill } from \"./borders\";\r\nimport { decodeParaProps, decodeRunProps } from \"./props\";\r\nimport { attr, children, el, els, findDeep, numAttr, parseXml, rootEl, textOf, val, type XmlNode } from \"./xml\";\r\n\r\ninterface ParseCtx {\r\n warnings: WarningSink;\r\n /** Header/footer mode: PAGE / NUMPAGES fields become live {page}/{pages}\r\n * tokens (the layout substitutes them per page). In the body, fields keep\r\n * their cached result text \u2014 a TOC's \"page 5\" should stay \"5\". */\r\n fieldTokens: boolean;\r\n /** Content-control registry filled as w:sdt elements are parsed; shared\r\n * across body and band parts so ids never collide. */\r\n sdts: Record<string, IRSdtProps>;\r\n nextSdt: { n: number };\r\n /** Bookmark names seen between paragraphs (block-level w:bookmarkStart),\r\n * attached to the NEXT paragraph. */\r\n pendingBookmarks: string[];\r\n /** Bookmark names collected inside the paragraph currently being walked. */\r\n currentBookmarks: string[] | null;\r\n /** Block-level bookmark markers, attached at offset 0 of the NEXT paragraph. */\r\n pendingMarkers: BookmarkMarker[];\r\n /** Bookmark markers (start/end + offset) inside the paragraph being walked. */\r\n currentMarkers: BookmarkMarker[] | null;\r\n /** Capture non-built-in complex fields into a model field registry + stamp the\r\n * result blocks' fieldId. True for the body only \u2014 bands/footnotes keep their\r\n * cached result flattened (custom fields live in the body). */\r\n trackFields: boolean;\r\n /** Block-scoped complex-field tracker \u2014 survives across paragraphs so a field\r\n * whose result spans multiple blocks is captured whole. */\r\n fieldTrack: FieldTrack;\r\n}\r\n\r\n/** Tracks custom (host-resolvable, non-built-in) complex fields at BLOCK scope \u2014\r\n * the per-paragraph FieldState below resets each paragraph, but a field's result\r\n * can span many blocks (begin in block 1, end in block N). */\r\ninterface FieldTrack {\r\n /** Global complex-field nesting depth (begin++/end--), spanning paragraphs. */\r\n depth: number;\r\n /** Instruction text of the current top-level (depth-1) field, accumulated. */\r\n topInstr: string;\r\n /** fieldId of the current top-level field IF it's a custom field, else null. */\r\n openId: string | null;\r\n /** fieldId to stamp on the block currently being built \u2014 the field open when the\r\n * block started, or one that opened during it (kept set through the block that\r\n * closes the field). */\r\n markBlock: string | null;\r\n next: { n: number };\r\n registry: Record<string, FieldDef>;\r\n}\r\n\r\nconst newFieldTrack = (): FieldTrack => ({ depth: 0, topInstr: \"\", openId: null, markBlock: null, next: { n: 0 }, registry: {} });\r\n\r\n/** Open a custom field if the just-completed top-level instruction is a non-built-in\r\n * one (idempotent \u2014 only the first call per field, e.g. at `separate`, opens it). */\r\nfunction decideCustomField(ctx: ParseCtx): void {\r\n const ft = ctx.fieldTrack;\r\n if (ft.openId !== null || !isCustomFieldInstruction(ft.topInstr)) return;\r\n const id = `field${ft.next.n++}`;\r\n ft.registry[id] = { id, instruction: ft.topInstr, name: parseFieldInstruction(ft.topInstr).name, kind: \"custom\" };\r\n ft.openId = id;\r\n ft.markBlock = id;\r\n}\r\n\r\n/** UTF-16 offset accumulated so far in a paragraph's inline list (runs count\r\n * their text; a soft break occupies one offset; images contribute nothing). */\r\nfunction inlineOffset(out: IRInline[]): number {\r\n let n = 0;\r\n for (const inl of out) {\r\n if (inl.kind === \"run\") n += inl.text.length;\r\n else if (inl.kind === \"break\") n += 1;\r\n }\r\n return n;\r\n}\r\n\r\nexport function parseDocumentXml(xmlText: string, partName: string, warnings: WarningSink): IRDocument {\r\n const doc = rootEl(parseXml(xmlText, partName), \"w:document\");\r\n const body = doc && el(doc, \"w:body\");\r\n if (!body) {\r\n throw new ImportError(\"MALFORMED_XML\", `${partName} has no w:document/w:body root.`);\r\n }\r\n const sdts: Record<string, IRSdtProps> = {};\r\n const ctx: ParseCtx = { warnings, fieldTokens: false, sdts, nextSdt: { n: 0 }, pendingBookmarks: [], currentBookmarks: null, pendingMarkers: [], currentMarkers: null, trackFields: true, fieldTrack: newFieldTrack() };\r\n\r\n const blocks: IRBlock[] = [];\r\n walkBlocks(children(body), blocks, ctx);\r\n\r\n const sectPr = el(body, \"w:sectPr\");\r\n const section = sectPr ? parseSection(sectPr, warnings) : null;\r\n\r\n // w:background is document-global (sibling of w:body) \u2014 the page fill color.\r\n const bgEl = doc ? el(doc, \"w:background\") : undefined;\r\n const bgColor = bgEl ? attr(bgEl, \"w:color\") : undefined;\r\n const pageColorHex = bgColor && bgColor !== \"auto\" ? bgColor : undefined;\r\n\r\n const fields = ctx.fieldTrack.registry;\r\n const out: IRDocument =\r\n Object.keys(fields).length > 0 ? { blocks, section, sdts, fields } : { blocks, section, sdts };\r\n if (pageColorHex) out.pageColorHex = pageColorHex;\r\n return out;\r\n}\r\n\r\n/** header1.xml / footer1.xml \u2014 same block content under a w:hdr / w:ftr root.\r\n * Pass the document's sdt registry so band controls join the same id space. */\r\nexport function parseHeaderFooterXml(\r\n xmlText: string,\r\n partName: string,\r\n warnings: WarningSink,\r\n sdts: Record<string, IRSdtProps> = {},\r\n): IRBlock[] {\r\n const nodes = parseXml(xmlText, partName);\r\n const root = rootEl(nodes, \"w:hdr\") ?? rootEl(nodes, \"w:ftr\");\r\n if (!root) {\r\n throw new ImportError(\"MALFORMED_XML\", `${partName} has no w:hdr/w:ftr root.`);\r\n }\r\n const ctx: ParseCtx = { warnings, fieldTokens: true, sdts, nextSdt: { n: Object.keys(sdts).length }, pendingBookmarks: [], currentBookmarks: null, pendingMarkers: [], currentMarkers: null, trackFields: false, fieldTrack: newFieldTrack() };\r\n const blocks: IRBlock[] = [];\r\n walkBlocks(children(root), blocks, ctx);\r\n return blocks;\r\n}\r\n\r\nconst BOOKMARK_IGNORE = new Set([\"_GoBack\", \"_Toc_Placeholder\"]);\r\nfunction bookmarkName(node: XmlNode): string | null {\r\n const name = attr(node, \"w:name\");\r\n return name && !BOOKMARK_IGNORE.has(name) ? name : null;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Block-level walk\r\n\r\nfunction walkBlocks(nodes: XmlNode[], out: IRBlock[], ctx: ParseCtx): void {\r\n for (const node of nodes) {\r\n // A custom field open here marks the block being built; one that opens/closes\r\n // mid-block is captured during the parse (decideCustomField sets markBlock).\r\n if (ctx.trackFields) ctx.fieldTrack.markBlock = ctx.fieldTrack.openId;\r\n switch (node.tagName) {\r\n case \"w:p\": {\r\n const p = parseParagraph(node, ctx);\r\n if (ctx.trackFields && ctx.fieldTrack.markBlock) p.fieldId = ctx.fieldTrack.markBlock;\r\n out.push(p);\r\n break;\r\n }\r\n case \"w:tbl\": {\r\n const t = parseTable(node, ctx);\r\n if (ctx.trackFields && ctx.fieldTrack.markBlock) t.fieldId = ctx.fieldTrack.markBlock;\r\n out.push(t);\r\n break;\r\n }\r\n case \"w:sdt\": {\r\n const content = el(node, \"w:sdtContent\");\r\n if (!content) break;\r\n const props = parseSdtPr(el(node, \"w:sdtPr\"));\r\n if (!props) {\r\n // No usable w:sdtPr \u2014 a transparent container; unwrap.\r\n ctx.warnings.add(\"sdt-unwrapped\", \"Content controls were unwrapped to their content.\");\r\n walkBlocks(children(content), out, ctx);\r\n break;\r\n }\r\n const sdtId = `sdt${ctx.nextSdt.n++}`;\r\n ctx.sdts[sdtId] = props;\r\n const inner: IRBlock[] = [];\r\n walkBlocks(children(content), inner, ctx);\r\n for (const b of inner) tagBlockSdt(b, sdtId);\r\n out.push(...inner);\r\n break;\r\n }\r\n case \"w:bookmarkStart\": {\r\n // Block-level bookmark \u2014 attach to the start (offset 0) of the next paragraph.\r\n const name = bookmarkName(node);\r\n const idAttr = attr(node, \"w:id\");\r\n if (name) {\r\n ctx.pendingBookmarks.push(name);\r\n if (idAttr) ctx.pendingMarkers.push({ id: idAttr, name, kind: \"start\", offset: 0 });\r\n }\r\n break;\r\n }\r\n case \"w:bookmarkEnd\": {\r\n const idAttr = attr(node, \"w:id\");\r\n if (idAttr) ctx.pendingMarkers.push({ id: idAttr, kind: \"end\", offset: 0 });\r\n break;\r\n }\r\n case \"w:sectPr\":\r\n break; // handled by the caller\r\n default:\r\n break; // proofing marks, etc.\r\n }\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Paragraphs and inline content\r\n\r\nfunction parseParagraph(p: XmlNode, ctx: ParseCtx): IRParagraph {\r\n const pPr = el(p, \"w:pPr\");\r\n const props = pPr ? decodeParaProps(pPr, ctx.warnings) : {};\r\n const inlines: IRInline[] = [];\r\n // Bookmarks: block-level ones that preceded this paragraph, plus any\r\n // w:bookmarkStart found inside it (collected during walkInlines).\r\n const bookmarks = ctx.pendingBookmarks;\r\n ctx.pendingBookmarks = [];\r\n ctx.currentBookmarks = bookmarks;\r\n // Block-level markers (pending from before this paragraph) sit at its start;\r\n // inline markers accumulate during walkInlines.\r\n const markers = ctx.pendingMarkers;\r\n ctx.pendingMarkers = [];\r\n ctx.currentMarkers = markers;\r\n // Complex fields (w:fldChar begin \u2192 instr \u2192 separate \u2192 result \u2192 end) span\r\n // multiple runs; the state lives at paragraph scope.\r\n const field: FieldState = { depth: 0, instr: \"\", suppressResult: false };\r\n walkInlines(children(p), inlines, ctx, field);\r\n ctx.currentBookmarks = null;\r\n ctx.currentMarkers = null;\r\n const para: IRParagraph = { kind: \"paragraph\", props, inlines };\r\n if (bookmarks.length > 0) para.bookmarks = bookmarks;\r\n if (markers.length > 0) para.bookmarkMarkers = markers;\r\n if (field.tocInstr !== undefined) para.tocField = field.tocInstr;\r\n return para;\r\n}\r\n\r\ninterface FieldState {\r\n depth: number;\r\n instr: string;\r\n /** True between \"separate\" and \"end\" when the field became a token \u2014 the\r\n * cached result runs must not ALSO be emitted. */\r\n suppressResult: boolean;\r\n /** Set between \"separate\" and \"end\" for a PAGEREF field: the bookmark it points\r\n * at. Its cached result runs (the page number) are tagged with this in-document\r\n * anchor so a TOC whose entries are plain text + a PAGEREF (no surrounding\r\n * hyperlink) still maps each entry to its heading for \"recalculate TOC\". */\r\n pagerefAnchor?: string | undefined;\r\n /** The verbatim instrText of a `TOC` field in this paragraph (first one wins) \u2014\r\n * surfaced on IRParagraph.tocField so a headless render can anchor a built TOC. */\r\n tocInstr?: string | undefined;\r\n /** Set between \"separate\" and \"end\" for a built-in inline field whose cached\r\n * result we keep (DATE/TIME/IF): the field id stamped on those result runs so\r\n * they import as an editable field object. */\r\n resultFieldId?: string | undefined;\r\n}\r\n\r\n/** Built-in inline fields the editor models as field objects (PAGE/NUMPAGES emit a\r\n * {page}/{pages} token; DATE/TIME/IF keep their materialized cached result). */\r\nconst BUILTIN_INLINE = new Set([\"PAGE\", \"NUMPAGES\", \"DATE\", \"TIME\", \"IF\"]);\r\n/** Placeholder style for an IF spec's true/false runs parsed from the instruction\r\n * (their text round-trips; the displayed result keeps its own resolved style). */\r\nconst FIELD_SPEC_STYLE: CharStyle = { fontFamily: \"\", fontSizePx: 16, bold: false, italic: false, underline: false, strikethrough: false, color: \"#000000\" };\r\n\r\n/** The {page}/{pages} token (with format suffix) the layout substitutes per page. */\r\nfunction pageTokenFor(spec: FieldSpec): string {\r\n if (spec.type === \"NUMPAGES\") return \"{pages}\";\r\n if (spec.type === \"PAGE\") return `{page${spec.numFmt && spec.numFmt !== \"arabic\" ? `:${spec.numFmt}` : \"\"}}`;\r\n return \"\";\r\n}\r\n\r\n/** \" PAGE \\\\* MERGEFORMAT \" \u2192 \"{page}\". Layout substitutes per page. */\r\nfunction fieldToken(instr: string): string | undefined {\r\n if (/\\bNUMPAGES\\b/.test(instr)) return \"{pages}\"; // before PAGE \u2014 substring!\r\n if (/\\bPAGE\\b/.test(instr)) return \"{page}\";\r\n return undefined;\r\n}\r\n\r\n/** The in-document bookmark a TOC entry points at, from its field instruction:\r\n * ` PAGEREF _Toc12345 \\h ` or ` HYPERLINK \\l \"_Toc12345\" ` \u2192 \"_Toc12345\". Word\r\n * writes TOC entries as a HYPERLINK field wrapping the label + a nested PAGEREF\r\n * for the number; either carries the same target. */\r\nfunction anchorFromInstr(instr: string): string | undefined {\r\n const m = instr.match(/\\bPAGEREF\\s+(\"[^\"]+\"|\\S+)/) ?? instr.match(/\\bHYPERLINK\\s+\\\\l\\s+(\"[^\"]+\"|\\S+)/);\r\n return m ? m[1]!.replace(/^\"|\"$/g, \"\") : undefined;\r\n}\r\n\r\nfunction walkInlines(nodes: XmlNode[], out: IRInline[], ctx: ParseCtx, field: FieldState): void {\r\n for (const node of nodes) {\r\n switch (node.tagName) {\r\n case \"w:r\":\r\n parseRun(node, out, ctx, field);\r\n break;\r\n case \"w:hyperlink\": {\r\n // Tag the contained runs with the link target \u2014 r:id is an external\r\n // rel (URL, resolved in mapToModel), w:anchor an in-document bookmark.\r\n const relId = attr(node, \"r:id\");\r\n const anchor = attr(node, \"w:anchor\");\r\n const start = out.length;\r\n walkInlines(children(node), out, ctx, field);\r\n if (relId || anchor) {\r\n for (let i = start; i < out.length; i++) {\r\n const inline = out[i]!;\r\n if (inline.kind !== \"run\") continue;\r\n if (relId) inline.props.linkRelId = relId;\r\n else if (anchor) inline.props.linkAnchor = anchor;\r\n }\r\n }\r\n break;\r\n }\r\n case \"w:sdt\": {\r\n const content = el(node, \"w:sdtContent\");\r\n if (!content) break;\r\n const props = parseSdtPr(el(node, \"w:sdtPr\"));\r\n if (!props) {\r\n ctx.warnings.add(\"sdt-unwrapped\", \"Content controls were unwrapped to their content.\");\r\n walkInlines(children(content), out, ctx, field);\r\n break;\r\n }\r\n const sdtId = `sdt${ctx.nextSdt.n++}`;\r\n ctx.sdts[sdtId] = props;\r\n const inner: IRInline[] = [];\r\n walkInlines(children(content), inner, ctx, field);\r\n for (const inline of inner) {\r\n if (inline.kind === \"run\") inline.sdtId = sdtId;\r\n }\r\n out.push(...inner);\r\n break;\r\n }\r\n case \"w:fldSimple\": {\r\n const instr = attr(node, \"w:instr\") ?? \"\";\r\n const token = ctx.fieldTokens ? fieldToken(instr) : undefined;\r\n if (token) {\r\n out.push({ kind: \"run\", text: token, props: firstRunProps(node) });\r\n } else {\r\n walkInlines(children(node), out, ctx, field); // cached result runs\r\n }\r\n break;\r\n }\r\n case \"w:smartTag\":\r\n case \"w:ins\": // accepted tracked insertion\r\n walkInlines(children(node), out, ctx, field);\r\n break;\r\n case \"w:del\": // tracked deletion \u2014 content is already \"deleted\"\r\n break;\r\n case \"w:bookmarkStart\": {\r\n const name = bookmarkName(node);\r\n const idAttr = attr(node, \"w:id\");\r\n if (name && ctx.currentBookmarks) ctx.currentBookmarks.push(name);\r\n if (name && idAttr && ctx.currentMarkers) {\r\n ctx.currentMarkers.push({ id: idAttr, name, kind: \"start\", offset: inlineOffset(out) });\r\n }\r\n break;\r\n }\r\n case \"w:bookmarkEnd\": {\r\n const idAttr = attr(node, \"w:id\");\r\n if (idAttr && ctx.currentMarkers) ctx.currentMarkers.push({ id: idAttr, kind: \"end\", offset: inlineOffset(out) });\r\n break;\r\n }\r\n default:\r\n break; // w:pPr, w:proofErr, comment ranges, \u2026\r\n }\r\n }\r\n}\r\n\r\n/** Props of the first run inside a container \u2014 used to style synthesized\r\n * field-token runs like the field's visible result. */\r\nfunction firstRunProps(container: XmlNode): IRRunProps {\r\n const run = findDeep(container, \"w:r\");\r\n const rPr = run && el(run, \"w:rPr\");\r\n return rPr ? decodeRunProps(rPr) : {};\r\n}\r\n\r\n/** A single w:r can hold many content children (w:t, w:tab, w:br, \u2026).\r\n * Text accumulates into one IR run; breaks flush and emit a break marker. */\r\nfunction parseRun(r: XmlNode, out: IRInline[], ctx: ParseCtx, field: FieldState): void {\r\n const rPr = el(r, \"w:rPr\");\r\n const props = rPr ? decodeRunProps(rPr) : {};\r\n let text = \"\";\r\n const flush = (): void => {\r\n if (text.length > 0) {\r\n // Tag a PAGEREF's cached result (the page number) with its in-document\r\n // anchor so TOC entries lacking a surrounding hyperlink still map to their\r\n // heading. A real hyperlink wrapper overrides this afterwards (same target).\r\n if (field.pagerefAnchor && props.linkAnchor === undefined && props.linkRelId === undefined) {\r\n props.linkAnchor = field.pagerefAnchor;\r\n }\r\n out.push({ kind: \"run\", text, props, ...(field.resultFieldId ? { fieldId: field.resultFieldId } : {}) });\r\n }\r\n text = \"\";\r\n };\r\n const walkContent = (nodes: XmlNode[]): void => {\r\n for (const node of nodes) {\r\n switch (node.tagName) {\r\n case \"w:t\":\r\n if (!field.suppressResult) text += textOf(node);\r\n break;\r\n case \"w:tab\":\r\n if (!field.suppressResult) text += \"\\t\"; // policy (fixed spaces) applied in mapToModel\r\n break;\r\n case \"w:br\": {\r\n flush();\r\n const brType = attr(node, \"w:type\");\r\n if (brType === \"page\") out.push({ kind: \"break\", page: true });\r\n else if (brType === \"column\") out.push({ kind: \"break\", column: true });\r\n else out.push({ kind: \"break\" });\r\n break;\r\n }\r\n case \"w:cr\":\r\n flush();\r\n out.push({ kind: \"break\" });\r\n break;\r\n case \"w:noBreakHyphen\":\r\n text += \"\u2011\";\r\n break;\r\n case \"w:drawing\": {\r\n flush();\r\n const image = parseDrawing(node, ctx);\r\n if (image) out.push(image);\r\n break;\r\n }\r\n case \"w:pict\": {\r\n flush();\r\n const image = parseVmlPict(node, ctx);\r\n if (image) out.push(image);\r\n break;\r\n }\r\n case \"w:object\":\r\n ctx.warnings.add(\"objects-skipped\", \"Embedded OLE objects are not imported.\");\r\n break;\r\n case \"w:instrText\":\r\n if (field.depth > 0) {\r\n field.instr += textOf(node);\r\n // A TOC entry's HYPERLINK/PAGEREF target \u2014 remember it so the cached\r\n // result runs (label + page number) get tagged as in-document links,\r\n // even when nested (Word nests PAGEREF inside the entry's HYPERLINK).\r\n const anchor = anchorFromInstr(field.instr);\r\n if (anchor) field.pagerefAnchor = anchor;\r\n // The paragraph's own TOC field instruction (first wins) \u2014 drives the\r\n // headless TOC build's anchor + the re-emitted instruction on export.\r\n const t = textOf(node);\r\n if (field.tocInstr === undefined && /\\bTOC\\b/.test(t)) field.tocInstr = t;\r\n }\r\n // Block-scoped custom-field tracker: accumulate the TOP-level field's\r\n // instruction (nested fields' instrText belongs to them, not the field\r\n // whose result region we're capturing).\r\n if (ctx.trackFields && ctx.fieldTrack.depth === 1) ctx.fieldTrack.topInstr += textOf(node);\r\n break;\r\n case \"w:fldChar\":\r\n handleFldChar(node, props, out, ctx, field);\r\n break;\r\n case \"mc:AlternateContent\": {\r\n // Word wraps newer markup (drawings, groups) in AlternateContent:\r\n // mc:Choice carries the real content, mc:Fallback a legacy stand-in.\r\n const choice = el(node, \"mc:Choice\") ?? el(node, \"mc:Fallback\");\r\n if (choice) walkContent(children(choice));\r\n break;\r\n }\r\n case \"w:footnoteReference\": {\r\n // The marker run: text becomes the note number in mapToModel.\r\n const fnId = attr(node, \"w:id\");\r\n if (fnId !== undefined) {\r\n flush();\r\n out.push({ kind: \"run\", text: \"\", props: { ...props, footnoteId: fnId } });\r\n }\r\n break;\r\n }\r\n case \"w:footnoteRef\":\r\n break; // the auto-number placeholder inside a footnote BODY \u2014 engine paints it\r\n default:\r\n break; // w:rPr, w:lastRenderedPageBreak, w:endnoteReference, \u2026\r\n }\r\n }\r\n };\r\n walkContent(children(r));\r\n flush();\r\n}\r\n\r\nfunction handleFldChar(\r\n node: XmlNode,\r\n runProps: IRRunProps,\r\n out: IRInline[],\r\n ctx: ParseCtx,\r\n field: FieldState,\r\n): void {\r\n const ft = ctx.fieldTrack;\r\n switch (attr(node, \"w:fldCharType\")) {\r\n case \"begin\":\r\n field.depth++;\r\n if (field.depth === 1) {\r\n field.instr = \"\";\r\n field.suppressResult = false;\r\n field.pagerefAnchor = undefined;\r\n field.resultFieldId = undefined;\r\n }\r\n if (ctx.trackFields) {\r\n ft.depth++;\r\n if (ft.depth === 1) {\r\n ft.topInstr = \"\";\r\n ft.openId = null;\r\n }\r\n }\r\n break;\r\n case \"separate\": {\r\n // Custom field's instruction is complete by `separate` \u2014 open it now so its\r\n // result blocks (which follow) get tagged with the field id.\r\n if (ctx.trackFields && ft.depth === 1) decideCustomField(ctx);\r\n if (field.depth !== 1) break;\r\n // Built-in inline field \u2192 a field object (body only; bands keep the token\r\n // path below for back-compat). PAGE/NUMPAGES emit a tagged {page}/{pages}\r\n // token; DATE/TIME/IF keep their cached result runs, tagged via resultFieldId.\r\n if (ctx.trackFields) {\r\n const parsed = parseFieldInstruction(field.instr);\r\n if (BUILTIN_INLINE.has(parsed.name)) {\r\n const spec = parseFieldSpec(parsed, FIELD_SPEC_STYLE);\r\n if (spec) {\r\n const fid = `field${ft.next.n++}`;\r\n ft.registry[fid] = { id: fid, instruction: field.instr, name: parsed.name, kind: \"builtin\", spec };\r\n if (spec.type === \"PAGE\" || spec.type === \"NUMPAGES\") {\r\n out.push({ kind: \"run\", text: pageTokenFor(spec), props: runProps, fieldId: fid });\r\n field.suppressResult = true;\r\n } else {\r\n field.resultFieldId = fid;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n const token = ctx.fieldTokens ? fieldToken(field.instr) : undefined;\r\n if (token) {\r\n out.push({ kind: \"run\", text: token, props: runProps });\r\n field.suppressResult = true; // the cached result would duplicate the token\r\n }\r\n break;\r\n }\r\n case \"end\":\r\n if (ctx.trackFields && ft.depth > 0) {\r\n if (ft.depth === 1) {\r\n decideCustomField(ctx); // custom field with no `separate` (no cached result)\r\n ft.openId = null; // closed \u2014 but markBlock keeps this block tagged\r\n ft.topInstr = \"\";\r\n }\r\n ft.depth--;\r\n }\r\n if (field.depth > 0) field.depth--;\r\n if (field.depth === 0) {\r\n // Field without a \"separate\" (no cached result): emit the token now.\r\n if (!field.suppressResult) {\r\n const token = ctx.fieldTokens ? fieldToken(field.instr) : undefined;\r\n if (token) out.push({ kind: \"run\", text: token, props: runProps });\r\n }\r\n field.instr = \"\";\r\n field.suppressResult = false;\r\n field.pagerefAnchor = undefined;\r\n field.resultFieldId = undefined;\r\n }\r\n break;\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Images\r\n\r\n/** DrawingML: w:drawing \u2192 wp:inline|wp:anchor \u2192 \u2026 \u2192 a:blip r:embed. The exact\r\n * nesting varies by producer, so the blip is found by deep search. */\r\nfunction parseDrawing(drawing: XmlNode, ctx: ParseCtx): IRInline | undefined {\r\n const anchor = el(drawing, \"wp:anchor\");\r\n const container = el(drawing, \"wp:inline\") ?? anchor;\r\n if (!container) return undefined;\r\n const blip = findDeep(container, \"a:blip\");\r\n const relId = blip && attr(blip, \"r:embed\");\r\n if (!relId) {\r\n ctx.warnings.add(\"images-skipped\", \"A drawing without an embedded image reference was skipped.\");\r\n return undefined;\r\n }\r\n const extent = el(container, \"wp:extent\");\r\n const image: IRInline = { kind: \"image\", relId, anchored: !!anchor };\r\n const cx = numAttr(extent, \"cx\");\r\n if (cx !== undefined) image.widthEmu = cx;\r\n const cy = numAttr(extent, \"cy\");\r\n if (cy !== undefined) image.heightEmu = cy;\r\n if (anchor) {\r\n // Square/tight/through wrap maps onto the model's \"square\" float; wrapNone\r\n // (behind/in-front of text) becomes an absolutely-positioned anchor; only\r\n // topAndBottom/none-without-wrapNone fall back to block flow.\r\n const square = el(anchor, \"wp:wrapSquare\") ?? el(anchor, \"wp:wrapTight\") ?? el(anchor, \"wp:wrapThrough\");\r\n const wrapNone = el(anchor, \"wp:wrapNone\");\r\n image.anchorWrap = square ? \"square\" : \"block\";\r\n const posH = el(anchor, \"wp:positionH\");\r\n const posV = el(anchor, \"wp:positionV\");\r\n const alignText = posH && el(posH, \"wp:align\");\r\n const align = alignText && textOf(alignText);\r\n if (align === \"left\" || align === \"right\" || align === \"center\") image.anchorAlign = align;\r\n if (wrapNone) {\r\n const dec = findDeep(anchor, \"adec:decorative\");\r\n const z = numAttr(anchor, \"relativeHeight\");\r\n image.anchorFloat = {\r\n behind: attr(anchor, \"behindDoc\") === \"1\",\r\n offsetXEmu: posOffsetEmu(posH),\r\n offsetYEmu: posOffsetEmu(posV),\r\n relFromH: relFromH(posH),\r\n relFromV: relFromV(posV),\r\n decorative: !!dec && attr(dec, \"val\") !== \"0\",\r\n ...(z !== undefined ? { z } : {}),\r\n };\r\n } else if (!square) {\r\n ctx.warnings.add(\r\n \"images-anchored\",\r\n \"Some floating images (overlapping or top-and-bottom wrap) were placed in the text flow.\",\r\n );\r\n }\r\n }\r\n return image;\r\n}\r\n\r\n/** wp:positionH|V \u2192 wp:posOffset (EMU, signed). Absent/non-numeric \u2192 0. */\r\nfunction posOffsetEmu(pos: XmlNode | undefined): number {\r\n const off = pos && el(pos, \"wp:posOffset\");\r\n const n = off ? Number(textOf(off).trim()) : NaN;\r\n return Number.isFinite(n) ? n : 0;\r\n}\r\n\r\nconst REL_FROM_H = new Set([\"page\", \"margin\", \"column\", \"leftMargin\", \"rightMargin\", \"character\"]);\r\nconst REL_FROM_V = new Set([\"page\", \"margin\", \"paragraph\", \"line\", \"topMargin\", \"bottomMargin\"]);\r\n\r\n/** wp:positionH/@relativeFrom \u2014 OOXML default is \"column\". Unknown \u2192 \"column\". */\r\nfunction relFromH(pos: XmlNode | undefined): NonNullable<Extract<IRInline, { kind: \"image\" }>[\"anchorFloat\"]>[\"relFromH\"] {\r\n const v = pos && attr(pos, \"relativeFrom\");\r\n return v && REL_FROM_H.has(v) ? (v as never) : \"column\";\r\n}\r\n\r\n/** wp:positionV/@relativeFrom \u2014 OOXML default is \"paragraph\". Unknown \u2192 \"paragraph\". */\r\nfunction relFromV(pos: XmlNode | undefined): NonNullable<Extract<IRInline, { kind: \"image\" }>[\"anchorFloat\"]>[\"relFromV\"] {\r\n const v = pos && attr(pos, \"relativeFrom\");\r\n return v && REL_FROM_V.has(v) ? (v as never) : \"paragraph\";\r\n}\r\n\r\n/** Legacy VML (w:pict \u2192 v:shape \u2192 v:imagedata r:id), still produced for some\r\n * content. Size comes from the shape's style=\"width:\u2026pt;height:\u2026pt\". */\r\nfunction parseVmlPict(pict: XmlNode, ctx: ParseCtx): IRInline | undefined {\r\n const imagedata = findDeep(pict, \"v:imagedata\");\r\n const relId = imagedata && attr(imagedata, \"r:id\");\r\n if (!relId) {\r\n ctx.warnings.add(\"images-skipped\", \"A legacy picture without an image reference was skipped.\");\r\n return undefined;\r\n }\r\n const image: IRInline = { kind: \"image\", relId, anchored: false };\r\n const shape = findDeep(pict, \"v:shape\");\r\n const style = (shape && attr(shape, \"style\")) ?? \"\";\r\n const dim = (name: string): number | undefined => {\r\n const m = style.match(new RegExp(`(?:^|;)\\\\s*${name}:([\\\\d.]+)pt`));\r\n return m ? Number(m[1]) * 12700 : undefined; // pt \u2192 EMU (12700 EMU/pt)\r\n };\r\n const w = dim(\"width\");\r\n if (w !== undefined) image.widthEmu = w;\r\n const h = dim(\"height\");\r\n if (h !== undefined) image.heightEmu = h;\r\n return image;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Tables\r\n\r\n/** w:tcMar / w:tblCellMar \u2192 per-side twips. Each side is a <w:top w:w=\"..\"/> etc.\r\n * Returns undefined when no side is present so the cascade can fall through. */\r\nfunction decodeCellMargin(node: XmlNode | undefined): IRCellMargin | undefined {\r\n if (!node) return undefined;\r\n const side = (name: string): number | undefined => numAttr(el(node, name), \"w:w\");\r\n const m: IRCellMargin = {};\r\n const top = side(\"w:top\");\r\n if (top !== undefined) m.top = top;\r\n const right = side(\"w:right\");\r\n if (right !== undefined) m.right = right;\r\n const bottom = side(\"w:bottom\");\r\n if (bottom !== undefined) m.bottom = bottom;\r\n const left = side(\"w:left\");\r\n if (left !== undefined) m.left = left;\r\n return Object.keys(m).length > 0 ? m : undefined;\r\n}\r\n\r\nfunction parseTable(tbl: XmlNode, ctx: ParseCtx): IRTable {\r\n const rows: IRTableRow[] = [];\r\n for (const tr of els(tbl, \"w:tr\")) {\r\n const cells: IRTableCell[] = [];\r\n for (const tc of els(tr, \"w:tc\")) {\r\n cells.push(parseCell(tc, ctx));\r\n }\r\n rows.push({ cells });\r\n }\r\n const table: IRTable = { kind: \"table\", rows };\r\n const tblGrid = el(tbl, \"w:tblGrid\");\r\n if (tblGrid) {\r\n const widths = els(tblGrid, \"w:gridCol\")\r\n .map((col) => numAttr(col, \"w:w\"))\r\n .filter((w): w is number => w !== undefined && w > 0);\r\n if (widths.length > 0) table.colWidthsTwips = widths;\r\n }\r\n const tblPr = el(tbl, \"w:tblPr\");\r\n if (tblPr) {\r\n const styleId = val(tblPr, \"w:tblStyle\");\r\n if (styleId) table.styleId = styleId;\r\n const look = el(tblPr, \"w:tblLook\");\r\n if (look) {\r\n const on = (a: string): boolean => { const v = attr(look, a); return v === \"1\" || v === \"true\"; };\r\n table.look = {\r\n firstRow: on(\"w:firstRow\"),\r\n lastRow: on(\"w:lastRow\"),\r\n firstCol: on(\"w:firstColumn\"),\r\n lastCol: on(\"w:lastColumn\"),\r\n bandRows: !on(\"w:noHBand\"),\r\n bandCols: !on(\"w:noVBand\"),\r\n };\r\n }\r\n if (el(tblPr, \"w:tblBorders\")) table.bordersSpecified = true;\r\n const borders = decodeBorders(el(tblPr, \"w:tblBorders\"));\r\n if (borders) table.borders = borders;\r\n const shd = decodeShdFill(el(tblPr, \"w:shd\"));\r\n if (shd) table.shd = shd;\r\n const cellMar = decodeCellMargin(el(tblPr, \"w:tblCellMar\"));\r\n if (cellMar) table.cellMarginTwips = cellMar;\r\n }\r\n return table;\r\n}\r\n\r\n/** Cell content is a full block story (paragraphs, images, nested tables) \u2014\r\n * same walk as the body. */\r\nfunction parseCell(tc: XmlNode, ctx: ParseCtx): IRTableCell {\r\n const tcPr = el(tc, \"w:tcPr\");\r\n const gridSpan = (tcPr && numAttr(el(tcPr, \"w:gridSpan\"), \"w:val\")) ?? 1;\r\n const vMerge = tcPr && el(tcPr, \"w:vMerge\");\r\n const vMergeContinue = !!vMerge && (attr(vMerge, \"w:val\") ?? \"continue\") === \"continue\";\r\n\r\n const blocks: IRBlock[] = [];\r\n walkBlocks(children(tc), blocks, ctx);\r\n const cell: IRTableCell = { blocks, gridSpan, vMergeContinue };\r\n if (tcPr) {\r\n if (el(tcPr, \"w:tcBorders\")) cell.bordersSpecified = true;\r\n const borders = decodeBorders(el(tcPr, \"w:tcBorders\"));\r\n if (borders) cell.borders = borders;\r\n const shd = decodeShdFill(el(tcPr, \"w:shd\"));\r\n if (shd) cell.shd = shd;\r\n const cellMar = decodeCellMargin(el(tcPr, \"w:tcMar\"));\r\n if (cellMar) cell.marginTwips = cellMar;\r\n }\r\n return cell;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Content controls (w:sdt)\r\n\r\n/** w:sdtPr \u2192 IRSdtProps. Returns null when there are no properties at all\r\n * (some producers emit bare w:sdt wrappers \u2014 those just unwrap). */\r\nfunction parseSdtPr(pr: XmlNode | undefined): IRSdtProps | null {\r\n if (!pr) return null;\r\n const props: IRSdtProps = { type: \"richText\" };\r\n const alias = el(pr, \"w:alias\");\r\n const aliasVal = alias && attr(alias, \"w:val\");\r\n if (aliasVal) props.alias = aliasVal;\r\n const tag = el(pr, \"w:tag\");\r\n const tagVal = tag && attr(tag, \"w:val\");\r\n if (tagVal) props.tag = tagVal;\r\n if (el(pr, \"w:text\")) props.type = \"plainText\";\r\n const list = el(pr, \"w:dropDownList\") ?? el(pr, \"w:comboBox\");\r\n if (list) {\r\n props.type = list.tagName === \"w:dropDownList\" ? \"dropDown\" : \"comboBox\";\r\n props.listItems = els(list, \"w:listItem\").map((li) => ({\r\n display: attr(li, \"w:displayText\") ?? attr(li, \"w:value\") ?? \"\",\r\n value: attr(li, \"w:value\") ?? attr(li, \"w:displayText\") ?? \"\",\r\n }));\r\n }\r\n const date = el(pr, \"w:date\");\r\n if (date) {\r\n props.type = \"date\";\r\n const fmt = el(date, \"w:dateFormat\");\r\n const fmtVal = fmt && attr(fmt, \"w:val\");\r\n if (fmtVal) props.dateFormat = fmtVal;\r\n }\r\n const checkbox = el(pr, \"w14:checkbox\");\r\n if (checkbox) {\r\n props.type = \"checkbox\";\r\n const checked = el(checkbox, \"w14:checked\");\r\n const v = checked && attr(checked, \"w14:val\");\r\n props.checked = v === \"1\" || v === \"true\";\r\n }\r\n if (el(pr, \"w:showingPlcHdr\")) props.placeholder = true;\r\n const lock = el(pr, \"w:lock\");\r\n const lockVal = lock && attr(lock, \"w:val\");\r\n if (lockVal === \"contentLocked\" || lockVal === \"sdtContentLocked\") props.lockContent = true;\r\n if (lockVal === \"sdtLocked\" || lockVal === \"sdtContentLocked\") props.lockControl = true;\r\n return props;\r\n}\r\n\r\n/** Block-level control: every run in the wrapped paragraphs (including table\r\n * cell paragraphs) joins the control. */\r\nfunction tagBlockSdt(block: IRBlock, sdtId: string): void {\r\n if (block.kind === \"paragraph\") {\r\n for (const inline of block.inlines) {\r\n if (inline.kind === \"run\" && inline.sdtId === undefined) inline.sdtId = sdtId;\r\n }\r\n return;\r\n }\r\n for (const row of block.rows) {\r\n for (const cell of row.cells) for (const b of cell.blocks) tagBlockSdt(b, sdtId);\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Section properties\r\n\r\nfunction parseSection(sectPr: XmlNode, warnings: WarningSink): IRSection {\r\n const section: IRSection = {};\r\n const pgSz = el(sectPr, \"w:pgSz\");\r\n const w = numAttr(pgSz, \"w:w\");\r\n if (w !== undefined) section.pageWidthTwips = w;\r\n const h = numAttr(pgSz, \"w:h\");\r\n if (h !== undefined) section.pageHeightTwips = h;\r\n const pgMar = el(sectPr, \"w:pgMar\");\r\n if (pgMar) {\r\n const top = numAttr(pgMar, \"w:top\");\r\n const right = numAttr(pgMar, \"w:right\");\r\n const bottom = numAttr(pgMar, \"w:bottom\");\r\n const left = numAttr(pgMar, \"w:left\");\r\n if (top !== undefined && right !== undefined && bottom !== undefined && left !== undefined) {\r\n section.marginTwips = { top, right, bottom, left };\r\n }\r\n const headerDist = numAttr(pgMar, \"w:header\");\r\n if (headerDist !== undefined) section.headerDistTwips = headerDist;\r\n const footerDist = numAttr(pgMar, \"w:footer\");\r\n if (footerDist !== undefined) section.footerDistTwips = footerDist;\r\n }\r\n const headerRefs = bandRefs(els(sectPr, \"w:headerReference\"));\r\n if (headerRefs) section.headerRefs = headerRefs;\r\n const footerRefs = bandRefs(els(sectPr, \"w:footerReference\"));\r\n if (footerRefs) section.footerRefs = footerRefs;\r\n if (el(sectPr, \"w:titlePg\")) section.titlePg = true;\r\n\r\n const cols = el(sectPr, \"w:cols\");\r\n if (cols) {\r\n const colEls = els(cols, \"w:col\");\r\n // count: explicit @w:num, else inferred from the w:col children.\r\n const count = numAttr(cols, \"w:num\") ?? (colEls.length > 1 ? colEls.length : 1);\r\n if (count > 1) {\r\n section.columns = { count };\r\n const space = numAttr(cols, \"w:space\");\r\n if (space !== undefined) section.columns.spaceTwips = space;\r\n if (attr(cols, \"w:sep\") === \"1\" || attr(cols, \"w:sep\") === \"true\") section.columns.sep = true;\r\n // Unequal columns: w:equalWidth=\"0\" + a w:col per column.\r\n if (colEls.length === count) {\r\n const list = colEls.map((cel) => ({\r\n wTwips: numAttr(cel, \"w:w\") ?? 0,\r\n spaceTwips: numAttr(cel, \"w:space\") ?? 0,\r\n }));\r\n if (list.some((c) => c.wTwips > 0)) section.columns.cols = list;\r\n }\r\n }\r\n }\r\n const pgBorders = el(sectPr, \"w:pgBorders\");\r\n if (pgBorders) {\r\n const offsetFrom = attr(pgBorders, \"w:offsetFrom\");\r\n const borders: import(\"./types\").IRPageBorders = {\r\n offsetFrom: offsetFrom === \"text\" ? \"text\" : \"page\",\r\n };\r\n const edge = (name: \"top\" | \"right\" | \"bottom\" | \"left\"): void => {\r\n const e = el(pgBorders, \"w:\" + name);\r\n if (!e) return;\r\n const sz = numAttr(e, \"w:sz\");\r\n const space = numAttr(e, \"w:space\");\r\n const color = attr(e, \"w:color\");\r\n borders[name] = {\r\n style: attr(e, \"w:val\") ?? \"single\",\r\n ...(sz !== undefined ? { sz } : {}),\r\n ...(space !== undefined ? { space } : {}),\r\n ...(color !== undefined ? { color } : {}),\r\n };\r\n };\r\n edge(\"top\");\r\n edge(\"right\");\r\n edge(\"bottom\");\r\n edge(\"left\");\r\n if (borders.top || borders.right || borders.bottom || borders.left) section.pageBorders = borders;\r\n }\r\n const pgNumStart = numAttr(el(sectPr, \"w:pgNumType\"), \"w:start\");\r\n if (pgNumStart !== undefined) section.pageNumberStart = pgNumStart;\r\n return section;\r\n}\r\n\r\n/** Collect w:headerReference / w:footerReference by w:type (default/first/even). */\r\nfunction bandRefs(refs: XmlNode[]): BandRefs | undefined {\r\n if (refs.length === 0) return undefined;\r\n const out: BandRefs = {};\r\n for (const ref of refs) {\r\n const id = attr(ref, \"r:id\");\r\n if (!id) continue;\r\n const type = attr(ref, \"w:type\") ?? \"default\";\r\n if (type === \"first\") out.first = id;\r\n else if (type === \"even\") out.even = id;\r\n else out.default = id;\r\n }\r\n return Object.keys(out).length > 0 ? out : undefined;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Footnotes (footnotes.xml)\r\n\r\n/** footnotes.xml \u2192 IR block stories keyed by footnote id. The standard\r\n * separator/continuation pseudo-notes (negative ids / type attrs) are skipped;\r\n * only real notes are returned. Each note's leading w:footnoteRef placeholder\r\n * is dropped (parseRun ignores it) \u2014 the engine paints the number. */\r\nexport function parseFootnotesXml(\r\n xmlText: string,\r\n partName: string,\r\n warnings: WarningSink,\r\n sdts: Record<string, IRSdtProps> = {},\r\n): Map<string, IRBlock[]> {\r\n const out = new Map<string, IRBlock[]>();\r\n const root = rootEl(parseXml(xmlText, partName), \"w:footnotes\");\r\n if (!root) return out;\r\n const ctx: ParseCtx = {\r\n warnings,\r\n fieldTokens: false,\r\n sdts,\r\n nextSdt: { n: Object.keys(sdts).length },\r\n pendingBookmarks: [],\r\n currentBookmarks: null,\r\n pendingMarkers: [],\r\n currentMarkers: null,\r\n trackFields: false,\r\n fieldTrack: newFieldTrack(),\r\n };\r\n for (const note of els(root, \"w:footnote\")) {\r\n const fnId = attr(note, \"w:id\");\r\n if (fnId === undefined) continue;\r\n const type = attr(note, \"w:type\"); // \"separator\" | \"continuationSeparator\" | \u2026\r\n if (type) continue; // pseudo-notes, not real footnotes\r\n const blocks: IRBlock[] = [];\r\n walkBlocks(children(note), blocks, ctx);\r\n out.set(fnId, blocks);\r\n }\r\n return out;\r\n}\r\n", "// IR \u2192 canvas-word model. This is the lossy stage: everything the model\r\n// can't hold is decided HERE (with a warning), never silently in the parser.\r\n//\r\n// Policies (see IMPORT.md \"Lossy mappings\"):\r\n// w:br soft break \u2192 paragraph split (split halves hug: zero space between)\r\n// w:tab \u2192 fixed spaces\r\n// gridSpan/vMerge \u2192 padded uniform cell grid\r\n// inline images \u2192 block-level ImageBlock (paragraph splits around it)\r\n// images in cells \u2192 skipped (TableCell holds paragraphs only)\r\n\r\nimport type {\r\n Block,\r\n BookmarkRange,\r\n CharStyle,\r\n ColumnEntry,\r\n DocPosition,\r\n ImageBlock,\r\n PageBorderEdge,\r\n PageBorders,\r\n ParaStyle,\r\n Paragraph,\r\n Run,\r\n SdtProps,\r\n SectionPatch,\r\n SectionProps,\r\n TabAlign,\r\n TableBlock,\r\n TableCell,\r\n TabLeader,\r\n TabStop,\r\n} from \"@cw/shared\";\r\nimport type { NamedStyle, Stylesheet } from \"@cw/shared\";\r\nimport type { ListDefinition, ListLevel, ListNumberFormat } from \"@cw/shared\";\r\nimport type { TableCond, TableCondProps, TableStyle } from \"@cw/shared\";\r\nimport { normalizeRuns } from \"@cw/shared\";\r\nimport { cellBordersFromIR, resolveCellBorders, type BorderSources, type CellPosition } from \"./borders\";\r\nimport type { MediaStore } from \"./media\";\r\nimport type { NumberingData } from \"./numbering\";\r\nimport type { ResolvedTableStyle, StyleResolver, StylesData } from \"./styles\";\r\nimport type {\r\n IRBlock,\r\n IRBorders,\r\n IRInline,\r\n IRListDefinition,\r\n IRPageBorders,\r\n IRParaProps,\r\n IRParagraph,\r\n IRRunProps,\r\n IRSdtProps,\r\n IRSection,\r\n IRTable,\r\n IRTableCell,\r\n} from \"./types\";\r\nimport { WarningSink } from \"./types\";\r\nimport { emuToPx, halfPointsToPx, marginTwipsToPx, round2, twipsToPx } from \"./units\";\r\n\r\nconst PAGE_BORDER_STYLES = new Set([\"single\", \"double\", \"dashed\", \"dotted\", \"thick\", \"none\"]);\r\n\r\n/** IR newspaper columns \u2192 model columns (twips\u2192px, per-column widths + sep). */\r\nfunction irColumnsToModel(\r\n c: NonNullable<IRSection[\"columns\"]>,\r\n): { count: number; gapPx: number; sep?: boolean; cols?: ColumnEntry[] } {\r\n // OOXML default column gap is 720 twips (0.5\") when w:space is absent.\r\n const out = { count: c.count, gapPx: round2(twipsToPx(c.spaceTwips ?? 720)) } as {\r\n count: number;\r\n gapPx: number;\r\n sep?: boolean;\r\n cols?: ColumnEntry[];\r\n };\r\n if (c.sep) out.sep = true;\r\n if (c.cols && c.cols.length === c.count) {\r\n out.cols = c.cols.map((col) => ({\r\n widthPx: round2(twipsToPx(col.wTwips)),\r\n spaceAfterPx: round2(twipsToPx(col.spaceTwips)),\r\n }));\r\n }\r\n return out;\r\n}\r\n\r\n/** IR page borders \u2192 model PageBorders (eighth-points\u2192px, points\u2192px, color). */\r\nfunction irPageBordersToModel(b: IRPageBorders): PageBorders {\r\n const edge = (e: IRPageBorders[\"top\"]): PageBorderEdge | undefined => {\r\n if (!e) return undefined;\r\n const style = (PAGE_BORDER_STYLES.has(e.style) ? e.style : \"single\") as PageBorderEdge[\"style\"];\r\n const out: PageBorderEdge = {\r\n style,\r\n widthPx: e.sz !== undefined ? round2(e.sz / 6) : 1, // w:sz is eighth-points\r\n color: !e.color || e.color === \"auto\" ? \"#000000\" : `#${e.color}`,\r\n };\r\n if (e.space !== undefined) out.spacePx = round2((e.space * 96) / 72); // w:space is points\r\n return out;\r\n };\r\n const out: PageBorders = { offsetFrom: b.offsetFrom ?? \"page\" };\r\n const top = edge(b.top);\r\n if (top) out.top = top;\r\n const right = edge(b.right);\r\n if (right) out.right = right;\r\n const bottom = edge(b.bottom);\r\n if (bottom) out.bottom = bottom;\r\n const left = edge(b.left);\r\n if (left) out.left = left;\r\n return out;\r\n}\r\n\r\n/** Resolves a hyperlink relationship id to a URL (the part's external rels). */\r\nexport type LinkResolver = (relId: string) => string | undefined;\r\nconst NO_LINKS: LinkResolver = () => undefined;\r\n\r\n// Fallbacks for properties NOTHING specifies (no docDefaults, no style, no\r\n// direct formatting). These mirror what Word itself renders for a bare\r\n// document \u2014 single line spacing, no space after, Times New Roman 12pt \u2014\r\n// NOT the editor's native defaults: an imported page must look like it did\r\n// in Word, even where the file is silent.\r\nconst DEFAULT_CHAR: CharStyle = {\r\n fontFamily: \"Times New Roman, serif\",\r\n fontSizePx: 16, // 12pt\r\n bold: false,\r\n italic: false,\r\n underline: false,\r\n strikethrough: false,\r\n color: \"#000000\",\r\n};\r\n\r\nconst DEFAULT_PARA: ParaStyle = {\r\n align: \"left\",\r\n lineHeight: 1,\r\n spaceBeforePx: 0,\r\n spaceAfterPx: 0,\r\n indentFirstLinePx: 0,\r\n indentLeftPx: 0,\r\n};\r\n\r\n/** Word's default cell margins (TableNormal): 0 top/bottom, 108 twips (~7.2px)\r\n * left/right. The base each table's w:tblCellMar and each cell's w:tcMar\r\n * override per side. Vertical is intentionally 0 \u2014 a single-line row is only as\r\n * tall as its line, which is why a symmetric pad makes Word tables too tall. */\r\nconst WORD_CELL_MARGIN_TWIPS = { top: 0, right: 108, bottom: 0, left: 108 } as const;\r\n\r\n/** US Letter at 96dpi, 1in margins \u2014 matches sampleDoc. */\r\nconst DEFAULT_SECTION: SectionProps = {\r\n pageWidthPx: 816,\r\n pageHeightPx: 1056,\r\n marginPx: { top: 96, right: 96, bottom: 96, left: 96 },\r\n};\r\n\r\nexport interface Mapper {\r\n /** Map a block list (document body, header story, footer story). resolveLink\r\n * resolves that part's hyperlink rels (body and bands have separate rels). */\r\n mapBlocks(blocks: IRBlock[], media: MediaStore, resolveLink?: LinkResolver): Block[];\r\n mapSection(section: IRSection | null): SectionProps;\r\n /** The editor assumes at least one block (the caret needs a home). */\r\n emptyParagraph(): Paragraph;\r\n /** Model list definitions for the lists actually referenced \u2014 for Document.lists. */\r\n lists(): Record<string, ListDefinition>;\r\n /** Bookmark name \u2192 resolved model range, collected across all mapped stories. */\r\n bookmarks(): Record<string, BookmarkRange>;\r\n /** Footnotes referenced (in document order) \u2014 the pipeline maps their bodies\r\n * into Document.footnotes. `noteId` is the model key, `docxId` the source id. */\r\n footnoteRefs(): { docxId: string; noteId: string }[];\r\n /** The first `TOC` field's block id + verbatim instruction, or undefined. */\r\n tocField(): { blockId: string; instruction: string } | undefined;\r\n}\r\n\r\nexport function createMapper(\r\n warnings: WarningSink,\r\n resolver: StyleResolver,\r\n sdts: Record<string, IRSdtProps> = {},\r\n numbering: NumberingData = new Map(),\r\n tableStyle: (styleId: string) => ResolvedTableStyle = () => ({}),\r\n /** The document (body) section's page size in twips \u2014 section breaks that\r\n * match it are geometry-preserving and flow rather than forcing a page. */\r\n refPgSize?: { w: number; h: number },\r\n): Mapper {\r\n // Import-distinct id prefix: commands.ts mints `n\u2026`, sampleDoc `b\u2026`.\r\n let nextId = 0;\r\n const id = (): string => `i${nextId++}`;\r\n\r\n // Bookmark markers resolved to model positions, keyed by w:id; paired into\r\n // ranges in bookmarks(). Start carries the name; end may live in a later block.\r\n const bookmarkStarts = new Map<string, { name: string; pos: DocPosition }>();\r\n const bookmarkEnds = new Map<string, DocPosition>();\r\n\r\n // Footnote markers numbered sequentially in document order (docx id \u2192 number),\r\n // matching the editor's renumber convention. The pipeline maps the referenced\r\n // bodies into Document.footnotes keyed by `fn<docxId>`.\r\n const footnoteNum = new Map<string, string>();\r\n const footnoteOrder: string[] = [];\r\n const footnoteNumber = (docxId: string): string => {\r\n let num = footnoteNum.get(docxId);\r\n if (num === undefined) {\r\n num = String(footnoteNum.size + 1);\r\n footnoteNum.set(docxId, num);\r\n footnoteOrder.push(docxId);\r\n }\r\n return num;\r\n };\r\n\r\n // Model list definitions, built lazily as numIds are referenced during the body\r\n // walk; the lists() getter then realizes any remaining DEFINED-but-unused ones\r\n // so authored list styles survive a round-trip before being applied.\r\n const usedLists = new Map<string, ListDefinition>();\r\n const listDefFor = (numId: string): ListDefinition | undefined => {\r\n const cached = usedLists.get(numId);\r\n if (cached) return cached;\r\n const ir = numbering.get(numId);\r\n if (!ir) return undefined;\r\n const def = buildListDefinition(ir);\r\n usedLists.set(numId, def);\r\n return def;\r\n };\r\n\r\n // What a run with no formatting at all resolves to in THIS document\r\n // (docDefaults + default paragraph style) \u2014 empty paragraphs and padded\r\n // table cells must carry the document's defaults, not the editor's.\r\n const documentChar = mapCharStyle(resolver.run(undefined, {}));\r\n const documentPara = mapParaStyle(resolver.para({}));\r\n\r\n const emptyParagraph = (): Paragraph => ({\r\n kind: \"paragraph\",\r\n id: id(),\r\n revision: 0,\r\n runs: [{ text: \"\", style: { ...documentChar } }],\r\n style: { ...documentPara },\r\n });\r\n\r\n /** Apply list membership to a resolved paragraph style. The engine ADDS the\r\n * list level's indent to the paragraph's own (engine.ts ~L446), so subtract\r\n * the level indent here to avoid double-counting; the marker hang is handled\r\n * by the level's hangingPx, so zero the paragraph's first-line indent.\r\n * Returns the level indent (px) so soft-break continuation lines \u2014 which\r\n * drop list membership \u2014 can restore it and stay aligned under the item. */\r\n const applyListMembership = (style: ParaStyle, ref: IRParaProps[\"list\"]): number => {\r\n if (!ref) return 0; // undefined (no list) or null (explicitly removed)\r\n const def = listDefFor(ref.numId);\r\n if (!def) {\r\n warnings.add(\"list-missing\", \"A list reference had no matching definition \u2014 markers were dropped.\");\r\n return 0;\r\n }\r\n style.list = { listId: ref.numId, level: ref.level };\r\n const lvl = def.levels[Math.min(ref.level, def.levels.length - 1)];\r\n const levelIndentPx = lvl ? lvl.indentLeftPx : 0;\r\n style.indentLeftPx = Math.max(0, round2(style.indentLeftPx - levelIndentPx));\r\n style.indentFirstLinePx = 0;\r\n return levelIndentPx;\r\n };\r\n\r\n const sectionChangesGeometry = (props: IRParaProps): boolean => {\r\n const sz = props.sectionPgSize;\r\n return !!sz && !!refPgSize && (sz.w !== refPgSize.w || sz.h !== refPgSize.h);\r\n };\r\n\r\n /** A section worth its own page+geometry: different page size, newspaper\r\n * columns, or a page-number restart. (A bare footer/header switch with the\r\n * same geometry flows instead \u2014 see mapBlocks.) */\r\n const sectionIsDistinct = (props: IRParaProps): boolean =>\r\n sectionChangesGeometry(props) ||\r\n !!props.sectionColumns ||\r\n props.sectionPageNumberStart !== undefined ||\r\n !!props.sectionPgBorders;\r\n\r\n /** Build a SectionPatch from a section-ending paragraph's geometry/columns. */\r\n const buildSectionPatch = (props: IRParaProps): SectionPatch => {\r\n const patch: SectionPatch = {};\r\n if (props.sectionPgSize) {\r\n patch.pageWidthPx = round2(twipsToPx(props.sectionPgSize.w));\r\n patch.pageHeightPx = round2(twipsToPx(props.sectionPgSize.h));\r\n }\r\n if (props.sectionMarginTwips) {\r\n patch.marginPx = marginTwipsToPx(props.sectionMarginTwips);\r\n }\r\n if (props.sectionColumns) patch.columns = irColumnsToModel(props.sectionColumns);\r\n if (props.sectionPageNumberStart !== undefined) patch.pageNumberStart = props.sectionPageNumberStart;\r\n if (props.sectionHeaderDistTwips !== undefined) patch.headerDistancePx = round2(twipsToPx(props.sectionHeaderDistTwips));\r\n if (props.sectionFooterDistTwips !== undefined) patch.footerDistancePx = round2(twipsToPx(props.sectionFooterDistTwips));\r\n if (props.sectionPgBorders) patch.pageBorders = irPageBordersToModel(props.sectionPgBorders);\r\n return patch;\r\n };\r\n\r\n const lastParagraphOf = (mapped: Block[]): Paragraph | undefined => {\r\n for (let i = mapped.length - 1; i >= 0; i--) if (mapped[i]!.kind === \"paragraph\") return mapped[i] as Paragraph;\r\n return undefined;\r\n };\r\n\r\n // The first TOC field's anchor (block id + instruction), captured as blocks are\r\n // mapped (a paragraph may split into several blocks, so an ordinal can't find it).\r\n let tocAnchor: { blockId: string; instruction: string } | undefined;\r\n\r\n const mapBlocks = (blocks: IRBlock[], media: MediaStore, resolveLink: LinkResolver = NO_LINKS): Block[] => {\r\n const out: Block[] = [];\r\n // A paragraph carrying w:sectPr ends a section (OOXML: its props describe the\r\n // section ending there). A *distinct* section (different geometry/columns/page\r\n // numbering) becomes a real ParaStyle.sectionBreak on that paragraph \u2014 the\r\n // engine pages and applies the geometry. But these generated reports emit a\r\n // Next Page break wherever only the footer changes (dozens, identical\r\n // geometry); a spec-literal page break would strand half of every page, so\r\n // those FLOW \u2014 unless the next section opens with a heading (a real chapter\r\n // boundary), which page-breaks. \"continuous\" never breaks.\r\n let pending = false;\r\n // The first page-type section break ends the title/cover page, which always\r\n // stands alone \u2014 force it even though its new section (the Letter of\r\n // Transmittal) opens with an address rather than a heading. Gated on the cover\r\n // actually holding content (its title image/text), so a leading bare section\r\n // break with nothing before it still flows.\r\n let pendingForce = false;\r\n let seenPageSection = false;\r\n let coverHasContent = false;\r\n const hasRealContent = (bs: Block[]): boolean =>\r\n bs.some((b) => b.kind !== \"paragraph\" || b.runs.some((r) => r.text.trim().length > 0 && !r.style.hidden));\r\n\r\n // Backward attribution: a w:sectPr describes the section it CLOSES, so whether a\r\n // heading starts a new page depends on ITS OWN section's type \u2014 the NEXT sectPr,\r\n // not the one before it. The forward `pending` above breaks the section AFTER a\r\n // page-type break, which silently misses a heading-led page-type section sitting\r\n // behind a \"continuous\" break (e.g. a full-page map between two chapters). We\r\n // track where the current section began and its first visible line so, when the\r\n // section closes as page-type, the break can land on that title directly.\r\n let sectionStartBi = 0;\r\n let sectionFirstVisible: Paragraph | null = null;\r\n const firstVisiblePara = (bs: Block[]): Paragraph | undefined => {\r\n for (const b of bs)\r\n if (b.kind === \"paragraph\" && b.runs.some((r) => r.text.trim().length > 0 && !r.style.hidden)) return b;\r\n return undefined;\r\n };\r\n\r\n // Looking PAST blank/hidden lead-in paragraphs, does the section beginning\r\n // after `afterIndex` open with a real section title? These generated reports\r\n // format titles directly (bold/centered) rather than with a Heading style, so\r\n // isHeading misses them \u2014 but Word always bookmarks a section title for its\r\n // TOC (_Toc<n> targets, or the TOC's own _Part_TOC anchor). A titled section\r\n // starts a new page (Word's Next Page break); plain continuing body text\r\n // after a footer-only break flows. Hidden-anchor paragraphs (w:vanish text,\r\n // dropped on import) are skipped here via the IR's vanish flag.\r\n const isHeadingLedSection = (afterIndex: number): boolean => {\r\n for (let i = afterIndex + 1; i < blocks.length; i++) {\r\n const b = blocks[i]!;\r\n if (b.kind !== \"paragraph\") return false; // opens with a table/image, not a title\r\n const visible = b.inlines.some(\r\n (inl) => inl.kind === \"run\" && inl.text.trim().length > 0 && !inl.props.vanish,\r\n );\r\n if (!visible) continue; // blank line or hidden anchor \u2014 keep looking\r\n if (resolver.isHeading(b.props.styleId)) return true;\r\n return (b.bookmarks ?? []).some((n) => /toc/i.test(n));\r\n }\r\n return false;\r\n };\r\n\r\n for (let bi = 0; bi < blocks.length; bi++) {\r\n const irBlock = blocks[bi]!;\r\n const mapped =\r\n irBlock.kind === \"paragraph\"\r\n ? mapParagraph(irBlock, media, resolveLink)\r\n : [mapTable(irBlock, media, resolveLink)];\r\n\r\n // Custom-field membership: an IR block in a field's result region stamps its\r\n // fieldId onto every model block it produced (a paragraph may split).\r\n if (irBlock.fieldId) for (const b of mapped) b.fieldId = irBlock.fieldId;\r\n\r\n // TOC field anchor: record the real model block (first one this paragraph\r\n // produced) so a headless render places the built TOC exactly here.\r\n if (irBlock.kind === \"paragraph\" && irBlock.tocField !== undefined && tocAnchor === undefined) {\r\n const p = mapped.find((b): b is Paragraph => b.kind === \"paragraph\") ?? mapped[0];\r\n if (p) tocAnchor = { blockId: p.id, instruction: irBlock.tocField };\r\n }\r\n\r\n // Resolve a pending (same-geometry) section break against this block.\r\n // Blank/hidden lead-in paragraphs are skipped so the break lands on the\r\n // section's first VISIBLE line (the title), not an empty anchor above it.\r\n if (pending && mapped.length > 0) {\r\n const first = mapped[0]!;\r\n // Hidden runs count as blank \u2014 a w:vanish anchor paragraph is invisible.\r\n const empty = first.kind === \"paragraph\" && first.runs.every((r) => r.text.length === 0 || r.style.hidden);\r\n if (!empty) {\r\n const heading = irBlock.kind === \"paragraph\" && resolver.isHeading(irBlock.props.styleId);\r\n if (heading || pendingForce) {\r\n if (first.kind === \"paragraph\") first.style.pageBreakBefore = true;\r\n else mapped.unshift({ ...emptyParagraph(), style: { ...documentPara, pageBreakBefore: true } });\r\n }\r\n pending = false;\r\n pendingForce = false;\r\n }\r\n // empty paragraph: keep pending and look past it for the real section start\r\n }\r\n\r\n // Does THIS paragraph end a (page-type) section?\r\n if (irBlock.kind === \"paragraph\" && irBlock.props.sectionBreak === \"page\") {\r\n const props = irBlock.props;\r\n if (sectionIsDistinct(props)) {\r\n // Apply the section's geometry: sectionBreak sits on the paragraph that\r\n // ENDS the section (engine pages at the next block).\r\n let carrier = lastParagraphOf(mapped);\r\n if (!carrier) {\r\n carrier = emptyParagraph();\r\n mapped.push(carrier);\r\n }\r\n carrier.style.sectionBreak = { type: \"nextPage\", props: buildSectionPatch(props) };\r\n pending = false;\r\n } else {\r\n if (props.sectionHasBands) {\r\n warnings.add(\r\n \"section-bands-flattened\",\r\n \"Per-section headers/footers on geometry-preserving section breaks were not applied (the document section's are used).\",\r\n );\r\n }\r\n pending = true;\r\n // Break out of the section when it's the cover\u2192body boundary OR the new\r\n // section opens with a real title (heading style / TOC-bookmarked) \u2014\r\n // Word's Next Page behavior for titled sections (TOC, Flood Map, \u2026).\r\n pendingForce = (!seenPageSection && coverHasContent) || isHeadingLedSection(bi);\r\n // \u2026and break THIS closing section's own title when it's titled \u2014 covers the\r\n // heading-led page section the forward `pending` misses behind a preceding\r\n // continuous break. Never the document's first section (it can't break).\r\n if (sectionStartBi > 0 && sectionFirstVisible && isHeadingLedSection(sectionStartBi - 1)) {\r\n sectionFirstVisible.style.pageBreakBefore = true;\r\n }\r\n }\r\n seenPageSection = true;\r\n }\r\n // Section boundary (page OR continuous): the next block opens a new section, so\r\n // reset the title tracker; otherwise remember this section's first visible line.\r\n if (irBlock.kind === \"paragraph\" && irBlock.props.sectionBreak !== undefined) {\r\n sectionStartBi = bi + 1;\r\n sectionFirstVisible = null;\r\n } else if (!sectionFirstVisible) {\r\n sectionFirstVisible = firstVisiblePara(mapped) ?? null;\r\n }\r\n out.push(...mapped);\r\n if (!seenPageSection) coverHasContent ||= hasRealContent(mapped);\r\n }\r\n keepHeadingWithFollowingFigure(out);\r\n return out;\r\n };\r\n\r\n /** Don't strand a section heading above its figure: when a heading is followed\r\n * \u2014 through only blank lines and a short caption \u2014 by an image or table, mark\r\n * the heading (and that caption) \"keep with next\" so the engine's keep-chain\r\n * rides them to the figure's page. These reports leave the heading's keepNext\r\n * off, so a Heading1 like FLOOD MAP otherwise sits at a page bottom while its\r\n * map flows to the next page. Bounded to a tight group so a heading above real\r\n * body text (with a figure further down) is NOT pulled. */\r\n const keepHeadingWithFollowingFigure = (blocks: Block[]): void => {\r\n const isFigure = (b: Block): boolean => b.kind === \"image\" || b.kind === \"table\";\r\n const isBlank = (b: Block): boolean =>\r\n b.kind === \"paragraph\" && b.runs.every((r) => r.text.trim().length === 0 || r.style.hidden);\r\n const textLen = (b: Block): number => (b.kind === \"paragraph\" ? b.runs.reduce((s, r) => s + r.text.length, 0) : 0);\r\n for (let i = 0; i < blocks.length; i++) {\r\n const h = blocks[i]!;\r\n if (h.kind !== \"paragraph\" || !h.style.namedStyle || !resolver.isHeading(h.style.namedStyle)) continue;\r\n const between: Paragraph[] = [];\r\n let captions = 0;\r\n let figureAt = -1;\r\n for (let j = i + 1; j < blocks.length && j <= i + 6; j++) {\r\n const b = blocks[j]!;\r\n if (isFigure(b)) {\r\n figureAt = j;\r\n break;\r\n }\r\n if (b.kind !== \"paragraph\") break; // anything else ends the tight group\r\n if (isBlank(b)) continue; // blank spacer \u2014 the engine bridges it\r\n if (captions >= 2 || textLen(b) > 300) break; // real body content, not a caption\r\n captions++;\r\n between.push(b);\r\n }\r\n if (figureAt < 0) continue;\r\n h.style.keepWithNext = true;\r\n for (const cap of between) cap.style.keepWithNext = true;\r\n }\r\n };\r\n\r\n // -------------------------------------------------------------------------\r\n // Paragraphs\r\n\r\n /** One IR paragraph maps to 1..N model blocks: soft breaks split it (the\r\n * model has no intra-paragraph line break), and inline images surface as\r\n * block-level ImageBlocks between the text fragments. */\r\n function mapParagraph(ir: IRParagraph, media: MediaStore, resolveLink: LinkResolver): Block[] {\r\n const effPara = resolver.para(ir.props);\r\n const style = mapParaStyle(effPara);\r\n const listLevelIndentPx = applyListMembership(style, effPara.list);\r\n // Empty paragraphs take the paragraph MARK's formatting (w:pPr/w:rPr over\r\n // the style cascade) \u2014 that's what sizes the empty line in Word.\r\n const markChar = mapCharStyle(resolver.run(ir.props.styleId, ir.props.markRunProps ?? {}));\r\n const blocks: Block[] = [];\r\n let runs: Run[] = [];\r\n let trailingBreak = false;\r\n // Set by a page/column break; consumed by the NEXT emitted paragraph \u2014 what\r\n // follows the break starts a new page (or newspaper column).\r\n let pendingPageBreak = false;\r\n let pendingColumnBreak = false;\r\n\r\n const paraOf = (paraRuns: Run[]): Paragraph => {\r\n const paraStyle = { ...style };\r\n if (pendingPageBreak) {\r\n paraStyle.pageBreakBefore = true;\r\n pendingPageBreak = false;\r\n }\r\n if (pendingColumnBreak) {\r\n paraStyle.columnBreakBefore = true;\r\n pendingColumnBreak = false;\r\n }\r\n return {\r\n kind: \"paragraph\",\r\n id: id(),\r\n revision: 0,\r\n runs: normalizeRuns(paraRuns, markChar),\r\n style: paraStyle,\r\n };\r\n };\r\n const flushPara = (): void => {\r\n if (runs.length === 0) return;\r\n blocks.push(paraOf(runs));\r\n runs = [];\r\n };\r\n\r\n for (const inline of ir.inlines) {\r\n switch (inline.kind) {\r\n case \"break\":\r\n if (!inline.page && !inline.column) {\r\n warnings.add(\"soft-breaks\", \"Soft line breaks (Shift+Enter) became paragraph breaks.\");\r\n // A soft break with nothing before it is an empty visual line (\"a\\n\\nb\").\r\n if (runs.length > 0) flushPara();\r\n else blocks.push(paraOf([]));\r\n } else {\r\n // A page/column break flushes any preceding text but emits NO empty line\r\n // of its own \u2014 the pending break rides the NEXT emitted paragraph. Pushing\r\n // a blank \"before\" line here strands an empty paragraph that, after a\r\n // full-page figure, becomes an entire blank page (the break-only paragraph\r\n // Word places between a full-page map and the following section).\r\n if (runs.length > 0) flushPara();\r\n if (inline.page) pendingPageBreak = true;\r\n if (inline.column) pendingColumnBreak = true;\r\n }\r\n trailingBreak = true;\r\n break;\r\n case \"image\": {\r\n const image = mapImage(inline, media, style.align);\r\n if (image) {\r\n flushPara();\r\n // An image can't carry a page/column break \u2014 give the break a carrier.\r\n if (pendingPageBreak || pendingColumnBreak) blocks.push(paraOf([]));\r\n blocks.push(image);\r\n trailingBreak = false;\r\n }\r\n break;\r\n }\r\n case \"run\": {\r\n const effective = resolver.run(ir.props.styleId, inline.props);\r\n // Hidden text (w:vanish) is PRESERVED with style.hidden (set via\r\n // applyRunProps) \u2014 never displayed, never caret-reachable, protected\r\n // from deletion \u2014 so a round-trip re-emits it instead of losing it.\r\n runs.push(mapRun(inline.text, effective, resolveLink, inline.sdtId, inline.fieldId));\r\n trailingBreak = false;\r\n break;\r\n }\r\n }\r\n }\r\n flushPara();\r\n\r\n // Trailing soft break = an empty line after it. A paragraph with no\r\n // surviving content still occupies vertical space \u2014 but an image-only\r\n // paragraph shouldn't add a stray empty line.\r\n if (trailingBreak || blocks.length === 0) blocks.push(paraOf([]));\r\n\r\n // Spacing belongs to the ORIGINAL paragraph: first split keeps the space\r\n // before, last keeps the space after, seams between splits hug.\r\n const paragraphs = blocks.filter((b): b is Paragraph => b.kind === \"paragraph\");\r\n paragraphs.forEach((p, i) => {\r\n if (i > 0) p.style.spaceBeforePx = 0;\r\n if (i < paragraphs.length - 1) p.style.spaceAfterPx = 0;\r\n // A soft break inside a list item is the SAME item: only the first split\r\n // is numbered. Continuation lines drop list membership (no marker, no\r\n // counter bump) and restore the level indent so they align under the text.\r\n if (i > 0 && p.style.list) {\r\n delete p.style.list;\r\n p.style.indentLeftPx = round2(p.style.indentLeftPx + listLevelIndentPx);\r\n }\r\n });\r\n // Resolve this paragraph's bookmark markers to model positions. The home is\r\n // the first emitted block; offsets clamp to its text (exact for the common\r\n // single-block paragraph; a soft-break split anchors into the first block).\r\n if (ir.bookmarkMarkers && ir.bookmarkMarkers.length > 0 && blocks[0]) {\r\n const home = blocks[0]!;\r\n const homeLen = home.kind === \"paragraph\" ? home.runs.reduce((s, r) => s + r.text.length, 0) : 0;\r\n for (const m of ir.bookmarkMarkers) {\r\n const pos: DocPosition = { blockId: home.id, offset: Math.min(m.offset, homeLen) };\r\n if (m.kind === \"start\" && m.name) bookmarkStarts.set(m.id, { name: m.name, pos });\r\n else if (m.kind === \"end\") bookmarkEnds.set(m.id, pos);\r\n }\r\n }\r\n return blocks;\r\n }\r\n\r\n function mapImage(\r\n inline: Extract<IRInline, { kind: \"image\" }>,\r\n media: MediaStore,\r\n paraAlign: ParaStyle[\"align\"],\r\n ): ImageBlock | undefined {\r\n const src = media.resolve(inline.relId);\r\n if (!src) return undefined; // media store already warned\r\n if (inline.widthEmu === undefined || inline.heightEmu === undefined) {\r\n warnings.add(\"images-unsized\", \"An image without explicit dimensions was skipped.\");\r\n return undefined;\r\n }\r\n const image: ImageBlock = {\r\n kind: \"image\",\r\n id: id(),\r\n revision: 0,\r\n src,\r\n widthPx: round2(emuToPx(inline.widthEmu)),\r\n heightPx: round2(emuToPx(inline.heightEmu)),\r\n align: inline.anchorAlign ?? (paraAlign === \"justify\" ? \"left\" : paraAlign),\r\n };\r\n // Anchored with square/tight wrap \u2192 an honest float; the model flows\r\n // following text around it.\r\n if (inline.anchored && inline.anchorWrap === \"square\") image.wrap = \"square\";\r\n // wrapNone anchor \u2192 absolutely-positioned behind/in-front image: no flow\r\n // height, no reflow. Mutually exclusive with `wrap` (parser sets at most one).\r\n if (inline.anchorFloat) {\r\n const a = inline.anchorFloat;\r\n image.anchor = {\r\n behind: a.behind,\r\n offsetXPx: round2(emuToPx(a.offsetXEmu)),\r\n offsetYPx: round2(emuToPx(a.offsetYEmu)),\r\n relFromH: a.relFromH,\r\n relFromV: a.relFromV,\r\n ...(a.decorative ? { decorative: true } : {}),\r\n ...(a.z !== undefined ? { z: a.z } : {}),\r\n };\r\n }\r\n return image;\r\n }\r\n\r\n function mapRun(rawText: string, effective: IRRunProps, resolveLink: LinkResolver, sdtId?: string, fieldId?: string): Run {\r\n // \"\\t\" is preserved \u2014 the layout engine positions it at the paragraph's tab\r\n // stops (or the default interval); no flattening to spaces.\r\n let text = rawText;\r\n const style = mapCharStyle(effective);\r\n if (effective.linkRelId) {\r\n const url = resolveLink(effective.linkRelId);\r\n if (url) style.link = url;\r\n else warnings.add(\"links-unresolved\", \"A hyperlink target could not be resolved and was dropped.\");\r\n } else if (effective.linkAnchor) {\r\n style.link = `#${effective.linkAnchor}`; // in-document bookmark\r\n }\r\n if (effective.footnoteId !== undefined) {\r\n // The ref run's TEXT is its number (the engine paints it at page bottom);\r\n // numbers are sequential in document order, matching the editor's convention.\r\n text = footnoteNumber(effective.footnoteId);\r\n style.footnoteRef = `fn${effective.footnoteId}`;\r\n style.verticalAlign = \"super\";\r\n }\r\n if (sdtId) {\r\n style.sdtId = sdtId;\r\n const sdt = sdts[sdtId];\r\n // Checkbox glyphs arrive in symbol fonts (MS Gothic / Wingdings private\r\n // chars) \u2014 normalize to the Unicode glyphs the editor toggles between.\r\n if (sdt?.type === \"checkbox\" && text.length > 0) {\r\n text = sdt.checked ? \"\u2612\" : \"\u2610\";\r\n style.fontFamily = DEFAULT_CHAR.fontFamily;\r\n }\r\n }\r\n if (fieldId) style.fieldId = fieldId; // inline built-in field result run\r\n // Character-style reference (w:rStyle) \u2014 kept for round-trip + \"what style?\"\r\n // UI; the concrete formatting is already baked above. collectUsedStyleIds\r\n // picks the same id up from the IR so the stylesheet builder includes it.\r\n if (effective.styleId) style.charStyleId = effective.styleId;\r\n return { text, style };\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // Tables \u2014 cells are full block stories; gridSpan maps to colSpan.\r\n\r\n /** A model cell with its source IR (null for padding) and grid position \u2014\r\n * the border/shading pass needs the position; row spans make it non-trivial. */\r\n interface PlacedCell {\r\n cell: TableCell;\r\n ir: IRTableCell | null;\r\n startRow: number;\r\n startCol: number;\r\n colSpan: number;\r\n }\r\n\r\n /** Collapse the OOXML border/shading cascade onto one placed cell. Borders are\r\n * set only when the table carries border info at SOME layer (style, table, or\r\n * any cell) \u2014 otherwise left absent so the renderer draws its default grid. */\r\n function styleCell(\r\n p: PlacedCell,\r\n ir: IRTable,\r\n styled: ResolvedTableStyle,\r\n hasBorderInfo: boolean,\r\n width: number,\r\n rowCount: number,\r\n ): void {\r\n const rowSpan = p.cell.rowSpan ?? 1;\r\n const pos: CellPosition = {\r\n top: p.startRow === 0,\r\n bottom: p.startRow + rowSpan - 1 === rowCount - 1,\r\n left: p.startCol === 0,\r\n right: p.startCol + p.colSpan - 1 === width - 1,\r\n };\r\n const shd = p.ir?.shd ?? ir.shd ?? styled.shd; // cell over table over style\r\n if (shd) p.cell.shading = shd;\r\n if (hasBorderInfo) {\r\n const src: BorderSources = { cell: p.ir?.borders, table: ir.borders, style: styled.borders };\r\n p.cell.borders = resolveCellBorders(src, pos);\r\n }\r\n }\r\n\r\n function mapTable(ir: IRTable, media: MediaStore, resolveLink: LinkResolver): TableBlock {\r\n const buildCell = (irCell: IRTableCell): TableCell => {\r\n const blocks: Block[] = [];\r\n for (const b of irCell.blocks) {\r\n if (b.kind === \"paragraph\") blocks.push(...mapParagraph(b, media, resolveLink));\r\n else blocks.push(mapTable(b, media, resolveLink)); // nested table \u2014 model renders one level\r\n }\r\n const cell: TableCell = { id: id(), blocks: blocks.length > 0 ? blocks : [emptyParagraph()] };\r\n if (irCell.gridSpan > 1) cell.colSpan = irCell.gridSpan;\r\n // Cell-margin cascade: this cell's w:tcMar over the table's w:tblCellMar\r\n // over Word's defaults, resolved per side (a cell may set only top/bottom).\r\n const side = (s: \"top\" | \"right\" | \"bottom\" | \"left\"): number =>\r\n irCell.marginTwips?.[s] ?? ir.cellMarginTwips?.[s] ?? WORD_CELL_MARGIN_TWIPS[s];\r\n cell.margin = marginTwipsToPx({ top: side(\"top\"), right: side(\"right\"), bottom: side(\"bottom\"), left: side(\"left\") });\r\n return cell;\r\n };\r\n\r\n // Column count: the widest row by grid columns. Merge-continuation cells are\r\n // still present in their rows (each covered row carries a w:vMerge cell), so\r\n // every row sums to the full width before we drop them.\r\n const width = Math.max(1, ...ir.rows.map((r) => r.cells.reduce((s, c) => s + Math.max(1, c.gridSpan), 0)));\r\n\r\n // owner[col] = the cell currently spanning down into column `col` (HTML\r\n // rowspan). A w:vMerge=\"continue\" cell is dropped and bumps its owner's\r\n // rowSpan; the row simply omits a cell for those columns.\r\n const owner = new Array<TableCell | undefined>(width);\r\n const placedRows: PlacedCell[][] = ir.rows.map((irRow, ri) => {\r\n const placed: PlacedCell[] = [];\r\n let col = 0;\r\n for (const irCell of irRow.cells) {\r\n if (col >= width) break; // overflow beyond the declared grid \u2014 drop\r\n const span = Math.max(1, Math.min(irCell.gridSpan, width - col));\r\n if (irCell.vMergeContinue) {\r\n const o = owner[col];\r\n if (o) o.rowSpan = (o.rowSpan ?? 1) + 1;\r\n else warnings.add(\"cell-vmerge-orphan\", \"A merged-cell continuation had no cell above to extend.\");\r\n col += span; // owner[col..] persists so deeper continuations find it\r\n continue;\r\n }\r\n const cell = buildCell(irCell);\r\n placed.push({ cell, ir: irCell, startRow: ri, startCol: col, colSpan: span });\r\n for (let k = 0; k < span && col + k < width; k++) owner[col + k] = cell;\r\n col += span;\r\n }\r\n // Genuinely short row (not rowspan holes): pad the trailing columns.\r\n while (col < width) {\r\n const cell: TableCell = { id: id(), blocks: [emptyParagraph()] };\r\n placed.push({ cell, ir: null, startRow: ri, startCol: col, colSpan: 1 });\r\n owner[col] = cell;\r\n col += 1;\r\n }\r\n return placed;\r\n });\r\n\r\n // Borders/shading after all rows so each owner's rowSpan is final.\r\n const styled = ir.styleId ? tableStyle(ir.styleId) : {};\r\n // An explicitly-declared (even empty) w:tblBorders/w:tcBorders counts as\r\n // border info: the author chose \"no borders\", which must override the\r\n // renderer's default grid rather than fall through to it.\r\n const hasBorderInfo =\r\n !!styled.borders ||\r\n !!ir.borders ||\r\n !!ir.bordersSpecified ||\r\n ir.rows.some((r) => r.cells.some((c) => c.borders || c.bordersSpecified));\r\n for (const row of placedRows) for (const p of row) styleCell(p, ir, styled, hasBorderInfo, width, ir.rows.length);\r\n\r\n const rows = placedRows.map((row) => ({ cells: row.map((p) => p.cell) }));\r\n const table: TableBlock = { kind: \"table\", id: id(), revision: 0, rows };\r\n // Table-style reference + active bands (the style itself goes to\r\n // Document.tableStyles via buildTableStyles; cells are baked above).\r\n if (ir.styleId) table.styleId = ir.styleId;\r\n if (ir.look) table.condOverrides = { ...ir.look };\r\n // Always emit colFractions of the true width: dropped continuation cells mean\r\n // a row's cell count no longer equals the column count, so the layout engine\r\n // can't infer the column count from cells.length anymore.\r\n table.colFractions = columnFractions(ir.colWidthsTwips, width);\r\n return table;\r\n }\r\n\r\n // -------------------------------------------------------------------------\r\n // Section\r\n\r\n function mapSection(ir: IRSection | null): SectionProps {\r\n if (!ir) return { ...DEFAULT_SECTION, marginPx: { ...DEFAULT_SECTION.marginPx } };\r\n const section: SectionProps = {\r\n pageWidthPx:\r\n ir.pageWidthTwips !== undefined ? round2(twipsToPx(ir.pageWidthTwips)) : DEFAULT_SECTION.pageWidthPx,\r\n pageHeightPx:\r\n ir.pageHeightTwips !== undefined ? round2(twipsToPx(ir.pageHeightTwips)) : DEFAULT_SECTION.pageHeightPx,\r\n marginPx: ir.marginTwips ? marginTwipsToPx(ir.marginTwips) : { ...DEFAULT_SECTION.marginPx },\r\n };\r\n if (ir.columns) section.columns = irColumnsToModel(ir.columns);\r\n if (ir.pageNumberStart !== undefined) section.pageNumberStart = ir.pageNumberStart;\r\n if (ir.headerDistTwips !== undefined) section.headerDistancePx = round2(twipsToPx(ir.headerDistTwips));\r\n if (ir.footerDistTwips !== undefined) section.footerDistancePx = round2(twipsToPx(ir.footerDistTwips));\r\n if (ir.pageBorders) section.pageBorders = irPageBordersToModel(ir.pageBorders);\r\n return section;\r\n }\r\n\r\n return {\r\n mapBlocks,\r\n mapSection,\r\n emptyParagraph,\r\n // Realize EVERY defined numbering definition (not just referenced ones) so a\r\n // list style authored in the editor survives save\u2192reopen before it's applied.\r\n lists: () => {\r\n for (const numId of numbering.keys()) listDefFor(numId);\r\n return Object.fromEntries(usedLists);\r\n },\r\n bookmarks: () => {\r\n const out: Record<string, BookmarkRange> = {};\r\n for (const [id, s] of bookmarkStarts) {\r\n out[s.name] = { start: s.pos, end: bookmarkEnds.get(id) ?? s.pos }; // point bookmark if no end\r\n }\r\n return out;\r\n },\r\n footnoteRefs: () => footnoteOrder.map((docxId) => ({ docxId, noteId: `fn${docxId}` })),\r\n tocField: () => tocAnchor,\r\n };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Lists (numbering.xml IR \u2192 model ListDefinition)\r\n\r\nconst NUM_FORMAT_MAP: Record<string, ListNumberFormat> = {\r\n decimal: \"decimal\",\r\n decimalZero: \"decimal\",\r\n lowerLetter: \"lowerLetter\",\r\n upperLetter: \"upperLetter\",\r\n lowerRoman: \"lowerRoman\",\r\n upperRoman: \"upperRoman\",\r\n bullet: \"bullet\",\r\n};\r\n\r\n/** Symbol/Wingdings private-use code points Word uses for bullets \u2192 Unicode. */\r\nfunction bulletGlyph(glyph: string): string {\r\n if (glyph.length !== 1) return glyph; // already a real char, or multi-char marker\r\n switch (glyph.charCodeAt(0)) {\r\n case 0xf0b7: // Symbol (filled round bullet)\r\n case 0x00b7: // middle dot\r\n return '\u2022'; // \u2022\r\n case 0xf0a7: // Wingdings (filled square)\r\n case 0x00a7:\r\n return '\u25AA'; // \u25AA\r\n case 0xf06f: // Wingdings (open square)\r\n return '\u25AB'; // \u25AB\r\n case 0xf0d8: // Wingdings (arrowhead)\r\n return '\u2023'; // \u2023\r\n case 0xf0fc: // Wingdings (check)\r\n return '\u2714'; // \u2714\r\n default:\r\n return glyph;\r\n }\r\n}\r\n\r\nfunction buildListDefinition(ir: IRListDefinition): ListDefinition {\r\n const levels: ListLevel[] = [];\r\n for (let i = 0; i < 9; i++) {\r\n levels.push(buildListLevel(ir.levels[i], i));\r\n }\r\n return { id: ir.id, levels };\r\n}\r\n\r\nfunction buildListLevel(ir: IRListDefinition[\"levels\"][number] | undefined, i: number): ListLevel {\r\n if (!ir) {\r\n // Hole in the definition \u2014 synthesize a sane decimal level so the engine's\r\n // levels[level] lookup never hits undefined.\r\n return { format: \"decimal\", text: `%${i + 1}.`, indentLeftPx: 24 + i * 24, hangingPx: 18, start: 1 };\r\n }\r\n const format = NUM_FORMAT_MAP[ir.format] ?? (ir.format === \"none\" ? \"bullet\" : \"decimal\");\r\n const level: ListLevel = {\r\n format,\r\n text: format === \"bullet\" ? \"\" : ir.lvlText,\r\n indentLeftPx: ir.indentLeftTwips !== undefined ? round2(twipsToPx(ir.indentLeftTwips)) : 24 + i * 24,\r\n hangingPx: ir.hangingTwips !== undefined ? round2(twipsToPx(ir.hangingTwips)) : 18,\r\n start: ir.start,\r\n };\r\n if (format === \"bullet\") {\r\n level.bulletChar = ir.format === \"none\" ? \"\" : bulletGlyph(ir.lvlText);\r\n }\r\n if (ir.markerRunProps) {\r\n const marker = mapCharPatch(ir.markerRunProps);\r\n if (Object.keys(marker).length > 0) level.markerStyle = marker;\r\n }\r\n return level;\r\n}\r\n\r\n// Import-side (OOXML w:val \u2192 model enum) maps. Intentionally many-to-one\r\n// (start/num\u2192left, end\u2192right, middleDot\u2192dot, hyphen\u2192dash) and NOT the inverse of\r\n// the exporter's TAB_VAL/TAB_LEADER in export/docx/mappings.ts \u2014 do not merge.\r\nconst TAB_ALIGN: Record<string, TabAlign> = {\r\n left: \"left\",\r\n start: \"left\",\r\n num: \"left\",\r\n center: \"center\",\r\n right: \"right\",\r\n end: \"right\",\r\n decimal: \"decimal\",\r\n};\r\nconst TAB_LEADER: Record<string, TabLeader> = {\r\n dot: \"dot\",\r\n middleDot: \"dot\",\r\n hyphen: \"dash\",\r\n underscore: \"underscore\",\r\n};\r\n\r\n/** Raw w:tabs \u2192 model TabStop[] (twips \u2192 px), sorted by position. */\r\nfunction mapTabStops(raw: NonNullable<IRParaProps[\"tabStops\"]>): TabStop[] {\r\n const stops = raw.map((t) => {\r\n const stop: TabStop = { posPx: round2(twipsToPx(t.posTwips)) };\r\n const align = t.val ? TAB_ALIGN[t.val] : undefined;\r\n if (align && align !== \"left\") stop.align = align;\r\n const leader = t.leader ? TAB_LEADER[t.leader] : undefined;\r\n if (leader) stop.leader = leader;\r\n return stop;\r\n });\r\n stops.sort((a, b) => a.posPx - b.posPx);\r\n return stops;\r\n}\r\n\r\n/** Column fractions of length `width` (sum \u2248 1). From w:tblGrid when it matches\r\n * the column count, else equal columns. The last cell absorbs rounding. */\r\nfunction columnFractions(widthsTwips: number[] | undefined, width: number): number[] {\r\n const fractions =\r\n widthsTwips && widthsTwips.length === width && widthsTwips.reduce((s, w) => s + w, 0) > 0\r\n ? widthsTwips.map((w) => Math.round((w / widthsTwips.reduce((s, x) => s + x, 0)) * 10000) / 10000)\r\n : Array.from({ length: width }, () => Math.round((1 / width) * 10000) / 10000);\r\n fractions[fractions.length - 1] =\r\n Math.round((1 - fractions.slice(0, -1).reduce((s, f) => s + f, 0)) * 10000) / 10000;\r\n return fractions;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Style mapping (pure)\r\n\r\n/** Word's 16 named highlight colors \u2192 hex. */\r\nconst HIGHLIGHT_HEX: Record<string, string> = {\r\n yellow: \"#ffff00\", green: \"#00ff00\", cyan: \"#00ffff\", magenta: \"#ff00ff\",\r\n blue: \"#0000ff\", red: \"#ff0000\", darkBlue: \"#000080\", darkCyan: \"#008080\",\r\n darkGreen: \"#008000\", darkMagenta: \"#800080\", darkRed: \"#800000\", darkYellow: \"#808000\",\r\n darkGray: \"#808080\", lightGray: \"#c0c0c0\", black: \"#000000\", white: \"#ffffff\",\r\n};\r\n\r\nfunction mapCharStyle(props: IRRunProps): CharStyle {\r\n const style: CharStyle = { ...DEFAULT_CHAR };\r\n applyRunProps(style, props);\r\n return style;\r\n}\r\n\r\n/** Shared run-property mapping for full CharStyle and partial style-gallery patches. */\r\nfunction applyRunProps(style: Partial<CharStyle>, props: IRRunProps): void {\r\n if (props.fontAscii) style.fontFamily = `${props.fontAscii}, serif`;\r\n if (props.sizeHalfPoints !== undefined) style.fontSizePx = round2(halfPointsToPx(props.sizeHalfPoints));\r\n if (props.bold !== undefined) style.bold = props.bold;\r\n if (props.italic !== undefined) style.italic = props.italic;\r\n if (props.underline !== undefined) style.underline = props.underline;\r\n if (props.strikethrough !== undefined) style.strikethrough = props.strikethrough;\r\n if (props.color && props.color !== \"auto\") style.color = `#${props.color.toLowerCase()}`;\r\n if (props.highlight) {\r\n const hex = HIGHLIGHT_HEX[props.highlight];\r\n if (hex) style.highlightColor = hex;\r\n }\r\n if (props.vertAlign === \"superscript\") style.verticalAlign = \"super\";\r\n else if (props.vertAlign === \"subscript\") style.verticalAlign = \"sub\";\r\n if (props.vanish) style.hidden = true; // preserved, never displayed (see CharStyle.hidden)\r\n}\r\n\r\n/** IR content controls \u2192 model SdtProps (shapes match; copy defined fields). */\r\nexport function mapSdts(ir: Record<string, IRSdtProps>): Record<string, SdtProps> {\r\n const out: Record<string, SdtProps> = {};\r\n for (const [id, p] of Object.entries(ir)) {\r\n const props: SdtProps = { type: p.type };\r\n if (p.alias !== undefined) props.alias = p.alias;\r\n if (p.tag !== undefined) props.tag = p.tag;\r\n if (p.placeholder) props.placeholder = true;\r\n if (p.listItems !== undefined) props.listItems = p.listItems;\r\n if (p.dateFormat !== undefined) props.dateFormat = p.dateFormat;\r\n if (p.checked !== undefined) props.checked = p.checked;\r\n if (p.lockContent) props.lockContent = true;\r\n if (p.lockControl) props.lockControl = true;\r\n out[id] = props;\r\n }\r\n return out;\r\n}\r\n\r\n/** Patch-only style mappers: a NamedStyle carries each style's OWN deltas \u2014\r\n * the editor resolves basedOn chains itself. Theme-indirected fields are\r\n * skipped (the resolver already baked them into the runs). */\r\nfunction mapCharPatch(props: IRRunProps): Partial<CharStyle> {\r\n const out: Partial<CharStyle> = {};\r\n applyRunProps(out, props);\r\n return out;\r\n}\r\n\r\nfunction mapParaPatch(props: IRParaProps): Partial<ParaStyle> {\r\n const out: Partial<ParaStyle> = {};\r\n if (props.align) out.align = props.align;\r\n if (props.lineHeight !== undefined) out.lineHeight = round2(props.lineHeight);\r\n if (props.spaceBeforeTwips !== undefined) out.spaceBeforePx = round2(twipsToPx(props.spaceBeforeTwips));\r\n if (props.spaceAfterTwips !== undefined) out.spaceAfterPx = round2(twipsToPx(props.spaceAfterTwips));\r\n if (props.indentLeftTwips !== undefined) out.indentLeftPx = round2(twipsToPx(props.indentLeftTwips));\r\n if (props.indentRightTwips !== undefined) out.indentRightPx = round2(twipsToPx(props.indentRightTwips));\r\n if (props.indentFirstLineTwips !== undefined)\r\n out.indentFirstLinePx = round2(twipsToPx(props.indentFirstLineTwips));\r\n if (props.keepWithNext) out.keepWithNext = true;\r\n if (props.keepLinesTogether) out.keepLinesTogether = true;\r\n if (props.tabStops) out.tabStops = mapTabStops(props.tabStops);\r\n return out;\r\n}\r\n\r\n/** styles.xml \u2192 editor Stylesheet. ALL defined paragraph and character styles\r\n * are carried over (not just the ones in use) so a style authored in the editor\r\n * survives a save\u2192reopen even before it's applied to any content \u2014 matching\r\n * Word, which keeps style definitions regardless of use. Display names come from\r\n * w:name; generated documents use opaque numeric styleIds. */\r\nexport function buildStylesheet(data: StylesData): Stylesheet | undefined {\r\n if (data.styles.size === 0) return undefined;\r\n const include = new Set<string>();\r\n for (const def of data.styles.values()) {\r\n if (def.type === \"paragraph\" || def.type === \"character\") include.add(def.id);\r\n }\r\n if (include.size === 0) return undefined;\r\n\r\n const styles: NamedStyle[] = [];\r\n for (const id of include) {\r\n const def = data.styles.get(id)!;\r\n const isChar = def.type === \"character\";\r\n const style: NamedStyle = {\r\n id,\r\n name: def.name ?? id,\r\n type: isChar ? \"character\" : \"paragraph\",\r\n char: mapCharPatch(def.rPr),\r\n para: isChar ? {} : mapParaPatch(def.pPr),\r\n };\r\n // basedOn is kept only when it resolves to an included style of the same kind.\r\n if (def.basedOnId && include.has(def.basedOnId) && data.styles.get(def.basedOnId)?.type === def.type) {\r\n style.basedOn = def.basedOnId;\r\n }\r\n styles.push(style);\r\n }\r\n // Default style first \u2014 the gallery reads top-to-bottom.\r\n styles.sort((a, b) =>\r\n a.id === data.defaultParaStyleId ? -1 : b.id === data.defaultParaStyleId ? 1 : a.name.localeCompare(b.name),\r\n );\r\n return { styles, defaultStyleId: data.defaultParaStyleId ?? styles[0]!.id };\r\n}\r\n\r\n/** styles.xml table styles \u2192 Document.tableStyles. ALL defined table styles are\r\n * carried over (not just used ones) so an authored table style survives a\r\n * save\u2192reopen before being applied. Each w:tblStylePr conditional band maps to a\r\n * TableCond; the whole-table base comes from the style's own rPr/pPr/tblBorders/tblShd. */\r\nexport function buildTableStyles(data: StylesData): Record<string, TableStyle> | undefined {\r\n const include = new Set<string>();\r\n for (const def of data.styles.values()) if (def.type === \"table\") include.add(def.id);\r\n if (include.size === 0) return undefined;\r\n\r\n const condProps = (rPr: IRRunProps, pPr: IRParaProps, borders: IRBorders | undefined, shd: string | undefined): TableCondProps => {\r\n const cp: TableCondProps = {};\r\n const char = mapCharPatch(rPr);\r\n if (Object.keys(char).length > 0) cp.char = char;\r\n const para = mapParaPatch(pPr);\r\n if (Object.keys(para).length > 0) cp.para = para;\r\n const cb = cellBordersFromIR(borders);\r\n if (cb) cp.borders = cb;\r\n if (shd !== undefined) cp.shading = shd;\r\n return cp;\r\n };\r\n\r\n const out: Record<string, TableStyle> = {};\r\n for (const id of include) {\r\n const def = data.styles.get(id)!;\r\n const conds: Partial<Record<TableCond, TableCondProps>> = {\r\n wholeTable: condProps(def.rPr, def.pPr, def.tblBorders, def.tblShd),\r\n };\r\n for (const [cond, c] of Object.entries(def.tblStylePr ?? {})) {\r\n conds[cond as TableCond] = condProps(c.rPr, c.pPr, c.borders, c.shd);\r\n }\r\n const style: TableStyle = { id, name: def.name ?? id, conds };\r\n if (def.basedOnId && include.has(def.basedOnId)) style.basedOn = def.basedOnId;\r\n if (def.rowBandSize !== undefined) style.rowBandSize = def.rowBandSize;\r\n if (def.colBandSize !== undefined) style.colBandSize = def.colBandSize;\r\n out[id] = style;\r\n }\r\n return out;\r\n}\r\n\r\nfunction mapParaStyle(props: IRParaProps): ParaStyle {\r\n const style: ParaStyle = { ...DEFAULT_PARA };\r\n if (props.align) style.align = props.align;\r\n if (props.lineHeight !== undefined) style.lineHeight = round2(props.lineHeight);\r\n if (props.spaceBeforeTwips !== undefined) style.spaceBeforePx = round2(twipsToPx(props.spaceBeforeTwips));\r\n if (props.spaceAfterTwips !== undefined) style.spaceAfterPx = round2(twipsToPx(props.spaceAfterTwips));\r\n if (props.indentLeftTwips !== undefined) style.indentLeftPx = round2(twipsToPx(props.indentLeftTwips));\r\n if (props.indentRightTwips !== undefined) style.indentRightPx = round2(twipsToPx(props.indentRightTwips));\r\n if (props.indentFirstLineTwips !== undefined)\r\n style.indentFirstLinePx = round2(twipsToPx(props.indentFirstLineTwips));\r\n if (props.keepWithNext) style.keepWithNext = true;\r\n if (props.keepLinesTogether) style.keepLinesTogether = true;\r\n if (props.tabStops) style.tabStops = mapTabStops(props.tabStops);\r\n if (props.pageBreakBefore) style.pageBreakBefore = true;\r\n if (props.outlineLevel !== undefined) style.outlineLevel = props.outlineLevel;\r\n if (props.styleId) style.namedStyle = props.styleId;\r\n return style;\r\n}\r\n", "// Embedded media \u2192 blob: URLs. Created where the pipeline runs (worker or\n// Node \u2014 both have Blob/createObjectURL); the URLs are plain strings that\n// survive structured clone and are valid on the main thread (same origin).\n//\n// Each part (document, header1, \u2026) has its OWN rels, so media stores are\n// created per part; the pipeline aggregates the URLs for ImportResult.mediaUrls.\n\nimport type { Relationships } from \"./relationships\";\nimport { WarningSink, type MediaCollector } from \"./types\";\nimport type { Archive } from \"./zip\";\n\nexport interface MediaStore {\n /** blob: URL for an image relationship, or undefined if missing/unsupported. */\n resolve(relId: string): string | undefined;\n /** Every URL this store created \u2014 for ImportResult.mediaUrls (caller revokes). */\n urls(): string[];\n}\n\n/** Browsers can't decode Windows metafiles (Word loves embedding them) \u2014 skip\n * with a warning rather than producing a broken <img>-equivalent. */\nconst CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n webp: \"image/webp\",\n svg: \"image/svg+xml\",\n};\n\nexport function createMediaStore(\n archive: Archive,\n rels: Relationships,\n warnings: WarningSink,\n collect?: MediaCollector,\n): MediaStore {\n const byTarget = new Map<string, string | undefined>(); // same image referenced twice \u2192 one URL\n const created: string[] = [];\n\n return {\n resolve(relId) {\n const rel = rels.get(relId);\n if (!rel) {\n warnings.add(\"media-missing\", \"An image reference had no matching relationship \u2014 skipped.\");\n return undefined;\n }\n if (byTarget.has(rel.target)) return byTarget.get(rel.target);\n\n // Linked (\"Link to File\") images: the target IS the source. Browsers can\n // load http(s) directly; file:/local paths are unreachable from a page.\n if (rel.external) {\n const loadable = /^https?:\\/\\//i.test(rel.target);\n if (!loadable) {\n warnings.add(\n \"media-external-unreachable\",\n \"Linked images pointing at local files can't be loaded in the browser \u2014 skipped.\",\n );\n } else {\n warnings.add(\"media-external\", \"Linked (external) images load from their original URL.\");\n }\n const src = loadable ? rel.target : undefined;\n byTarget.set(rel.target, src);\n return src;\n }\n\n let url: string | undefined;\n const ext = rel.target.slice(rel.target.lastIndexOf(\".\") + 1).toLowerCase();\n const contentType = CONTENT_TYPES[ext];\n if (!contentType) {\n warnings.add(\n \"media-unsupported\",\n `Some images use formats browsers can't display (.${ext}, typically metafiles) \u2014 skipped.`,\n );\n } else {\n const bytes = archive.part(rel.target);\n if (!bytes) {\n warnings.add(\"media-missing\", \"An image reference had no matching relationship \u2014 skipped.\");\n } else {\n // Copy into a fresh buffer: `bytes` may be a view into the archive's\n // big backing buffer, and Blob([view]) would retain all of it.\n const copy = new Uint8Array(bytes);\n if (collect) {\n // Node/backend path: hand the bytes to the collector (which the\n // caller content-addresses) and use the synthetic src it returns \u2014\n // no blob: URL (createObjectURL isn't reliably available off-browser).\n url = collect.add(copy, contentType);\n } else {\n url = URL.createObjectURL(new Blob([copy], { type: contentType }));\n created.push(url);\n }\n }\n }\n byTarget.set(rel.target, url);\n return url;\n },\n urls: () => [...created],\n };\n}\n\n/** No-op store for parts without rels. */\nexport const EMPTY_MEDIA: MediaStore = { resolve: () => undefined, urls: () => [] };\n", "// numbering.xml \u2192 IR list definitions, keyed by numId (the id space paragraphs\n// reference via w:numPr/w:numId). Resolves w:num \u2192 w:abstractNum, applies\n// w:lvlOverride. mapToModel converts these to model ListDefinitions (twips\u2192px,\n// marker rPr \u2192 CharStyle); the model renders markers paint-only.\n\nimport { decodeRunProps } from \"./props\";\nimport type { IRListDefinition, IRListLevel } from \"./types\";\nimport { attr, el, els, numAttr, parseXml, rootEl, val, type XmlNode } from \"./xml\";\n\nexport type NumberingData = Map<string, IRListDefinition>;\n\nexport const EMPTY_NUMBERING: NumberingData = new Map();\n\nexport function parseNumberingXml(xmlText: string): NumberingData {\n const out: NumberingData = new Map();\n const root = rootEl(parseXml(xmlText, \"numbering.xml\"), \"w:numbering\");\n if (!root) return out;\n\n // abstractNumId \u2192 its 0..8 levels.\n const abstracts = new Map<string, IRListLevel[]>();\n for (const abs of els(root, \"w:abstractNum\")) {\n const absId = attr(abs, \"w:abstractNumId\");\n if (absId === undefined) continue;\n abstracts.set(absId, parseLevels(abs));\n }\n\n // w:num maps a public numId onto an abstractNum, with optional level overrides.\n for (const num of els(root, \"w:num\")) {\n const numId = attr(num, \"w:numId\");\n if (numId === undefined) continue;\n const absId = val(num, \"w:abstractNumId\");\n const base = absId !== undefined ? abstracts.get(absId) : undefined;\n if (!base) continue; // numStyleLink-only definitions aren't resolved\n const levels = base.map((l) => ({ ...l })); // copy \u2014 overrides mutate per-num\n for (const ovr of els(num, \"w:lvlOverride\")) {\n const ilvl = numAttr(ovr, \"w:ilvl\") ?? 0;\n const startOverride = numAttr(el(ovr, \"w:startOverride\"), \"w:val\");\n const lvlEl = el(ovr, \"w:lvl\");\n if (lvlEl && levels[ilvl]) levels[ilvl] = parseLevel(lvlEl, ilvl);\n if (startOverride !== undefined && levels[ilvl]) levels[ilvl]!.start = startOverride;\n }\n out.set(numId, { id: numId, levels });\n }\n return out;\n}\n\nfunction parseLevels(abstractNum: XmlNode): IRListLevel[] {\n const levels: IRListLevel[] = [];\n for (const lvl of els(abstractNum, \"w:lvl\")) {\n const ilvl = numAttr(lvl, \"w:ilvl\") ?? levels.length;\n levels[ilvl] = parseLevel(lvl, ilvl);\n }\n return levels;\n}\n\nfunction parseLevel(lvl: XmlNode, ilvl: number): IRListLevel {\n // lvlText present but valueless (\"\") is meaningful (a \"none\" marker); only an\n // absent element falls back to the conventional \"%n.\" pattern.\n const lvlTextEl = el(lvl, \"w:lvlText\");\n const level: IRListLevel = {\n format: val(lvl, \"w:numFmt\") ?? \"decimal\",\n lvlText: lvlTextEl ? (attr(lvlTextEl, \"w:val\") ?? \"\") : `%${ilvl + 1}.`,\n start: numAttr(el(lvl, \"w:start\"), \"w:val\") ?? 1,\n };\n\n const pPr = el(lvl, \"w:pPr\");\n const ind = pPr && el(pPr, \"w:ind\");\n if (ind) {\n const left = numAttr(ind, \"w:left\") ?? numAttr(ind, \"w:start\");\n if (left !== undefined) level.indentLeftTwips = left;\n const hanging = numAttr(ind, \"w:hanging\");\n if (hanging !== undefined) level.hangingTwips = hanging;\n }\n const rPr = el(lvl, \"w:rPr\");\n if (rPr) level.markerRunProps = decodeRunProps(rPr);\n return level;\n}\n", "// OPC relationships: word/_rels/document.xml.rels maps rIds \u2192 part targets.\n// Used to locate styles.xml / theme (milestone 2) and media parts (milestone 3)\n// instead of hardcoding conventional names.\n\nimport { attr, children, parseXml, rootEl } from \"./xml\";\n\nexport interface Relationship {\n id: string;\n /** Full relationship type URI; match with findByType() on the trailing segment. */\n type: string;\n /** Internal: resolved zip part name. External: the raw target (URL/path) \u2014\n * hyperlinks always, but also linked (\"Link to File\") images and OLE objects. */\n target: string;\n /** TargetMode=\"External\" \u2014 target lives outside the package. */\n external: boolean;\n}\n\nexport type Relationships = Map<string, Relationship>;\n\n/** @param sourcePart the part these rels belong to, e.g. \"word/document.xml\" \u2014\n * relative targets resolve against its directory. */\nexport function parseRelationships(relsXml: string, sourcePart: string): Relationships {\n const baseDir = sourcePart.includes(\"/\") ? sourcePart.slice(0, sourcePart.lastIndexOf(\"/\")) : \"\";\n const out: Relationships = new Map();\n const root = rootEl(parseXml(relsXml, `${sourcePart} rels`), \"Relationships\");\n if (!root) return out;\n for (const rel of children(root)) {\n if (rel.tagName !== \"Relationship\") continue;\n const id = attr(rel, \"Id\");\n const type = attr(rel, \"Type\");\n const target = attr(rel, \"Target\");\n if (!id || !type || !target) continue;\n const external = attr(rel, \"TargetMode\") === \"External\";\n out.set(id, { id, type, target: external ? target : resolveTarget(baseDir, target), external });\n }\n return out;\n}\n\n/** \"/word/styles.xml\" is package-rooted; \"styles.xml\" or \"../x.xml\" is relative. */\nfunction resolveTarget(baseDir: string, target: string): string {\n if (target.startsWith(\"/\")) return target.slice(1);\n const parts = baseDir === \"\" ? [] : baseDir.split(\"/\");\n for (const seg of target.split(\"/\")) {\n if (seg === \"..\") parts.pop();\n else if (seg !== \".\" && seg !== \"\") parts.push(seg);\n }\n return parts.join(\"/\");\n}\n\n/** Relationship types share a URI prefix; the trailing segment is the kind. */\nexport function findByType(rels: Relationships, kind: string): Relationship | undefined {\n for (const rel of rels.values()) {\n if (rel.type.endsWith(`/${kind}`)) return rel;\n }\n return undefined;\n}\n\n/** Conventional location of a part's own rels: dir/_rels/name.rels */\nexport function relsPartFor(partName: string): string {\n const slash = partName.lastIndexOf(\"/\");\n const dir = slash >= 0 ? partName.slice(0, slash + 1) : \"\";\n const name = slash >= 0 ? partName.slice(slash + 1) : partName;\n return `${dir}_rels/${name}.rels`;\n}\n", "// theme1.xml \u2192 font scheme + color scheme. Styles and direct formatting can\n// reference these indirectly (w:asciiTheme=\"minorHAnsi\", w:themeColor=\"accent1\");\n// the StyleResolver translates the references using this data.\n\nimport { attr, children, el, parseXml, rootEl, type XmlNode } from \"./xml\";\n\nexport interface Theme {\n /** a:majorFont latin typeface \u2014 headings (\"majorHAnsi\" etc.). */\n majorLatin?: string;\n /** a:minorFont latin typeface \u2014 body text (\"minorHAnsi\" etc.). */\n minorLatin?: string;\n /** Scheme color slot \u2192 hex (no '#'), e.g. \"accent1\" \u2192 \"4472C4\". */\n colors: Map<string, string>;\n}\n\nexport const EMPTY_THEME: Theme = { colors: new Map() };\n\n/** w:themeColor names \u2192 clrScheme element names. text/background map onto\n * dk/lt (the standard clrMap; we assume Word's default mapping). */\nconst THEME_COLOR_ALIASES: Record<string, string> = {\n dark1: \"dk1\",\n light1: \"lt1\",\n dark2: \"dk2\",\n light2: \"lt2\",\n text1: \"dk1\",\n background1: \"lt1\",\n text2: \"dk2\",\n background2: \"lt2\",\n hyperlink: \"hlink\",\n followedHyperlink: \"folHlink\",\n};\n\nexport function themeColor(theme: Theme, name: string): string | undefined {\n return theme.colors.get(THEME_COLOR_ALIASES[name] ?? name);\n}\n\nexport function themeFont(theme: Theme, slot: string): string | undefined {\n if (slot.startsWith(\"major\")) return theme.majorLatin;\n if (slot.startsWith(\"minor\")) return theme.minorLatin;\n return undefined;\n}\n\nexport function parseThemeXml(xmlText: string): Theme {\n const theme: Theme = { colors: new Map() };\n const root = rootEl(parseXml(xmlText, \"theme\"), \"a:theme\");\n const elements = root && el(root, \"a:themeElements\");\n if (!elements) return theme;\n\n const fontScheme = el(elements, \"a:fontScheme\");\n if (fontScheme) {\n const major = latinTypeface(el(fontScheme, \"a:majorFont\"));\n if (major) theme.majorLatin = major;\n const minor = latinTypeface(el(fontScheme, \"a:minorFont\"));\n if (minor) theme.minorLatin = minor;\n }\n\n const clrScheme = el(elements, \"a:clrScheme\");\n if (clrScheme) {\n for (const slot of children(clrScheme)) {\n const name = slot.tagName.replace(/^a:/, \"\");\n const srgb = el(slot, \"a:srgbClr\");\n const sys = el(slot, \"a:sysClr\");\n const hex = (srgb && attr(srgb, \"val\")) ?? (sys && attr(sys, \"lastClr\"));\n if (hex) theme.colors.set(name, hex);\n }\n }\n return theme;\n}\n\nfunction latinTypeface(font: XmlNode | undefined): string | undefined {\n const latin = font && el(font, \"a:latin\");\n const typeface = latin && attr(latin, \"typeface\");\n return typeface || undefined; // empty typeface=\"\" \u2192 undefined\n}\n", "// styles.xml \u2192 StyleResolver. This is where docx fidelity lives or dies:\n// most real-world formatting (fonts, sizes, heading looks) arrives through the\n// style cascade, not direct formatting.\n//\n// Resolution order (ECMA-376 \u00A717.7.2):\n// docDefaults \u2192 paragraph-style basedOn chain \u2192 character-style chain \u2192 direct\n//\n// Within a basedOn chain, properties inherit child-over-parent (plain override).\n// ACROSS the hierarchy levels, *toggle* properties (bold/italic/strike/vanish)\n// combine by XOR (\u00A717.7.3): paragraph style bold + character style bold = NOT\n// bold. Direct formatting is absolute and exempt from XOR. Getting this wrong\n// is the classic \"everything is bold\" import bug.\n//\n// Theme indirections (w:asciiTheme, w:themeColor) are translated to concrete\n// values here, after merging \u2014 any layer may carry the reference.\n\nimport { decodeBorders, decodeShdFill, mergeBorders } from \"./borders\";\nimport { decodeParaProps, decodeRunProps } from \"./props\";\nimport { themeColor, themeFont, type Theme } from \"./theme\";\nimport type { IRBorders, IRParaProps, IRRunProps } from \"./types\";\nimport { WarningSink } from \"./types\";\nimport { attr, el, els, parseXml, rootEl, val } from \"./xml\";\n\nexport interface StyleDef {\n id: string;\n type: string; // \"paragraph\" | \"character\" | \"table\" | \"numbering\"\n /** w:name \u2014 the human-readable name (\"Heading 2\"); generated documents use\n * opaque numeric styleIds, so the NAME is what the style gallery shows. */\n name?: string;\n basedOnId?: string;\n rPr: IRRunProps;\n pPr: IRParaProps;\n /** Table styles only: w:tblPr/w:tblBorders. */\n tblBorders?: IRBorders;\n /** Table styles only: w:tblPr/w:shd \u2192 CSS fill. */\n tblShd?: string;\n /** Table styles only: each w:tblStylePr conditional band, keyed by its w:type\n * (firstRow, band1Horz, \u2026) \u2014 these map 1:1 to the model's TableCond. */\n tblStylePr?: Record<string, TblCondDef>;\n /** Table styles only: w:tblStyleRowBandSize / w:tblStyleColBandSize. */\n rowBandSize?: number;\n colBandSize?: number;\n}\n\n/** One w:tblStylePr conditional band's captured formatting. */\nexport interface TblCondDef {\n rPr: IRRunProps;\n pPr: IRParaProps;\n borders?: IRBorders;\n shd?: string;\n}\n\n/** A table style's borders/shd, with its basedOn chain already collapsed. */\nexport interface ResolvedTableStyle {\n borders?: IRBorders;\n shd?: string;\n}\n\nexport interface StylesData {\n docDefaultsRun: IRRunProps;\n docDefaultsPara: IRParaProps;\n styles: Map<string, StyleDef>;\n /** The w:default=\"1\" paragraph style (usually \"Normal\") \u2014 applies to\n * paragraphs that carry no w:pStyle at all. */\n defaultParaStyleId?: string;\n}\n\nexport const EMPTY_STYLES: StylesData = { docDefaultsRun: {}, docDefaultsPara: {}, styles: new Map() };\n\nexport function parseStylesXml(xmlText: string, warnings: WarningSink): StylesData {\n const data: StylesData = { docDefaultsRun: {}, docDefaultsPara: {}, styles: new Map() };\n const root = rootEl(parseXml(xmlText, \"styles.xml\"), \"w:styles\");\n if (!root) return data;\n\n const docDefaults = el(root, \"w:docDefaults\");\n if (docDefaults) {\n const rPrDefault = el(docDefaults, \"w:rPrDefault\");\n const rPr = rPrDefault && el(rPrDefault, \"w:rPr\");\n if (rPr) data.docDefaultsRun = decodeRunProps(rPr);\n const pPrDefault = el(docDefaults, \"w:pPrDefault\");\n const pPr = pPrDefault && el(pPrDefault, \"w:pPr\");\n if (pPr) data.docDefaultsPara = decodeParaProps(pPr, warnings);\n }\n\n for (const style of els(root, \"w:style\")) {\n const id = attr(style, \"w:styleId\");\n const type = attr(style, \"w:type\");\n if (!id || !type) continue;\n const rPrEl = el(style, \"w:rPr\");\n const pPrEl = el(style, \"w:pPr\");\n const def: StyleDef = {\n id,\n type,\n rPr: rPrEl ? decodeRunProps(rPrEl) : {},\n pPr: pPrEl ? decodeParaProps(pPrEl, warnings) : {},\n };\n const name = val(style, \"w:name\");\n if (name) def.name = name;\n const basedOnId = val(style, \"w:basedOn\");\n if (basedOnId) def.basedOnId = basedOnId;\n if (type === \"table\") {\n const tblPr = el(style, \"w:tblPr\");\n if (tblPr) {\n const borders = decodeBorders(el(tblPr, \"w:tblBorders\"));\n if (borders) def.tblBorders = borders;\n const shd = decodeShdFill(el(tblPr, \"w:shd\"));\n if (shd) def.tblShd = shd;\n const rowBand = val(tblPr, \"w:tblStyleRowBandSize\");\n if (rowBand && Number.isFinite(Number(rowBand))) def.rowBandSize = Number(rowBand);\n const colBand = val(tblPr, \"w:tblStyleColBandSize\");\n if (colBand && Number.isFinite(Number(colBand))) def.colBandSize = Number(colBand);\n }\n const conds: Record<string, TblCondDef> = {};\n for (const sp of els(style, \"w:tblStylePr\")) {\n const condType = attr(sp, \"w:type\");\n if (!condType) continue;\n const rPrEl = el(sp, \"w:rPr\");\n const pPrEl = el(sp, \"w:pPr\");\n const tcPr = el(sp, \"w:tcPr\");\n const cond: TblCondDef = {\n rPr: rPrEl ? decodeRunProps(rPrEl) : {},\n pPr: pPrEl ? decodeParaProps(pPrEl, warnings) : {},\n };\n const cb = tcPr && decodeBorders(el(tcPr, \"w:tcBorders\"));\n if (cb) cond.borders = cb;\n const cs = tcPr && decodeShdFill(el(tcPr, \"w:shd\"));\n if (cs) cond.shd = cs;\n conds[condType] = cond;\n }\n if (Object.keys(conds).length > 0) def.tblStylePr = conds;\n }\n data.styles.set(id, def);\n const isDefault = attr(style, \"w:default\");\n if (type === \"paragraph\" && (isDefault === \"1\" || isDefault === \"true\")) {\n data.defaultParaStyleId = id;\n }\n }\n return data;\n}\n\n/** Collapse a table style's basedOn chain into one borders/shd spec\n * (root \u2192 leaf, child overriding per edge). Cycle-guarded. */\nexport function resolveTableStyle(data: StylesData, styleId: string): ResolvedTableStyle {\n let borders: IRBorders | undefined;\n let shd: string | undefined;\n const seen = new Set<string>();\n const chain: StyleDef[] = [];\n for (\n let cur = data.styles.get(styleId);\n cur && !seen.has(cur.id);\n cur = cur.basedOnId ? data.styles.get(cur.basedOnId) : undefined\n ) {\n seen.add(cur.id);\n chain.unshift(cur); // root first\n }\n for (const def of chain) {\n borders = mergeBorders(borders, def.tblBorders);\n if (def.tblShd !== undefined) shd = def.tblShd;\n }\n const out: ResolvedTableStyle = {};\n if (borders) out.borders = borders;\n if (shd !== undefined) out.shd = shd;\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Resolver\n\nexport interface StyleResolver {\n /** Effective run props: cascade + direct formatting, theme refs translated. */\n run(pStyleId: string | undefined, direct: IRRunProps): IRRunProps;\n /** Effective paragraph props: cascade + direct formatting. */\n para(direct: IRParaProps): IRParaProps;\n /** True when this style (or a basedOn ancestor) is a built-in heading \u2014 its\n * w:name is \"Heading 1\"..\"Heading 9\". Used to decide whether a section break\n * starts a real new (heading-led) section, which page-breaks, vs flows. */\n isHeading(pStyleId: string | undefined): boolean;\n}\n\n/** Toggle properties per \u00A717.7.3 \u2014 XOR across hierarchy levels.\n * (underline is NOT a toggle: it's an enumerated value, plain override.) */\nconst RUN_TOGGLES = [\"bold\", \"italic\", \"strikethrough\", \"vanish\"] as const;\n\nexport function createStyleResolver(data: StylesData, theme: Theme): StyleResolver {\n // basedOn chains resolved root\u2192leaf with override semantics, memoized per style.\n const chainRunCache = new Map<string, IRRunProps>();\n const chainParaCache = new Map<string, IRParaProps>();\n\n const chainOf = (id: string): StyleDef[] => {\n const chain: StyleDef[] = [];\n const seen = new Set<string>(); // cycle guard (corrupt files exist)\n for (let cur = data.styles.get(id); cur && !seen.has(cur.id); cur = cur.basedOnId ? data.styles.get(cur.basedOnId) : undefined) {\n seen.add(cur.id);\n chain.unshift(cur); // root first\n }\n return chain;\n };\n\n const chainRun = (id: string): IRRunProps => {\n let out = chainRunCache.get(id);\n if (!out) {\n out = chainOf(id).reduce<IRRunProps>((acc, def) => mergeRun(acc, def.rPr), {});\n chainRunCache.set(id, out);\n }\n return out;\n };\n\n const chainPara = (id: string): IRParaProps => {\n let out = chainParaCache.get(id);\n if (!out) {\n out = chainOf(id).reduce<IRParaProps>((acc, def) => mergeProps(acc, def.pPr), {});\n chainParaCache.set(id, out);\n }\n return out;\n };\n\n // Style-layer run props (no direct formatting) memoized by (pStyle, rStyle) \u2014\n // a 70-page document reuses a handful of combinations thousands of times.\n const layerCache = new Map<string, IRRunProps>();\n const styleLayerRun = (pStyleId: string | undefined, rStyleId: string | undefined): IRRunProps => {\n const key = `${pStyleId ?? \"\"}|${rStyleId ?? \"\"}`;\n let out = layerCache.get(key);\n if (out) return out;\n\n const p = pStyleId ? chainRun(pStyleId) : {};\n const r = rStyleId ? chainRun(rStyleId) : {};\n out = mergeRun(mergeRun(data.docDefaultsRun, p), r);\n\n // Toggles: XOR across levels, overriding what the plain merge produced.\n for (const t of RUN_TOGGLES) {\n if (data.docDefaultsRun[t] === undefined && p[t] === undefined && r[t] === undefined) continue;\n const base = data.docDefaultsRun[t] ?? false;\n out[t] = (base !== (p[t] === true)) !== (r[t] === true);\n }\n layerCache.set(key, out);\n return out;\n };\n\n return {\n run(pStyleId, direct) {\n const effectivePid = pStyleId ?? data.defaultParaStyleId;\n const layer = styleLayerRun(effectivePid, direct.styleId);\n // Direct formatting is absolute \u2014 toggles included (\u00A717.7.3 exempts it from XOR).\n return translateTheme(mergeRun(layer, direct));\n },\n para(direct) {\n const pid = direct.styleId ?? data.defaultParaStyleId;\n const chain = pid ? chainPara(pid) : {};\n const eff = mergeProps(mergeProps(data.docDefaultsPara, chain), direct);\n // namedStyle in the model should reflect the document's own reference.\n if (direct.styleId) eff.styleId = direct.styleId;\n else delete eff.styleId;\n return eff;\n },\n isHeading(pStyleId) {\n if (!pStyleId) return false;\n // \"heading\" as a whole word, or immediately before a level digit \u2014 matches\n // \"Heading 1\" / \"Heading1\" (name or styleId) and named variants like \"TOC\n // Heading Custom\" (the TOC's own title style), but NOT \"toc 1\" (the entry\n // style) or \"Subheading\". Word's built-in headings use either name or id;\n // generated docs keep the human name on an opaque numeric id.\n const isHeadingLabel = (s: string | undefined): boolean => s !== undefined && /(^|\\s)heading(\\s|\\d|$)/i.test(s);\n return chainOf(pStyleId).some((def) => isHeadingLabel(def.name) || isHeadingLabel(def.id));\n },\n };\n\n function translateTheme(props: IRRunProps): IRRunProps {\n const out = { ...props };\n if (!out.fontAscii && out.fontThemeAscii) {\n const font = themeFont(theme, out.fontThemeAscii);\n if (font) out.fontAscii = font;\n }\n if ((out.color === undefined || out.color === \"auto\") && out.colorTheme) {\n const color = themeColor(theme, out.colorTheme);\n if (color) out.color = color;\n }\n return out;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Property merging (defined fields of `add` override `base`)\n\n/** Font and color each span two linked fields (concrete + theme ref). A layer\n * that specifies either form of the slot replaces the whole slot \u2014 otherwise a\n * child's concrete font would lose to a grandparent's lingering theme ref. */\nfunction mergeRun(base: IRRunProps, add: IRRunProps): IRRunProps {\n const out: IRRunProps = { ...base };\n if (add.fontAscii !== undefined || add.fontThemeAscii !== undefined) {\n delete out.fontAscii;\n delete out.fontThemeAscii;\n }\n if (add.color !== undefined || add.colorTheme !== undefined) {\n delete out.color;\n delete out.colorTheme;\n }\n return mergeProps(out, add);\n}\n\nfunction mergeProps<T extends object>(base: T, add: T): T {\n const out = { ...base };\n for (const [k, v] of Object.entries(add)) {\n if (v !== undefined) (out as Record<string, unknown>)[k] = v;\n }\n return out;\n}\n", "// OPC container access: a .docx is a zip of \"parts\". fflate does the inflation;\n// this module adds magic-byte sniffing (the difference between \"not a docx\" and\n// \"password-protected docx\" is a real UX distinction) and UTF-8 part reads.\n\nimport { strFromU8, unzipSync } from \"fflate\";\nimport { ImportError } from \"./types\";\n\nconst ZIP_MAGIC = [0x50, 0x4b]; // \"PK\"\n/** OLE compound file \u2014 what Word writes for password-protected documents. */\nconst OLE_MAGIC = [0xd0, 0xcf, 0x11, 0xe0];\n\nconst startsWith = (bytes: Uint8Array, magic: number[]): boolean =>\n magic.every((b, i) => bytes[i] === b);\n\nexport interface Archive {\n /** Raw bytes of a part by exact name, e.g. \"word/document.xml\". */\n part(name: string): Uint8Array | undefined;\n /** Part decoded as UTF-8 text. */\n text(name: string): string | undefined;\n names(): string[];\n}\n\nexport function openArchive(bytes: Uint8Array): Archive {\n if (startsWith(bytes, OLE_MAGIC)) {\n throw new ImportError(\"ENCRYPTED\", \"Password-protected documents are not supported.\");\n }\n if (!startsWith(bytes, ZIP_MAGIC)) {\n throw new ImportError(\"NOT_ZIP\", \"Not a .docx file (zip container signature missing).\");\n }\n // Media is the bulk of a rich docx (often megabytes of JPEGs) but only the\n // referenced parts are ever read \u2014 inflate everything EXCEPT media up front,\n // and pull media parts on demand.\n const isMedia = (name: string): boolean => /^word\\/media\\//.test(name);\n let entries: Record<string, Uint8Array>;\n let mediaNames: string[];\n try {\n mediaNames = [];\n entries = unzipSync(bytes, {\n filter: (f) => {\n if (!isMedia(f.name)) return true;\n mediaNames.push(f.name);\n return false;\n },\n });\n } catch (e) {\n throw new ImportError(\"NOT_ZIP\", `Corrupt zip container: ${e instanceof Error ? e.message : String(e)}`);\n }\n const texts = new Map<string, string>();\n const lazyExtract = (name: string): Uint8Array | undefined => {\n const extracted = unzipSync(bytes, { filter: (f) => f.name === name })[name];\n if (extracted) entries[name] = extracted; // cache for repeated references\n return extracted;\n };\n return {\n part: (name) => entries[name] ?? (isMedia(name) ? lazyExtract(name) : undefined),\n text(name) {\n const cached = texts.get(name);\n if (cached !== undefined) return cached;\n const raw = entries[name];\n if (!raw) return undefined;\n const decoded = strFromU8(raw);\n texts.set(name, decoded);\n return decoded;\n },\n names: () => [...Object.keys(entries), ...mediaNames.filter((n) => !(n in entries))],\n };\n}\n", "// Stage orchestration: bytes \u2192 Archive \u2192 styles/theme \u2192 document.xml (+ header/\r\n// footer parts) \u2192 IR \u2192 Document. Pure (no worker/DOM references) so the whole\r\n// pipeline runs under vitest in Node; worker.ts is just transport around this.\r\n\r\nimport type { Block, BandContainer, Paragraph, SectionProps } from \"@cw/shared\";\r\nimport { markImportedTocEntries } from \"@cw/shared\";\r\nimport { findMainDocumentPart } from \"./contentTypes\";\r\nimport { parseDocumentXml, parseFootnotesXml, parseHeaderFooterXml } from \"./documentParser\";\r\nimport { buildStylesheet, buildTableStyles, createMapper, mapSdts, type LinkResolver, type Mapper } from \"./mapToModel\";\r\nimport { createMediaStore, type MediaStore } from \"./media\";\r\nimport { parseNumberingXml, EMPTY_NUMBERING } from \"./numbering\";\r\nimport { findByType, parseRelationships, relsPartFor, type Relationships } from \"./relationships\";\r\nimport { createStyleResolver, parseStylesXml, resolveTableStyle, EMPTY_STYLES } from \"./styles\";\r\nimport { parseThemeXml, EMPTY_THEME } from \"./theme\";\r\nimport { el, parseXml, rootEl } from \"./xml\";\r\nimport { openArchive, type Archive } from \"./zip\";\r\nimport { ImportError, WarningSink, type BandRefs, type ImportMedia, type ImportPhase, type ImportResult, type IRSdtProps, type MediaCollector, type RunImportOpts } from \"./types\";\r\n\r\nexport function runImport(\r\n bytes: Uint8Array,\r\n onProgress?: (phase: ImportPhase, pct: number) => void,\r\n opts?: RunImportOpts,\r\n): ImportResult {\r\n const progress = (phase: ImportPhase, pct: number): void =>\r\n (opts?.onProgress ?? onProgress)?.(phase, pct);\r\n const warnings = new WarningSink();\r\n\r\n // Node/backend path: collect raw image bytes instead of minting blob: URLs.\r\n // Each call returns a synthetic src (\"cw-media:N\") the mapper stamps on the\r\n // ImageBlock, so the caller can match bytes \u2192 block and swap in a mediaId.\r\n const mediaRecords: ImportMedia[] = [];\r\n const collector: MediaCollector | undefined = opts?.collectMediaBytes\r\n ? {\r\n add(b, mime) {\r\n const src = `cw-media:${mediaRecords.length}`;\r\n mediaRecords.push({ src, bytes: b, mime });\r\n return src;\r\n },\r\n }\r\n : undefined;\r\n\r\n progress(\"unzip\", 0);\r\n const archive = openArchive(bytes);\r\n progress(\"unzip\", 1);\r\n\r\n const contentTypes = archive.text(\"[Content_Types].xml\");\r\n const mainPart =\r\n (contentTypes !== undefined ? findMainDocumentPart(contentTypes) : undefined) ?? \"word/document.xml\";\r\n const documentXml = archive.text(mainPart);\r\n if (documentXml === undefined) {\r\n throw new ImportError(\"NO_DOCUMENT_PART\", `Main document part \"${mainPart}\" not found in the archive.`);\r\n }\r\n\r\n // Relationships locate styles/theme/header/footer/media parts; conventional\r\n // names are the fallback for minimal producers that skip the rels part.\r\n const rels = relsOf(archive, mainPart);\r\n\r\n progress(\"styles\", 0);\r\n const stylesXml = partByRelType(archive, rels, \"styles\") ?? archive.text(\"word/styles.xml\");\r\n const styles = stylesXml !== undefined ? parseStylesXml(stylesXml, warnings) : EMPTY_STYLES;\r\n const themeXml = partByRelType(archive, rels, \"theme\") ?? archive.text(\"word/theme/theme1.xml\");\r\n const theme = themeXml !== undefined ? parseThemeXml(themeXml) : EMPTY_THEME;\r\n const resolver = createStyleResolver(styles, theme);\r\n const numberingXml = partByRelType(archive, rels, \"numbering\") ?? archive.text(\"word/numbering.xml\");\r\n const numbering = numberingXml !== undefined ? parseNumberingXml(numberingXml) : EMPTY_NUMBERING;\r\n progress(\"styles\", 1);\r\n\r\n progress(\"parse\", 0);\r\n const ir = parseDocumentXml(documentXml, mainPart, warnings);\r\n progress(\"parse\", 1);\r\n\r\n progress(\"map\", 0);\r\n // Reference page size for section-break geometry comparison: the document's\r\n // own section, falling back to Letter (so an explicit-size mid-doc section\r\n // still compares against the implied default).\r\n const refPgSize = {\r\n w: ir.section?.pageWidthTwips ?? 12240,\r\n h: ir.section?.pageHeightTwips ?? 15840,\r\n };\r\n const mapper = createMapper(\r\n warnings,\r\n resolver,\r\n ir.sdts,\r\n numbering,\r\n (styleId) => resolveTableStyle(styles, styleId),\r\n refPgSize,\r\n );\r\n const mediaStores: MediaStore[] = [];\r\n const mediaFor = (partRels: Relationships): MediaStore => {\r\n const store = createMediaStore(archive, partRels, warnings, collector);\r\n mediaStores.push(store);\r\n return store;\r\n };\r\n\r\n const blocks = mapper.mapBlocks(ir.blocks, mediaFor(rels), linkResolverFor(rels));\r\n if (blocks.length === 0) blocks.push(mapper.emptyParagraph()); // caret needs a home\r\n const section = mapper.mapSection(ir.section);\r\n // w:background is document-global \u2192 the body section's page fill.\r\n if (ir.pageColorHex) section.pageColorHex = `#${ir.pageColorHex}`;\r\n\r\n // Header/footer parts are full block stories with their OWN rels (images and\r\n // hyperlinks in a header resolve through header1.xml.rels, not the document's).\r\n // Their content controls join the document's sdt registry. The first/even\r\n // variants only apply when Word would use them (w:titlePg / settings evenAndOdd).\r\n const settingsXml = partByRelType(archive, rels, \"settings\") ?? archive.text(\"word/settings.xml\");\r\n const evenAndOdd = settingsXml !== undefined && hasEvenAndOdd(settingsXml);\r\n mapBands(section, \"header\", ir.section?.headerRefs, ir.section?.titlePg ?? false, evenAndOdd, archive, rels, mapper, mediaFor, warnings, ir.sdts);\r\n mapBands(section, \"footer\", ir.section?.footerRefs, ir.section?.titlePg ?? false, evenAndOdd, archive, rels, mapper, mediaFor, warnings, ir.sdts);\r\n\r\n // Footnotes: map the bodies of the notes actually referenced (in document\r\n // order, so numbering matches). Each note's own rels resolve its media/links.\r\n const footnotePart = partNameByRelType(rels, \"footnotes\") ?? \"word/footnotes.xml\";\r\n const footnoteXml = archive.text(footnotePart);\r\n const footnoteIR = footnoteXml !== undefined ? parseFootnotesXml(footnoteXml, footnotePart, warnings, ir.sdts) : new Map();\r\n const footnotes: Record<string, Paragraph[]> = {};\r\n if (footnoteIR.size > 0) {\r\n const footRels = relsOf(archive, footnotePart);\r\n const footMedia = mediaFor(footRels);\r\n const footLink = linkResolverFor(footRels);\r\n for (const { docxId, noteId } of mapper.footnoteRefs()) {\r\n const bodyIR = footnoteIR.get(docxId);\r\n if (!bodyIR) {\r\n warnings.add(\"footnote-missing\", \"A footnote reference had no matching note body.\");\r\n continue;\r\n }\r\n const noteBlocks = mapper.mapBlocks(bodyIR, footMedia, footLink);\r\n const paras = noteBlocks.filter((b): b is Paragraph => b.kind === \"paragraph\");\r\n if (paras.length < noteBlocks.length) {\r\n warnings.add(\"footnote-tables\", \"Tables inside footnotes were dropped (footnotes hold paragraphs only).\");\r\n }\r\n if (paras.length > 0) footnotes[noteId] = paras;\r\n }\r\n }\r\n progress(\"map\", 1);\r\n\r\n const doc: ImportResult[\"doc\"] = { section, blocks };\r\n if (Object.keys(footnotes).length > 0) doc.footnotes = footnotes;\r\n const sdts = mapSdts(ir.sdts);\r\n if (Object.keys(sdts).length > 0) doc.sdts = sdts;\r\n const lists = mapper.lists();\r\n if (Object.keys(lists).length > 0) doc.lists = lists;\r\n const bookmarks = mapper.bookmarks();\r\n if (Object.keys(bookmarks).length > 0) doc.bookmarks = bookmarks;\r\n // Style gallery: ALL defined paragraph/character styles (w:name labels) \u2014 so\r\n // authored-but-unapplied styles survive a round-trip (matches Word).\r\n const stylesheet = buildStylesheet(styles);\r\n if (stylesheet) doc.stylesheet = stylesheet;\r\n // All defined table styles \u2192 Document.tableStyles.\r\n const tableStyles = buildTableStyles(styles);\r\n if (tableStyles) doc.tableStyles = tableStyles;\r\n\r\n // TOC field: capture its instruction (for verbatim re-emit) and mark the\r\n // flattened entry paragraphs as live tocEntry (stripping their cached numbers)\r\n // so export round-trips them as a real, F9-refreshable field, not frozen text.\r\n // When the field has NO entries (e.g. a C# pipeline emitting an empty TOC field),\r\n // record the field's block (captured at map time, not by ordinal) so a headless\r\n // render can BUILD the entries in place.\r\n const toc = mapper.tocField();\r\n if (toc) {\r\n doc.tocInstruction = toc.instruction;\r\n if (markImportedTocEntries(doc) === 0) doc.tocAnchorBlockId = toc.blockId;\r\n }\r\n\r\n // Custom (non-built-in) fields captured during the body walk \u2014 their result\r\n // blocks already carry the matching fieldId (see mapToModel).\r\n if (ir.fields) doc.fields = ir.fields;\r\n\r\n return {\r\n doc,\r\n warnings: warnings.list,\r\n mediaUrls: mediaStores.flatMap((s) => s.urls()),\r\n media: mediaRecords,\r\n };\r\n}\r\n\r\nfunction mapStory(\r\n archive: Archive,\r\n documentRels: Relationships,\r\n relId: string | undefined,\r\n mapper: Mapper,\r\n mediaFor: (rels: Relationships) => MediaStore,\r\n warnings: WarningSink,\r\n sdts: Record<string, IRSdtProps>,\r\n): Block[] | undefined {\r\n if (!relId) return undefined;\r\n const rel = documentRels.get(relId);\r\n const xml = rel && !rel.external ? archive.text(rel.target) : undefined;\r\n if (rel === undefined || xml === undefined) {\r\n warnings.add(\"header-missing\", \"A referenced header/footer part was missing from the archive.\");\r\n return undefined;\r\n }\r\n const partRels = relsOf(archive, rel.target);\r\n const ir = parseHeaderFooterXml(xml, rel.target, warnings, sdts);\r\n const blocks = mapper.mapBlocks(ir, mediaFor(partRels), linkResolverFor(partRels));\r\n return blocks.length > 0 ? blocks : undefined;\r\n}\r\n\r\n/** Map a band's default/first/even references onto the section's slots. First\r\n * applies only with w:titlePg; even only with settings evenAndOdd \u2014 matching\r\n * when Word actually renders them. */\r\nfunction mapBands(\r\n section: SectionProps,\r\n kind: \"header\" | \"footer\",\r\n refs: BandRefs | undefined,\r\n titlePg: boolean,\r\n evenAndOdd: boolean,\r\n archive: Archive,\r\n rels: Relationships,\r\n mapper: Mapper,\r\n mediaFor: (rels: Relationships) => MediaStore,\r\n warnings: WarningSink,\r\n sdts: Record<string, IRSdtProps>,\r\n): void {\r\n if (!refs) return;\r\n const slot = (variant: \"\" | \"First\" | \"Even\"): BandContainer => `${kind}${variant}` as BandContainer;\r\n const set = (container: BandContainer, relId: string | undefined): void => {\r\n const story = mapStory(archive, rels, relId, mapper, mediaFor, warnings, sdts);\r\n if (story) section[container] = story;\r\n };\r\n set(slot(\"\"), refs.default);\r\n if (titlePg) set(slot(\"First\"), refs.first);\r\n if (evenAndOdd) set(slot(\"Even\"), refs.even);\r\n}\r\n\r\n/** settings.xml w:evenAndOddHeadersAndFooters \u2014 even-page bands only apply when on. */\r\nfunction hasEvenAndOdd(settingsXml: string): boolean {\r\n const root = rootEl(parseXml(settingsXml, \"settings.xml\"), \"w:settings\");\r\n return !!root && !!el(root, \"w:evenAndOddHeadersAndFooters\");\r\n}\r\n\r\nfunction relsOf(archive: Archive, partName: string): Relationships {\r\n const relsXml = archive.text(relsPartFor(partName));\r\n return relsXml !== undefined ? parseRelationships(relsXml, partName) : new Map();\r\n}\r\n\r\n/** Hyperlink r:id \u2192 URL. External rels carry the raw URL as target. */\r\nfunction linkResolverFor(rels: Relationships): LinkResolver {\r\n return (relId) => {\r\n const rel = rels.get(relId);\r\n return rel?.external ? rel.target : undefined;\r\n };\r\n}\r\n\r\nfunction partByRelType(archive: Archive, rels: Relationships, kind: string): string | undefined {\r\n const rel = findByType(rels, kind);\r\n return rel && !rel.external ? archive.text(rel.target) : undefined;\r\n}\r\n\r\n/** Part NAME for a relationship type (footnotes need their rels resolved separately). */\r\nfunction partNameByRelType(rels: Relationships, kind: string): string | undefined {\r\n const rel = findByType(rels, kind);\r\n return rel && !rel.external ? rel.target : undefined;\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["val", "themeColor", "themeFont", "out", "id", "rPrEl", "pPrEl"]
|
|
7
|
+
}
|