@pixerate/editor 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +30 -0
  2. package/THIRD_PARTY_NOTICES.md +11 -0
  3. package/dist/agent/index.cjs +174 -11
  4. package/dist/agent/index.cjs.map +1 -1
  5. package/dist/agent/index.d.cts +18 -4
  6. package/dist/agent/index.d.ts +18 -4
  7. package/dist/agent/index.js +167 -4
  8. package/dist/agent/index.js.map +1 -1
  9. package/dist/{arrangeShortcuts-B8O3f8-P.d.cts → arrange-BICutYPk.d.cts} +243 -29
  10. package/dist/{arrangeShortcuts-sLlD2rSX.d.ts → arrange-BICutYPk.d.ts} +243 -29
  11. package/dist/builtins-CdPcLwwF.d.cts +176 -0
  12. package/dist/builtins-Chj6zv_O.d.ts +176 -0
  13. package/dist/canvas/index.cjs +3917 -19
  14. package/dist/canvas/index.cjs.map +1 -1
  15. package/dist/canvas/index.d.cts +1232 -7
  16. package/dist/canvas/index.d.ts +1232 -7
  17. package/dist/canvas/index.js +3916 -18
  18. package/dist/canvas/index.js.map +1 -1
  19. package/dist/chunk-3CC7OPUQ.cjs +831 -0
  20. package/dist/chunk-3CC7OPUQ.cjs.map +1 -0
  21. package/dist/{chunk-AL6JMGWW.cjs → chunk-CS6NZWWA.cjs} +24 -24
  22. package/dist/{chunk-AL6JMGWW.cjs.map → chunk-CS6NZWWA.cjs.map} +1 -1
  23. package/dist/{chunk-C7P22VIP.cjs → chunk-EWCOFSCQ.cjs} +17 -6
  24. package/dist/chunk-EWCOFSCQ.cjs.map +1 -0
  25. package/dist/chunk-HDYMLS3X.cjs +409 -0
  26. package/dist/chunk-HDYMLS3X.cjs.map +1 -0
  27. package/dist/{chunk-X4N4WUKB.cjs → chunk-IFHKKVXH.cjs} +150 -38
  28. package/dist/chunk-IFHKKVXH.cjs.map +1 -0
  29. package/dist/{chunk-ECCCYKGL.js → chunk-JOIREKL7.js} +63 -39
  30. package/dist/chunk-JOIREKL7.js.map +1 -0
  31. package/dist/chunk-KRGXUQ2Y.js +1696 -0
  32. package/dist/chunk-KRGXUQ2Y.js.map +1 -0
  33. package/dist/{chunk-QGYDWPRM.js → chunk-MHEPLBFB.js} +2 -2
  34. package/dist/chunk-MR2764X2.js +831 -0
  35. package/dist/chunk-MR2764X2.js.map +1 -0
  36. package/dist/{chunk-7WISYZFO.cjs → chunk-NFVBT3UZ.cjs} +67 -43
  37. package/dist/chunk-NFVBT3UZ.cjs.map +1 -0
  38. package/dist/{chunk-WSQKHXW7.cjs → chunk-NQF32I6Z.cjs} +1209 -457
  39. package/dist/chunk-NQF32I6Z.cjs.map +1 -0
  40. package/dist/{chunk-IXHSYOVY.js → chunk-Q2OHWD2A.js} +638 -866
  41. package/dist/chunk-Q2OHWD2A.js.map +1 -0
  42. package/dist/{chunk-NAXVVS5I.js → chunk-QJSOZFCZ.js} +2 -2
  43. package/dist/{chunk-V3CHHWOE.cjs → chunk-RRREAOVM.cjs} +4 -4
  44. package/dist/{chunk-V3CHHWOE.cjs.map → chunk-RRREAOVM.cjs.map} +1 -1
  45. package/dist/{chunk-UAKDG62Z.js → chunk-SWE3NPOU.js} +116 -4
  46. package/dist/chunk-SWE3NPOU.js.map +1 -0
  47. package/dist/chunk-TXXNBDQX.cjs +1696 -0
  48. package/dist/chunk-TXXNBDQX.cjs.map +1 -0
  49. package/dist/chunk-UBCFIABU.js +409 -0
  50. package/dist/chunk-UBCFIABU.js.map +1 -0
  51. package/dist/{chunk-RR7F5GUM.js → chunk-X7HXL2SB.js} +941 -189
  52. package/dist/chunk-X7HXL2SB.js.map +1 -0
  53. package/dist/{chunk-PO6A6QQH.cjs → chunk-YOMYSFJU.cjs} +742 -970
  54. package/dist/chunk-YOMYSFJU.cjs.map +1 -0
  55. package/dist/{chunk-FH6F67DN.js → chunk-ZRNHGAQT.js} +17 -6
  56. package/dist/{chunk-FH6F67DN.js.map → chunk-ZRNHGAQT.js.map} +1 -1
  57. package/dist/commands/index.cjs +352 -4
  58. package/dist/commands/index.cjs.map +1 -1
  59. package/dist/commands/index.d.cts +37 -108
  60. package/dist/commands/index.d.ts +37 -108
  61. package/dist/commands/index.js +351 -3
  62. package/dist/commands/index.js.map +1 -1
  63. package/dist/compare/index.cjs +3 -3
  64. package/dist/compare/index.js +2 -2
  65. package/dist/{controller-BIJiNoVs.d.cts → controller-CxXGOEmy.d.cts} +209 -13
  66. package/dist/{controller-BIJiNoVs.d.ts → controller-CxXGOEmy.d.ts} +209 -13
  67. package/dist/export/index.cjs +36 -0
  68. package/dist/export/index.cjs.map +1 -0
  69. package/dist/export/index.d.cts +243 -0
  70. package/dist/export/index.d.ts +243 -0
  71. package/dist/export/index.js +36 -0
  72. package/dist/export/index.js.map +1 -0
  73. package/dist/extensions/index.cjs +54 -6
  74. package/dist/extensions/index.cjs.map +1 -1
  75. package/dist/extensions/index.d.cts +7 -2
  76. package/dist/extensions/index.d.ts +7 -2
  77. package/dist/extensions/index.js +59 -11
  78. package/dist/{index-7a6bHTLy.d.ts → index-B273Zllk.d.ts} +211 -207
  79. package/dist/{index-Csd5qI8u.d.cts → index-jcJwmBYt.d.cts} +211 -207
  80. package/dist/index.cjs +144 -32
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.d.cts +49 -13
  83. package/dist/index.d.ts +49 -13
  84. package/dist/index.js +136 -24
  85. package/dist/index.js.map +1 -1
  86. package/dist/registry-CED5C0lA.d.cts +204 -0
  87. package/dist/registry-CED5C0lA.d.ts +204 -0
  88. package/dist/{registry-D32LpIc4.d.cts → registry-D0GADKc7.d.cts} +1 -1
  89. package/dist/{registry-evKTP4ls.d.ts → registry-DhVUZioj.d.ts} +1 -1
  90. package/dist/serializers/index.cjs +4 -4
  91. package/dist/serializers/index.d.cts +2 -1
  92. package/dist/serializers/index.d.ts +2 -1
  93. package/dist/serializers/index.js +3 -3
  94. package/dist/spreadsheet/index.cjs +33 -3
  95. package/dist/spreadsheet/index.cjs.map +1 -1
  96. package/dist/spreadsheet/index.d.cts +106 -3
  97. package/dist/spreadsheet/index.d.ts +106 -3
  98. package/dist/spreadsheet/index.js +32 -2
  99. package/package.json +10 -1
  100. package/dist/chunk-7WISYZFO.cjs.map +0 -1
  101. package/dist/chunk-C7P22VIP.cjs.map +0 -1
  102. package/dist/chunk-ECCCYKGL.js.map +0 -1
  103. package/dist/chunk-IXHSYOVY.js.map +0 -1
  104. package/dist/chunk-PO6A6QQH.cjs.map +0 -1
  105. package/dist/chunk-RR7F5GUM.js.map +0 -1
  106. package/dist/chunk-UAKDG62Z.js.map +0 -1
  107. package/dist/chunk-WSQKHXW7.cjs.map +0 -1
  108. package/dist/chunk-X4N4WUKB.cjs.map +0 -1
  109. package/dist/types-DX4Mh4SL.d.cts +0 -217
  110. package/dist/types-DX4Mh4SL.d.ts +0 -217
  111. /package/dist/{chunk-QGYDWPRM.js.map → chunk-MHEPLBFB.js.map} +0 -0
  112. /package/dist/{chunk-NAXVVS5I.js.map → chunk-QJSOZFCZ.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/export/images.ts","../src/export/units.ts","../src/export/xml.ts","../src/export/zip-writer.ts","../src/export/docx.ts","../src/export/controller.ts"],"sourcesContent":["/** Image types Word displays without a fallback, by MIME type → file extension. */\nexport const DOCX_IMAGE_TYPES: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpeg\",\n \"image/gif\": \"gif\",\n \"image/bmp\": \"bmp\",\n \"image/webp\": \"webp\",\n \"image/tiff\": \"tiff\",\n};\n\n/** Content types of the image extensions above. */\nexport const DOCX_IMAGE_CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n webp: \"image/webp\",\n tiff: \"image/tiff\",\n};\n\nexport interface DecodedDataUrl {\n mime: string;\n bytes: Uint8Array;\n}\n\n/** Largest data URL decoded (characters), so a huge attribute cannot exhaust memory twice. */\nconst MAX_DATA_URL = 64 * 1024 * 1024;\n\n/** Decodes a base64 `data:` URL. Returns `null` for anything else or malformed input. */\nexport function decodeDataUrl(src: string): DecodedDataUrl | null {\n if (src.length > MAX_DATA_URL) return null;\n const comma = src.indexOf(\",\");\n if (comma === -1) return null;\n const header = /^data:([a-z0-9.+-]+\\/[a-z0-9.+-]+)((?:;[a-z0-9-]+=[^;,]*)*);base64$/i.exec(src.slice(0, comma));\n if (!header) return null;\n const payload = src.slice(comma + 1).replace(/\\s+/g, \"\");\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(payload)) return null;\n try {\n const binary = atob(payload);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return { mime: header[1].toLowerCase(), bytes };\n } catch {\n return null;\n }\n}\n\nconst u16be = (b: Uint8Array, i: number) => (b[i] << 8) | b[i + 1];\nconst u16le = (b: Uint8Array, i: number) => b[i] | (b[i + 1] << 8);\nconst u32be = (b: Uint8Array, i: number) => ((b[i] << 24) | (b[i + 1] << 16) | (b[i + 2] << 8) | b[i + 3]) >>> 0;\nconst i32le = (b: Uint8Array, i: number) => b[i] | (b[i + 1] << 8) | (b[i + 2] << 16) | (b[i + 3] << 24);\n\n/** Pixel size read from a PNG, GIF, JPEG, BMP or WebP header, or `null`. */\nexport function imagePixelSize(b: Uint8Array): { width: number; height: number } | null {\n const ok = (width: number, height: number) =>\n width > 0 && height > 0 && width < 1e6 && height < 1e6 ? { width, height } : null;\n if (b.length >= 24 && b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) {\n return ok(u32be(b, 16), u32be(b, 20));\n }\n if (b.length >= 10 && b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46) return ok(u16le(b, 6), u16le(b, 8));\n if (b.length >= 26 && b[0] === 0x42 && b[1] === 0x4d) return ok(Math.abs(i32le(b, 18)), Math.abs(i32le(b, 22)));\n if (b.length >= 30 && b[0] === 0x52 && b[1] === 0x49 && b[8] === 0x57 && b[9] === 0x45) {\n const chunk = String.fromCharCode(b[12], b[13], b[14], b[15]);\n if (chunk === \"VP8 \") return ok(u16le(b, 26) & 0x3fff, u16le(b, 28) & 0x3fff);\n if (chunk === \"VP8L\") {\n const bits = b[21] | (b[22] << 8) | (b[23] << 16) | (b[24] << 24);\n return ok((bits & 0x3fff) + 1, ((bits >>> 14) & 0x3fff) + 1);\n }\n if (chunk === \"VP8X\") return ok((b[24] | (b[25] << 8) | (b[26] << 16)) + 1, (b[27] | (b[28] << 8) | (b[29] << 16)) + 1);\n return null;\n }\n if (b.length >= 4 && b[0] === 0xff && b[1] === 0xd8) {\n // Walk the JPEG segments to the first start-of-frame marker.\n let i = 2;\n while (i + 9 < b.length) {\n if (b[i] !== 0xff) return null;\n const marker = b[i + 1];\n if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {\n i += 2;\n continue;\n }\n const length = u16be(b, i + 2);\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n return ok(u16be(b, i + 7), u16be(b, i + 5));\n }\n if (length < 2) return null;\n i += 2 + length;\n }\n }\n return null;\n}\n\n/** A CSS pixel size from a node attribute (`320`, `\"320\"`, `\"320px\"`), or `undefined`. */\nexport function pixelAttr(value: unknown): number | undefined {\n if (typeof value === \"number\") return Number.isFinite(value) && value > 0 ? value : undefined;\n if (typeof value !== \"string\") return undefined;\n const match = /^\\s*(\\d+(?:\\.\\d+)?)\\s*(px)?\\s*$/i.exec(value);\n return match ? Number(match[1]) || undefined : undefined;\n}\n","// Portions ported from wordcraft/crates/docx/src/units.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/** Base font size (points) that `em` / `rem` / `%` lengths are relative to: Word's default 11 pt. */\nexport const DOCX_BASE_FONT_PT = 11;\n/** Largest length accepted, in points (22 inches, Word's page limit). */\nconst MAX_LEN_PT = 1584;\n\nconst UNIT_PT: Record<string, number> = {\n pt: 1,\n px: 0.75,\n in: 72,\n cm: 72 / 2.54,\n mm: 72 / 25.4,\n pc: 12,\n};\n\n/**\n * Converts a CSS length (`12pt`, `16px`, `1.5em`, `120%`, `0.5in`) to points.\n * Unit-less numbers are pixels. Returns `undefined` for anything else\n * (`calc()`, `var()`, keywords) and clamps to ±1584 pt.\n */\nexport function cssLengthToPt(value: unknown, basePt = DOCX_BASE_FONT_PT): number | undefined {\n if (typeof value === \"number\") return Number.isFinite(value) ? clampPt(value * UNIT_PT.px) : undefined;\n if (typeof value !== \"string\") return undefined;\n const match = /^\\s*(-?\\d+(?:\\.\\d+)?|-?\\.\\d+)\\s*([a-z%]*)\\s*$/i.exec(value);\n if (!match) return undefined;\n const n = Number(match[1]);\n const unit = match[2].toLowerCase() || \"px\";\n let pt: number | undefined;\n if (unit === \"em\" || unit === \"rem\") pt = n * basePt;\n else if (unit === \"%\") pt = (n / 100) * basePt;\n else if (unit in UNIT_PT) pt = n * UNIT_PT[unit];\n return pt === undefined || !Number.isFinite(pt) ? undefined : clampPt(pt);\n}\n\nfunction clampPt(pt: number): number {\n return Math.max(-MAX_LEN_PT, Math.min(MAX_LEN_PT, pt));\n}\n\n/** Points → twentieths of a point (twips), as an integer. */\nexport const ptToTwips = (pt: number): number => Math.round(pt * 20);\n/** Points → half-points (`w:sz`), at least 1. */\nexport const ptToHalfPoints = (pt: number): number => Math.max(1, Math.min(3276, Math.round(pt * 2)));\n/** CSS pixels (96 dpi) → English Metric Units (images). */\nexport const pxToEmu = (px: number): number => Math.round(px * 9525);\n/** CSS pixels (96 dpi) → twips. */\nexport const pxToTwips = (px: number): number => Math.round(px * 15);\n\n/** Formats points for CSS, e.g. `12pt` or `10.5pt`. */\nexport function ptToCss(pt: number): string {\n return `${Math.round(pt * 100) / 100}pt`;\n}\n\nconst NAMED_COLORS: Record<string, string> = {\n black: \"000000\",\n white: \"FFFFFF\",\n red: \"FF0000\",\n green: \"008000\",\n lime: \"00FF00\",\n blue: \"0000FF\",\n yellow: \"FFFF00\",\n cyan: \"00FFFF\",\n aqua: \"00FFFF\",\n magenta: \"FF00FF\",\n fuchsia: \"FF00FF\",\n gray: \"808080\",\n grey: \"808080\",\n silver: \"C0C0C0\",\n maroon: \"800000\",\n navy: \"000080\",\n olive: \"808000\",\n purple: \"800080\",\n teal: \"008080\",\n orange: \"FFA500\",\n pink: \"FFC0CB\",\n};\n\n/**\n * A CSS colour (`#abc`, `#aabbcc`, `#aabbccdd`, `rgb()` / `rgba()`, a few\n * names) as six upper-case hex digits, or `undefined`.\n */\nexport function cssColorToHex(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const color = value.trim().toLowerCase();\n if (color in NAMED_COLORS) return NAMED_COLORS[color];\n let match = /^#([0-9a-f]{3,4})$/.exec(color);\n if (match) return match[1].slice(0, 3).split(\"\").map((c) => c + c).join(\"\").toUpperCase();\n match = /^#([0-9a-f]{6})(?:[0-9a-f]{2})?$/.exec(color);\n if (match) return match[1].toUpperCase();\n match = /^rgba?\\(\\s*(\\d{1,3})\\s*[, ]\\s*(\\d{1,3})\\s*[, ]\\s*(\\d{1,3})\\s*(?:[,/]\\s*[\\d.]+%?\\s*)?\\)$/.exec(color);\n if (match) {\n return match\n .slice(1, 4)\n .map((n) => Math.min(255, Number(n)).toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n }\n return undefined;\n}\n\n/** Word's highlight colours (`w:highlight`), by their RGB value. */\nexport const WORD_HIGHLIGHTS: Record<string, string> = {\n FFFF00: \"yellow\",\n \"00FF00\": \"green\",\n \"00FFFF\": \"cyan\",\n FF00FF: \"magenta\",\n \"0000FF\": \"blue\",\n FF0000: \"red\",\n \"000080\": \"darkBlue\",\n \"008080\": \"darkCyan\",\n \"008000\": \"darkGreen\",\n \"800080\": \"darkMagenta\",\n \"800000\": \"darkRed\",\n \"808000\": \"darkYellow\",\n \"808080\": \"darkGray\",\n C0C0C0: \"lightGray\",\n \"000000\": \"black\",\n FFFFFF: \"white\",\n};\n","// Portions ported from wordcraft/crates/docx/src/xml.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Characters XML 1.0 cannot carry (C0 controls other than tab / LF / CR,\n * lone surrogates, U+FFFE / U+FFFF). They are dropped, never escaped:\n * `&#1;` is not well-formed XML 1.0 either.\n */\nconst INVALID_XML_CHARS = /[^\\t\\n\\r -퟿-�\\u{10000}-\\u{10FFFF}]/gu;\n\n/** Removes characters that are not allowed in XML 1.0 documents. */\nexport function stripInvalidXmlChars(value: string): string {\n return value.replace(INVALID_XML_CHARS, \"\");\n}\n\n/** Escapes text for XML element content (`&`, `<`, `>`), dropping invalid characters. */\nexport function escapeXmlText(value: string): string {\n return stripInvalidXmlChars(value).replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n}\n\n/**\n * Escapes a value for a double- or single-quoted XML attribute. White space\n * other than spaces is written as character references, because attribute\n * value normalisation would otherwise turn tabs and newlines into spaces.\n */\nexport function escapeXmlAttr(value: string): string {\n return escapeXmlText(value)\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\")\n .replace(/\\t/g, \"&#9;\")\n .replace(/\\n/g, \"&#10;\")\n .replace(/\\r/g, \"&#13;\");\n}\n\nexport type XmlAttrs = Record<string, string | number | undefined | null | false>;\n\nfunction attrs(values: XmlAttrs | undefined): string {\n if (!values) return \"\";\n let out = \"\";\n for (const [name, value] of Object.entries(values)) {\n if (value === undefined || value === null || value === false) continue;\n out += ` ${name}=\"${escapeXmlAttr(String(value))}\"`;\n }\n return out;\n}\n\n/**\n * A small string-building XML writer; every attribute value and text node is\n * escaped. Element names are trusted (always literals in this codebase).\n */\nexport class XmlWriter {\n private parts: string[];\n\n /** `declaration: false` writes a fragment (e.g. one paragraph). */\n constructor(declaration = true) {\n this.parts = declaration ? ['<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n'] : [];\n }\n\n open(name: string, values?: XmlAttrs): this {\n this.parts.push(`<${name}${attrs(values)}>`);\n return this;\n }\n\n empty(name: string, values?: XmlAttrs): this {\n this.parts.push(`<${name}${attrs(values)}/>`);\n return this;\n }\n\n close(name: string): this {\n this.parts.push(`</${name}>`);\n return this;\n }\n\n text(value: string): this {\n this.parts.push(escapeXmlText(value));\n return this;\n }\n\n /** `<name attrs>text</name>`. */\n leaf(name: string, values: XmlAttrs | undefined, text: string): this {\n return this.open(name, values).text(text).close(name);\n }\n\n /** `<name w:val=\"value\"/>`. */\n val(name: string, value: string | number): this {\n return this.empty(name, { \"w:val\": value });\n }\n\n /** Appends markup produced by another writer. */\n raw(markup: string): this {\n this.parts.push(markup);\n return this;\n }\n\n toString(): string {\n return this.parts.join(\"\");\n }\n}\n","import { zipCrc32 } from \"../import/zip\";\n\n/**\n * Minimal, dependency-free ZIP writer (the counterpart of `readZip`), used by\n * the DOCX export. Entries are deflated with the platform\n * `CompressionStream(\"deflate-raw\")` when it exists (modern browsers,\n * Node ≥ 18) and stored otherwise, or when deflating does not make them\n * smaller. Names are written as UTF-8 (flag bit 11). No ZIP64: archives are\n * limited to 65 535 entries and 4 GiB.\n */\n\nexport interface ZipWriteEntry {\n /** Entry path with `/` separators; must be relative and free of `..`. */\n name: string;\n /** Strings are encoded as UTF-8. */\n data: Uint8Array | string;\n}\n\nexport interface ZipWriteOptions {\n /**\n * `\"auto\"` (default) deflates when `CompressionStream` is available,\n * `\"store\"` never compresses.\n */\n compression?: \"auto\" | \"store\";\n /**\n * Modification time written for every entry (default 1980-01-01, the DOS\n * epoch, so the output is deterministic).\n */\n modified?: Date;\n}\n\nconst encoder = new TextEncoder();\nconst MAX_SIZE = 0xffffffff;\n\nasync function readAll(readable: ReadableStream<Uint8Array>): Promise<Uint8Array> {\n const reader = readable.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n length += value.length;\n }\n const out = new Uint8Array(length);\n let pos = 0;\n for (const chunk of chunks) {\n out.set(chunk, pos);\n pos += chunk.length;\n }\n return out;\n}\n\n/** Raw deflate with `CompressionStream`, or `null` when it is unavailable. */\nexport async function deflateRaw(data: Uint8Array): Promise<Uint8Array | null> {\n const Stream = (globalThis as { CompressionStream?: typeof CompressionStream }).CompressionStream;\n if (typeof Stream !== \"function\") return null;\n let stream: CompressionStream;\n try {\n stream = new Stream(\"deflate-raw\" as CompressionFormat);\n } catch {\n return null;\n }\n // Plain stream APIs only: jsdom's Blob has no `stream()` (see GOTCHAS).\n const writer = stream.writable.getWriter();\n const written = writer\n .write(data as unknown as BufferSource)\n .then(() => writer.close())\n .catch(() => {});\n const out = await readAll(stream.readable as ReadableStream<Uint8Array>);\n await written;\n return out;\n}\n\nfunction dosDateTime(date: Date): { time: number; date: number } {\n const year = Math.min(Math.max(date.getUTCFullYear(), 1980), 2107);\n return {\n time: (date.getUTCHours() << 11) | (date.getUTCMinutes() << 5) | Math.floor(date.getUTCSeconds() / 2),\n date: ((year - 1980) << 9) | ((date.getUTCMonth() + 1) << 5) | date.getUTCDate(),\n };\n}\n\nclass ByteSink {\n private chunks: Uint8Array[] = [];\n length = 0;\n\n bytes(data: Uint8Array): void {\n this.chunks.push(data);\n this.length += data.length;\n }\n\n header(fields: [number, 2 | 4][]): void {\n const size = fields.reduce((n, [, width]) => n + width, 0);\n const buffer = new Uint8Array(size);\n const view = new DataView(buffer.buffer);\n let pos = 0;\n for (const [value, width] of fields) {\n if (width === 2) view.setUint16(pos, value, true);\n else view.setUint32(pos, value >>> 0, true);\n pos += width;\n }\n this.bytes(buffer);\n }\n\n toUint8Array(): Uint8Array {\n const out = new Uint8Array(this.length);\n let pos = 0;\n for (const chunk of this.chunks) {\n out.set(chunk, pos);\n pos += chunk.length;\n }\n return out;\n }\n}\n\n/** Writes a ZIP archive. Throws on unsafe or duplicate names and oversized archives. */\nexport async function writeZip(entries: readonly ZipWriteEntry[], options: ZipWriteOptions = {}): Promise<Uint8Array> {\n if (entries.length > 0xffff) throw new RangeError(\"Too many ZIP entries (no ZIP64 support).\");\n const { time, date } = dosDateTime(options.modified ?? new Date(Date.UTC(1980, 0, 1)));\n const out = new ByteSink();\n const central = new ByteSink();\n const seen = new Set<string>();\n for (const entry of entries) {\n const name = entry.name;\n if (!name || name.startsWith(\"/\") || name.includes(\"\\\\\") || name.split(\"/\").includes(\"..\") || name.includes(\"\\0\")) {\n throw new Error(`Unsafe ZIP entry name: ${JSON.stringify(name)}`);\n }\n if (seen.has(name)) throw new Error(`Duplicate ZIP entry name: ${JSON.stringify(name)}`);\n seen.add(name);\n const raw = typeof entry.data === \"string\" ? encoder.encode(entry.data) : entry.data;\n const deflated = options.compression === \"store\" || raw.length === 0 ? null : await deflateRaw(raw);\n const useDeflate = !!deflated && deflated.length < raw.length;\n const body = useDeflate ? deflated! : raw;\n const method = useDeflate ? 8 : 0;\n const nameBytes = encoder.encode(name);\n const crc = zipCrc32(raw);\n const offset = out.length;\n if (body.length > MAX_SIZE || raw.length > MAX_SIZE || offset > MAX_SIZE) {\n throw new RangeError(\"ZIP archive too large (no ZIP64 support).\");\n }\n const flags = 0x0800;\n out.header([\n [0x04034b50, 4], [20, 2], [flags, 2], [method, 2], [time, 2], [date, 2],\n [crc, 4], [body.length, 4], [raw.length, 4], [nameBytes.length, 2], [0, 2],\n ]);\n out.bytes(nameBytes);\n out.bytes(body);\n central.header([\n [0x02014b50, 4], [20, 2], [20, 2], [flags, 2], [method, 2], [time, 2], [date, 2],\n [crc, 4], [body.length, 4], [raw.length, 4], [nameBytes.length, 2], [0, 2], [0, 2],\n [0, 2], [0, 2], [0, 4], [offset, 4],\n ]);\n central.bytes(nameBytes);\n }\n const cdOffset = out.length;\n const cd = central.toUint8Array();\n out.bytes(cd);\n out.header([\n [0x06054b50, 4], [0, 2], [0, 2], [entries.length, 2], [entries.length, 2],\n [cd.length, 4], [cdOffset, 4], [0, 2],\n ]);\n return out.toUint8Array();\n}\n","// Portions ported from wordcraft/crates/docx/src/write/mod.rs, wordcraft/crates/docx/src/write/story.rs, wordcraft/crates/docx/src/write/props.rs and wordcraft/crates/docx/src/package.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport type { CommentThread, ReviewAuthor, SerializedComments } from \"../extensions/comment-store\";\nimport {\n DEFAULT_STYLES,\n isValidStyleId,\n NORMAL_STYLE_ID,\n type CharacterFormat,\n type ParagraphFormat,\n type StyleDefaults,\n type StyleDefinition,\n type StyleRegistry,\n type StyleRegistryJSON,\n} from \"../extensions/paragraph-styles/registry\";\nimport { DOCX_IMAGE_CONTENT_TYPES, DOCX_IMAGE_TYPES, decodeDataUrl, imagePixelSize, pixelAttr } from \"./images\";\nimport {\n cssColorToHex,\n cssLengthToPt,\n ptToHalfPoints,\n ptToTwips,\n pxToEmu,\n pxToTwips,\n WORD_HIGHLIGHTS,\n} from \"./units\";\nimport { XmlWriter, type XmlAttrs } from \"./xml\";\nimport { writeZip, type ZipWriteEntry } from \"./zip-writer\";\n\n/**\n * Dependency-free DOCX (WordprocessingML) export of TipTap documents.\n *\n * Takes an editor (anything with `getJSON()`) or its JSON and writes a\n * minimal, valid package: `[Content_Types].xml`, `_rels/.rels`,\n * `word/document.xml` (+ relationships), `styles.xml` (from the paragraph\n * style registry, with `basedOn` / `next` / `link`), `numbering.xml` (one\n * `w:num` per list), `settings.xml`, `comments.xml` +\n * `commentsExtended.xml` (replies and resolved state) + `people.xml` (author\n * ids), `docProps/core.xml` and `docProps/app.xml`, plus embedded images.\n *\n * Tracked insertions, deletions, moves (`w:moveFrom` / `w:moveTo` with\n * named move ranges), formatting changes (`w:rPrChange`) and block changes\n * (`w:pPrChange`, paragraph-mark `w:ins` / `w:del`) keep their authors and\n * dates. Anything that cannot be written is listed in the returned report.\n */\n\nexport const DOCX_EXPORT_MIME_TYPE = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n\n/** A ProseMirror / TipTap JSON node (`editor.getJSON()`). */\nexport interface DocxJSONNode {\n type?: string;\n attrs?: Record<string, any>;\n content?: DocxJSONNode[];\n marks?: DocxJSONMark[];\n text?: string;\n}\n\nexport interface DocxJSONMark {\n type: string;\n attrs?: Record<string, any>;\n}\n\n/** Anything with `getJSON()`, e.g. a TipTap `Editor`. Its comment store and style registry are used by default. */\nexport interface DocxExportEditorLike {\n getJSON(): DocxJSONNode;\n storage?: unknown;\n}\n\n/** A comment store (`CommentStore`), its `toJSON()` output, or a thread list. */\nexport type DocxCommentSource =\n | { toJSON(): SerializedComments }\n | { getSnapshot(): { threads: readonly CommentThread[] } }\n | SerializedComments\n | readonly CommentThread[];\n\nexport interface DocxExportOptions {\n /**\n * Paragraph and character styles written to `styles.xml`. Defaults to the\n * editor's registry (`ParagraphStyles` extension), else the built-in styles.\n */\n styles?: StyleRegistry | StyleRegistryJSON | readonly StyleDefinition[];\n /** Comment threads. Defaults to the editor's comment store (`Comments` extension). */\n comments?: DocxCommentSource | null;\n /**\n * The document's author (`dc:creator`) and the author of tracked changes\n * and comments that name none.\n */\n author?: string | ReviewAuthor;\n /**\n * `\"strip-authors\"` writes every comment, reply and tracked change as\n * \"Author\" (initials \"A\"), leaves out `people.xml`, the creator and last\n * modified by, and sets `w:removePersonalInformation` so Word keeps doing\n * so. Default `\"keep\"`.\n */\n privacy?: \"keep\" | \"strip-authors\";\n /** `dc:title` of the document. */\n title?: string;\n /**\n * Images with `http(s)` URLs: `\"skip\"` (default, reported) or `\"link\"`\n * (an external relationship Word may load when the file is opened).\n */\n remoteImages?: \"skip\" | \"link\";\n /** Time written as created / modified (default: now). */\n now?: () => Date;\n /** ZIP compression (default `\"auto\"`: deflate when `CompressionStream` exists). */\n compression?: \"auto\" | \"store\";\n}\n\nexport type DocxExportIssueKind = \"node\" | \"mark\" | \"image\" | \"link\" | \"comment\" | \"style\";\n\n/** Something the export left out or simplified, counted per kind, name and reason. */\nexport interface DocxExportIssue {\n kind: DocxExportIssueKind;\n /** Node / mark type, style id, image or link URL (truncated), or comment thread id. */\n name: string;\n reason: string;\n count: number;\n}\n\nexport interface DocxExportReport {\n /** Content that was dropped or simplified. Empty when everything was written. */\n dropped: DocxExportIssue[];\n /** Counts of what was written. */\n written: {\n paragraphs: number;\n tables: number;\n images: number;\n comments: number;\n replies: number;\n trackedChanges: number;\n };\n}\n\nexport interface DocxExportResult {\n /** The `.docx` file. */\n data: Uint8Array;\n report: DocxExportReport;\n}\n\nexport interface DocxPackagePart {\n name: string;\n data: Uint8Array | string;\n}\n\nconst NS = {\n w: \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\n r: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n wp: \"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\",\n a: \"http://schemas.openxmlformats.org/drawingml/2006/main\",\n pic: \"http://schemas.openxmlformats.org/drawingml/2006/picture\",\n mc: \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n w14: \"http://schemas.microsoft.com/office/word/2010/wordml\",\n w15: \"http://schemas.microsoft.com/office/word/2012/wordml\",\n};\n\nconst BODY_NS: XmlAttrs = {\n \"xmlns:w\": NS.w,\n \"xmlns:r\": NS.r,\n \"xmlns:wp\": NS.wp,\n \"xmlns:a\": NS.a,\n \"xmlns:pic\": NS.pic,\n \"xmlns:mc\": NS.mc,\n \"xmlns:w14\": NS.w14,\n \"xmlns:w15\": NS.w15,\n \"mc:Ignorable\": \"w14 w15\",\n};\n\nconst REL = {\n officeDocument: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n core: \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n app: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n styles: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n numbering: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\",\n settings: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\",\n comments: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n commentsExtended: \"http://schemas.microsoft.com/office/2011/relationships/commentsExtended\",\n people: \"http://schemas.microsoft.com/office/2011/relationships/people\",\n image: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n hyperlink: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n};\n\nconst CT_WML = \"application/vnd.openxmlformats-officedocument.wordprocessingml.\";\n\n/** Text width of a US Letter page with 1\" margins, in twips (6.5\"). */\nconst CONTENT_WIDTH_TWIPS = 9360;\n/** Widest image, in CSS pixels (6.5\" at 96 dpi). */\nconst MAX_IMAGE_WIDTH_PX = 624;\n/** Indent per list or quote level, in twips (0.5\"). */\nconst INDENT_STEP = 720;\n/** Name written for every author with `privacy: \"strip-authors\"` (as Word does). */\nexport const DOCX_ANONYMOUS_AUTHOR = \"Author\";\nconst ANONYMOUS_INITIALS = \"A\";\nconst MAX_DEPTH = 64;\n\n/** Bullet characters per list level. */\nconst BULLETS = [\"•\", \"◦\", \"▪\"];\nconst BULLET_FONTS = [\"Symbol\", \"Courier New\", \"Wingdings\"];\nconst TASK_UNCHECKED = \"☐\";\nconst TASK_CHECKED = \"☒\";\n\n/** Formatting marks whose `rPr` is written; the rest are reported. */\nconst FORMAT_MARKS = new Set([\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"subscript\",\n \"superscript\",\n \"code\",\n \"textStyle\",\n \"highlight\",\n \"characterStyle\",\n]);\n/** Marks handled separately (links, review) or that carry no formatting. */\nconst STRUCTURAL_MARKS = new Set([\"link\", \"insertion\", \"deletion\", \"formatChange\", \"comment\", \"bookmark\"]);\n\ninterface RunFormat {\n charStyle?: string;\n font?: string;\n bold?: boolean;\n italic?: boolean;\n strike?: boolean;\n color?: string;\n halfPoints?: number;\n highlight?: string;\n shading?: string;\n underline?: boolean;\n vertAlign?: \"superscript\" | \"subscript\";\n}\n\ninterface Revision {\n kind: \"ins\" | \"del\";\n attrs: Record<string, any>;\n moveId?: string;\n}\n\ntype PieceKind = \"text\" | \"tab\" | \"br\" | \"image\";\n\ninterface Piece {\n kind: PieceKind;\n text?: string;\n node: DocxJSONNode;\n /** Last piece produced by `node` (comment range ends go after it). */\n last: boolean;\n marks: DocxJSONMark[];\n}\n\ninterface BlockContext {\n depth: number;\n quoteLevel: number;\n list?: { numId: number; level: number; task?: boolean; checked?: boolean };\n /** The list item's first paragraph gets the number; later ones are indented. */\n listItemFirst?: boolean;\n}\n\ninterface BlockChangeRecord {\n changeId?: string;\n authorId?: string;\n authorName?: string;\n createdAt?: number;\n previous?: { type?: string; attrs?: Record<string, any> };\n operation?: \"insert\" | \"delete\";\n}\n\nconst isEditorLike = (value: unknown): value is DocxExportEditorLike =>\n !!value && typeof (value as DocxExportEditorLike).getJSON === \"function\";\n\n/** Threads from any supported comment source. */\nfunction threadsOf(source: DocxCommentSource | null | undefined): CommentThread[] {\n if (!source) return [];\n if (Array.isArray(source)) return [...source];\n const value = source as any;\n if (typeof value.toJSON === \"function\") return [...(value.toJSON()?.threads ?? [])];\n if (typeof value.getSnapshot === \"function\") return [...(value.getSnapshot()?.threads ?? [])];\n return Array.isArray(value.threads) ? [...value.threads] : [];\n}\n\nfunction stylesOf(source: DocxExportOptions[\"styles\"]): { styles: StyleDefinition[]; defaults: StyleDefaults } {\n if (!source) return { styles: DEFAULT_STYLES.map((s) => ({ ...s })), defaults: {} };\n if (Array.isArray(source)) return { styles: [...source], defaults: {} };\n const value = source as any;\n const json: StyleRegistryJSON = typeof value.toJSON === \"function\" ? value.toJSON() : value;\n return { styles: [...(json.styles ?? [])], defaults: json.defaults ?? {} };\n}\n\nfunction authorOf(author: DocxExportOptions[\"author\"]): ReviewAuthor | undefined {\n if (!author) return undefined;\n return typeof author === \"string\" ? { id: author, name: author } : author;\n}\n\n/** W3CDTF date without milliseconds, or `undefined` for missing / invalid times. */\nfunction isoDate(ms: unknown): string | undefined {\n const n = typeof ms === \"number\" ? ms : Number(ms);\n if (!Number.isFinite(n) || n <= 0) return undefined;\n const date = new Date(n);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nfunction initialsOf(name: string): string {\n const letters = name\n .split(/\\s+/)\n .filter(Boolean)\n .map((word) => Array.from(word)[0] ?? \"\")\n .join(\"\")\n .slice(0, 3)\n .toUpperCase();\n return letters || ANONYMOUS_INITIALS;\n}\n\n/** Word keeps built-in style names in lower case (`heading 1`) in `styles.xml`. */\nfunction fileStyleName(name: string): string {\n const heading = /^Heading ([1-9])$/.exec(name);\n return heading ? `heading ${heading[1]}` : name;\n}\n\nconst truncate = (value: string, max = 80) => (value.length > max ? `${value.slice(0, max - 1)}…` : value);\n\n/** Converts a mark list to run formatting. */\nfunction runFormatOf(marks: readonly DocxJSONMark[] | undefined): RunFormat {\n const format: RunFormat = {};\n for (const mark of marks ?? []) {\n const attrs = mark.attrs ?? {};\n switch (mark.type) {\n case \"bold\":\n format.bold = true;\n break;\n case \"italic\":\n format.italic = true;\n break;\n case \"underline\":\n format.underline = true;\n break;\n case \"strike\":\n format.strike = true;\n break;\n case \"subscript\":\n format.vertAlign = \"subscript\";\n break;\n case \"superscript\":\n format.vertAlign = \"superscript\";\n break;\n case \"code\":\n format.font = \"Consolas\";\n break;\n case \"textStyle\": {\n const color = cssColorToHex(attrs.color);\n if (color) format.color = color;\n const pt = cssLengthToPt(attrs.fontSize);\n if (pt !== undefined && pt > 0) format.halfPoints = ptToHalfPoints(pt);\n if (typeof attrs.fontFamily === \"string\" && attrs.fontFamily.trim()) {\n format.font = attrs.fontFamily.split(\",\")[0].trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n break;\n }\n case \"highlight\": {\n const color = attrs.color ? cssColorToHex(attrs.color) : \"FFFF00\";\n if (color && WORD_HIGHLIGHTS[color]) format.highlight = WORD_HIGHLIGHTS[color];\n else if (color) format.shading = color;\n break;\n }\n case \"characterStyle\":\n if (isValidStyleId(attrs.styleId)) format.charStyle = attrs.styleId;\n break;\n case \"link\":\n format.charStyle ??= \"Hyperlink\";\n break;\n default:\n break;\n }\n }\n return format;\n}\n\n/** `w:rPr` children in CT_RPr order. */\nfunction writeRunProps(w: XmlWriter, f: RunFormat): void {\n if (f.charStyle) w.val(\"w:rStyle\", f.charStyle);\n if (f.font) w.empty(\"w:rFonts\", { \"w:ascii\": f.font, \"w:hAnsi\": f.font, \"w:cs\": f.font, \"w:eastAsia\": f.font });\n if (f.bold) w.empty(\"w:b\");\n if (f.italic) w.empty(\"w:i\");\n if (f.strike) w.empty(\"w:strike\");\n if (f.color) w.val(\"w:color\", f.color);\n if (f.halfPoints) {\n w.val(\"w:sz\", f.halfPoints);\n w.val(\"w:szCs\", f.halfPoints);\n }\n if (f.highlight) w.val(\"w:highlight\", f.highlight);\n if (f.underline) w.val(\"w:u\", \"single\");\n if (f.shading) w.empty(\"w:shd\", { \"w:val\": \"clear\", \"w:color\": \"auto\", \"w:fill\": f.shading });\n if (f.vertAlign) w.val(\"w:vertAlign\", f.vertAlign);\n}\n\nconst hasRunProps = (f: RunFormat) => Object.values(f).some((v) => v !== undefined && v !== false);\n\nfunction characterFormatToRun(c: CharacterFormat | undefined): RunFormat {\n const f: RunFormat = {};\n if (!c) return f;\n if (c.fontFamily) f.font = c.fontFamily.split(\",\")[0].trim().replace(/^[\"']|[\"']$/g, \"\");\n if (c.bold) f.bold = true;\n if (c.italic) f.italic = true;\n if (c.underline) f.underline = true;\n if (c.strike) f.strike = true;\n const color = cssColorToHex(c.color);\n if (color) f.color = color;\n const pt = cssLengthToPt(c.fontSize);\n if (pt !== undefined && pt > 0) f.halfPoints = ptToHalfPoints(pt);\n const background = cssColorToHex(c.backgroundColor);\n if (background) f.shading = background;\n return f;\n}\n\n/** `w:pPr` content of a style's paragraph format (spacing, indentation, alignment). */\nfunction writeParagraphFormat(w: XmlWriter, p: ParagraphFormat | undefined, outline?: number): void {\n if (!p && outline === undefined) return;\n const before = cssLengthToPt(p?.spaceBefore);\n const after = cssLengthToPt(p?.spaceAfter);\n const lineValue = p?.lineHeight;\n let line: number | undefined;\n let lineRule: string | undefined;\n if (typeof lineValue === \"string\" && /^\\s*\\d+(\\.\\d+)?\\s*$/.test(lineValue)) {\n line = Math.round(Number(lineValue) * 240);\n lineRule = \"auto\";\n } else if (lineValue) {\n const pt = cssLengthToPt(lineValue);\n if (pt !== undefined && pt > 0) {\n line = ptToTwips(pt);\n lineRule = \"atLeast\";\n }\n }\n if (before !== undefined || after !== undefined || line !== undefined) {\n w.empty(\"w:spacing\", {\n \"w:before\": before !== undefined ? Math.max(0, ptToTwips(before)) : undefined,\n \"w:after\": after !== undefined ? Math.max(0, ptToTwips(after)) : undefined,\n \"w:line\": line,\n \"w:lineRule\": lineRule,\n });\n }\n const left = cssLengthToPt(p?.indentLeft);\n const right = cssLengthToPt(p?.indentRight);\n const first = cssLengthToPt(p?.indentFirstLine);\n if (left !== undefined || right !== undefined || first !== undefined) {\n w.empty(\"w:ind\", {\n \"w:left\": left !== undefined ? ptToTwips(left) : undefined,\n \"w:right\": right !== undefined ? ptToTwips(right) : undefined,\n \"w:firstLine\": first !== undefined && first >= 0 ? ptToTwips(first) : undefined,\n \"w:hanging\": first !== undefined && first < 0 ? ptToTwips(-first) : undefined,\n });\n }\n const jc = alignment(p?.textAlign);\n if (jc) w.val(\"w:jc\", jc);\n if (outline !== undefined) w.val(\"w:outlineLvl\", outline);\n}\n\nfunction alignment(value: unknown): string | undefined {\n switch (value) {\n case \"left\":\n return \"left\";\n case \"center\":\n return \"center\";\n case \"right\":\n return \"right\";\n case \"justify\":\n return \"both\";\n default:\n return undefined;\n }\n}\n\nclass Relationships {\n private list: { id: string; type: string; target: string; external: boolean }[] = [];\n private index = new Map<string, string>();\n\n add(type: string, target: string, external = false): string {\n const key = `${type}\\n${target}\\n${external}`;\n const existing = this.index.get(key);\n if (existing) return existing;\n const id = `rId${this.list.length + 1}`;\n this.list.push({ id, type, target, external });\n this.index.set(key, id);\n return id;\n }\n\n get size(): number {\n return this.list.length;\n }\n\n xml(): string {\n const w = new XmlWriter();\n w.open(\"Relationships\", { xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\" });\n for (const rel of this.list) {\n w.empty(\"Relationship\", {\n Id: rel.id,\n Type: rel.type,\n Target: rel.target,\n TargetMode: rel.external ? \"External\" : undefined,\n });\n }\n w.close(\"Relationships\");\n return w.toString();\n }\n}\n\ninterface CommentEntry {\n thread: CommentThread;\n /** File id of the thread's comment, then of each reply. */\n ids: number[];\n started: boolean;\n ended: boolean;\n}\n\nclass DocxBuilder {\n readonly report: DocxExportReport = {\n dropped: [],\n written: { paragraphs: 0, tables: 0, images: 0, comments: 0, replies: 0, trackedChanges: 0 },\n };\n private rels = new Relationships();\n private media: { name: string; bytes: Uint8Array }[] = [];\n private mediaTypes = new Set<string>();\n private nums: { numId: number; abstractId: number; start?: number; level: number }[] = [];\n private revisionId = 0;\n private docPrId = 0;\n private paraIdCounter = 0x10000000;\n private comments = new Map<string, CommentEntry>();\n /** Thread id → JSON node carrying its last comment mark. */\n private commentEnds = new Map<string, DocxJSONNode>();\n /** JSON node → threads whose range ends after it (so ends are found in O(1) per node). */\n private endsByNode = new Map<DocxJSONNode, string[]>();\n private people = new Map<string, string>();\n private styleIds: Set<string>;\n private extraStyles = new Set<string>();\n private readonly anonymous: boolean;\n private readonly defaultAuthor: ReviewAuthor | undefined;\n\n constructor(\n private readonly doc: DocxJSONNode,\n private readonly options: DocxExportOptions,\n private readonly threads: CommentThread[],\n private readonly styles: { styles: StyleDefinition[]; defaults: StyleDefaults },\n ) {\n this.anonymous = options.privacy === \"strip-authors\";\n this.defaultAuthor = authorOf(options.author);\n this.styleIds = new Set(styles.styles.filter((s) => isValidStyleId(s.id)).map((s) => s.id));\n }\n\n drop(kind: DocxExportIssueKind, name: string, reason: string): void {\n const issue = this.report.dropped.find((i) => i.kind === kind && i.name === name && i.reason === reason);\n if (issue) issue.count++;\n else this.report.dropped.push({ kind, name: truncate(name), reason, count: 1 });\n }\n\n // -- Authors and revisions ------------------------------------------------\n\n private authorName(name: unknown, id: unknown): string {\n if (this.anonymous) return DOCX_ANONYMOUS_AUTHOR;\n const author =\n (typeof name === \"string\" && name.trim()) ||\n (typeof id === \"string\" && id.trim()) ||\n this.defaultAuthor?.name ||\n \"Unknown\";\n const authorId = (typeof id === \"string\" && id.trim()) || this.defaultAuthor?.id;\n if (authorId && authorId !== author && !this.people.has(author)) this.people.set(author, authorId);\n return author;\n }\n\n private changeAttrs(attrs: Record<string, any>): XmlAttrs {\n return {\n \"w:id\": ++this.revisionId,\n \"w:author\": this.authorName(attrs.authorName, attrs.authorId),\n \"w:date\": isoDate(attrs.createdAt),\n };\n }\n\n // -- Comments ---------------------------------------------------------------\n\n private prepareComments(): void {\n const marked = new Set<string>();\n const visit = (node: DocxJSONNode, depth: number) => {\n if (depth > MAX_DEPTH) return;\n for (const mark of node.marks ?? []) {\n if (mark.type === \"comment\" && typeof mark.attrs?.commentId === \"string\") {\n marked.add(mark.attrs.commentId);\n this.commentEnds.set(mark.attrs.commentId, node);\n }\n }\n node.content?.forEach((child) => visit(child, depth + 1));\n };\n visit(this.doc, 0);\n let next = 0;\n for (const thread of this.threads) {\n if (!thread || typeof thread.id !== \"string\") continue;\n if (!marked.has(thread.id)) {\n this.drop(\"comment\", thread.id, \"comment text is not in the document\");\n continue;\n }\n if (!thread.body?.trim()) {\n this.drop(\"comment\", thread.id, \"draft comment without text\");\n this.commentEnds.delete(thread.id);\n continue;\n }\n const replies = (thread.replies ?? []).filter((reply) => reply && reply.body?.trim());\n const ids = [next++, ...replies.map(() => next++)];\n this.comments.set(thread.id, { thread: { ...thread, replies }, ids, started: false, ended: false });\n }\n for (const [threadId, node] of this.commentEnds) {\n if (!this.comments.has(threadId)) continue;\n const list = this.endsByNode.get(node) ?? [];\n list.push(threadId);\n this.endsByNode.set(node, list);\n }\n }\n\n // -- Document ---------------------------------------------------------------\n\n documentXml(): string {\n this.prepareComments();\n const body = new XmlWriter(false);\n const blocks = this.doc.type === \"doc\" || !this.doc.type ? (this.doc.content ?? []) : [this.doc];\n this.blocks(body, blocks, { depth: 0, quoteLevel: 0 });\n // Word wants a paragraph before the section properties.\n if (!blocks.length || blocks[blocks.length - 1].type === \"table\") body.empty(\"w:p\");\n // Ranges whose end was never written (e.g. text in a dropped node) are closed here.\n for (const [id, entry] of this.comments) if (entry.started && !entry.ended) this.endComment(body, id);\n const w = new XmlWriter();\n w.open(\"w:document\", BODY_NS).open(\"w:body\").raw(body.toString());\n w.open(\"w:sectPr\")\n .empty(\"w:pgSz\", { \"w:w\": 12240, \"w:h\": 15840 })\n .empty(\"w:pgMar\", {\n \"w:top\": 1440,\n \"w:right\": 1440,\n \"w:bottom\": 1440,\n \"w:left\": 1440,\n \"w:header\": 720,\n \"w:footer\": 720,\n \"w:gutter\": 0,\n })\n .close(\"w:sectPr\");\n w.close(\"w:body\").close(\"w:document\");\n return w.toString();\n }\n\n private blocks(w: XmlWriter, nodes: readonly DocxJSONNode[], ctx: BlockContext): void {\n if (ctx.depth > MAX_DEPTH) {\n this.drop(\"node\", \"nesting\", `content nested deeper than ${MAX_DEPTH} levels`);\n return;\n }\n let first = true;\n nodes.forEach((node, i) => {\n const itemCtx: BlockContext = { ...ctx, depth: ctx.depth + 1, listItemFirst: ctx.list ? first : undefined };\n this.block(w, node, itemCtx);\n if (node.type !== \"bulletList\" && node.type !== \"orderedList\" && node.type !== \"taskList\") first = false;\n // Two tables in a row would merge into one in Word, so a paragraph separates them.\n if (node.type === \"table\" && nodes[i + 1]?.type === \"table\") w.empty(\"w:p\");\n });\n }\n\n private block(w: XmlWriter, node: DocxJSONNode, ctx: BlockContext): void {\n const type = node.type ?? \"\";\n switch (type) {\n case \"paragraph\":\n this.paragraph(w, node, ctx);\n return;\n case \"heading\":\n this.paragraph(w, node, ctx, { heading: Math.max(1, Math.min(6, Number(node.attrs?.level) || 1)) });\n return;\n case \"codeBlock\":\n this.paragraph(w, node, ctx, { code: true });\n return;\n case \"blockquote\":\n this.blocks(w, node.content ?? [], { ...ctx, quoteLevel: ctx.quoteLevel + 1 });\n return;\n case \"bulletList\":\n case \"orderedList\":\n case \"taskList\":\n this.list(w, node, ctx);\n return;\n case \"table\":\n this.table(w, node, ctx);\n return;\n case \"horizontalRule\":\n w.open(\"w:p\").open(\"w:pPr\").open(\"w:pBdr\");\n w.empty(\"w:bottom\", { \"w:val\": \"single\", \"w:sz\": 6, \"w:space\": 1, \"w:color\": \"auto\" });\n w.close(\"w:pBdr\").close(\"w:pPr\").close(\"w:p\");\n this.report.written.paragraphs++;\n return;\n case \"pageBreak\":\n w.open(\"w:p\").open(\"w:r\").empty(\"w:br\", { \"w:type\": \"page\" }).close(\"w:r\").close(\"w:p\");\n return;\n case \"image\":\n this.paragraph(w, { type: \"paragraph\", content: [node] }, ctx);\n return;\n default:\n break;\n }\n // Unknown blocks: inline content becomes a paragraph, block content is flattened.\n const content = node.content ?? [];\n if (content.some((child) => child.type === \"text\" || isInlineType(child.type))) {\n this.drop(\"node\", type || \"unknown\", \"written as a plain paragraph\");\n this.paragraph(w, { type: \"paragraph\", content }, ctx);\n } else if (content.length) {\n this.drop(\"node\", type || \"unknown\", \"container flattened\");\n this.blocks(w, content, ctx);\n } else {\n this.drop(\"node\", type || \"unknown\", \"unsupported node\");\n }\n }\n\n // -- Lists --------------------------------------------------------------------\n\n private list(w: XmlWriter, node: DocxJSONNode, ctx: BlockContext): void {\n const level = Math.min(8, ctx.list ? ctx.list.level + 1 : 0);\n const abstractId = node.type === \"orderedList\" ? 2 : node.type === \"taskList\" ? 3 : 1;\n const numId = this.nums.length + 1;\n const start = node.type === \"orderedList\" ? Number(node.attrs?.start ?? 1) : undefined;\n this.nums.push({ numId, abstractId, level, start: start !== undefined && start !== 1 && Number.isFinite(start) ? start : undefined });\n for (const item of node.content ?? []) {\n const task = item.type === \"taskItem\";\n this.blocks(w, item.content ?? [], {\n ...ctx,\n list: { numId, level, task, checked: task ? !!item.attrs?.checked : undefined },\n });\n }\n }\n\n // -- Paragraphs -----------------------------------------------------------------\n\n private styleFor(node: DocxJSONNode, ctx: BlockContext, opts: { heading?: number; code?: boolean }): string | undefined {\n const own = node.attrs?.styleId;\n if (own) {\n if (isValidStyleId(own) && this.styleIds.has(own)) return own;\n this.drop(\"style\", String(own), \"style is not in the registry\");\n }\n if (opts.heading) return this.needStyle(`Heading${opts.heading}`);\n if (opts.code) return this.needStyle(\"Code\");\n if (ctx.quoteLevel > 0) return this.needStyle(\"BlockText\");\n if (ctx.list) return this.needStyle(\"ListParagraph\");\n return undefined;\n }\n\n /** Uses a style the registry may not define (it is then written with defaults). */\n private needStyle(id: string): string {\n if (!this.styleIds.has(id)) this.extraStyles.add(id);\n return id;\n }\n\n private previousStyle(previous: BlockChangeRecord[\"previous\"]): string | undefined {\n if (!previous) return undefined;\n const id = previous.attrs?.styleId;\n if (isValidStyleId(id) && this.styleIds.has(id)) return id;\n if (previous.type === \"heading\") return this.needStyle(`Heading${Math.max(1, Math.min(6, Number(previous.attrs?.level) || 1))}`);\n if (previous.type === \"codeBlock\") return this.needStyle(\"Code\");\n return undefined;\n }\n\n private paragraph(\n w: XmlWriter,\n node: DocxJSONNode,\n ctx: BlockContext,\n opts: { heading?: number; code?: boolean } = {},\n ): void {\n this.report.written.paragraphs++;\n const style = this.styleFor(node, ctx, opts);\n const change = (node.attrs?.blockChange ?? null) as BlockChangeRecord | null;\n const operation = change?.operation;\n const list = ctx.list;\n const numbered = list && ctx.listItemFirst;\n const indent = ctx.quoteLevel * INDENT_STEP + (list && !numbered ? (list.level + 1) * INDENT_STEP : 0);\n const jc = alignment(node.attrs?.textAlign);\n\n w.open(\"w:p\");\n const ppr = new XmlWriter(false);\n if (style) ppr.val(\"w:pStyle\", style);\n if (numbered) {\n ppr.open(\"w:numPr\").val(\"w:ilvl\", list!.level).val(\"w:numId\", list!.numId).close(\"w:numPr\");\n }\n if (indent && !(ctx.quoteLevel > 0 && !list && ctx.quoteLevel === 1)) ppr.empty(\"w:ind\", { \"w:left\": indent });\n if (jc) ppr.val(\"w:jc\", jc);\n if (change && operation) {\n ppr.open(\"w:rPr\").empty(operation === \"insert\" ? \"w:ins\" : \"w:del\", this.changeAttrs(change)).close(\"w:rPr\");\n this.report.written.trackedChanges++;\n } else if (change?.previous) {\n ppr.open(\"w:pPrChange\", this.changeAttrs(change)).open(\"w:pPr\");\n const old = this.previousStyle(change.previous);\n if (old) ppr.val(\"w:pStyle\", old);\n const oldJc = alignment(change.previous.attrs?.textAlign);\n if (oldJc) ppr.val(\"w:jc\", oldJc);\n ppr.close(\"w:pPr\").close(\"w:pPrChange\");\n this.report.written.trackedChanges++;\n }\n const pprXml = ppr.toString();\n if (pprXml) w.open(\"w:pPr\").raw(pprXml).close(\"w:pPr\");\n\n if (list?.task && numbered) {\n // Word has no checklist numbering: the box is the first character.\n w.open(\"w:r\").leaf(\"w:t\", { \"xml:space\": \"preserve\" }, `${list.checked ? TASK_CHECKED : TASK_UNCHECKED} `).close(\"w:r\");\n }\n const synthetic: Revision | undefined =\n change && operation ? { kind: operation === \"insert\" ? \"ins\" : \"del\", attrs: change } : undefined;\n this.inline(w, this.pieces(node.content ?? [], opts.code === true), synthetic);\n w.close(\"w:p\");\n }\n\n /** Flattens inline content into runs of text, tabs, breaks and images. */\n private pieces(nodes: readonly DocxJSONNode[], code: boolean, out: Piece[] = [], depth = 0): Piece[] {\n if (depth > MAX_DEPTH) return out;\n for (const node of nodes) {\n const marks = node.marks ?? [];\n switch (node.type) {\n case \"text\": {\n const text = node.text ?? \"\";\n const parts = text.split(/(\\t|\\r\\n|\\n|\\r)/);\n const pieces: Piece[] = [];\n for (const part of parts) {\n if (!part) continue;\n if (part === \"\\t\") pieces.push({ kind: \"tab\", node, last: false, marks });\n else if (part === \"\\n\" || part === \"\\r\\n\" || part === \"\\r\") pieces.push({ kind: \"br\", node, last: false, marks });\n else pieces.push({ kind: \"text\", text: part, node, last: false, marks });\n }\n if (!pieces.length) pieces.push({ kind: \"text\", text: \"\", node, last: false, marks });\n pieces[pieces.length - 1].last = true;\n out.push(...pieces);\n break;\n }\n case \"hardBreak\":\n out.push({ kind: \"br\", node, last: true, marks });\n break;\n case \"image\":\n out.push({ kind: \"image\", node, last: true, marks });\n break;\n case \"mention\": {\n const label = node.attrs?.label ?? node.attrs?.id ?? \"\";\n out.push({ kind: \"text\", text: label ? `@${label}` : \"\", node, last: true, marks });\n break;\n }\n default:\n if (node.content?.length) {\n this.pieces(node.content, code, out, depth + 1);\n } else if (typeof node.attrs?.label === \"string\" || typeof node.attrs?.text === \"string\") {\n this.drop(\"node\", node.type ?? \"unknown\", \"written as text\");\n out.push({ kind: \"text\", text: String(node.attrs.label ?? node.attrs.text), node, last: true, marks });\n } else {\n this.drop(\"node\", node.type ?? \"unknown\", \"unsupported inline node\");\n }\n }\n }\n return out;\n }\n\n private revisionsOf(marks: readonly DocxJSONMark[], synthetic?: Revision): Revision[] {\n const out: Revision[] = [];\n const ins = marks.find((m) => m.type === \"insertion\");\n const del = marks.find((m) => m.type === \"deletion\");\n if (ins) out.push({ kind: \"ins\", attrs: ins.attrs ?? {}, moveId: ins.attrs?.moveId || undefined });\n if (del) out.push({ kind: \"del\", attrs: del.attrs ?? {}, moveId: del.attrs?.moveId || undefined });\n if (!out.length && synthetic) out.push(synthetic);\n return out;\n }\n\n private linkOf(marks: readonly DocxJSONMark[]): string | undefined {\n const link = marks.find((m) => m.type === \"link\");\n const href = typeof link?.attrs?.href === \"string\" ? link.attrs.href.trim() : \"\";\n if (!href) return undefined;\n if (href.startsWith(\"#\") || /^(https?|mailto|tel|ftp):/i.test(href) || !/^[a-z][a-z0-9+.-]*:/i.test(href)) return href;\n this.drop(\"link\", href, \"unsafe URL scheme\");\n return undefined;\n }\n\n /** Writes pieces grouped into hyperlinks (outer) and tracked-change wrappers (inner). */\n private inline(w: XmlWriter, pieces: Piece[], synthetic?: Revision): void {\n let openLink: string | undefined;\n type OpenRevisions = { key: string; tags: string[]; moveRanges: { tag: string; id: number }[] };\n let openRevs: OpenRevisions | null = null;\n const closeRevs = () => {\n const open = openRevs as OpenRevisions | null;\n if (!open) return;\n for (const tag of [...open.tags].reverse()) w.close(tag);\n for (const range of open.moveRanges) w.empty(range.tag, { \"w:id\": range.id });\n openRevs = null;\n };\n const closeLink = () => {\n closeRevs();\n if (openLink !== undefined) w.close(\"w:hyperlink\");\n openLink = undefined;\n };\n for (const piece of pieces) {\n const href = this.linkOf(piece.marks);\n if (href !== openLink) {\n closeLink();\n if (href !== undefined) {\n if (href.startsWith(\"#\")) w.open(\"w:hyperlink\", { \"w:anchor\": href.slice(1), \"w:history\": 1 });\n else w.open(\"w:hyperlink\", { \"r:id\": this.rels.add(REL.hyperlink, href, true), \"w:history\": 1 });\n openLink = href;\n }\n }\n const revs = this.revisionsOf(piece.marks, synthetic);\n const key = revs.map((r) => `${r.kind}:${r.attrs.changeId ?? \"\"}:${r.moveId ?? \"\"}:${r.attrs.authorName ?? \"\"}`).join(\"|\");\n if (key !== ((openRevs as OpenRevisions | null)?.key ?? \"\")) {\n closeRevs();\n if (revs.length) {\n const state: OpenRevisions = { key, tags: [], moveRanges: [] };\n for (const rev of revs) {\n const attrs = this.changeAttrs(rev.attrs);\n this.report.written.trackedChanges++;\n if (rev.moveId) {\n const rangeTag = rev.kind === \"ins\" ? \"w:moveToRange\" : \"w:moveFromRange\";\n const rangeId = ++this.revisionId;\n w.empty(`${rangeTag}Start`, { \"w:id\": rangeId, \"w:name\": rev.moveId, \"w:author\": attrs[\"w:author\"], \"w:date\": attrs[\"w:date\"] });\n state.moveRanges.push({ tag: `${rangeTag}End`, id: rangeId });\n }\n const tag = rev.moveId ? (rev.kind === \"ins\" ? \"w:moveTo\" : \"w:moveFrom\") : rev.kind === \"ins\" ? \"w:ins\" : \"w:del\";\n w.open(tag, attrs);\n state.tags.push(tag);\n }\n openRevs = state;\n }\n }\n this.commentStarts(w, piece.marks);\n this.run(w, piece, revs);\n if (piece.last) this.commentEndsAfter(w, piece.node);\n }\n closeLink();\n }\n\n private commentStarts(w: XmlWriter, marks: readonly DocxJSONMark[]): void {\n for (const mark of marks) {\n if (mark.type !== \"comment\") continue;\n const entry = this.comments.get(mark.attrs?.commentId);\n if (!entry || entry.started) continue;\n entry.started = true;\n for (const id of entry.ids) w.empty(\"w:commentRangeStart\", { \"w:id\": id });\n }\n }\n\n private commentEndsAfter(w: XmlWriter, node: DocxJSONNode): void {\n for (const threadId of this.endsByNode.get(node) ?? []) {\n const entry = this.comments.get(threadId);\n if (entry?.started && !entry.ended) this.endComment(w, threadId);\n }\n }\n\n private endComment(w: XmlWriter, threadId: string): void {\n const entry = this.comments.get(threadId)!;\n entry.ended = true;\n for (const id of entry.ids) {\n w.empty(\"w:commentRangeEnd\", { \"w:id\": id });\n w.open(\"w:r\").open(\"w:rPr\").val(\"w:rStyle\", \"CommentReference\").close(\"w:rPr\");\n w.empty(\"w:commentReference\", { \"w:id\": id }).close(\"w:r\");\n }\n this.needStyle(\"CommentReference\");\n this.needStyle(\"CommentText\");\n }\n\n private run(w: XmlWriter, piece: Piece, revs: Revision[]): void {\n for (const mark of piece.marks) {\n if (!FORMAT_MARKS.has(mark.type) && !STRUCTURAL_MARKS.has(mark.type)) this.drop(\"mark\", mark.type, \"formatting not supported\");\n if (mark.type === \"characterStyle\" && mark.attrs?.styleId && !this.styleIds.has(mark.attrs.styleId)) {\n this.drop(\"style\", String(mark.attrs.styleId), \"character style is not in the registry\");\n }\n }\n if (piece.kind === \"image\") {\n const drawing = this.image(piece.node);\n if (!drawing) return;\n w.open(\"w:r\");\n const format = runFormatOf(piece.marks);\n delete format.charStyle;\n if (hasRunProps(format)) {\n w.open(\"w:rPr\");\n writeRunProps(w, format);\n w.close(\"w:rPr\");\n }\n w.raw(drawing).close(\"w:r\");\n return;\n }\n const format = runFormatOf(piece.marks.filter((m) => m.type !== \"characterStyle\" || this.styleIds.has(m.attrs?.styleId)));\n if (format.charStyle === \"Hyperlink\") this.needStyle(\"Hyperlink\");\n const formatChange = piece.marks.find((m) => m.type === \"formatChange\");\n w.open(\"w:r\");\n if (hasRunProps(format) || formatChange) {\n w.open(\"w:rPr\");\n writeRunProps(w, format);\n if (formatChange) {\n const attrs = formatChange.attrs ?? {};\n w.open(\"w:rPrChange\", this.changeAttrs(attrs)).open(\"w:rPr\");\n writeRunProps(w, runFormatOf(Array.isArray(attrs.before) ? attrs.before : []));\n w.close(\"w:rPr\").close(\"w:rPrChange\");\n this.report.written.trackedChanges++;\n }\n w.close(\"w:rPr\");\n }\n // Deleted text is `w:delText`; text moved away stays `w:t` (ECMA-376 §17.13.5.22).\n const deleted = revs.some((r) => r.kind === \"del\" && !r.moveId);\n if (piece.kind === \"tab\") w.empty(\"w:tab\");\n else if (piece.kind === \"br\") w.empty(\"w:br\");\n else if (piece.text) w.leaf(deleted ? \"w:delText\" : \"w:t\", { \"xml:space\": \"preserve\" }, piece.text);\n w.close(\"w:r\");\n }\n\n // -- Images -----------------------------------------------------------------\n\n private image(node: DocxJSONNode): string | null {\n const src = typeof node.attrs?.src === \"string\" ? node.attrs.src.trim() : \"\";\n const alt = typeof node.attrs?.alt === \"string\" ? node.attrs.alt : \"\";\n const title = typeof node.attrs?.title === \"string\" ? node.attrs.title : \"\";\n let relId: string;\n let natural: { width: number; height: number } | null = null;\n let linked = false;\n if (src.startsWith(\"data:\")) {\n const decoded = decodeDataUrl(src);\n const ext = decoded ? DOCX_IMAGE_TYPES[decoded.mime] : undefined;\n if (!decoded || !ext) {\n this.drop(\"image\", decoded?.mime ?? \"data URL\", \"unsupported image type\");\n return null;\n }\n const name = `image${this.media.length + 1}.${ext}`;\n this.media.push({ name, bytes: decoded.bytes });\n this.mediaTypes.add(ext);\n relId = this.rels.add(REL.image, `media/${name}`);\n natural = imagePixelSize(decoded.bytes);\n } else if (/^https?:\\/\\//i.test(src)) {\n if (this.options.remoteImages !== \"link\") {\n this.drop(\"image\", src, \"remote image skipped (use remoteImages: \\\"link\\\")\");\n return null;\n }\n relId = this.rels.add(REL.image, src, true);\n linked = true;\n } else {\n this.drop(\"image\", src || \"image\", \"image source is neither a data URL nor http(s)\");\n return null;\n }\n let width = pixelAttr(node.attrs?.width) ?? natural?.width ?? 400;\n let height = pixelAttr(node.attrs?.height) ?? (natural ? (natural.height * width) / natural.width : 300);\n if (width > MAX_IMAGE_WIDTH_PX) {\n height = (height * MAX_IMAGE_WIDTH_PX) / width;\n width = MAX_IMAGE_WIDTH_PX;\n }\n const cx = pxToEmu(width);\n const cy = pxToEmu(height);\n const id = ++this.docPrId;\n this.report.written.images++;\n const w = new XmlWriter(false);\n w.open(\"w:drawing\").open(\"wp:inline\", { distT: 0, distB: 0, distL: 0, distR: 0 });\n w.empty(\"wp:extent\", { cx, cy }).empty(\"wp:effectExtent\", { l: 0, t: 0, r: 0, b: 0 });\n w.empty(\"wp:docPr\", { id, name: `Picture ${id}`, descr: alt || undefined, title: title || undefined });\n w.open(\"wp:cNvGraphicFramePr\").empty(\"a:graphicFrameLocks\", { noChangeAspect: 1 }).close(\"wp:cNvGraphicFramePr\");\n w.open(\"a:graphic\").open(\"a:graphicData\", { uri: \"http://schemas.openxmlformats.org/drawingml/2006/picture\" });\n w.open(\"pic:pic\").open(\"pic:nvPicPr\").empty(\"pic:cNvPr\", { id: 0, name: `Picture ${id}`, descr: alt || undefined });\n w.empty(\"pic:cNvPicPr\").close(\"pic:nvPicPr\");\n w.open(\"pic:blipFill\").empty(\"a:blip\", linked ? { \"r:link\": relId } : { \"r:embed\": relId });\n w.open(\"a:stretch\").empty(\"a:fillRect\").close(\"a:stretch\").close(\"pic:blipFill\");\n w.open(\"pic:spPr\").open(\"a:xfrm\").empty(\"a:off\", { x: 0, y: 0 }).empty(\"a:ext\", { cx, cy }).close(\"a:xfrm\");\n w.open(\"a:prstGeom\", { prst: \"rect\" }).empty(\"a:avLst\").close(\"a:prstGeom\").close(\"pic:spPr\");\n w.close(\"pic:pic\").close(\"a:graphicData\").close(\"a:graphic\").close(\"wp:inline\").close(\"w:drawing\");\n return w.toString();\n }\n\n // -- Tables -------------------------------------------------------------------\n\n private table(w: XmlWriter, node: DocxJSONNode, ctx: BlockContext): void {\n type Slot = { cell: DocxJSONNode; rowOffset: number; colOffset: number; colspan: number; rowspan: number } | null;\n const rows = (node.content ?? []).filter((row) => row.type === \"tableRow\" || row.content?.length);\n if (!rows.length) {\n this.drop(\"node\", \"table\", \"empty table\");\n return;\n }\n const grid: Slot[][] = rows.map(() => []);\n rows.forEach((row, r) => {\n let col = 0;\n for (const cell of row.content ?? []) {\n while (grid[r][col]) col++;\n const colspan = Math.max(1, Math.min(63, Number(cell.attrs?.colspan) || 1));\n const rowspan = Math.max(1, Math.min(rows.length - r, Number(cell.attrs?.rowspan) || 1));\n for (let i = 0; i < rowspan; i++) {\n for (let j = 0; j < colspan; j++) {\n grid[r + i][col + j] = { cell, rowOffset: i, colOffset: j, colspan, rowspan };\n }\n }\n col += colspan;\n }\n });\n const cols = Math.max(1, Math.min(63, ...grid.map((row) => row.length)));\n const widths: number[] = [];\n for (let c = 0; c < cols; c++) {\n const slot = grid[0][c];\n const colwidth = slot?.cell.attrs?.colwidth;\n const px = Array.isArray(colwidth) ? Number(colwidth[slot!.colOffset]) : NaN;\n widths.push(Number.isFinite(px) && px > 0 ? pxToTwips(px) : 0);\n }\n const known = widths.reduce((n, v) => n + v, 0);\n const unknown = widths.filter((v) => !v).length;\n const fill = unknown ? Math.max(360, Math.floor(Math.max(0, CONTENT_WIDTH_TWIPS - known) / unknown)) : 0;\n for (let c = 0; c < cols; c++) if (!widths[c]) widths[c] = fill;\n\n this.report.written.tables++;\n w.open(\"w:tbl\").open(\"w:tblPr\");\n w.empty(\"w:tblW\", { \"w:w\": 0, \"w:type\": \"auto\" });\n w.open(\"w:tblBorders\");\n for (const side of [\"top\", \"left\", \"bottom\", \"right\", \"insideH\", \"insideV\"]) {\n w.empty(`w:${side}`, { \"w:val\": \"single\", \"w:sz\": 4, \"w:space\": 0, \"w:color\": \"auto\" });\n }\n w.close(\"w:tblBorders\");\n w.empty(\"w:tblLook\", { \"w:val\": \"04A0\", \"w:firstRow\": 1, \"w:lastRow\": 0, \"w:firstColumn\": 1, \"w:lastColumn\": 0, \"w:noHBand\": 0, \"w:noVBand\": 1 });\n w.close(\"w:tblPr\");\n w.open(\"w:tblGrid\");\n widths.forEach((width) => w.empty(\"w:gridCol\", { \"w:w\": width }));\n w.close(\"w:tblGrid\");\n const cellCtx: BlockContext = { depth: ctx.depth + 1, quoteLevel: 0 };\n rows.forEach((row, r) => {\n w.open(\"w:tr\");\n const cells = row.content ?? [];\n if (cells.length && cells.every((cell) => cell.type === \"tableHeader\")) {\n w.open(\"w:trPr\").empty(\"w:tblHeader\").close(\"w:trPr\");\n }\n for (let c = 0; c < cols; c++) {\n const slot = grid[r][c];\n if (slot && slot.colOffset > 0) continue;\n const span = slot?.colspan ?? 1;\n const width = widths.slice(c, c + span).reduce((n, v) => n + v, 0);\n w.open(\"w:tc\").open(\"w:tcPr\").empty(\"w:tcW\", { \"w:w\": width, \"w:type\": \"dxa\" });\n if (span > 1) w.val(\"w:gridSpan\", span);\n if (slot && slot.rowspan > 1) {\n if (slot.rowOffset === 0) w.val(\"w:vMerge\", \"restart\");\n else w.empty(\"w:vMerge\");\n }\n w.close(\"w:tcPr\");\n const content = slot && slot.rowOffset === 0 ? (slot.cell.content ?? []) : [];\n if (content.length) this.blocks(w, content, cellCtx);\n // A cell must end with a paragraph.\n const lastType = content[content.length - 1]?.type;\n if (!content.length || lastType === \"table\") w.empty(\"w:p\");\n w.close(\"w:tc\");\n }\n w.close(\"w:tr\");\n });\n w.close(\"w:tbl\");\n }\n\n // -- Other parts --------------------------------------------------------------\n\n numberingXml(): string | null {\n if (!this.nums.length) return null;\n const w = new XmlWriter();\n w.open(\"w:numbering\", BODY_NS);\n const abstract = (id: number, kind: \"bullet\" | \"decimal\" | \"task\") => {\n w.open(\"w:abstractNum\", { \"w:abstractNumId\": id }).val(\"w:multiLevelType\", \"hybridMultilevel\");\n for (let level = 0; level < 9; level++) {\n w.open(\"w:lvl\", { \"w:ilvl\": level }).val(\"w:start\", 1);\n if (kind === \"decimal\") {\n const formats = [\"decimal\", \"lowerLetter\", \"lowerRoman\"];\n w.val(\"w:numFmt\", formats[level % 3]).val(\"w:lvlText\", `%${level + 1}.`);\n } else if (kind === \"bullet\") {\n w.val(\"w:numFmt\", \"bullet\").val(\"w:lvlText\", BULLETS[level % 3]);\n } else {\n w.val(\"w:numFmt\", \"none\").val(\"w:lvlText\", \"\");\n }\n w.val(\"w:lvlJc\", \"left\");\n w.open(\"w:pPr\").empty(\"w:ind\", { \"w:left\": (level + 1) * INDENT_STEP, \"w:hanging\": kind === \"task\" ? 0 : 360 }).close(\"w:pPr\");\n if (kind === \"bullet\") {\n const font = BULLET_FONTS[level % 3] === \"Symbol\" ? \"Arial\" : BULLET_FONTS[level % 3];\n w.open(\"w:rPr\").empty(\"w:rFonts\", { \"w:ascii\": font, \"w:hAnsi\": font, \"w:hint\": \"default\" }).close(\"w:rPr\");\n }\n w.close(\"w:lvl\");\n }\n w.close(\"w:abstractNum\");\n };\n abstract(1, \"bullet\");\n abstract(2, \"decimal\");\n abstract(3, \"task\");\n for (const num of this.nums) {\n w.open(\"w:num\", { \"w:numId\": num.numId }).val(\"w:abstractNumId\", num.abstractId);\n if (num.start !== undefined) {\n w.open(\"w:lvlOverride\", { \"w:ilvl\": num.level }).val(\"w:startOverride\", num.start).close(\"w:lvlOverride\");\n }\n w.close(\"w:num\");\n }\n w.close(\"w:numbering\");\n return w.toString();\n }\n\n stylesXml(): string {\n const w = new XmlWriter();\n w.open(\"w:styles\", BODY_NS);\n const defaults = this.styles.defaults;\n const defaultRun = characterFormatToRun(defaults.character);\n w.open(\"w:docDefaults\").open(\"w:rPrDefault\").open(\"w:rPr\");\n const font = defaultRun.font ?? \"Calibri\";\n w.empty(\"w:rFonts\", { \"w:ascii\": font, \"w:hAnsi\": font, \"w:eastAsia\": font, \"w:cs\": font });\n const size = defaultRun.halfPoints ?? 22;\n w.val(\"w:sz\", size).val(\"w:szCs\", size);\n w.val(\"w:lang\", \"en-US\");\n w.close(\"w:rPr\").close(\"w:rPrDefault\");\n w.open(\"w:pPrDefault\").open(\"w:pPr\");\n if (defaults.paragraph && Object.keys(defaults.paragraph).length) writeParagraphFormat(w, defaults.paragraph);\n else w.empty(\"w:spacing\", { \"w:after\": 160, \"w:line\": 259, \"w:lineRule\": \"auto\" });\n w.close(\"w:pPr\").close(\"w:pPrDefault\").close(\"w:docDefaults\");\n\n const byId = new Map(this.styles.styles.filter((s) => isValidStyleId(s.id)).map((s) => [s.id, s]));\n const written = new Set<string>();\n const blockOf = (style: StyleDefinition): StyleDefinition[\"block\"] => {\n let current: StyleDefinition | undefined = style;\n for (let i = 0; current && i < 32; i++) {\n if (current.block) return current.block;\n current = current.basedOn ? byId.get(current.basedOn) : undefined;\n }\n return null;\n };\n const writeStyle = (style: StyleDefinition) => {\n if (written.has(style.id)) return;\n written.add(style.id);\n const isNormal = style.kind === \"paragraph\" && style.id === NORMAL_STYLE_ID;\n w.open(\"w:style\", {\n \"w:type\": style.kind === \"character\" ? \"character\" : \"paragraph\",\n \"w:default\": isNormal ? 1 : undefined,\n \"w:customStyle\": style.builtin ? undefined : 1,\n \"w:styleId\": style.id,\n });\n w.val(\"w:name\", fileStyleName(style.name || style.id));\n const base = style.basedOn && byId.has(style.basedOn) && byId.get(style.basedOn)!.kind === style.kind ? style.basedOn : undefined;\n if (base) w.val(\"w:basedOn\", base);\n if (style.kind === \"paragraph\" && style.next && byId.get(style.next)?.kind === \"paragraph\") w.val(\"w:next\", style.next);\n if (style.linked && byId.has(style.linked)) w.val(\"w:link\", style.linked);\n if (style.priority !== undefined && Number.isFinite(style.priority)) w.val(\"w:uiPriority\", Math.max(0, Math.round(style.priority)));\n if (style.hidden) w.empty(\"w:semiHidden\").empty(\"w:unhideWhenUsed\");\n if (style.quick) w.empty(\"w:qFormat\");\n const block = style.kind === \"paragraph\" ? blockOf(style) : null;\n const ownBlock = style.kind === \"paragraph\" ? style.block : null;\n const outline = ownBlock?.type === \"heading\" ? Math.max(0, Math.min(8, (Number(ownBlock.attrs?.level) || 1) - 1)) : undefined;\n if (style.kind === \"paragraph\" && (style.paragraph || outline !== undefined)) {\n const p = new XmlWriter(false);\n writeParagraphFormat(p, style.paragraph, outline);\n const xml = p.toString();\n if (xml) w.open(\"w:pPr\").raw(xml).close(\"w:pPr\");\n }\n const run = characterFormatToRun(style.character);\n if (block?.type === \"codeBlock\" && !run.font) run.font = \"Consolas\";\n if (hasRunProps(run)) {\n w.open(\"w:rPr\");\n writeRunProps(w, run);\n w.close(\"w:rPr\");\n }\n w.close(\"w:style\");\n };\n // Base styles first, so Word never sees a `basedOn` before its target.\n const visit = (style: StyleDefinition, depth = 0) => {\n if (depth > 32 || written.has(style.id)) return;\n const base = style.basedOn ? byId.get(style.basedOn) : undefined;\n if (base) visit(base, depth + 1);\n writeStyle(style);\n };\n byId.forEach((style) => visit(style));\n for (const id of this.extraStyles) {\n if (written.has(id)) continue;\n const extra = EXTRA_STYLES[id] ?? { id, name: id, kind: \"paragraph\" as const, basedOn: NORMAL_STYLE_ID };\n byId.set(id, extra);\n writeStyle(extra);\n }\n w.close(\"w:styles\");\n return w.toString();\n }\n\n settingsXml(): string {\n const w = new XmlWriter();\n w.open(\"w:settings\", BODY_NS).empty(\"w:zoom\", { \"w:percent\": 100 });\n if (this.anonymous) w.empty(\"w:removePersonalInformation\");\n w.val(\"w:defaultTabStop\", 720);\n w.val(\"w:characterSpacingControl\", \"doNotCompress\");\n w.open(\"w:compat\").empty(\"w:compatSetting\", {\n \"w:name\": \"compatibilityMode\",\n \"w:uri\": \"http://schemas.microsoft.com/office/word\",\n \"w:val\": 15,\n });\n w.close(\"w:compat\").close(\"w:settings\");\n return w.toString();\n }\n\n commentParts(): { comments: string; extended: string } | null {\n if (!this.comments.size) return null;\n const w = new XmlWriter();\n const ext = new XmlWriter();\n w.open(\"w:comments\", BODY_NS);\n ext.open(\"w15:commentsEx\", { \"xmlns:w15\": NS.w15, \"xmlns:mc\": NS.mc, \"mc:Ignorable\": \"w15\" });\n for (const entry of this.comments.values()) {\n if (!entry.started) continue;\n const { thread } = entry;\n const parentPara = this.comment(w, entry.ids[0], thread.author, thread.createdAt, thread.body);\n ext.empty(\"w15:commentEx\", { \"w15:paraId\": parentPara, \"w15:done\": thread.resolved ? 1 : 0 });\n this.report.written.comments++;\n thread.replies.forEach((reply, i) => {\n const para = this.comment(w, entry.ids[i + 1], reply.author, reply.createdAt, reply.body);\n ext.empty(\"w15:commentEx\", { \"w15:paraId\": para, \"w15:paraIdParent\": parentPara, \"w15:done\": thread.resolved ? 1 : 0 });\n this.report.written.replies++;\n });\n }\n w.close(\"w:comments\");\n ext.close(\"w15:commentsEx\");\n return { comments: w.toString(), extended: ext.toString() };\n }\n\n private comment(w: XmlWriter, id: number, author: ReviewAuthor | undefined, createdAt: number, body: string): string {\n const name = this.authorName(author?.name, author?.id);\n w.open(\"w:comment\", {\n \"w:id\": id,\n \"w:author\": name,\n \"w:date\": isoDate(createdAt),\n \"w:initials\": this.anonymous ? ANONYMOUS_INITIALS : initialsOf(name),\n });\n const lines = String(body ?? \"\").replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n let paraId = \"\";\n lines.forEach((line, i) => {\n const last = i === lines.length - 1;\n if (last) paraId = (this.paraIdCounter++).toString(16).toUpperCase().padStart(8, \"0\");\n w.open(\"w:p\", last ? { \"w14:paraId\": paraId, \"w14:textId\": \"77777777\" } : undefined);\n w.open(\"w:pPr\").val(\"w:pStyle\", \"CommentText\").close(\"w:pPr\");\n if (i === 0) {\n w.open(\"w:r\").open(\"w:rPr\").val(\"w:rStyle\", \"CommentReference\").close(\"w:rPr\").empty(\"w:annotationRef\").close(\"w:r\");\n }\n if (line) w.open(\"w:r\").leaf(\"w:t\", { \"xml:space\": \"preserve\" }, line).close(\"w:r\");\n w.close(\"w:p\");\n });\n w.close(\"w:comment\");\n return paraId;\n }\n\n peopleXml(): string | null {\n if (this.anonymous || !this.people.size) return null;\n const w = new XmlWriter();\n w.open(\"w15:people\", { \"xmlns:w15\": NS.w15, \"xmlns:mc\": NS.mc, \"mc:Ignorable\": \"w15\" });\n for (const [name, id] of this.people) {\n w.open(\"w15:person\", { \"w15:author\": name });\n w.empty(\"w15:presenceInfo\", { \"w15:providerId\": \"None\", \"w15:userId\": id });\n w.close(\"w15:person\");\n }\n w.close(\"w15:people\");\n return w.toString();\n }\n\n coreXml(now: Date): string {\n const w = new XmlWriter();\n w.open(\"cp:coreProperties\", {\n \"xmlns:cp\": \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\",\n \"xmlns:dc\": \"http://purl.org/dc/elements/1.1/\",\n \"xmlns:dcterms\": \"http://purl.org/dc/terms/\",\n \"xmlns:dcmitype\": \"http://purl.org/dc/dcmitype/\",\n \"xmlns:xsi\": \"http://www.w3.org/2001/XMLSchema-instance\",\n });\n if (this.options.title) w.leaf(\"dc:title\", undefined, this.options.title);\n const creator = this.anonymous ? undefined : this.defaultAuthor?.name;\n if (creator) w.leaf(\"dc:creator\", undefined, creator).leaf(\"cp:lastModifiedBy\", undefined, creator);\n const date = isoDate(now.getTime()) ?? \"2026-01-01T00:00:00Z\";\n w.leaf(\"dcterms:created\", { \"xsi:type\": \"dcterms:W3CDTF\" }, date);\n w.leaf(\"dcterms:modified\", { \"xsi:type\": \"dcterms:W3CDTF\" }, date);\n w.close(\"cp:coreProperties\");\n return w.toString();\n }\n\n /** Assembles every part; `[Content_Types].xml` first. */\n parts(now: Date): DocxPackagePart[] {\n const document = this.documentXml();\n const parts: DocxPackagePart[] = [];\n const overrides: [string, string][] = [];\n const add = (name: string, data: string, contentType: string) => {\n parts.push({ name, data });\n overrides.push([`/${name}`, contentType]);\n };\n this.rels.add(REL.styles, \"styles.xml\");\n this.rels.add(REL.settings, \"settings.xml\");\n const numbering = this.numberingXml();\n if (numbering) this.rels.add(REL.numbering, \"numbering.xml\");\n const comments = this.commentParts();\n if (comments) {\n this.rels.add(REL.comments, \"comments.xml\");\n this.rels.add(REL.commentsExtended, \"commentsExtended.xml\");\n }\n const people = this.peopleXml();\n if (people) this.rels.add(REL.people, \"people.xml\");\n // Styles last: the document and comments decide which extra styles are needed.\n const styles = this.stylesXml();\n\n add(\"word/document.xml\", document, `${CT_WML}document.main+xml`);\n add(\"word/styles.xml\", styles, `${CT_WML}styles+xml`);\n add(\"word/settings.xml\", this.settingsXml(), `${CT_WML}settings+xml`);\n if (numbering) add(\"word/numbering.xml\", numbering, `${CT_WML}numbering+xml`);\n if (comments) {\n add(\"word/comments.xml\", comments.comments, `${CT_WML}comments+xml`);\n add(\"word/commentsExtended.xml\", comments.extended, `${CT_WML}commentsExtended+xml`);\n }\n if (people) add(\"word/people.xml\", people, `${CT_WML}people+xml`);\n parts.push({ name: \"word/_rels/document.xml.rels\", data: this.rels.xml() });\n for (const file of this.media) parts.push({ name: `word/media/${file.name}`, data: file.bytes });\n add(\"docProps/core.xml\", this.coreXml(now), \"application/vnd.openxmlformats-package.core-properties+xml\");\n const app = new XmlWriter();\n app.open(\"Properties\", { xmlns: \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" });\n app.leaf(\"Application\", undefined, \"@pixerate/editor\").close(\"Properties\");\n add(\"docProps/app.xml\", app.toString(), \"application/vnd.openxmlformats-officedocument.extended-properties+xml\");\n\n const root = new Relationships();\n root.add(REL.officeDocument, \"word/document.xml\");\n root.add(REL.core, \"docProps/core.xml\");\n root.add(REL.app, \"docProps/app.xml\");\n\n const types = new XmlWriter();\n types.open(\"Types\", { xmlns: \"http://schemas.openxmlformats.org/package/2006/content-types\" });\n types.empty(\"Default\", { Extension: \"rels\", ContentType: \"application/vnd.openxmlformats-package.relationships+xml\" });\n types.empty(\"Default\", { Extension: \"xml\", ContentType: \"application/xml\" });\n for (const ext of this.mediaTypes) types.empty(\"Default\", { Extension: ext, ContentType: DOCX_IMAGE_CONTENT_TYPES[ext] });\n for (const [name, contentType] of overrides) types.empty(\"Override\", { PartName: name, ContentType: contentType });\n types.close(\"Types\");\n return [\n { name: \"[Content_Types].xml\", data: types.toString() },\n { name: \"_rels/.rels\", data: root.xml() },\n ...parts,\n ];\n }\n}\n\nconst isInlineType = (type: string | undefined) =>\n type === \"hardBreak\" || type === \"image\" || type === \"mention\" || type === \"text\";\n\n/** Styles written when the document uses them but the registry has no definition. */\nconst EXTRA_STYLES: Record<string, StyleDefinition> = {\n BlockText: {\n id: \"BlockText\",\n name: \"Block Text\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n paragraph: { indentLeft: \"0.5in\", indentRight: \"0.5in\" },\n character: { italic: true },\n priority: 99,\n builtin: true,\n },\n ListParagraph: {\n id: \"ListParagraph\",\n name: \"List Paragraph\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n paragraph: { indentLeft: \"0.5in\" },\n priority: 34,\n quick: true,\n builtin: true,\n },\n Code: {\n id: \"Code\",\n name: \"Code\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n block: { type: \"codeBlock\" },\n character: { fontFamily: \"Consolas\", fontSize: \"10pt\" },\n paragraph: { spaceAfter: \"0pt\", lineHeight: \"1\" },\n priority: 30,\n },\n Hyperlink: {\n id: \"Hyperlink\",\n name: \"Hyperlink\",\n kind: \"character\",\n character: { color: \"#0563C1\", underline: true },\n priority: 99,\n hidden: true,\n builtin: true,\n },\n CommentReference: {\n id: \"CommentReference\",\n name: \"annotation reference\",\n kind: \"character\",\n character: { fontSize: \"8pt\" },\n priority: 99,\n hidden: true,\n builtin: true,\n },\n CommentText: {\n id: \"CommentText\",\n name: \"annotation text\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n character: { fontSize: \"10pt\" },\n priority: 99,\n hidden: true,\n builtin: true,\n },\n};\nfor (let level = 1; level <= 6; level++) {\n EXTRA_STYLES[`Heading${level}`] = {\n id: `Heading${level}`,\n name: `Heading ${level}`,\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n next: NORMAL_STYLE_ID,\n block: { type: \"heading\", attrs: { level } },\n character: { bold: true },\n priority: 9,\n quick: true,\n builtin: true,\n };\n}\n\nfunction resolveInput(\n input: DocxExportEditorLike | DocxJSONNode,\n options: DocxExportOptions,\n): { doc: DocxJSONNode; options: DocxExportOptions } {\n if (!isEditorLike(input)) return { doc: input, options };\n const storage = (input.storage ?? {}) as any;\n return {\n doc: input.getJSON(),\n options: {\n ...options,\n comments: options.comments !== undefined ? options.comments : (storage.comment?.store ?? null),\n styles: options.styles ?? storage.paragraphStyles?.registry ?? undefined,\n },\n };\n}\n\n/**\n * Builds the package parts of a DOCX file without zipping them (synchronous;\n * useful for inspection and tests). See {@link exportDocx}.\n */\nexport function createDocxParts(\n input: DocxExportEditorLike | DocxJSONNode,\n options: DocxExportOptions = {},\n): { parts: DocxPackagePart[]; report: DocxExportReport } {\n const resolved = resolveInput(input, options);\n const builder = new DocxBuilder(\n resolved.doc ?? { type: \"doc\", content: [] },\n resolved.options,\n threadsOf(resolved.options.comments),\n stylesOf(resolved.options.styles),\n );\n const parts = builder.parts(resolved.options.now?.() ?? new Date());\n return { parts, report: builder.report };\n}\n\n/**\n * Exports an editor (or its JSON) as a Word document. Resolves with the file\n * bytes and a report of what was dropped. Never fetches anything: remote\n * images are skipped (or linked with `remoteImages: \"link\"`).\n */\nexport async function exportDocx(\n input: DocxExportEditorLike | DocxJSONNode,\n options: DocxExportOptions = {},\n): Promise<DocxExportResult> {\n const { parts, report } = createDocxParts(input, options);\n const data = await writeZip(parts as ZipWriteEntry[], { compression: options.compression });\n return { data, report };\n}\n\n/** Like {@link exportDocx}, but resolves with a `Blob` of type {@link DOCX_EXPORT_MIME_TYPE}. */\nexport async function exportDocxBlob(\n input: DocxExportEditorLike | DocxJSONNode,\n options: DocxExportOptions = {},\n): Promise<{ blob: Blob; report: DocxExportReport }> {\n const { data, report } = await exportDocx(input, options);\n return { blob: new Blob([data as BlobPart], { type: DOCX_EXPORT_MIME_TYPE }), report };\n}\n","import {\n exportDocxBlob,\n type DocxExportEditorLike,\n type DocxExportOptions,\n type DocxExportReport,\n type DocxJSONNode,\n} from \"./docx\";\n\n/**\n * Saves a `Blob` as a file through a temporary `<a download>` link. Does\n * nothing (returns `false`) without a DOM.\n */\nexport function downloadBlob(blob: Blob, fileName: string): boolean {\n if (typeof document === \"undefined\" || typeof URL === \"undefined\" || typeof URL.createObjectURL !== \"function\") {\n return false;\n }\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n link.rel = \"noopener\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n link.remove();\n // Revoke after the click has been handled, or some browsers cancel the download.\n setTimeout(() => URL.revokeObjectURL(url), 0);\n return true;\n}\n\n/** `name.docx`, with characters that are invalid in file names replaced. */\nexport function docxFileName(name: string | undefined): string {\n const base = (name ?? \"\")\n .replace(/[\\u0000-\\u001f\\u007f<>:\"/\\\\|?*]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\.docx$/i, \"\")\n .slice(0, 120);\n return `${base || \"document\"}.docx`;\n}\n\nexport interface DocxExportState {\n isExporting: boolean;\n /** Last export error (cleared when a new export starts). */\n error: Error | null;\n /** Report of the most recent successful export. */\n lastReport: DocxExportReport | null;\n}\n\nexport interface DocxExportControllerOptions extends DocxExportOptions {\n /** Download file name (default: `title`, else `document`, plus `.docx`). */\n fileName?: string;\n /** Called after each successful export with its report. */\n onExport?: (report: DocxExportReport, blob: Blob) => void;\n /** Called when an export fails (the error is also kept in the state). */\n onError?: (error: Error) => void;\n}\n\n/**\n * Framework-agnostic state for an \"Export to Word\" button: tracks\n * `isExporting` / `error` / `lastReport` and downloads the `.docx` of the\n * editor returned by `getSource`. React's `useDocxExport` and Svelte's\n * `createDocxExport` wrap it.\n */\nexport class DocxExportController {\n private state: DocxExportState = { isExporting: false, error: null, lastReport: null };\n private readonly listeners = new Set<(state: DocxExportState) => void>();\n private pending = 0;\n\n constructor(\n private readonly getSource: () => DocxExportEditorLike | DocxJSONNode | null | undefined,\n private options: DocxExportControllerOptions = {},\n ) {}\n\n setOptions(options: DocxExportControllerOptions): void {\n this.options = options;\n }\n\n getState = (): DocxExportState => this.state;\n\n subscribe = (listener: (state: DocxExportState) => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n private setState(patch: Partial<DocxExportState>): void {\n this.state = { ...this.state, ...patch };\n this.listeners.forEach((listener) => listener(this.state));\n }\n\n /** Builds the `.docx` without downloading it. Resolves with `null` when there is no editor or it fails. */\n async exportBlob(): Promise<{ blob: Blob; report: DocxExportReport } | null> {\n const source = this.getSource();\n if (!source) return null;\n this.pending++;\n this.setState({ isExporting: true, error: null });\n try {\n const { fileName: _fileName, onExport: _onExport, onError: _onError, ...exportOptions } = this.options;\n const result = await exportDocxBlob(source, exportOptions);\n this.setState({ lastReport: result.report });\n this.options.onExport?.(result.report, result.blob);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.setState({ error: err });\n if (this.options.onError) this.options.onError(err);\n else console.error(\"[Editor] DOCX export failed:\", err);\n return null;\n } finally {\n this.pending--;\n if (this.pending === 0) this.setState({ isExporting: false });\n }\n }\n\n /** Exports and downloads the document. Resolves with the report, or `null`. */\n async download(fileName?: string): Promise<DocxExportReport | null> {\n const result = await this.exportBlob();\n if (!result) return null;\n downloadBlob(result.blob, docxFileName(fileName ?? this.options.fileName ?? this.options.title));\n return result.report;\n }\n}\n\nexport function createDocxExportController(\n getSource: () => DocxExportEditorLike | DocxJSONNode | null | undefined,\n options?: DocxExportControllerOptions,\n): DocxExportController {\n return new DocxExportController(getSource, options);\n}\n"],"mappings":"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","names":["attrs","format","document"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  escapeHtml,
3
3
  sanitizeHtml
4
- } from "./chunk-ECCCYKGL.js";
4
+ } from "./chunk-JOIREKL7.js";
5
5
 
6
6
  // src/serializers/html.ts
7
7
  var DROP_WITH_CONTENT_REGEX = /<(script|style|template|noscript|iframe|object|embed|head|title|svg|math|textarea|select|button)\b[^>]*>[\s\S]*?<\/\1\s*>/gi;
@@ -296,4 +296,4 @@ export {
296
296
  getClipboardData,
297
297
  readRichClipboard
298
298
  };
299
- //# sourceMappingURL=chunk-QGYDWPRM.js.map
299
+ //# sourceMappingURL=chunk-MHEPLBFB.js.map