@arbidocs/blocks 0.4.157 → 0.4.159

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 (127) hide show
  1. package/dist/{ConnectedNativeDocxComparison-S25BPUH5.cjs → ConnectedNativeDocxComparison-R6RU5TZE.cjs} +8 -7
  2. package/dist/{ConnectedNativeDocxComparison-S25BPUH5.cjs.map → ConnectedNativeDocxComparison-R6RU5TZE.cjs.map} +1 -1
  3. package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js → ConnectedNativeDocxComparison-XMZ5KLD4.js} +7 -6
  4. package/dist/{ConnectedNativeDocxComparison-2PLOOXSH.js.map → ConnectedNativeDocxComparison-XMZ5KLD4.js.map} +1 -1
  5. package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs → ConnectedNativeDocxEditor-LBATSM3M.cjs} +7 -6
  6. package/dist/{ConnectedNativeDocxEditor-YA4HWLY4.cjs.map → ConnectedNativeDocxEditor-LBATSM3M.cjs.map} +1 -1
  7. package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js → ConnectedNativeDocxEditor-NGUK2AX6.js} +5 -4
  8. package/dist/{ConnectedNativeDocxEditor-JJAGMHZC.js.map → ConnectedNativeDocxEditor-NGUK2AX6.js.map} +1 -1
  9. package/dist/{ConnectedStreamedWordArtifact-EXYZAU4Y.cjs → ConnectedStreamedWordArtifact-CWFR6A37.cjs} +8 -7
  10. package/dist/ConnectedStreamedWordArtifact-CWFR6A37.cjs.map +1 -0
  11. package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js → ConnectedStreamedWordArtifact-IXRJ7MUE.js} +7 -6
  12. package/dist/{ConnectedStreamedWordArtifact-YAAXY5KY.js.map → ConnectedStreamedWordArtifact-IXRJ7MUE.js.map} +1 -1
  13. package/dist/{NativeDocxEditor-M3I776GD.cjs → NativeDocxEditor-T2PJIZMU.cjs} +9 -7
  14. package/dist/{NativeDocxEditor-M3I776GD.cjs.map → NativeDocxEditor-T2PJIZMU.cjs.map} +1 -1
  15. package/dist/{NativeDocxEditor-JBQMH3MP.js → NativeDocxEditor-TBTBD6TC.js} +5 -3
  16. package/dist/{NativeDocxEditor-JBQMH3MP.js.map → NativeDocxEditor-TBTBD6TC.js.map} +1 -1
  17. package/dist/{WorkspaceTableView-5OWX53R5.js → WorkspaceTableView-DWUE4VQF.js} +19 -9
  18. package/dist/WorkspaceTableView-DWUE4VQF.js.map +1 -0
  19. package/dist/{WorkspaceTableView-ZFMAYHUD.cjs → WorkspaceTableView-EYLEUZZT.cjs} +21 -11
  20. package/dist/WorkspaceTableView-EYLEUZZT.cjs.map +1 -0
  21. package/dist/{chunk-IJEISII2.cjs → chunk-2BHDRVVL.cjs} +17 -7
  22. package/dist/chunk-2BHDRVVL.cjs.map +1 -0
  23. package/dist/chunk-2R3GGNPA.js +151 -0
  24. package/dist/chunk-2R3GGNPA.js.map +1 -0
  25. package/dist/{chunk-F3EZDBDJ.js → chunk-3OCNUKGX.js} +4 -4
  26. package/dist/{chunk-F3EZDBDJ.js.map → chunk-3OCNUKGX.js.map} +1 -1
  27. package/dist/{chunk-D3WFIFRY.cjs → chunk-3VW7ZXQ6.cjs} +211 -5
  28. package/dist/chunk-3VW7ZXQ6.cjs.map +1 -0
  29. package/dist/{chunk-JSQEAPTC.cjs → chunk-4GITK3Q5.cjs} +398 -75
  30. package/dist/chunk-4GITK3Q5.cjs.map +1 -0
  31. package/dist/{chunk-2CWM2CFZ.js → chunk-7UENVUA6.js} +4 -4
  32. package/dist/{chunk-2CWM2CFZ.js.map → chunk-7UENVUA6.js.map} +1 -1
  33. package/dist/{chunk-EWCJXUBP.js → chunk-AVXRXPII.js} +3 -3
  34. package/dist/{chunk-EWCJXUBP.js.map → chunk-AVXRXPII.js.map} +1 -1
  35. package/dist/{chunk-7IRSCMNK.js → chunk-BGXWPVHR.js} +3 -3
  36. package/dist/{chunk-7IRSCMNK.js.map → chunk-BGXWPVHR.js.map} +1 -1
  37. package/dist/chunk-DAN7EJ4O.js +482 -0
  38. package/dist/chunk-DAN7EJ4O.js.map +1 -0
  39. package/dist/chunk-E4H5H2C3.cjs +18 -0
  40. package/dist/{chunk-OTU5KGQ6.cjs.map → chunk-E4H5H2C3.cjs.map} +1 -1
  41. package/dist/{chunk-VY4UFXTM.cjs → chunk-ETJFC6MO.cjs} +4 -4
  42. package/dist/{chunk-VY4UFXTM.cjs.map → chunk-ETJFC6MO.cjs.map} +1 -1
  43. package/dist/{chunk-TQIY2SVY.cjs → chunk-GFVIFXWT.cjs} +5 -5
  44. package/dist/{chunk-TQIY2SVY.cjs.map → chunk-GFVIFXWT.cjs.map} +1 -1
  45. package/dist/chunk-JPWPR6QU.cjs +485 -0
  46. package/dist/chunk-JPWPR6QU.cjs.map +1 -0
  47. package/dist/{chunk-KQYPP72K.js → chunk-JTJCCL2E.js} +212 -9
  48. package/dist/chunk-JTJCCL2E.js.map +1 -0
  49. package/dist/{chunk-PGOSIJ2I.js → chunk-KFMRBZQK.js} +15 -5
  50. package/dist/chunk-KFMRBZQK.js.map +1 -0
  51. package/dist/chunk-NMZI3K6R.cjs +159 -0
  52. package/dist/chunk-NMZI3K6R.cjs.map +1 -0
  53. package/dist/{chunk-53RCZPMR.cjs → chunk-P2YM67Y5.cjs} +5 -5
  54. package/dist/{chunk-53RCZPMR.cjs.map → chunk-P2YM67Y5.cjs.map} +1 -1
  55. package/dist/chunk-Q2XGM372.cjs +18 -0
  56. package/dist/{chunk-S74QMZVZ.cjs.map → chunk-Q2XGM372.cjs.map} +1 -1
  57. package/dist/{chunk-7HHYMDPE.js → chunk-RATEAOKT.js} +3 -3
  58. package/dist/{chunk-7HHYMDPE.js.map → chunk-RATEAOKT.js.map} +1 -1
  59. package/dist/{chunk-SN2GZ4ZM.cjs → chunk-TQUYWUEE.cjs} +10 -156
  60. package/dist/chunk-TQUYWUEE.cjs.map +1 -0
  61. package/dist/{chunk-ONTUMV74.js → chunk-XER3JLC7.js} +398 -78
  62. package/dist/chunk-XER3JLC7.js.map +1 -0
  63. package/dist/{chunk-HP2C4MD3.js → chunk-ZDOKJD44.js} +4 -143
  64. package/dist/chunk-ZDOKJD44.js.map +1 -0
  65. package/dist/connect/docx.cjs +11 -10
  66. package/dist/connect/docx.js +7 -6
  67. package/dist/connect/index.cjs +406 -384
  68. package/dist/connect/index.cjs.map +1 -1
  69. package/dist/connect/index.js +69 -47
  70. package/dist/connect/index.js.map +1 -1
  71. package/dist/connect/viewer.cjs +41 -20
  72. package/dist/connect/viewer.cjs.map +1 -1
  73. package/dist/connect/viewer.js +29 -8
  74. package/dist/connect/viewer.js.map +1 -1
  75. package/dist/connection/viewer/ViewerPdfPane.d.ts +7 -1
  76. package/dist/connection/workspace-list/ConnectedWorkspaceList.d.ts +4 -2
  77. package/dist/connection/workspace-list/WorkspaceCardsView.d.ts +3 -2
  78. package/dist/connection/workspace-list/WorkspaceTableView.d.ts +3 -2
  79. package/dist/connection/workspace-list/index.d.ts +1 -1
  80. package/dist/connection/workspace-list/useConnectedWorkspaceList.d.ts +19 -0
  81. package/dist/connection/workspace-list/workspaceTable.d.ts +3 -1
  82. package/dist/connection/workspace-settings/ConnectedWorkspaceSettings.d.ts +3 -1
  83. package/dist/document-tools/AdoptSignatureDialog.d.ts +39 -4
  84. package/dist/document-tools/PlaceMySignatureButton.d.ts +16 -0
  85. package/dist/document-tools/SavedSignatureSettings.d.ts +10 -0
  86. package/dist/document-tools/index.cjs +37 -22
  87. package/dist/document-tools/index.d.ts +2 -0
  88. package/dist/document-tools/index.js +5 -2
  89. package/dist/document-tools/viewer/AnnotatedPdfViewer.d.ts +10 -1
  90. package/dist/document-tools/viewer/SignatureRequestEditor.d.ts +7 -4
  91. package/dist/document-tools/viewer/index.cjs +184 -18
  92. package/dist/document-tools/viewer/index.cjs.map +1 -1
  93. package/dist/document-tools/viewer/index.js +184 -18
  94. package/dist/document-tools/viewer/index.js.map +1 -1
  95. package/dist/docx/NativeDocxEditor.d.ts +5 -0
  96. package/dist/docx/index.cjs +61 -47
  97. package/dist/docx/index.d.ts +1 -0
  98. package/dist/docx/index.js +5 -3
  99. package/dist/docx/signatures/SignatureFields.d.ts +50 -0
  100. package/dist/settings/index.cjs +183 -182
  101. package/dist/settings/index.js +2 -1
  102. package/node_modules/@arbidocs/coedit/dist/commands.cjs +109 -16
  103. package/node_modules/@arbidocs/coedit/dist/commands.cjs.map +1 -1
  104. package/node_modules/@arbidocs/coedit/dist/commands.d.cts +84 -1
  105. package/node_modules/@arbidocs/coedit/dist/commands.d.ts +84 -1
  106. package/node_modules/@arbidocs/coedit/dist/commands.js +99 -17
  107. package/node_modules/@arbidocs/coedit/dist/commands.js.map +1 -1
  108. package/node_modules/@arbidocs/coedit/package.json +1 -1
  109. package/package.json +5 -5
  110. package/src/docx/styles.css +50 -0
  111. package/dist/ConnectedStreamedWordArtifact-EXYZAU4Y.cjs.map +0 -1
  112. package/dist/WorkspaceTableView-5OWX53R5.js.map +0 -1
  113. package/dist/WorkspaceTableView-ZFMAYHUD.cjs.map +0 -1
  114. package/dist/chunk-6MG62I5B.cjs +0 -272
  115. package/dist/chunk-6MG62I5B.cjs.map +0 -1
  116. package/dist/chunk-D3WFIFRY.cjs.map +0 -1
  117. package/dist/chunk-EQB3WELX.js +0 -269
  118. package/dist/chunk-EQB3WELX.js.map +0 -1
  119. package/dist/chunk-HP2C4MD3.js.map +0 -1
  120. package/dist/chunk-IJEISII2.cjs.map +0 -1
  121. package/dist/chunk-JSQEAPTC.cjs.map +0 -1
  122. package/dist/chunk-KQYPP72K.js.map +0 -1
  123. package/dist/chunk-ONTUMV74.js.map +0 -1
  124. package/dist/chunk-OTU5KGQ6.cjs +0 -18
  125. package/dist/chunk-PGOSIJ2I.js.map +0 -1
  126. package/dist/chunk-S74QMZVZ.cjs +0 -18
  127. package/dist/chunk-SN2GZ4ZM.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/commands/read.ts","../src/commands/numbering.ts","../src/commands/ooxml.ts","../src/commands/references.ts","../src/commands/undo.ts","../src/commands/terms.ts","../src/template/xml.ts","../src/template/pkg.ts","../src/template/track.ts","../src/commands/fragment.ts","../src/commands/definitions.ts","../src/commands/everywhere.ts","../src/commands/index.ts"],"names":["child","attr","serialize","strToU8","zipSync","root"],"mappings":"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","file":"commands.js","sourcesContent":["/**\n * The read side of the Word-editor commands: a document's paragraphs as the commands see them\n * (text in the engine's offset vocabulary, bookmarks, internal links, fields, note references),\n * read from the engine's OOXML tree. The same tree comes from a live editor\n * (`surface.session.part().root`) or from document bytes (`openHeadlessDocument`), so the toolbar\n * and ARBI's headless tools read a document the same way.\n */\n\n/** Character style of an inserted term: a dotted underline, so a defined term reads as one. */\nexport const DEFINED_TERM_STYLE = 'DefinedTerm'\n\n/** Character style of a cross-reference: a muted blue with a dotted underline (Word's name). */\nexport const CROSS_REFERENCE_STYLE = 'CrossReference'\n/** Character style of a cross-reference whose target is gone: its last text, flagged. */\nexport const BROKEN_CROSS_REFERENCE_STYLE = 'CrossReferenceBroken'\n\n/** A position: a paragraph (the engine's node id) and a UTF-16 offset into its text. */\nexport interface DocPoint {\n paragraphId: string\n offset: number\n}\n\n/** An internal link in a paragraph. */\nexport interface DocLink {\n anchor: string\n text: string\n /** Where its text starts in the paragraph's text. */\n offset?: number\n}\n\n/** A footnote or endnote reference: one character of the paragraph, as the engine counts it. */\nexport interface DocNote {\n offset: number\n kind: 'footnote' | 'endnote'\n /** `w:id` of the note. */\n id: string\n}\n\n/** One paragraph, in document order. */\nexport interface DocParagraph {\n id: string\n /** `w14:paraId`, the id that is the same in every replica of a collaboration room. */\n paraId?: string\n text: string\n /** Styled as a heading (a `Heading n` style or an outline level). */\n heading: boolean\n styleId?: string\n /** A paragraph of the body itself, not inside a table. */\n topLevel: boolean\n /** Names of the bookmarks that start in it. */\n bookmarks: string[]\n /** Its internal links (`w:hyperlink w:anchor`). */\n links: DocLink[]\n /** Its complex fields: where each sits (its one-character offset), its instruction and result. */\n fields?: DocField[]\n /** Its runs in a watched character style (a broken cross-reference's mark), with their text. */\n marks?: DocMark[]\n /** Its footnote and endnote references. */\n notes?: DocNote[]\n /** Its pending tracked insertions and deletions, in document order. */\n revisions?: DocRevision[]\n}\n\n/**\n * A pending tracked change in a paragraph. `text` leaves deleted text out, while the engine's\n * offsets (a {@link DocPoint}) count it: an insertion covers `length` characters of `text` from\n * `offset`; a deletion's `text` sits at `offset`, between the characters of `text` around it.\n */\nexport interface DocRevision {\n kind: 'insert' | 'delete'\n offset: number\n length: number\n author?: string\n /** A deletion's text. */\n text?: string\n}\n\n/**\n * Where a position in a paragraph's `text` is in the engine's offsets, which count pending\n * deleted text. `pastDeletions`: a position with deleted text right at it is placed after that\n * text rather than before it.\n */\nexport function engineOffset(\n paragraph: DocParagraph,\n offset: number,\n pastDeletions = false\n): number {\n let out = offset\n for (const r of paragraph.revisions ?? [])\n if (r.kind === 'delete' && (r.offset < offset || (pastDeletions && r.offset === offset)))\n out += r.length\n return out\n}\n\n/** A paragraph's length in the engine's offsets: its text and its pending deleted text. */\nexport const engineLength = (paragraph: DocParagraph) =>\n engineOffset(paragraph, paragraph.text.length, true)\n\n/** A stretch of a paragraph's text in a watched character style. */\nexport interface DocMark {\n styleId: string\n offset: number\n text: string\n}\n\n/** Character styles whose runs a paragraph read reports as marks. */\nexport const WATCHED_STYLES = new Set([BROKEN_CROSS_REFERENCE_STYLE])\n\n/** A complex field of a paragraph. */\nexport interface DocField {\n offset: number\n instruction: string\n result: string\n}\n\nexport type OoxmlNodeLike = {\n id: string\n kind: string\n localName?: string\n value?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly OoxmlNodeLike[]\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** How a field (or a note reference) counts in a paragraph's text (the engine's model vocabulary). */\nexport const FIELD_ATOM = '\\uFFFC'\n\n/** A heading style id in any of the spellings Word localises it to (`Heading1`, `berschrift1`…). */\nconst HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\\s*\\d/i\n\n/** The paragraphs of a part's body, read from the engine's OOXML tree. */\nexport function readParagraphs(root: OoxmlNodeLike): DocParagraph[] {\n const out: DocParagraph[] = []\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n const visit = (node: OoxmlNodeLike, topLevel: boolean, pending: string[]) => {\n for (const child of node.children ?? []) {\n if (child.kind === 'paragraph') {\n out.push(readParagraph(child, topLevel, pending.splice(0)))\n } else if (child.localName === 'bookmarkStart') {\n // A bookmark between paragraphs belongs to the next one.\n const name = attr(child, 'name')\n if (name) pending.push(name)\n } else if (\n child.localName === 'tbl' ||\n child.localName === 'tr' ||\n child.localName === 'tc'\n ) {\n visit(child, false, pending)\n } else if (child.localName === 'sdt' || child.localName === 'sdtContent') {\n visit(child, topLevel, pending)\n }\n }\n }\n visit(body, true, [])\n return out\n}\n\nfunction readParagraph(node: OoxmlNodeLike, topLevel: boolean, bookmarks: string[]): DocParagraph {\n let text = ''\n const links: DocLink[] = []\n let styleId: string | undefined\n let outline = false\n // A field reads as ONE character (U+FFFC), as the engine counts offsets: its instruction and\n // its cached result are not text of the paragraph.\n let fieldDepth = 0\n const marks: DocMark[] = []\n /** The watched style of the run being walked, if any. */\n let runStyle: string | undefined\n const fields: DocField[] = []\n const notes: DocNote[] = []\n const revisions: DocRevision[] = []\n let current: (DocField & { inResult: boolean }) | null = null\n const field = (c: OoxmlNodeLike) => {\n const type = attr(c, 'fldCharType')\n if (type === 'begin') {\n if (fieldDepth === 0) {\n current = { offset: text.length, instruction: '', result: '', inResult: false }\n text += FIELD_ATOM\n }\n fieldDepth++\n } else if (type === 'separate' && fieldDepth === 1 && current) current.inResult = true\n else if (type === 'end') {\n fieldDepth = Math.max(0, fieldDepth - 1)\n if (fieldDepth === 0 && current) {\n const { offset, instruction, result } = current\n fields.push({ offset, instruction: instruction.trim(), result })\n current = null\n }\n }\n }\n const walk = (n: OoxmlNodeLike, link?: DocLink) => {\n for (const c of n.children ?? []) {\n if (c.localName === 'fldChar') {\n field(c)\n continue\n }\n if (c.localName === 'fldSimple') {\n if (fieldDepth === 0) text += FIELD_ATOM\n continue\n }\n if (c.localName === 'instrText') {\n if (fieldDepth === 1 && current)\n (current as DocField).instruction += (c.children ?? []).map((t) => t.value ?? '').join('')\n continue\n }\n if (c.kind === 'paragraphProperties' || c.localName === 'pPr') {\n for (const p of c.children ?? []) {\n if (p.localName === 'pStyle') styleId = attr(p, 'val')\n if (p.localName === 'outlineLvl' && Number(attr(p, 'val')) < 9) outline = true\n }\n continue\n }\n if (c.localName === 'del') {\n // Deleted text is not part of the paragraph's text; where it sits is (see DocRevision).\n const deleted = deletedText(c)\n if (deleted && fieldDepth === 0)\n revisions.push({\n kind: 'delete',\n offset: text.length,\n length: deleted.length,\n author: attr(c, 'author'),\n text: deleted,\n })\n continue\n }\n if (c.localName === 'ins') {\n const start = text.length\n walk(c, link)\n if (text.length > start && fieldDepth === 0)\n revisions.push({\n kind: 'insert',\n offset: start,\n length: text.length - start,\n author: attr(c, 'author'),\n })\n continue\n }\n if (c.localName === 'delText' || c.localName === 'rPr') continue\n if (c.localName === 'r') {\n const rStyle = c.children\n ?.find((x) => x.localName === 'rPr')\n ?.children?.find((x) => x.localName === 'rStyle')\n const watched = rStyle && attr(rStyle, 'val')\n runStyle = watched && WATCHED_STYLES.has(watched) ? watched : undefined\n walk(c, link)\n runStyle = undefined\n continue\n }\n if (\n (c.localName === 'footnoteReference' || c.localName === 'endnoteReference') &&\n fieldDepth === 0\n ) {\n notes.push({\n offset: text.length,\n kind: c.localName === 'footnoteReference' ? 'footnote' : 'endnote',\n id: attr(c, 'id') ?? '',\n })\n text += FIELD_ATOM\n continue\n }\n if (c.localName === 'bookmarkStart') {\n const name = attr(c, 'name')\n if (name) bookmarks.push(name)\n continue\n }\n if (c.localName === 'hyperlink') {\n const anchor = attr(c, 'anchor')\n const next = anchor ? { anchor, text: '', offset: text.length } : undefined\n walk(c, next ?? link)\n if (next) links.push(next)\n continue\n }\n if (c.kind === 'textValue') {\n if (fieldDepth > 0) {\n const open = current as (DocField & { inResult: boolean }) | null\n if (fieldDepth === 1 && open?.inResult) open.result += c.value ?? ''\n continue\n }\n if (runStyle && c.value) {\n const last = marks[marks.length - 1]\n if (last && last.styleId === runStyle && last.offset + last.text.length === text.length)\n last.text += c.value\n else marks.push({ styleId: runStyle, offset: text.length, text: c.value })\n }\n text += c.value ?? ''\n if (link) link.text += c.value ?? ''\n continue\n }\n if (c.localName === 'tab' && fieldDepth === 0) text += '\\t'\n walk(c, link)\n }\n }\n walk(node)\n const paraId = attr(node, 'paraId')\n return {\n id: node.id,\n ...(paraId ? { paraId } : {}),\n text,\n heading: outline || (!!styleId && HEADING_STYLE.test(styleId)),\n styleId,\n topLevel,\n bookmarks,\n links,\n ...(fields.length ? { fields } : {}),\n ...(marks.length ? { marks } : {}),\n ...(notes.length ? { notes } : {}),\n ...(revisions.length ? { revisions } : {}),\n }\n}\n\n/** The text a tracked deletion removes (its `w:delText`; a deleted tab counts as one character). */\nfunction deletedText(node: OoxmlNodeLike): string {\n let out = ''\n for (const c of node.children ?? []) {\n if (c.localName === 'instrText') continue\n if (c.localName === 'delText') out += (c.children ?? []).map((t) => t.value ?? '').join('')\n else if (c.localName === 'tab') out += '\\t'\n else if (c.localName !== 'rPr') out += deletedText(c)\n }\n return out\n}\n\n/** Style id to style name (`Heading1` → `heading 1`), from a styles part's tree. */\nexport function styleNames(root: OoxmlNodeLike | null | undefined): Map<string, string> {\n const names = new Map<string, string>()\n for (const style of root?.children ?? []) {\n if (style.localName !== 'style') continue\n const id = attr(style, 'styleId')\n const name = style.children?.find((c) => c.localName === 'name')\n if (id) names.set(id, (name && attr(name, 'val')) || id)\n }\n return names\n}\n","/**\n * Cross-reference targets: the document's numbered paragraphs (clauses, sub-clauses, numbered\n * captions) and its headings, with the number Word's `REF \\r` shows for each.\n *\n * The number is what the editor computes for a `REF … \\r` field — and it has to be exactly that,\n * because the engine shows a field's live value only while the field's cached result matches what\n * it computes (otherwise it keeps the cached text for good). So this mirrors the engine: the\n * paragraph's own list level, preceded by each higher level whose number its level text does not\n * already show (`%1.%2` already shows level 1; `(%3)` does not show `2.1`), and one trailing\n * period dropped (`2.` reads `2`).\n */\n\nimport type { DocParagraph, OoxmlNodeLike } from './read'\nimport {\n buildNumberingIndex,\n buildStyleCascadeTable,\n resolveNumberingLevel,\n resolveStoryListItems,\n withNumberingStyleLinks,\n} from '@docx-editor.dev/core/layout'\n\n/** A paragraph's resolved list numbering (the engine's list item). */\nexport interface ListItemInfo {\n numId: string\n ilvl: number\n markerText: string\n numFmt: string\n}\n\n/** A list level's definition: its level text (`%1.%2`) and number format. */\nexport interface LevelInfo {\n lvlText: string\n numFmt: string\n}\n\nexport type LevelOf = (numId: string, ilvl: number) => LevelInfo | null\n\nconst numbers = (level: { numFmt: string; lvlText?: string; markerText?: string } | null) =>\n !!level &&\n level.numFmt !== 'bullet' &&\n level.numFmt !== 'none' &&\n (level.lvlText ?? level.markerText ?? '').length > 0\n\n/**\n * The number `REF \\r` shows for a paragraph, or null when it is not numbered. `order` is every\n * paragraph id in document order (for the markers of the levels above it).\n */\nexport function paragraphNumber(\n order: readonly string[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf,\n paragraphId: string\n): string | null {\n const item = items.get(paragraphId)\n if (!item || !numbers(item)) return null\n const at = order.indexOf(paragraphId)\n /** The marker the nearest paragraph at `ilvl` of this list had, up to the target. */\n const markerAt = (ilvl: number): string | null => {\n if (ilvl === item.ilvl) return item.markerText\n for (let i = at - 1; i >= 0; i--) {\n const other = items.get(order[i])\n if (other && other.numId === item.numId && other.ilvl === ilvl) return other.markerText\n }\n return null\n }\n const chain: number[] = []\n const texts: string[] = []\n for (let u = item.ilvl; u >= 0; u--) {\n const level = levelOf(item.numId, u)\n if (!level || !numbers(level)) continue\n if (u !== item.ilvl && texts.some((t) => t.includes(`%${u + 1}`))) continue\n chain.push(u)\n texts.push(level.lvlText)\n }\n const value = chain\n .reverse()\n .map((u) => markerAt(u) ?? '')\n .join('')\n if (!value) return null\n return value.length > 1 && value.endsWith('.') ? value.slice(0, -1) : value\n}\n\n/** One place a cross-reference can point at. */\nexport interface CrossReferenceTarget {\n paragraphId: string\n /** A numbered paragraph (clause, sub-clause, caption) or an unnumbered heading. */\n kind: 'numbered' | 'heading'\n /** What `REF \\r` shows (`8.2`), or null for an unnumbered heading. */\n number: string | null\n /** The paragraph's list marker as painted (`8.2`, `(a)`), or empty. */\n marker: string\n /** The paragraph's text (without its marker). */\n text: string\n heading: boolean\n /** Its list level (0 for a top-level clause), or 0 for a heading. */\n level: number\n}\n\n/** Every numbered paragraph and every heading, in document order. */\nexport function listTargets(\n paragraphs: readonly DocParagraph[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf\n): CrossReferenceTarget[] {\n const order = paragraphs.map((p) => p.id)\n const out: CrossReferenceTarget[] = []\n for (const p of paragraphs) {\n const text = p.text.replace(//g, '').trim()\n if (!text) continue\n const number = paragraphNumber(order, items, levelOf, p.id)\n const item = items.get(p.id)\n if (number !== null)\n out.push({\n paragraphId: p.id,\n kind: 'numbered',\n number,\n marker: item?.markerText ?? '',\n text,\n heading: p.heading,\n level: item?.ilvl ?? 0,\n })\n else if (p.heading)\n out.push({\n paragraphId: p.id,\n kind: 'heading',\n number: null,\n marker: '',\n text,\n heading: true,\n level: 0,\n })\n }\n return out\n}\n\n/** Targets whose number or text contains the query (case-insensitive). */\nexport function filterTargets(\n targets: readonly CrossReferenceTarget[],\n query: string\n): CrossReferenceTarget[] {\n const q = query.trim().toLowerCase()\n if (!q) return [...targets]\n return targets.filter(\n (t) => (t.number ?? '').toLowerCase().startsWith(q) || t.text.toLowerCase().includes(q)\n )\n}\n\n/** What the engine's numbering needs of a document: its parts' trees. */\nexport interface NumberingSource {\n /** The main document part's root. */\n root(): OoxmlNodeLike\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A document's list numbering as the engine resolves it. */\nexport interface DocumentNumbering {\n /** Each numbered paragraph's list item, by paragraph (node) id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/**\n * The numbering of a document, as the editor paints it: from a live editor's session or from a\n * headless document view alike.\n */\nexport function documentNumbering(source: NumberingSource): DocumentNumbering {\n type Index = ReturnType<typeof buildNumberingIndex>\n type Cascade = ReturnType<typeof buildStyleCascadeTable>\n let numbering: Index | undefined\n let cascade: Cascade | undefined\n const index = () => {\n if (!numbering) {\n cascade = buildStyleCascadeTable(\n source.stylesRoot() as Parameters<typeof buildStyleCascadeTable>[0],\n undefined,\n source.settingsRoot() as Parameters<typeof buildStyleCascadeTable>[2]\n )\n numbering = withNumberingStyleLinks(\n buildNumberingIndex(source.numberingRoot() as Parameters<typeof buildNumberingIndex>[0]),\n cascade\n )\n }\n return numbering\n }\n return {\n listItems: () => {\n const body = source.root().children?.find((n) => n.kind === 'body')\n const items = resolveStoryListItems(\n (body?.children ?? []) as unknown as Parameters<typeof resolveStoryListItems>[0],\n index(),\n cascade\n )\n const out = new Map<string, ListItemInfo>()\n for (const [id, item] of items)\n out.set(id, {\n numId: item.numId,\n ilvl: item.ilvl,\n markerText: item.markerText,\n numFmt: item.numFmt,\n })\n return out\n },\n levelOf: (numId, ilvl) => {\n const level = resolveNumberingLevel(index(), numId, ilvl)?.level\n return level ? { lvlText: level.lvlText, numFmt: level.numFmt } : null\n },\n }\n}\n","/**\n * The minimal WordprocessingML a command writes: escaped text, a `word/document.xml` and\n * `word/styles.xml` around it, and the `.docx` package that carries them (a paste fragment).\n */\n\nimport { strToU8, zipSync } from 'fflate'\n\nexport const W_NAMESPACES =\n 'xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"'\n\n// Text that is not allowed in XML 1.0 at all (control characters) is dropped, not escaped.\n// eslint-disable-next-line no-control-regex\nconst INVALID_XML = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F￾￿]/g\n\n/** Text as XML character data or an attribute value. */\nexport const esc = (text: string) =>\n text\n .replace(INVALID_XML, '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n\n/** A `word/document.xml` around body content (paragraphs, tables, then the section). */\nexport const documentXml = (body: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document ${W_NAMESPACES}><w:body>${body}</w:body></w:document>`\n\n/** `word/styles.xml` holding the given style definitions. */\nexport const stylesXml = (defaults: string, styles: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">${defaults}${styles}</w:styles>`\n\nconst CONTENT_TYPES = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/><Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/><Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/></Types>`\n\nconst ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/></Relationships>`\n\n/** `word/_rels/document.xml.rels`: the styles part, then any further relationships given. */\nconst documentRels = (more = '') => `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>${more}</Relationships>`\n\n/** A relationship to an external hyperlink target, for `w:hyperlink r:id`. */\nexport const hyperlinkRelationship = (id: string, url: string) =>\n `<Relationship Id=\"${esc(id)}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${esc(url)}\" TargetMode=\"External\"/>`\n\nconst coreXml = (\n title: string,\n at: string\n) => `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><dc:title>${esc(\n title\n)}</dc:title><dcterms:created xsi:type=\"dcterms:W3CDTF\">${at}</dcterms:created><dcterms:modified xsi:type=\"dcterms:W3CDTF\">${at}</dcterms:modified></cp:coreProperties>`\n\n/** The minimal `.docx` package: a document, its styles, and its title and time. */\nexport function docxPackage(parts: {\n document: string\n styles: string\n title: string\n /** ISO time; default now. */\n at?: string\n /** Further `word/document.xml` relationships (e.g. {@link hyperlinkRelationship}). */\n relationships?: string\n}): Uint8Array {\n const at = new Date(parts.at ?? Date.now()).toISOString().replace(/\\.\\d{3}Z$/, 'Z')\n return zipSync({\n '[Content_Types].xml': strToU8(CONTENT_TYPES),\n '_rels/.rels': strToU8(ROOT_RELS),\n 'docProps/core.xml': strToU8(coreXml(parts.title, at)),\n 'word/document.xml': strToU8(parts.document),\n 'word/styles.xml': strToU8(parts.styles),\n 'word/_rels/document.xml.rels': strToU8(documentRels(parts.relationships)),\n })\n}\n","/**\n * Cross-references, the way Word does them, and their status.\n *\n * Within the document: a hidden `_Ref…` bookmark on the target paragraph and a `REF` field at the\n * caret — `REF _Ref123 \\\\r \\\\h` for a numbered paragraph (Word's Cross-reference › Numbered item ›\n * Paragraph number), `REF _Ref123 \\\\h` for a heading's text. The field's cached result is the value\n * the editor computes, so it updates live when the clauses are renumbered, and Word updates it\n * with the document's other fields.\n *\n * To another document: a hyperlink with the reference text (\"SPA, clause 8.2\"), aimed at the app\n * address of that document's passage (so it works from Word too), with a screen tip saying so.\n *\n * Every cross-reference reads as current, stale (a clause renumbered, a heading reworded) or broken\n * (the target is gone).\n */\n\nimport {\n BROKEN_CROSS_REFERENCE_STYLE,\n CROSS_REFERENCE_STYLE,\n FIELD_ATOM,\n type DocParagraph,\n type DocPoint,\n type OoxmlNodeLike,\n} from './read'\nimport {\n paragraphNumber,\n type CrossReferenceTarget,\n type LevelOf,\n type ListItemInfo,\n} from './numbering'\nimport { esc, hyperlinkRelationship } from './ooxml'\nimport type { ReferencesPort } from './port'\n\n/** Prefix of Word's hidden cross-reference bookmarks. */\nexport const REF_BOOKMARK_PREFIX = '_Ref'\n\nexport type CrossReferenceMode = 'number' | 'text'\n\nconst REF_FIELD = /^REF\\s+(\\S+)((?:\\s+\\\\[A-Za-z*]+(?:\\s+MERGEFORMAT)?)*)\\s*$/i\n\n/** What reading cross-references needs of a document. */\nexport interface ReferencesReader {\n paragraphs(): DocParagraph[]\n /** Each numbered paragraph's list item, by paragraph id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/** One `REF` field to a `_Ref` bookmark. */\nexport interface CrossReference {\n paragraphId: string\n offset: number\n instruction: string\n bookmark: string\n mode: CrossReferenceMode\n /** The field's cached result (what it shows). */\n cached: string\n /** The paragraph the bookmark is in, or null when it is gone (the reference is broken). */\n target: string | null\n /** What the reference should show now, or null when that cannot be computed. */\n value: string | null\n}\n\n/** A `REF` field whose cached result no longer says what its target now is. */\nexport interface StaleReference {\n paragraphId: string\n offset: number\n instruction: string\n /** The current value, or null when the target is gone (the reference is broken). */\n value: string | null\n /** The field's cached result (what it last showed). */\n cached: string\n bookmark: string\n mode: CrossReferenceMode\n}\n\n/** A cross-reference whose target was deleted: its last text, marked in the Broken style. */\nexport interface BrokenReference {\n paragraphId: string\n offset: number\n text: string\n}\n\n/** Every cross-reference of the document, in document order. */\nexport function crossReferences(port: ReferencesReader): CrossReference[] {\n const paragraphs = port.paragraphs()\n if (!paragraphs.some((p) => p.fields?.length)) return []\n const items = port.listItems()\n const order = paragraphs.map((p) => p.id)\n const owner = new Map<string, string>()\n for (const p of paragraphs) for (const b of p.bookmarks) if (!owner.has(b)) owner.set(b, p.id)\n const out: CrossReference[] = []\n for (const p of paragraphs)\n for (const field of p.fields ?? []) {\n const match = REF_FIELD.exec(field.instruction)\n if (!match || !match[1].startsWith(REF_BOOKMARK_PREFIX)) continue\n const switches = match[2].toLowerCase()\n const mode: CrossReferenceMode = /\\\\[rwn]\\b/.test(switches) ? 'number' : 'text'\n const target = owner.get(match[1]) ?? null\n const value = !target\n ? null\n : mode === 'number'\n ? switches.includes('\\\\r')\n ? paragraphNumber(order, items, port.levelOf, target)\n : null\n : (paragraphs.find((x) => x.id === target)?.text ?? '').replace(//g, '').trim()\n out.push({\n paragraphId: p.id,\n offset: field.offset,\n instruction: field.instruction,\n bookmark: match[1],\n mode,\n cached: field.result,\n target,\n value,\n })\n }\n return out\n}\n\n/**\n * The cross-references whose cached result is out of date: a clause renumbered, a heading\n * reworded, or the target gone. The editor paints a field's live value only while its cached\n * result matches what it computes, so a stale cache shows the OLD number after the document is\n * reopened (and Word shows the cached result until its fields are updated).\n */\nexport function staleCrossReferences(port: ReferencesReader): StaleReference[] {\n return crossReferences(port)\n .filter((ref) => !ref.target || (ref.value && ref.value !== ref.cached.trim()))\n .map(({ paragraphId, offset, instruction, value, cached, bookmark, mode }) => ({\n paragraphId,\n offset,\n instruction,\n value,\n cached,\n bookmark,\n mode,\n }))\n}\n\n/** The broken cross-references marked in the document, in document order. */\nexport function brokenCrossReferences(\n port: Pick<ReferencesReader, 'paragraphs'>\n): BrokenReference[] {\n return port\n .paragraphs()\n .flatMap((p) =>\n (p.marks ?? [])\n .filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE)\n .map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))\n )\n}\n\n/** A new `_Ref` bookmark name: Word's shape (`_Ref` and nine digits), not yet in the document. */\nexport function newRefBookmark(taken: ReadonlySet<string>, random: () => number = Math.random) {\n for (;;) {\n const name = `${REF_BOOKMARK_PREFIX}${String(Math.floor(random() * 9e8) + 1e8)}`\n if (!taken.has(name)) return name\n }\n}\n\nconst styled = (style?: string) => (style ? `<w:rPr><w:rStyle w:val=\"${style}\"/></w:rPr>` : '')\nconst run = (text: string, style?: string) =>\n `<w:r>${styled(style)}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/**\n * A complex `REF` field with its cached result, every run in the Cross Reference style (Word gives\n * an updated result the formatting of the field's first run).\n */\nexport function refFieldXml(instruction: string, cached: string): string {\n const r = (inner: string) => `<w:r>${styled(CROSS_REFERENCE_STYLE)}${inner}</w:r>`\n return `${r('<w:fldChar w:fldCharType=\"begin\"/>')}${r(\n `<w:instrText xml:space=\"preserve\"> ${esc(instruction)} </w:instrText>`\n )}${r('<w:fldChar w:fldCharType=\"separate\"/>')}${run(cached, CROSS_REFERENCE_STYLE)}${r(\n '<w:fldChar w:fldCharType=\"end\"/>'\n )}`\n}\n\n/** The screen tip of a reference to this document: \"Cross-reference to clause 2.2\". */\nexport const refTooltip = (value: string, mode: CrossReferenceMode) =>\n mode === 'number' ? `Cross-reference to clause ${value}` : `Cross-reference to “${value}”`\n\n/**\n * A reference to this document: the `REF` field inside a link to the same bookmark, which carries\n * the screen tip Word shows on hover (\"Cross-reference to clause 2.2\").\n */\nexport function crossReferenceXml(bookmark: string, mode: CrossReferenceMode, value: string) {\n return `<w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(\n refTooltip(value, mode)\n )}\" w:history=\"1\">${refFieldXml(refInstruction(bookmark, mode), value)}</w:hyperlink>`\n}\n\n/** The field instruction for a target: its paragraph number, or its text. */\nexport const refInstruction = (bookmark: string, mode: CrossReferenceMode) =>\n mode === 'number' ? `REF ${bookmark} \\\\r \\\\h` : `REF ${bookmark} \\\\h`\n\n/** What the reference reads in the text. */\nexport const refResult = (target: CrossReferenceTarget, mode: CrossReferenceMode) =>\n mode === 'number' && target.number ? target.number : target.text\n\nconst allBookmarks = (port: ReferencesPort) =>\n new Set(port.paragraphs().flatMap((p) => p.bookmarks))\n\n/**\n * The `_Ref` bookmark a target carries: an existing one at the paragraph, else a new one. For a\n * paragraph number it is an empty bookmark at the paragraph's start (the number is the\n * paragraph's); for heading text it wraps the heading's runs (REF shows the bookmarked text).\n */\nexport function ensureTargetBookmark(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode\n): string {\n const paragraph = port.paragraphs().find((p) => p.id === target.paragraphId)\n if (!paragraph) throw new Error('That clause is no longer in the document.')\n const existing = paragraph.bookmarks.find((b) => b.startsWith(REF_BOOKMARK_PREFIX))\n if (existing && mode === 'number') return existing\n const name = newRefBookmark(allBookmarks(port))\n const start = `<w:bookmarkStart w:id=\"0\" w:name=\"${name}\"/>`\n const end = '<w:bookmarkEnd w:id=\"0\"/>'\n if (mode === 'number') {\n port.setCaret({ paragraphId: paragraph.id, offset: 0 })\n if (!port.paste(`<w:p>${start}${end}</w:p>`, '', false))\n throw new Error('The cross-reference target could not be marked.')\n return name\n }\n const runs = port.runsXml(paragraph.id)\n if (!runs) throw new Error('This heading cannot be referred to by its text; use its number.')\n // The heading's text is replaced by the same runs inside the bookmark.\n port.deleteRange(\n { paragraphId: paragraph.id, offset: 0 },\n { paragraphId: paragraph.id, offset: paragraph.text.length }\n )\n if (!port.paste(`<w:p>${start}${runs}${end}</w:p>`, paragraph.text, false))\n throw new Error('The cross-reference target could not be marked.')\n return name\n}\n\n/**\n * Where to paste at `caret`. Right after a field the engine would paste INTO the field (its result\n * runs), so a space is typed first and the paste goes after it.\n */\nfunction pastePoint(port: ReferencesPort, caret: DocPoint): DocPoint {\n const paragraph = port.paragraphs().find((p) => p.id === caret.paragraphId)\n if (paragraph?.text[caret.offset - 1] !== FIELD_ATOM) return caret\n port.setCaret(caret)\n port.typeText(' ')\n return { paragraphId: caret.paragraphId, offset: caret.offset + 1 }\n}\n\n/**\n * Mark a cross-reference's target (see {@link ensureTargetBookmark}): what the reference will\n * address and read. A paragraph number falls back to the heading text when it has none. Done as a\n * direct edit even while suggesting — the bookmark is hidden, and a heading's text is put back as\n * it was — so rejecting the reference leaves the target as it was.\n */\nexport function markCrossReferenceTarget(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode\n): { bookmark: string; mode: CrossReferenceMode; value: string } {\n if (mode === 'number' && !target.number) mode = 'text'\n const bookmark = ensureTargetBookmark(port, target, mode)\n return { bookmark, mode, value: refResult(target, mode) }\n}\n\n/**\n * Insert the `REF` field of a marked target at `caret`; the caret ends after it. With a port\n * whose pastes are tracked, the reference is one suggestion.\n */\nexport function insertCrossReferenceField(\n port: ReferencesPort,\n { bookmark, mode, value }: { bookmark: string; mode: CrossReferenceMode; value: string },\n caret: DocPoint\n): { bookmark: string } {\n caret = pastePoint(port, caret)\n port.setCaret(caret)\n if (!port.paste(`<w:p>${crossReferenceXml(bookmark, mode, value)}</w:p>`, value, false))\n throw new Error('The cross-reference could not be inserted.')\n // A field is one character of the paragraph.\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + 1 })\n return { bookmark }\n}\n\n/** Insert a cross-reference to a target of this document at `caret`; the caret ends after it. */\nexport function insertCrossReference(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode,\n caret: DocPoint\n): { bookmark: string } {\n return insertCrossReferenceField(port, markCrossReferenceTarget(port, target, mode), caret)\n}\n\n/** The screen tip of a reference to another document: \"Cross-reference: SPA, clause 8.2 — opens in ARBI\". */\nexport const documentReferenceTooltip = (text: string, appName = 'ARBI') =>\n `Cross-reference: ${text} — opens in ${appName}`\n\n/**\n * Insert a reference to another document's passage: the reference text in the Cross Reference\n * style, linked to the passage's (absolute) app address, at `caret`.\n */\nexport function insertDocumentReference(\n port: ReferencesPort,\n reference: { text: string; url: string; appName?: string },\n caret: DocPoint\n): void {\n const text = reference.text.trim()\n if (!text) throw new Error('Enter the reference text.')\n const tooltip = documentReferenceTooltip(text, reference.appName).slice(0, 255)\n caret = pastePoint(port, caret)\n port.setCaret(caret)\n const link = `<w:p><w:hyperlink r:id=\"rIdRef1\"${\n tooltip ? ` w:tooltip=\"${esc(tooltip)}\"` : ''\n } w:history=\"1\">${run(text, CROSS_REFERENCE_STYLE)}</w:hyperlink></w:p>`\n if (!port.paste(link, text, false, hyperlinkRelationship('rIdRef1', reference.url)))\n throw new Error('The reference could not be inserted.')\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + text.length })\n}\n\nexport interface RefreshResult {\n /** References rewritten with their current number or text. */\n refreshed: number\n /** References whose target is gone, now (or already) marked broken. */\n broken: BrokenReference[]\n}\n\n/**\n * Bring every cross-reference up to date: a stale one is replaced by the same reference with its\n * current value (and screen tip); one whose target was deleted becomes its last text in the Cross\n * Reference Broken style — never Word's \"Error! Reference source not found.\" A field directly\n * after another field is left alone: a paste there would land inside the previous field.\n */\nexport function refreshCrossReferences(port: ReferencesPort): RefreshResult {\n const stale = staleCrossReferences(port).sort((a, b) =>\n a.paragraphId === b.paragraphId ? b.offset - a.offset : 0\n )\n let refreshed = 0\n for (const ref of stale) {\n const paragraph = port.paragraphs().find((p) => p.id === ref.paragraphId)\n if (!paragraph || paragraph.text[ref.offset - 1] === FIELD_ATOM) continue\n const at = { paragraphId: ref.paragraphId, offset: ref.offset }\n port.deleteRange(at, { paragraphId: ref.paragraphId, offset: ref.offset + 1 })\n port.setCaret(at)\n const text = ref.value ?? (ref.cached.trim() || ref.bookmark)\n const body =\n ref.value === null\n ? run(text, BROKEN_CROSS_REFERENCE_STYLE)\n : crossReferenceXml(ref.bookmark, ref.mode, ref.value)\n if (port.paste(`<w:p>${body}</w:p>`, text, false) && ref.value !== null) refreshed++\n }\n return { refreshed, broken: brokenCrossReferences(port) }\n}\n\ntype Attr = { localName: string; value: string; prefix?: string }\ntype Element = OoxmlNodeLike & { prefix?: string }\n\n/** Run content a heading may hold and still be rewritten as runs. */\nconst RUN_PARTS = new Set(['rPr', 't', 'tab', 'br', 'lastRenderedPageBreak'])\n/** Paragraph children that are not content (kept out of the rewrite). */\nconst SKIPPED = new Set(['pPr', 'bookmarkStart', 'bookmarkEnd', 'proofErr', 'permStart', 'permEnd'])\n\nfunction serialize(node: Element): string {\n if (node.kind === 'textValue') return esc(node.value ?? '')\n const name = `${node.prefix ?? 'w'}:${node.localName}`\n const attrs = ((node.attributes ?? []) as readonly Attr[])\n .map((a) => ` ${a.prefix ? `${a.prefix}:` : ''}${a.localName}=\"${esc(a.value)}\"`)\n .join('')\n const children = (node.children ?? []).map((c) => serialize(c as Element)).join('')\n return children ? `<${name}${attrs}>${children}</${name}>` : `<${name}${attrs}/>`\n}\n\n/** A paragraph's runs as XML (formatting kept), or null for anything but plain runs. */\nexport function paragraphRunsXml(paragraph: OoxmlNodeLike): string | null {\n const runs: string[] = []\n for (const child of (paragraph.children ?? []) as Element[]) {\n if (child.localName && SKIPPED.has(child.localName)) continue\n if (child.localName !== 'r') return null\n if ((child.children ?? []).some((c) => !c.localName || !RUN_PARTS.has(c.localName))) return null\n runs.push(serialize(child))\n }\n return runs.length ? runs.join('') : null\n}\n","/**\n * Undo for the changes ARBI applies directly (they cannot be tracked): a paragraph style or format,\n * a table's properties, the page setup, refreshed field results. Before the change, the state it\n * replaces is captured as a small JSON record, kept in the room (the `agentUndo` map of the room's\n * Y.Doc, keyed by the id of the comment that announces the change) so it survives a reload. Undo\n * turns the record back into store ops, addressed by `w14:paraId` so they resolve on any replica:\n * the collaboration service and a browser alike.\n */\nimport {\n ACCEPTED_PARAGRAPH_PROPERTIES,\n type OoxmlProperty,\n type TabStopWrite,\n type TreeDocOp,\n} from '@docx-editor.dev/core/store'\nimport type { OoxmlNodeLike } from './read'\n\n/** The room's Y.Map of undo records, by comment id. */\nexport const AGENT_UNDO_MAP = 'agentUndo'\n\n/** A paragraph's own properties as they were. */\nexport interface ParagraphState {\n paraId: string\n /** The flat accepted properties (`pStyle`, `jc`, `spacing`, `ind`…). */\n properties: OoxmlProperty[]\n numbering: { numId: string; level: number } | null\n tabs: TabStopWrite[]\n}\n\n/** One section's page setup as it was; `paraId` is the paragraph whose mark ends it (null: the last). */\nexport interface SectionState {\n paraId: string | null\n pageWidthTwips?: number\n pageHeightTwips?: number\n orientation?: 'portrait' | 'landscape'\n marginTopTwips?: number\n marginRightTwips?: number\n marginBottomTwips?: number\n marginLeftTwips?: number\n}\n\nexport type UndoRecord =\n | { kind: 'paragraphs'; paragraphs: ParagraphState[] }\n | { kind: 'sections'; sections: SectionState[] }\n /** A table, found by a paragraph in it. */\n | { kind: 'table'; paraId: string; styleId: string | null; headerRowCount: number }\n /** Field results as they were: the `index`-th field of the paragraph. */\n | { kind: 'fields'; fields: { paraId: string; index: number; text: string }[] }\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\nconst child = (node: OoxmlNodeLike | undefined, name: string) =>\n node?.children?.find((c) => c.localName === name)\nconst twips = (node: OoxmlNodeLike | undefined, name: string) => {\n const value = node && attr(node, name)\n return value === undefined ? undefined : Number(value)\n}\nconst FLAT = new Set<string>(\n ACCEPTED_PARAGRAPH_PROPERTIES.filter((n) => n !== 'numPr' && n !== 'tabs')\n)\n\n/** Every paragraph of a part, by `w14:paraId`, and the body's own paragraphs in order. */\nexport function paragraphIndex(root: OoxmlNodeLike) {\n const byParaId = new Map<string, OoxmlNodeLike>()\n const parentOf = new Map<OoxmlNodeLike, OoxmlNodeLike>()\n const visit = (node: OoxmlNodeLike) => {\n for (const c of node.children ?? []) {\n parentOf.set(c, node)\n if (c.kind === 'paragraph') {\n const id = attr(c, 'paraId')\n if (id) byParaId.set(id, c)\n }\n if (c.kind !== 'textValue') visit(c)\n }\n }\n visit(root)\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n return { byParaId, parentOf, body }\n}\n\n/** A paragraph's own properties, to restore later. */\nexport function paragraphState(paragraph: OoxmlNodeLike): ParagraphState {\n const pPr = paragraph.children?.find((c) => c.localName === 'pPr')\n const properties: OoxmlProperty[] = []\n let numbering: ParagraphState['numbering'] = null\n const tabs: TabStopWrite[] = []\n for (const p of pPr?.children ?? []) {\n if (p.localName && FLAT.has(p.localName)) {\n properties.push({\n localName: p.localName,\n attributes: Object.fromEntries((p.attributes ?? []).map((a) => [a.localName, a.value])),\n })\n } else if (p.localName === 'numPr') {\n const numId = attr(child(p, 'numId') ?? p, 'val')\n if (numId) numbering = { numId, level: Number(attr(child(p, 'ilvl') ?? p, 'val') ?? 0) }\n } else if (p.localName === 'tabs') {\n for (const tab of p.children ?? []) {\n const val = attr(tab, 'val')\n if (!val || val === 'clear') continue\n tabs.push({\n positionTwips: Number(attr(tab, 'pos') ?? 0),\n alignment: (val === 'start'\n ? 'left'\n : val === 'end'\n ? 'right'\n : val) as TabStopWrite['alignment'],\n ...(attr(tab, 'leader') ? { leader: attr(tab, 'leader') as TabStopWrite['leader'] } : {}),\n })\n }\n }\n }\n return { paraId: attr(paragraph, 'paraId') ?? '', properties, numbering, tabs }\n}\n\n/** Every section's page setup, to restore later. */\nexport function sectionStates(root: OoxmlNodeLike): SectionState[] {\n const { body } = paragraphIndex(root)\n const state = (sectPr: OoxmlNodeLike, paraId: string | null): SectionState => {\n const size = child(sectPr, 'pgSz')\n const margin = child(sectPr, 'pgMar')\n const orient = size && attr(size, 'orient')\n return {\n paraId,\n pageWidthTwips: twips(size, 'w'),\n pageHeightTwips: twips(size, 'h'),\n orientation: orient === 'landscape' ? 'landscape' : 'portrait',\n marginTopTwips: twips(margin, 'top'),\n marginRightTwips: twips(margin, 'right'),\n marginBottomTwips: twips(margin, 'bottom'),\n marginLeftTwips: twips(margin, 'left'),\n }\n }\n const out: SectionState[] = []\n for (const block of body.children ?? []) {\n const sectPr = block.kind === 'paragraph' ? child(child(block, 'pPr'), 'sectPr') : undefined\n if (sectPr) out.push(state(sectPr, attr(block, 'paraId') ?? null))\n else if (block.localName === 'sectPr') out.push(state(block, null))\n }\n return out\n}\n\n/** The table a paragraph is in, or undefined. */\nexport function tableOf(root: OoxmlNodeLike, paraId: string): OoxmlNodeLike | undefined {\n const { byParaId, parentOf } = paragraphIndex(root)\n let node = byParaId.get(paraId)\n while (node && node.localName !== 'tbl') node = parentOf.get(node)\n return node\n}\n\n/** A table's style and header rows, to restore later (`paraId`: a paragraph in it). */\nexport function tableState(root: OoxmlNodeLike, paraId: string): UndoRecord | null {\n const table = tableOf(root, paraId)\n if (!table) return null\n const style = child(child(table, 'tblPr'), 'tblStyle')\n let headerRowCount = 0\n for (const row of table.children ?? []) {\n if (row.localName !== 'tr') continue\n const header = child(child(row, 'trPr'), 'tblHeader')\n if (!header || ['0', 'false', 'off'].includes(attr(header, 'val') ?? '')) break\n headerRowCount++\n }\n return { kind: 'table', paraId, styleId: (style && attr(style, 'val')) ?? null, headerRowCount }\n}\n\n/** The begin `w:fldChar` node ids of a paragraph's complex fields, in order (as `DocParagraph.fields`). */\nexport function fieldNodeIds(paragraph: OoxmlNodeLike): string[] {\n const out: string[] = []\n let depth = 0\n const walk = (node: OoxmlNodeLike) => {\n for (const c of node.children ?? []) {\n if (c.localName === 'del') continue\n if (c.localName === 'fldChar') {\n const type = attr(c, 'fldCharType')\n if (type === 'begin' && depth++ === 0) out.push(c.id)\n else if (type === 'end') depth = Math.max(0, depth - 1)\n } else if (c.kind !== 'textValue') walk(c)\n }\n }\n walk(paragraph)\n return out\n}\n\n/**\n * The store ops that put back what a record captured, against the document as it now is (`root`,\n * the main part's tree). Null when what it changed is no longer there (a paragraph or table gone).\n */\nexport function undoOps(root: OoxmlNodeLike, record: UndoRecord): TreeDocOp[] | null {\n const { byParaId, body } = paragraphIndex(root)\n const ops: TreeDocOp[] = []\n if (record.kind === 'paragraphs') {\n for (const state of record.paragraphs) {\n const paragraph = byParaId.get(state.paraId)\n if (!paragraph) return null\n ops.push(\n { op: 'setParagraphProperties', paragraphId: paragraph.id, properties: state.properties },\n {\n op: 'setListNumbering',\n paragraphId: paragraph.id,\n numId: state.numbering?.numId ?? null,\n ...(state.numbering ? { level: state.numbering.level } : {}),\n },\n { op: 'setParagraphTabStops', paragraphId: paragraph.id, stops: state.tabs }\n )\n }\n } else if (record.kind === 'sections') {\n const last = [...(body.children ?? [])].reverse().find((b) => b.kind === 'paragraph')\n for (const { paraId, ...setup } of record.sections) {\n const anchor = paraId === null ? last : byParaId.get(paraId)\n if (!anchor) return null\n const fields = Object.fromEntries(Object.entries(setup).filter(([, v]) => v !== undefined))\n ops.push({ op: 'setSectionProperties', anchorParagraphId: anchor.id, ...fields })\n }\n } else if (record.kind === 'table') {\n const table = tableOf(root, record.paraId)\n if (!table) return null\n ops.push({\n op: 'setTableProperties',\n tableId: table.id,\n styleId: record.styleId ?? '',\n headerRowCount: record.headerRowCount,\n })\n } else {\n const updates = []\n for (const { paraId, index, text } of record.fields) {\n const paragraph = byParaId.get(paraId)\n const fieldNodeId = paragraph && fieldNodeIds(paragraph)[index]\n if (!paragraph || !fieldNodeId) return null\n updates.push({ paragraphId: paragraph.id, fieldNodeId, text })\n }\n ops.push({ op: 'refreshFieldResults', updates })\n }\n return ops\n}\n","/**\n * Defined terms in text: a definition's term read from the start of its text (`\"Shares\" means …`,\n * `**Business Day** shall mean …`, `Completion: the date …`), the order of a glossary, and the hidden\n * Word bookmark a term links to. Shared by the editor's Defined Terms and ARBI's headless tools.\n */\n\n/** A definition's text split into its term and the rest. */\nexport interface ParsedDefinition {\n /** The term as written, without quotes or emphasis (`Business Day`). */\n term: string\n /** What follows the term, its connecting word included (`means a day …`, `: the date …`). */\n rest: string\n /** Just the meaning, the connecting word dropped (`a day …`). */\n meaning: string\n}\n\n/** A definition as the commands insert it: the id of its fact, its term and the rest. */\nexport interface DefinitionText extends Pick<ParsedDefinition, 'term' | 'rest'> {\n id: string\n}\n\nconst QUOTES = `\"“”„‟'‘’‚‛«»`\nconst OPEN_CLOSE: Record<string, string> = {\n '\"': '\"',\n '“': '”',\n '„': '“',\n '‟': '”',\n \"'\": \"'\",\n '‘': '’',\n '‚': '‘',\n '‛': '’',\n '«': '»',\n}\nconst EMPHASIS = /^(\\*\\*|__|\\*|_)/\n/** The words (or punctuation) joining a term to its meaning, longest first. */\nconst CONNECTORS =\n /^(?:shall\\s+(?:have\\s+the\\s+meaning|mean|include)s?|ha(?:s|ve)\\s+the\\s+meanings?|means?\\s+and\\s+includes?|means|mean|includes|include|[:—–]|\\s-\\s|-\\s)/i\nconst MAX_TERM_LENGTH = 80\nconst MAX_TERM_WORDS = 10\n\n/** Markdown emphasis and escapes dropped, whitespace collapsed. */\nfunction plain(text: string): string {\n return text\n .replace(/\\\\([\\\\`*_{}[\\]()#+\\-.!\"'])/g, '$1')\n .replace(/(\\*\\*|__)(.+?)\\1/g, '$2')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\n/** The matching key of a term: case and whitespace folded, quotes and emphasis dropped. */\nexport function termKey(term: string): string {\n return plain(term)\n .replace(new RegExp(`[${QUOTES}*_]`, 'g'), '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n}\n\nconst validTerm = (term: string) =>\n term.length > 0 &&\n term.length <= MAX_TERM_LENGTH &&\n term.split(/\\s+/).length <= MAX_TERM_WORDS &&\n /\\p{L}/u.test(term)\n\n/** A connector at the start of `rest` (after optional whitespace): its length, or 0. */\nfunction connectorAt(rest: string): number {\n const lead = rest.length - rest.trimStart().length\n // A spaced hyphen needs its leading space, so try the raw text before the trimmed one.\n const spaced = /^\\s-\\s/.exec(rest)\n if (spaced) return spaced[0].length\n const match = CONNECTORS.exec(rest.slice(lead))\n return match ? lead + match[0].length : 0\n}\n\n/**\n * Read a definition's term from the start of its text, or `null` when it does not start with one.\n *\n * Optional straight or curly quotes and bold markers around the term are dropped; the term is what\n * comes before \"means\", \"shall mean\", \"includes\", \"has the meaning\", a colon, or a dash. A quoted\n * term is taken whole, so `\"Long-Stop Date\" means …` keeps its hyphen.\n */\nexport function parseDefinition(text: string): ParsedDefinition | null {\n let s = plain(text)\n // Leading emphasis markers (`**\"Shares\"** means`), any order with the opening quote.\n for (let i = 0; i < 3; i++) s = s.replace(EMPHASIS, '').trimStart()\n let term: string\n let rest: string\n const open = s[0]\n const close = open ? OPEN_CLOSE[open] : undefined\n if (close) {\n const end = s.indexOf(close, 1)\n if (end < 0) return null\n term = s.slice(1, end)\n rest = s.slice(end + 1)\n // Emphasis or a closing quote between the term and its connector (`\"Shares\"**`, `**\"X**\"`).\n rest = rest.replace(new RegExp(`^(?:\\\\*\\\\*|__|\\\\*|_|[${QUOTES}])+`), '')\n } else {\n // Unquoted: the term runs up to the first connector.\n const match =\n /^(.+?)(\\s+(?:shall\\s+(?:have\\s+the\\s+meaning|mean|include)s?|ha(?:s|ve)\\s+the\\s+meanings?|means?\\s+and\\s+includes?|means|includes)\\b|\\s*[:—–]|\\s+-\\s)/i.exec(\n s\n )\n if (!match) return null\n term = match[1]\n rest = s.slice(match[1].length)\n }\n term = term.replace(/(\\*\\*|__|\\*|_)/g, '').trim()\n const joint = connectorAt(rest)\n if (!joint || !validTerm(term)) return null\n const meaning = rest.slice(joint).trim()\n if (!meaning) return null\n return { term, rest: rest.replace(/^\\s+/, ' ').replace(/^ (?=[:—–])/, ''), meaning }\n}\n\n/** Alphabetical order of terms, as a reader sorts a glossary (case and accents folded). */\nexport const compareTerms = (a: string, b: string) =>\n a.localeCompare(b, undefined, { sensitivity: 'base', numeric: true })\n\n/** Prefix of every bookmark a defined term links to: hidden in Word (leading underscore). */\nexport const DEFINITION_BOOKMARK_PREFIX = '_dt_'\nconst MAX_BOOKMARK_LENGTH = 40\n\n/**\n * The Word bookmark of a definition: `_dt_` and the fact id in valid bookmark characters\n * (`fct-AbC12345` → `_dt_fct_AbC12345`), at most 40 characters as Word requires.\n */\nexport function definitionBookmark(factId: string): string {\n return (DEFINITION_BOOKMARK_PREFIX + factId.replace(/[^A-Za-z0-9_]/g, '_')).slice(\n 0,\n MAX_BOOKMARK_LENGTH\n )\n}\n\n/** The fact id a definition bookmark names, or `null` for any other bookmark. */\nexport function definitionIdOfBookmark(name: string): string | null {\n const match = /^_dt_([a-z]{3})_([A-Za-z0-9]+)$/.exec(name)\n return match ? `${match[1]}-${match[2]}` : null\n}\n","/**\n * A small mutable XML tree over core's hardened reader (`readXml`: no DTDs or entities, bounded),\n * for rewriting WordprocessingML parts. Names are qualified as written (`w:style`); every part this\n * module edits is written by Word, LibreOffice or this engine with the conventional prefixes, and\n * `readPart` refuses a part whose `w` prefix is bound elsewhere rather than editing it blind.\n */\nimport { readXml } from '@docx-editor.dev/core/store'\n\nexport const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\nexport const R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\n\nexport interface El {\n name: string\n attrs: Record<string, string>\n children: Node[]\n}\nexport type Node = El | string\n\nexport class TemplateError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'TemplateError'\n }\n}\n\n/** Parse one part. Text is decoded; comments and the declaration are dropped. */\nexport function parse(xml: string, part = 'part'): El {\n const read = readXml(xml, { maxBytes: 64 * 1024 * 1024, maxElements: 2_000_000 })\n if (!read.ok) throw new TemplateError(`${part} is not readable XML (${read.reason})`)\n const convert = (node: (typeof read.nodes)[number]): Node =>\n node.type === 'text'\n ? node.value\n : { name: node.name, attrs: { ...node.attributes }, children: node.children.map(convert) }\n const root = read.nodes.map(convert).find((n): n is El => typeof n !== 'string')\n if (!root) throw new TemplateError(`${part} has no root element`)\n const w = root.attrs['xmlns:w']\n if (w !== undefined && w !== W_NS) throw new TemplateError(`${part} binds w: to ${w}`)\n return root\n}\n\nconst escText = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\nconst escAttr = (s: string) => escText(s).replace(/\"/g, '&quot;')\n\nexport function serialize(root: El): string {\n const out: string[] = ['<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n']\n const walk = (node: Node) => {\n if (typeof node === 'string') return void out.push(escText(node))\n out.push('<', node.name)\n for (const [k, v] of Object.entries(node.attrs)) out.push(' ', k, '=\"', escAttr(v), '\"')\n if (node.children.length === 0) return void out.push('/>')\n out.push('>')\n node.children.forEach(walk)\n out.push('</', node.name, '>')\n }\n walk(root)\n return out.join('')\n}\n\nexport const el = (\n name: string,\n attrs: Record<string, string> = {},\n children: Node[] = []\n): El => ({\n name,\n attrs,\n children,\n})\nexport const isEl = (n: Node | undefined): n is El => typeof n === 'object' && n !== null\nexport const kids = (e: El, name?: string): El[] =>\n e.children.filter((c): c is El => isEl(c) && (name === undefined || c.name === name))\nexport const kid = (e: El | undefined, name: string): El | undefined =>\n e ? kids(e, name)[0] : undefined\n/** `w:val` of a child, e.g. `val(style, 'w:basedOn')`. */\nexport const val = (e: El | undefined, name: string): string | undefined =>\n kid(e, name)?.attrs['w:val']\n\n/** Every descendant element (depth-first, document order), the root included. */\nexport function* walk(e: El): Generator<El> {\n yield e\n for (const c of e.children) if (isEl(c)) yield* walk(c)\n}\n\nexport const clone = <T extends Node>(n: T): T =>\n (typeof n === 'string'\n ? n\n : { name: n.name, attrs: { ...n.attrs }, children: n.children.map(clone) }) as T\n\n/** Text of an element's `w:t` descendants. */\nexport const textOf = (e: El): string =>\n [...walk(e)]\n .filter((x) => x.name === 'w:t')\n .map((x) => x.children.filter((c): c is string => typeof c === 'string').join(''))\n .join('')\n","/**\n * A DOCX/DOTX as a map of part names to bytes, with the OPC plumbing a merge needs: content types,\n * relationships, and resolving a relationship's target to a part name.\n */\nimport { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\nimport { el, kids, parse, serialize, TemplateError, type El } from './xml'\n\nexport const REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\nexport const RT = {\n officeDocument: `${REL}/officeDocument`,\n styles: `${REL}/styles`,\n numbering: `${REL}/numbering`,\n theme: `${REL}/theme`,\n fontTable: `${REL}/fontTable`,\n settings: `${REL}/settings`,\n header: `${REL}/header`,\n footer: `${REL}/footer`,\n image: `${REL}/image`,\n hyperlink: `${REL}/hyperlink`,\n glossary: `${REL}/glossaryDocument`,\n attachedTemplate: `${REL}/attachedTemplate`,\n} as const\nconst WML = 'application/vnd.openxmlformats-officedocument.wordprocessingml'\nexport const CT = {\n document: `${WML}.document.main+xml`,\n template: `${WML}.template.main+xml`,\n macroDocument: 'application/vnd.ms-word.document.macroEnabled.main+xml',\n macroTemplate: 'application/vnd.ms-word.template.macroEnabledTemplate.main+xml',\n styles: `${WML}.styles+xml`,\n numbering: `${WML}.numbering+xml`,\n settings: `${WML}.settings+xml`,\n fontTable: `${WML}.fontTable+xml`,\n header: `${WML}.header+xml`,\n footer: `${WML}.footer+xml`,\n glossary: `${WML}.document.glossary+xml`,\n theme: 'application/vnd.openxmlformats-officedocument.theme+xml',\n rels: 'application/vnd.openxmlformats-package.relationships+xml',\n} as const\n\nexport interface Rel {\n id: string\n type: string\n target: string\n external: boolean\n}\n\n/** Part names are kept without the leading slash, as the zip stores them. */\nexport class Pkg {\n readonly files: Map<string, Uint8Array>\n private types: El\n\n constructor(files: Map<string, Uint8Array>) {\n this.files = files\n const ct = this.find('[Content_Types].xml')\n if (!ct) throw new TemplateError('not a Word package: no [Content_Types].xml')\n this.types = parse(strFromU8(files.get(ct)!), '[Content_Types].xml')\n }\n\n static read(bytes: Uint8Array): Pkg {\n let files: Record<string, Uint8Array>\n try {\n files = unzipSync(bytes)\n } catch {\n throw new TemplateError('not a Word package: not a zip')\n }\n return new Pkg(new Map(Object.entries(files).filter(([n]) => !n.endsWith('/'))))\n }\n\n write(): Uint8Array {\n this.files.set(\n this.find('[Content_Types].xml') ?? '[Content_Types].xml',\n strToU8(serialize(this.types))\n )\n return zipSync(Object.fromEntries(this.files), { level: 6 })\n }\n\n /** The stored name of a part, matched case-insensitively as OPC does. */\n find(name: string): string | undefined {\n const key = name.replace(/^\\//, '').toLowerCase()\n for (const n of this.files.keys()) if (n.toLowerCase() === key) return n\n return undefined\n }\n has(name: string) {\n return this.find(name) !== undefined\n }\n text(name: string): string | undefined {\n const n = this.find(name)\n return n === undefined ? undefined : strFromU8(this.files.get(n)!)\n }\n xml(name: string): El | undefined {\n const t = this.text(name)\n return t === undefined ? undefined : parse(t, name)\n }\n setXml(name: string, root: El, contentType?: string) {\n this.files.set(this.find(name) ?? name, strToU8(serialize(root)))\n if (contentType) this.setContentType(name, contentType)\n }\n setBytes(name: string, bytes: Uint8Array, contentType?: string) {\n this.files.set(this.find(name) ?? name, bytes)\n if (contentType) this.setContentType(name, contentType)\n }\n remove(name: string) {\n const n = this.find(name)\n if (n === undefined) return\n this.files.delete(n)\n this.types.children = this.types.children.filter(\n (c) =>\n !(\n typeof c !== 'string' &&\n c.name === 'Override' &&\n c.attrs.PartName.toLowerCase() === `/${n.toLowerCase()}`\n )\n )\n this.files.delete(relsName(n))\n }\n\n contentType(name: string): string | undefined {\n const part = `/${name.replace(/^\\//, '')}`.toLowerCase()\n const override = kids(this.types, 'Override').find(\n (o) => o.attrs.PartName.toLowerCase() === part\n )\n if (override) return override.attrs.ContentType\n const ext = part.slice(part.lastIndexOf('.') + 1)\n return kids(this.types, 'Default').find((d) => d.attrs.Extension.toLowerCase() === ext)?.attrs\n .ContentType\n }\n setContentType(name: string, type: string) {\n const part = `/${name.replace(/^\\//, '')}`\n const override = kids(this.types, 'Override').find(\n (o) => o.attrs.PartName.toLowerCase() === part.toLowerCase()\n )\n if (override) override.attrs.ContentType = type\n else this.types.children.push(el('Override', { PartName: part, ContentType: type }))\n }\n /** A `Default` for an extension (media), unless one exists. */\n ensureDefault(ext: string, type: string) {\n if (\n !kids(this.types, 'Default').some(\n (d) => d.attrs.Extension.toLowerCase() === ext.toLowerCase()\n )\n )\n this.types.children.unshift(el('Default', { Extension: ext, ContentType: type }))\n }\n\n rels(owner: string): Rel[] {\n const root = this.xml(relsName(owner))\n if (!root) return []\n return kids(root, 'Relationship').map((r) => ({\n id: r.attrs.Id,\n type: r.attrs.Type,\n target: r.attrs.Target,\n external: r.attrs.TargetMode === 'External',\n }))\n }\n setRels(owner: string, rels: Rel[]) {\n const root = el(\n 'Relationships',\n { xmlns: 'http://schemas.openxmlformats.org/package/2006/relationships' },\n rels.map((r) =>\n el('Relationship', {\n Id: r.id,\n Type: r.type,\n Target: r.target,\n ...(r.external ? { TargetMode: 'External' } : {}),\n })\n )\n )\n this.setXml(relsName(owner), root)\n }\n /** Add a relationship from `owner`; returns its new id. */\n addRel(owner: string, type: string, target: string, external = false): string {\n const rels = this.rels(owner)\n const id = freshId(new Set(rels.map((r) => r.id)), 'rIdT')\n rels.push({ id, type, target, external })\n this.setRels(owner, rels)\n return id\n }\n\n /** The part a relationship of `owner` points at (internal targets only). */\n target(owner: string, rel: Rel): string {\n return resolveTarget(owner, rel.target)\n }\n /** The first internal part of a relationship type from `owner`. */\n partOf(owner: string, type: string): string | undefined {\n const rel = this.rels(owner).find((r) => r.type === type && !r.external)\n return rel && this.find(this.target(owner, rel))\n }\n /** The main document part (`word/document.xml` by convention). */\n get main(): string {\n const main = this.partOf('', RT.officeDocument)\n if (!main) throw new TemplateError('not a Word package: no main document part')\n return main\n }\n}\n\n/** `word/document.xml` → `word/_rels/document.xml.rels`; '' (the package) → `_rels/.rels`. */\nexport function relsName(owner: string): string {\n const slash = owner.lastIndexOf('/')\n return `${owner.slice(0, slash + 1)}_rels/${owner.slice(slash + 1)}.rels`\n}\n\nexport function resolveTarget(owner: string, target: string): string {\n if (target.startsWith('/')) return target.slice(1)\n const base = owner\n .slice(0, owner.lastIndexOf('/') + 1)\n .split('/')\n .filter(Boolean)\n for (const seg of target.split('/')) {\n if (seg === '..') base.pop()\n else if (seg !== '.' && seg !== '') base.push(seg)\n }\n return base.join('/')\n}\n\n/** A target for `part` relative to `owner`'s folder. */\nexport function relativeTarget(owner: string, part: string): string {\n const from = owner.slice(0, owner.lastIndexOf('/') + 1)\n return part.startsWith(from) ? part.slice(from.length) : `/${part}`\n}\n\nexport function freshId(taken: ReadonlySet<string>, prefix: string): string {\n for (let i = 1; ; i++) if (!taken.has(`${prefix}${i}`)) return `${prefix}${i}`\n}\n\n/** An unused part name like `word/header3.xml` / `word/media/image2.png`. */\nexport function freshPartName(pkg: Pkg, folder: string, stem: string, ext: string): string {\n for (let i = 1; ; i++) {\n const name = `${folder}${stem}${i}.${ext}`\n if (!pkg.has(name)) return name\n }\n}\n","/**\n * A fragment package marked as one tracked insertion, so that pasting it while suggesting lands a\n * change to review rather than an untracked edit. The editor's paste keeps `w:ins` from a\n * fragment (renumbering its id), and accepting or rejecting the change takes the whole insertion.\n */\nimport { Pkg } from './pkg'\nimport { el, isEl, kid, type El } from './xml'\n\n/** Who made a tracked change and when (`w:author`, `w:date`). */\nexport interface Revision {\n author: string\n /** ISO 8601, seconds precision, e.g. `2026-10-19T09:30:00Z`. */\n date: string\n}\n\n/** Already tracked in the fragment: left as they are. */\nconst TRACKED = new Set(['w:ins', 'w:del', 'w:moveFrom', 'w:moveTo'])\n\n/**\n * The fragment with every run wrapped in `w:ins` and every new paragraph mark marked inserted. A\n * table row is marked inserted as a whole, its cells left as they are: the editor rejects an\n * inserted row whose content is tracked as well only partly. A run is not descended into, so a\n * text box goes in with its run. `covered`: the fragment's last paragraph mark is pasted too (a\n * block before the caret's paragraph); otherwise the last paragraph runs into the text after the\n * caret and its mark is not new.\n */\nexport function trackInsertion(\n fragment: Uint8Array,\n revision: Revision,\n covered: boolean\n): Uint8Array {\n const pkg = Pkg.read(fragment)\n const main = pkg.main\n const root = pkg.xml(main)\n const body = kid(root, 'w:body')\n if (!root || !body) return fragment\n const attrs = { 'w:id': '1', 'w:author': revision.author, 'w:date': revision.date }\n const lastParagraph = body.children.filter(isEl).findLast((c) => c.name === 'w:p')\n\n const visit = (node: El) => {\n node.children = node.children.map((child) => {\n if (!isEl(child)) return child\n if (child.name === 'w:r') return TRACKED.has(node.name) ? child : el('w:ins', attrs, [child])\n if (TRACKED.has(child.name)) return child\n if (child.name === 'w:tr') {\n markRow(child, attrs)\n return child\n }\n visit(child)\n if (child.name === 'w:p' && (covered || child !== lastParagraph)) markParagraph(child, attrs)\n return child\n })\n }\n visit(body)\n pkg.setXml(main, root)\n return pkg.write()\n}\n\n/** `w:pPr/w:rPr/w:ins`: the paragraph mark is inserted (`w:ins` comes first in `CT_ParaRPr`). */\nfunction markParagraph(p: El, attrs: Record<string, string>) {\n let pPr = kid(p, 'w:pPr')\n if (!pPr) p.children.unshift((pPr = el('w:pPr')))\n let rPr = kid(pPr, 'w:rPr')\n if (!rPr) {\n rPr = el('w:rPr')\n // Before `w:sectPr` and `w:pPrChange`, which close `CT_PPr`.\n const at = pPr.children.findIndex(\n (c) => isEl(c) && (c.name === 'w:sectPr' || c.name === 'w:pPrChange')\n )\n pPr.children.splice(at < 0 ? pPr.children.length : at, 0, rPr)\n }\n if (!kid(rPr, 'w:ins')) rPr.children.unshift(el('w:ins', attrs))\n}\n\n/** `w:trPr/w:ins`: the table row is inserted (after the row properties, before `w:trPrChange`). */\nfunction markRow(tr: El, attrs: Record<string, string>) {\n let trPr = kid(tr, 'w:trPr')\n if (!trPr) {\n trPr = el('w:trPr')\n const after = tr.children.findIndex((c) => isEl(c) && c.name === 'w:tblPrEx')\n tr.children.splice(after + 1, 0, trPr)\n }\n if (kid(trPr, 'w:ins')) return\n const at = trPr.children.findIndex((c) => isEl(c) && c.name === 'w:trPrChange')\n trPr.children.splice(at < 0 ? trPr.children.length : at, 0, el('w:ins', attrs))\n}\n","/**\n * Defined-term and cross-reference content as WordprocessingML, and the clipboard fragment (a small\n * `.docx` package) that carries it into a document. The engine has no \"insert bookmark\" command, but\n * its paste lands an embedded fragment with everything in it — `w:bookmarkStart`/`w:bookmarkEnd` and\n * `w:hyperlink w:anchor` included — freshening bookmark ids as it goes.\n */\n\nimport { docxPackage, documentXml, esc, stylesXml } from './ooxml'\nimport { trackInsertion, type Revision } from '../template/track'\nimport {\n BROKEN_CROSS_REFERENCE_STYLE,\n CROSS_REFERENCE_STYLE,\n DEFINED_TERM_STYLE,\n type OoxmlNodeLike,\n} from './read'\nimport type { ParsedDefinition } from './terms'\n\ntype Definition = Pick<ParsedDefinition, 'term' | 'rest'>\n\n/**\n * The character styles the inserted content uses. A paste brings a style the document does not\n * define; one it already defines (a house template's) is used as it is, so only the missing ones\n * go into a fragment (see {@link stylesUsed}).\n */\nexport const CHARACTER_STYLES: Record<string, string> = {\n [DEFINED_TERM_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${DEFINED_TERM_STYLE}\"><w:name w:val=\"Defined Term\"/><w:rPr><w:u w:val=\"dotted\" w:color=\"7F7F7F\"/></w:rPr></w:style>`,\n [CROSS_REFERENCE_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${CROSS_REFERENCE_STYLE}\"><w:name w:val=\"Cross Reference\"/><w:rPr><w:color w:val=\"1F4E79\"/><w:u w:val=\"dotted\" w:color=\"8EA9C1\"/></w:rPr></w:style>`,\n [BROKEN_CROSS_REFERENCE_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${BROKEN_CROSS_REFERENCE_STYLE}\"><w:name w:val=\"Cross Reference Broken\"/><w:basedOn w:val=\"${CROSS_REFERENCE_STYLE}\"/><w:rPr><w:color w:val=\"C00000\"/><w:u w:val=\"wave\" w:color=\"C00000\"/></w:rPr></w:style>`,\n}\n\n/** The character styles a fragment's runs use (`w:rStyle`), as ids. */\nexport function stylesUsed(body: string): string[] {\n return [...new Set([...body.matchAll(/<w:rStyle w:val=\"([^\"]+)\"/g)].map((m) => m[1]))]\n}\n\n// No document defaults: the paste writes a fragment's defaults onto its runs as direct formatting,\n// and pasted terms and definitions should take the formatting of the document they land in.\nconst fragmentStyles = (ids: readonly string[]) =>\n stylesXml(\n '',\n `<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style>${ids\n .map((id) => CHARACTER_STYLES[id] ?? '')\n .join('')}`\n )\n\nconst textRun = (text: string, props = '') =>\n `<w:r>${props ? `<w:rPr>${props}</w:rPr>` : ''}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/** What Word shows on hover over a term: its definition, as one line of at most 255 characters. */\nexport function definitionTooltip(definition: Definition): string {\n const line = `“${definition.term}”${definition.rest}`.replace(/\\s+/g, ' ').trim()\n return line.length > 255 ? `${line.slice(0, 254)}…` : line\n}\n\n/** The definition paragraph's text as the document shows it: `“Shares” means the issued shares.` */\nexport const definitionParagraphText = (definition: Definition) =>\n `“${definition.term}”${definition.rest}`\n\n/**\n * A definition paragraph: the quoted term in bold, bookmarked (`bookmark`), then the definition as\n * the fact writes it. `id` is the bookmark id inside the fragment; the paste renumbers it.\n */\nexport function definitionParagraphXml(definition: Definition, bookmark: string, id = 0): string {\n return `<w:p><w:bookmarkStart w:id=\"${id}\" w:name=\"${esc(bookmark)}\"/>${textRun('“')}${textRun(\n definition.term,\n '<w:b/>'\n )}${textRun('”')}<w:bookmarkEnd w:id=\"${id}\"/>${textRun(definition.rest)}</w:p>`\n}\n\n/** A heading paragraph: the document's own heading style when it has one, else bold text. */\nexport function headingParagraphXml(text: string, styleId?: string): string {\n return styleId\n ? `<w:p><w:pPr><w:pStyle w:val=\"${esc(styleId)}\"/></w:pPr>${textRun(text)}</w:p>`\n : `<w:p><w:pPr><w:keepNext/></w:pPr>${textRun(text, '<w:b/>')}</w:p>`\n}\n\n/** The term as an internal link to its definition's bookmark, with the definition as its tooltip. */\nexport function termLinkXml(term: string, bookmark: string, tooltip: string): string {\n return `<w:p><w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(tooltip)}\" w:history=\"1\">${textRun(\n term,\n `<w:rStyle w:val=\"${DEFINED_TERM_STYLE}\"/>`\n )}</w:hyperlink></w:p>`\n}\n\n/**\n * The fragment package carrying `body` (paragraph XML). `covered` says the last paragraph mark is\n * part of it: the paste then ends with a whole paragraph (a block inserted before the caret's\n * paragraph) instead of running into the text after the caret (inline). With a `revision`, the\n * fragment is one tracked insertion by it.\n */\nexport function fragmentPackage(\n body: string,\n covered: boolean,\n {\n revision,\n relationships,\n styles = stylesUsed(body),\n }: {\n revision?: Revision | null\n /** Relationships the body refers to (a hyperlink's target). */\n relationships?: string\n /** The character styles to bring (default: every one the body uses). */\n styles?: readonly string[]\n } = {}\n): Uint8Array {\n const untracked = docxPackage({\n document: documentXml(body),\n styles: fragmentStyles(styles),\n title: 'Defined terms',\n relationships,\n })\n return revision ? trackInsertion(untracked, revision, covered) : untracked\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** The style ids a document's styles part defines. */\nexport function documentStyleIds(root: OoxmlNodeLike | null | undefined): Set<string> {\n const ids = new Set<string>()\n for (const style of root?.children ?? [])\n if (style.localName === 'style') {\n const id = attr(style, 'styleId')\n if (id) ids.add(id)\n }\n return ids\n}\n","/**\n * The defined-term commands: insert a term as a link to its definition (adding the definition to\n * the document's Definitions section when it is not there yet). Written against\n * {@link DefinitionsPort}, so they run on the live editor and on the in-memory model the tests use\n * alike.\n *\n * Where the Definitions section is: the first top-level paragraph titled \"Definitions\",\n * \"Definitions and interpretation\", \"Interpretation\", \"Defined terms\" or \"Glossary\" (clause numbers\n * ignored), up to the next heading. A document without one gets a \"Definitions\" heading at its end:\n * appended, it never splits the clause being drafted, and it is where a reader of a draft looks\n * for a schedule of terms. Inside the section, definitions are kept in alphabetical order.\n */\n\nimport {\n compareTerms,\n definitionBookmark,\n definitionIdOfBookmark,\n parseDefinition,\n type DefinitionText,\n} from './terms'\nimport {\n definitionParagraphXml,\n definitionTooltip,\n headingParagraphXml,\n termLinkXml,\n} from './fragment'\nimport type { DefinitionsPort } from './port'\nimport { engineLength, type DocParagraph, type DocPoint } from './read'\n\ntype Definition = DefinitionText\n\n/** Title of a Definitions section the commands create. */\nexport const DEFINITIONS_HEADING = 'Definitions'\n\nconst SECTION_TITLE =\n /^(definitions?(\\s*(and|&)\\s*interpretations?)?|interpretations?(\\s*(and|&)\\s*definitions?)?|defined\\s+terms|glossary)$/i\n/** Clause numbering in front of a title: `1.`, `1.1`, `Clause 1`, `A)`, `Schedule 2 -`. */\nconst NUMBERING =\n /^(?:(?:clause|section|article|schedule|part)\\s+)?(?:[0-9]+(?:\\.[0-9]+)*|[A-Z]|[ivxlc]+)[.):]?\\s+(?:[-–—]\\s*)?/i\n\n/** Whether a paragraph titles a Definitions section. */\nexport function isDefinitionsTitle(paragraph: DocParagraph): boolean {\n if (!paragraph.topLevel) return false\n const title = paragraph.text\n .trim()\n .replace(NUMBERING, '')\n .replace(/[.:]+$/, '')\n .trim()\n return SECTION_TITLE.test(title) && (paragraph.heading || title.length <= 40)\n}\n\n/** The Definitions section: its title's index and the paragraphs after it, up to the next heading. */\nexport interface DefinitionsSection {\n title: number\n /** First paragraph after the title. */\n start: number\n /** Index after the section's last paragraph (the next heading, a table, or the end). */\n end: number\n}\n\nexport function findDefinitionsSection(\n paragraphs: readonly DocParagraph[]\n): DefinitionsSection | null {\n const title = paragraphs.findIndex(isDefinitionsTitle)\n if (title < 0) return null\n let end = title + 1\n while (end < paragraphs.length && paragraphs[end].topLevel && !paragraphs[end].heading) end++\n return { title, start: title + 1, end }\n}\n\n/** The term a section paragraph defines, or `null` (an interpretation rule, a blank line…). */\nconst termOf = (paragraph: DocParagraph) => parseDefinition(paragraph.text)?.term ?? null\n\n/**\n * Where a definition of `term` goes in the section, alphabetically: before the first definition\n * whose term sorts after it, else after the last definition (else right after the title).\n */\nexport function insertionIndex(\n paragraphs: readonly DocParagraph[],\n section: DefinitionsSection,\n term: string,\n skip: ReadonlySet<string> = new Set()\n): number {\n let afterLast = section.start\n for (let i = section.start; i < section.end; i++) {\n if (skip.has(paragraphs[i].id)) continue\n const other = termOf(paragraphs[i])\n if (other === null) continue\n if (compareTerms(other, term) > 0) return i\n afterLast = i + 1\n }\n return afterLast\n}\n\n/** The document's heading style, read off its headings (so a new section matches them). */\nconst headingStyle = (paragraphs: readonly DocParagraph[]) =>\n paragraphs.find((p) => p.topLevel && p.heading && p.styleId)?.styleId\n\n/**\n * Paste `body` (`count` paragraphs) as paragraphs at `index`: before the paragraph there, or after\n * the last one. Answers the paragraph id of `keep` afterwards — pasting before a paragraph hands its\n * node to the first pasted paragraph, so a caret is tracked by position, not by id.\n */\nfunction insertParagraphs(\n port: DefinitionsPort,\n index: number,\n body: string,\n count: number,\n keep?: DocPoint\n): DocPoint | undefined {\n const before = port.paragraphs()\n const kept = keep ? before.findIndex((p) => p.id === keep.paragraphId) : -1\n if (index < before.length) {\n port.setCaret({ paragraphId: before[index].id, offset: 0 })\n } else {\n // At the end: open an empty paragraph to paste in front of (it stays as the last line). Its end\n // counts pending deleted text, as every engine offset does.\n const last = before[before.length - 1]\n port.setCaret({ paragraphId: last.id, offset: engineLength(last) })\n port.splitParagraph()\n const opened = port.paragraphs()\n port.setCaret({ paragraphId: opened[opened.length - 1].id, offset: 0 })\n }\n if (!port.paste(body, '', true)) throw new Error('The definition could not be added.')\n if (!keep || kept < 0) return keep\n const after = port.paragraphs()\n const moved = index <= kept ? kept + count : kept\n return { paragraphId: after[moved]?.id ?? keep.paragraphId, offset: keep.offset }\n}\n\n/**\n * Add a definition paragraph to the Definitions section (made at the end of the document when there\n * is none), in alphabetical order. Answers where `keep` moved to.\n */\nexport function addDefinition(\n port: DefinitionsPort,\n definition: Definition,\n keep?: DocPoint\n): DocPoint | undefined {\n const paragraphs = port.paragraphs()\n const section = findDefinitionsSection(paragraphs)\n const paragraph = definitionParagraphXml(definition, definitionBookmark(definition.id))\n if (section)\n return insertParagraphs(\n port,\n insertionIndex(paragraphs, section, definition.term),\n paragraph,\n 1,\n keep\n )\n return insertParagraphs(\n port,\n paragraphs.length,\n headingParagraphXml(DEFINITIONS_HEADING, headingStyle(paragraphs)) + paragraph,\n 2,\n keep\n )\n}\n\n/** Whether a bookmark is declared anywhere in the body. */\nconst hasBookmark = (paragraphs: readonly DocParagraph[], name: string) =>\n paragraphs.some((p) => p.bookmarks.includes(name))\n\nexport interface InsertTermResult {\n /** The definition was not in the document yet and was added to its Definitions section. */\n addedDefinition: boolean\n}\n\n/** A paragraph's words between two engine offsets, as a replacement addresses them. */\nexport interface ReplacedSpan {\n paragraphId: string\n from: number\n to: number\n}\n\nconst paragraphOf = (port: DefinitionsPort, id: string) =>\n port.paragraphs().find((p) => p.id === id)\n\n/**\n * Replace `span` with what `insert` puts at the caret (`length` characters), as one change that\n * never removes words without their replacement: the replacement goes in first, right after the\n * words, and only once it is in are the words deleted. A refused insert changes nothing; a refused\n * deletion takes the insert back out (deleting an insertion of one's own removes it). Answers\n * whether the replacement landed, the caret after it.\n */\nexport function replaceSpan(\n port: DefinitionsPort,\n span: ReplacedSpan,\n insert: () => boolean,\n length: number\n): boolean {\n const { paragraphId, from, to } = span\n if (from > to) throw new Error('A replacement runs forwards.')\n const before = paragraphOf(port, paragraphId)\n if (!before) throw new Error('That paragraph is no longer in the document.')\n const length0 = engineLength(before)\n port.setCaret({ paragraphId, offset: to })\n if (!insert()) return false\n if (from < to) {\n try {\n port.deleteRange({ paragraphId, offset: from }, { paragraphId, offset: to })\n } catch (error) {\n port.deleteRange({ paragraphId, offset: to }, { paragraphId, offset: to + length })\n throw error\n }\n }\n // A tracked deletion keeps the words (before the replacement); an untracked one removes them.\n const after = paragraphOf(port, paragraphId)\n const kept = after && engineLength(after) - length0 === length\n port.setCaret({ paragraphId, offset: (kept ? to : from) + length })\n return true\n}\n\n/**\n * Insert a defined term at the caret: the term as an internal link to its definition's bookmark\n * (its definition as the link's tooltip), the definition added to the Definitions section first\n * when the document does not have it. `replace` characters before the caret (a typed `@@query`,\n * or the term's own plain words) are replaced by it, as one change (see {@link replaceSpan}): a\n * term that cannot be inserted leaves them in place. The caret ends after the term.\n */\nexport function insertDefinedTerm(\n port: DefinitionsPort,\n definition: Definition,\n options: { replace?: number } = {}\n): InsertTermResult {\n const start = port.caret()\n if (!start) throw new Error('Place the cursor where the term should go.')\n const bookmark = definitionBookmark(definition.id)\n const addedDefinition = !hasBookmark(port.paragraphs(), bookmark)\n const caret = (addedDefinition && addDefinition(port, definition, start)) || start\n const insert = () =>\n port.paste(\n termLinkXml(definition.term, bookmark, definitionTooltip(definition)),\n definition.term,\n false\n )\n const from = Math.max(0, caret.offset - (options.replace ?? 0))\n if (\n !replaceSpan(\n port,\n { paragraphId: caret.paragraphId, from, to: caret.offset },\n insert,\n definition.term.length\n )\n )\n throw new Error('The term could not be inserted.')\n return { addedDefinition }\n}\n\n/** Term groups keyed for quick lookup of the definition a bookmark points at. */\nexport function definitionsById<D extends Definition>(definitions: readonly D[]): Map<string, D> {\n return new Map(definitions.map((d) => [d.id, d]))\n}\n\n/** The definition an internal link points at, from its bookmark name. */\nexport function definitionOfAnchor<D extends Definition>(\n anchor: string,\n definitions: ReadonlyMap<string, D>\n): D | undefined {\n const id = definitionIdOfBookmark(anchor.replace(/^#/, ''))\n return id ? definitions.get(id) : undefined\n}\n","/**\n * A defined term applied across a whole document in one command: the other words used for it\n * (`variants`: \"Vendor\", \"Provider\", \"supplier\") each replaced by the term, and, with `link`, every\n * use of the term linked to its definition. Each occurrence is its own tracked change, made with\n * the defined-term commands ({@link replaceSpan}, the term link of {@link insertDefinedTerm}), so a\n * reviewer accepts or rejects them one by one.\n *\n * Which words are uses: whole words only (not part of a longer word or a hyphenated compound),\n * matched exactly as written, case included. A defined term is written with its capitals, so the\n * ordinary word (\"supplier\") is not a use of the term (\"Supplier\") unless it is listed as a\n * variant. A variant written with its article (\"the Vendor\") counts only with that article in\n * front, and keeps it: only the name is replaced (\"the Supplier\"). Never touched: the definition of the term or of a variant, words inside a link (an\n * already linked term among them) or inside a field (a cross-reference's or other computed text),\n * and words inside a pending tracked change.\n */\nimport { addDefinition, replaceSpan } from './definitions'\nimport { definitionTooltip, termLinkXml } from './fragment'\nimport type { DefinitionsPort } from './port'\nimport { engineOffset, FIELD_ATOM, type DocParagraph } from './read'\nimport { definitionBookmark, parseDefinition, termKey, type DefinitionText } from './terms'\n\nexport interface TermSpec {\n /** The defined term, as the document writes it (\"Supplier\"). */\n term: string\n /** Other words used for it, each replaced by the term. */\n variants?: readonly string[]\n /** Link every use of the term (the replaced variants included) to its definition. */\n link?: boolean\n}\n\n/** One use of the term or a variant: `offset` into its paragraph's `text`. */\nexport interface TermUse {\n paragraphId: string\n paraId?: string\n offset: number\n text: string\n kind: 'term' | 'variant'\n}\n\nexport type TermSkipReason =\n 'definition' | 'linked' | 'link' | 'field' | 'pending-change' | 'unsupported-content' | 'refused'\n\n/** A use left as it is, and why. */\nexport interface TermSkip extends TermUse {\n reason: TermSkipReason\n}\n\n/** A use changed: replaced by the term (`text` → `to`), linked to its definition or both. */\nexport interface TermChange extends TermUse {\n to: string\n linked: boolean\n}\n\nexport interface TermEverywhereResult {\n changed: TermChange[]\n skipped: TermSkip[]\n /** The definition was not in the document and was added to its Definitions section. */\n addedDefinition: boolean\n}\n\n/** Words a whole word never runs into: letters, digits and the joins of a compound. */\nconst WORD = '[\\\\p{L}\\\\p{N}_\\\\-‐‑]'\n\nconst escape = (text: string) => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/**\n * An article in front of a name (\"the Vendor\"). A variant may be written with one, and then only\n * uses with it count, but the article is never replaced: \"the Vendor\" becomes \"the Supplier\", not\n * \"Supplier\". Its first letter matches either case, as at the start of a sentence.\n */\nconst ARTICLE = /^(the|a|an|this|that|such|said)\\s+/i\n\n/** A term or variant without a leading article (\"the Supplier\" is the term \"Supplier\"). */\nexport const withoutArticle = (words: string) =>\n words.replace(/\\s+/g, ' ').trim().replace(ARTICLE, '')\n\nconst anyCase = (word: string) =>\n `[${word[0].toUpperCase()}${word[0].toLowerCase()}]${escape(word.slice(1))}`\n\n/** The words to look for: the variants (distinct, never the term itself), and the term to link. */\nfunction needlesOf(spec: TermSpec): { text: string; kind: TermUse['kind']; pattern: RegExp }[] {\n const term = withoutArticle(spec.term)\n const seen = new Set<string>()\n const needles: { text: string; article: string; kind: TermUse['kind'] }[] = []\n for (const raw of spec.variants ?? []) {\n const words = raw.replace(/\\s+/g, ' ').trim()\n const article = ARTICLE.exec(words)?.[1] ?? ''\n const text = words.slice(article ? ARTICLE.exec(words)![0].length : 0)\n const key = `${article.toLowerCase()} ${text}`\n if (!text || text === term || seen.has(key)) continue\n seen.add(key)\n needles.push({ text, article, kind: 'variant' })\n }\n if (spec.link) needles.push({ text: term, article: '', kind: 'term' })\n return needles.map((n) => ({\n text: n.text,\n kind: n.kind,\n pattern: new RegExp(\n `(?<!${WORD})(${n.article ? `${anyCase(n.article)}\\\\s+` : ''})(${n.text\n .split(' ')\n .map(escape)\n .join('\\\\s+')})(?!${WORD})`,\n 'gu'\n ),\n }))\n}\n\n/** Whole-word matches in `text`, leftmost first and the longest where two start together. */\nfunction matchesIn(text: string, needles: ReturnType<typeof needlesOf>) {\n const found: { offset: number; text: string; kind: TermUse['kind'] }[] = []\n for (const needle of needles)\n for (const m of text.matchAll(needle.pattern))\n found.push({ offset: (m.index ?? 0) + m[1].length, text: m[2], kind: needle.kind })\n found.sort((a, b) => a.offset - b.offset || b.text.length - a.text.length)\n const out: typeof found = []\n for (const m of found)\n if (!out.length || m.offset >= out[out.length - 1].offset + out[out.length - 1].text.length)\n out.push(m)\n return out\n}\n\nconst overlaps = (start: number, end: number, from: number, to: number) => start < to && from < end\n\n/**\n * Every use of the term (when linking) and of its variants in `paragraphs`: the ones to change,\n * and the ones left as they are with the reason. `bookmark` is the definition's, which tells an\n * already linked term apart from a word inside some other link.\n */\nexport function findTermUses(\n paragraphs: readonly DocParagraph[],\n spec: TermSpec,\n bookmark?: string\n): { uses: TermUse[]; skipped: TermSkip[] } {\n const needles = needlesOf(spec)\n const defining = new Set(\n [spec.term, ...(spec.variants ?? [])].map((w) => termKey(withoutArticle(w)))\n )\n const uses: TermUse[] = []\n const skipped: TermSkip[] = []\n for (const p of paragraphs) {\n const at = { paragraphId: p.id, ...(p.paraId ? { paraId: p.paraId } : {}) }\n const defined = parseDefinition(p.text.split(FIELD_ATOM).join(''))\n const isDefinition = defined !== null && defining.has(termKey(defined.term))\n for (const m of matchesIn(p.text, needles)) {\n const use = { ...at, ...m }\n const end = m.offset + m.text.length\n const link = p.links.find(\n (l) => l.offset !== undefined && overlaps(m.offset, end, l.offset, l.offset + l.text.length)\n )\n const pending = (p.revisions ?? []).some((r) =>\n r.kind === 'insert'\n ? overlaps(m.offset, end, r.offset, r.offset + r.length)\n : r.offset > m.offset && r.offset < end\n )\n const reason: TermSkipReason | null = isDefinition\n ? 'definition'\n : link\n ? link.anchor === bookmark\n ? 'linked'\n : 'link'\n : pending\n ? 'pending-change'\n : null\n if (reason) skipped.push({ ...use, reason })\n else uses.push(use)\n }\n // A field's text (a cross-reference's number, a document property) is computed, not written.\n for (const field of p.fields ?? [])\n for (const m of matchesIn(field.result, needles))\n skipped.push({ ...at, offset: field.offset, text: m.text, kind: m.kind, reason: 'field' })\n }\n return { uses, skipped }\n}\n\n/** `text` with each of `uses` (offsets into it) replaced by `term`. */\nfunction replacedText(text: string, uses: readonly TermUse[], term: string): string {\n let out = text\n for (const use of [...uses].sort((a, b) => b.offset - a.offset))\n out = out.slice(0, use.offset) + term + out.slice(use.offset + use.text.length)\n return out\n}\n\n/** Raised when a paragraph does not read as intended afterwards: the caller discards the change. */\nexport class TermEverywhereError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'TermEverywhereError'\n }\n}\n\n/**\n * Apply a defined term across the document (see the module's description): variants replaced by\n * the term, and with `link` every use linked to `definition` (added to the Definitions section\n * first when the document does not have it). Every replacement is one change that never leaves\n * words removed without the term in their place ({@link replaceSpan}); a use the editor refuses is\n * reported as skipped. After each paragraph its text is checked against what the replacements\n * should make it, and a paragraph that reads otherwise throws {@link TermEverywhereError}: run\n * this on a staged copy of the document and keep the copy only when it returns.\n *\n * `accept` may turn a whole paragraph down (its uses are skipped as `unsupported-content`).\n */\nexport function applyTermEverywhere(\n port: DefinitionsPort,\n spec: TermSpec & { definition?: DefinitionText },\n { accept }: { accept?: (paragraph: DocParagraph) => boolean } = {}\n): TermEverywhereResult {\n const term = withoutArticle(spec.term)\n if (!term) throw new Error('Name the defined term.')\n let addedDefinition = false\n let link: { bookmark: string; tooltip: string } | undefined\n if (spec.link) {\n if (!spec.definition) throw new Error(`Linking \"${term}\" needs its definition.`)\n link = {\n bookmark: definitionBookmark(spec.definition.id),\n tooltip: definitionTooltip(spec.definition),\n }\n if (!port.paragraphs().some((p) => p.bookmarks.includes(link!.bookmark))) {\n addDefinition(port, spec.definition)\n addedDefinition = true\n }\n }\n // Read after the definition is in: adding it can move paragraphs and their ids.\n const paragraphs = port.paragraphs()\n const { uses, skipped } = findTermUses(paragraphs, { ...spec, term }, link?.bookmark)\n const changed: TermChange[] = []\n const insert = link\n ? () => port.paste(termLinkXml(term, link.bookmark, link.tooltip), term, false)\n : () => {\n port.typeText(term)\n return true\n }\n for (const p of paragraphs) {\n const mine = uses.filter((u) => u.paragraphId === p.id)\n if (!mine.length) continue\n if (accept && !accept(p)) {\n skipped.push(...mine.map((u) => ({ ...u, reason: 'unsupported-content' as const })))\n continue\n }\n const current = () =>\n port.paragraphs().find((x) => (p.paraId ? x.paraId === p.paraId : x.id === p.id))\n const done: TermUse[] = []\n // From the last use back, so each one's offsets still hold when its turn comes.\n for (const use of [...mine].sort((a, b) => b.offset - a.offset)) {\n const now = current()\n let ok = false\n if (now) {\n const span = {\n paragraphId: now.id,\n from: engineOffset(p, use.offset, true),\n to: engineOffset(p, use.offset + use.text.length),\n }\n try {\n ok = replaceSpan(port, span, insert, term.length)\n } catch {\n ok = false\n }\n }\n if (ok) {\n done.push(use)\n changed.push({ ...use, to: term, linked: Boolean(link) })\n } else skipped.push({ ...use, reason: 'refused' })\n }\n const want = replacedText(p.text, done, term)\n const got = current()?.text\n if (got !== want)\n throw new TermEverywhereError(\n `A paragraph did not read as intended after the changes: expected \"${want}\", got \"${got ?? '(missing)'}\".`\n )\n }\n changed.sort(\n (a, b) =>\n paragraphs.findIndex((p) => p.id === a.paragraphId) -\n paragraphs.findIndex((p) => p.id === b.paragraphId) || a.offset - b.offset\n )\n return { changed, skipped, addedDefinition }\n}\n","/**\n * Word-editor commands shared by the editor's toolbar and ARBI's headless tools in the\n * collaboration service. Pure functions over the engine's OOXML tree, so they run on a live\n * editor's session and on a headless document view alike.\n */\nimport { openHeadlessDocument } from '@docx-editor.dev/core/store'\nimport { readParagraphs, styleNames, type DocParagraph, type OoxmlNodeLike } from './read'\nimport { documentNumbering, type DocumentNumbering } from './numbering'\nimport type { ReferencesReader } from './references'\n\nexport * from './read'\nexport * from './numbering'\nexport * from './references'\nexport * from './undo'\nexport * from './ooxml'\nexport * from './terms'\nexport * from './fragment'\nexport * from './port'\nexport * from './definitions'\nexport * from './everywhere'\n\n/** A document's parts as trees: a live editor's session or a headless view (`openHeadlessDocument`). */\nexport interface DocumentTrees {\n part(): { root: unknown }\n /** The package, for its notes parts (absent on a live editor's session). */\n currentPackage?(): { parts: ReadonlyMap<string, { root: unknown }> }\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A read-only snapshot of a document: its paragraphs, numbering and style names. */\nexport interface DocumentReader extends ReferencesReader, DocumentNumbering {\n /** A style's name (`heading 1`) by its id, or the id when the document does not name it. */\n styleName(styleId: string): string\n /** A footnote's or endnote's text by its `w:id`. */\n noteText(kind: 'footnote' | 'endnote', id: string): string | undefined\n}\n\n/** Read a document whose trees do not change while the reader is used (a headless view). */\nexport function documentReader(view: DocumentTrees): DocumentReader {\n const root = () => view.part().root as OoxmlNodeLike\n let paragraphs: DocParagraph[] | undefined\n let items: ReturnType<DocumentNumbering['listItems']> | undefined\n let names: Map<string, string> | undefined\n let notes: Map<string, string> | undefined\n const readNotes = () => {\n const out = new Map<string, string>()\n for (const part of view.currentPackage?.().parts.values() ?? []) {\n const root = part.root as OoxmlNodeLike | undefined\n const kind =\n root?.localName === 'footnotes'\n ? 'footnote'\n : root?.localName === 'endnotes'\n ? 'endnote'\n : null\n if (!kind) continue\n for (const note of root?.children ?? []) {\n const id = note.attributes?.find((a) => a.localName === 'id')?.value\n if (id)\n out.set(\n `${kind}:${id}`,\n readParagraphs(note)\n .map((p) => p.text)\n .join(' ')\n )\n }\n }\n return out\n }\n const numbering = documentNumbering({ ...view, root })\n return {\n paragraphs: () => (paragraphs ??= readParagraphs(root())),\n listItems: () => (items ??= numbering.listItems()),\n levelOf: numbering.levelOf,\n noteText: (kind, id) => (notes ??= readNotes()).get(`${kind}:${id}`),\n styleName: (id) =>\n (names ??= styleNames(view.stylesRoot() as OoxmlNodeLike | null)).get(id) ?? id,\n }\n}\n\n/** Read a document from its bytes (a collaboration room's `readRoom`). Throws on a bad package. */\nexport function readDocument(bytes: Uint8Array): DocumentReader {\n const opened = openHeadlessDocument(bytes)\n if (!opened.ok) throw new Error(`The document cannot be read (${opened.reason}).`)\n return documentReader(opened.view)\n}\n"]}
1
+ {"version":3,"sources":["../src/commands/read.ts","../src/commands/numbering.ts","../src/commands/ooxml.ts","../src/commands/references.ts","../src/commands/signatureFields.ts","../src/commands/undo.ts","../src/commands/terms.ts","../src/template/xml.ts","../src/template/pkg.ts","../src/template/track.ts","../src/commands/fragment.ts","../src/commands/definitions.ts","../src/commands/everywhere.ts","../src/commands/index.ts"],"names":["child","attr","serialize","strToU8","zipSync","root"],"mappings":"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","file":"commands.js","sourcesContent":["/**\n * The read side of the Word-editor commands: a document's paragraphs as the commands see them\n * (text in the engine's offset vocabulary, bookmarks, internal links, fields, note references),\n * read from the engine's OOXML tree. The same tree comes from a live editor\n * (`surface.session.part().root`) or from document bytes (`openHeadlessDocument`), so the toolbar\n * and ARBI's headless tools read a document the same way.\n */\n\n/** Character style of an inserted term: a dotted underline, so a defined term reads as one. */\nexport const DEFINED_TERM_STYLE = 'DefinedTerm'\n\n/** Character style of a cross-reference: a muted blue with a dotted underline (Word's name). */\nexport const CROSS_REFERENCE_STYLE = 'CrossReference'\n/** Character style of a cross-reference whose target is gone: its last text, flagged. */\nexport const BROKEN_CROSS_REFERENCE_STYLE = 'CrossReferenceBroken'\n\n/** A position: a paragraph (the engine's node id) and a UTF-16 offset into its text. */\nexport interface DocPoint {\n paragraphId: string\n offset: number\n}\n\n/** An internal link in a paragraph. */\nexport interface DocLink {\n anchor: string\n text: string\n /** Where its text starts in the paragraph's text. */\n offset?: number\n}\n\n/** A footnote or endnote reference: one character of the paragraph, as the engine counts it. */\nexport interface DocNote {\n offset: number\n kind: 'footnote' | 'endnote'\n /** `w:id` of the note. */\n id: string\n}\n\n/** One paragraph, in document order. */\nexport interface DocParagraph {\n id: string\n /** `w14:paraId`, the id that is the same in every replica of a collaboration room. */\n paraId?: string\n text: string\n /** Styled as a heading (a `Heading n` style or an outline level). */\n heading: boolean\n styleId?: string\n /** A paragraph of the body itself, not inside a table. */\n topLevel: boolean\n /** Names of the bookmarks that start in it. */\n bookmarks: string[]\n /** Its internal links (`w:hyperlink w:anchor`). */\n links: DocLink[]\n /** Its complex fields: where each sits (its one-character offset), its instruction and result. */\n fields?: DocField[]\n /** Its runs in a watched character style (a broken cross-reference's mark), with their text. */\n marks?: DocMark[]\n /** Its footnote and endnote references. */\n notes?: DocNote[]\n /** Its pending tracked insertions and deletions, in document order. */\n revisions?: DocRevision[]\n}\n\n/**\n * A pending tracked change in a paragraph. `text` leaves deleted text out, while the engine's\n * offsets (a {@link DocPoint}) count it: an insertion covers `length` characters of `text` from\n * `offset`; a deletion's `text` sits at `offset`, between the characters of `text` around it.\n */\nexport interface DocRevision {\n kind: 'insert' | 'delete'\n offset: number\n length: number\n author?: string\n /** A deletion's text. */\n text?: string\n}\n\n/**\n * Where a position in a paragraph's `text` is in the engine's offsets, which count pending\n * deleted text. `pastDeletions`: a position with deleted text right at it is placed after that\n * text rather than before it.\n */\nexport function engineOffset(\n paragraph: DocParagraph,\n offset: number,\n pastDeletions = false\n): number {\n let out = offset\n for (const r of paragraph.revisions ?? [])\n if (r.kind === 'delete' && (r.offset < offset || (pastDeletions && r.offset === offset)))\n out += r.length\n return out\n}\n\n/** A paragraph's length in the engine's offsets: its text and its pending deleted text. */\nexport const engineLength = (paragraph: DocParagraph) =>\n engineOffset(paragraph, paragraph.text.length, true)\n\n/** A stretch of a paragraph's text in a watched character style. */\nexport interface DocMark {\n styleId: string\n offset: number\n text: string\n}\n\n/** Character styles whose runs a paragraph read reports as marks. */\nexport const WATCHED_STYLES = new Set([BROKEN_CROSS_REFERENCE_STYLE])\n\n/** A complex field of a paragraph. */\nexport interface DocField {\n offset: number\n instruction: string\n result: string\n}\n\nexport type OoxmlNodeLike = {\n id: string\n kind: string\n localName?: string\n value?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly OoxmlNodeLike[]\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** How a field (or a note reference) counts in a paragraph's text (the engine's model vocabulary). */\nexport const FIELD_ATOM = '\\uFFFC'\n\n/** A heading style id in any of the spellings Word localises it to (`Heading1`, `berschrift1`…). */\nconst HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\\s*\\d/i\n\n/** The paragraphs of a part's body, read from the engine's OOXML tree. */\nexport function readParagraphs(root: OoxmlNodeLike): DocParagraph[] {\n const out: DocParagraph[] = []\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n const visit = (node: OoxmlNodeLike, topLevel: boolean, pending: string[]) => {\n for (const child of node.children ?? []) {\n if (child.kind === 'paragraph') {\n out.push(readParagraph(child, topLevel, pending.splice(0)))\n } else if (child.localName === 'bookmarkStart') {\n // A bookmark between paragraphs belongs to the next one.\n const name = attr(child, 'name')\n if (name) pending.push(name)\n } else if (\n child.localName === 'tbl' ||\n child.localName === 'tr' ||\n child.localName === 'tc'\n ) {\n visit(child, false, pending)\n } else if (child.localName === 'sdt' || child.localName === 'sdtContent') {\n visit(child, topLevel, pending)\n }\n }\n }\n visit(body, true, [])\n return out\n}\n\nfunction readParagraph(node: OoxmlNodeLike, topLevel: boolean, bookmarks: string[]): DocParagraph {\n let text = ''\n const links: DocLink[] = []\n let styleId: string | undefined\n let outline = false\n // A field reads as ONE character (U+FFFC), as the engine counts offsets: its instruction and\n // its cached result are not text of the paragraph.\n let fieldDepth = 0\n const marks: DocMark[] = []\n /** The watched style of the run being walked, if any. */\n let runStyle: string | undefined\n const fields: DocField[] = []\n const notes: DocNote[] = []\n const revisions: DocRevision[] = []\n let current: (DocField & { inResult: boolean }) | null = null\n const field = (c: OoxmlNodeLike) => {\n const type = attr(c, 'fldCharType')\n if (type === 'begin') {\n if (fieldDepth === 0) {\n current = { offset: text.length, instruction: '', result: '', inResult: false }\n text += FIELD_ATOM\n }\n fieldDepth++\n } else if (type === 'separate' && fieldDepth === 1 && current) current.inResult = true\n else if (type === 'end') {\n fieldDepth = Math.max(0, fieldDepth - 1)\n if (fieldDepth === 0 && current) {\n const { offset, instruction, result } = current\n fields.push({ offset, instruction: instruction.trim(), result })\n current = null\n }\n }\n }\n const walk = (n: OoxmlNodeLike, link?: DocLink) => {\n for (const c of n.children ?? []) {\n if (c.localName === 'fldChar') {\n field(c)\n continue\n }\n if (c.localName === 'fldSimple') {\n if (fieldDepth === 0) text += FIELD_ATOM\n continue\n }\n if (c.localName === 'instrText') {\n if (fieldDepth === 1 && current)\n (current as DocField).instruction += (c.children ?? []).map((t) => t.value ?? '').join('')\n continue\n }\n if (c.kind === 'paragraphProperties' || c.localName === 'pPr') {\n for (const p of c.children ?? []) {\n if (p.localName === 'pStyle') styleId = attr(p, 'val')\n if (p.localName === 'outlineLvl' && Number(attr(p, 'val')) < 9) outline = true\n }\n continue\n }\n if (c.localName === 'del') {\n // Deleted text is not part of the paragraph's text; where it sits is (see DocRevision).\n const deleted = deletedText(c)\n if (deleted && fieldDepth === 0)\n revisions.push({\n kind: 'delete',\n offset: text.length,\n length: deleted.length,\n author: attr(c, 'author'),\n text: deleted,\n })\n continue\n }\n if (c.localName === 'ins') {\n const start = text.length\n walk(c, link)\n if (text.length > start && fieldDepth === 0)\n revisions.push({\n kind: 'insert',\n offset: start,\n length: text.length - start,\n author: attr(c, 'author'),\n })\n continue\n }\n if (c.localName === 'delText' || c.localName === 'rPr') continue\n if (c.localName === 'r') {\n const rStyle = c.children\n ?.find((x) => x.localName === 'rPr')\n ?.children?.find((x) => x.localName === 'rStyle')\n const watched = rStyle && attr(rStyle, 'val')\n runStyle = watched && WATCHED_STYLES.has(watched) ? watched : undefined\n walk(c, link)\n runStyle = undefined\n continue\n }\n if (\n (c.localName === 'footnoteReference' || c.localName === 'endnoteReference') &&\n fieldDepth === 0\n ) {\n notes.push({\n offset: text.length,\n kind: c.localName === 'footnoteReference' ? 'footnote' : 'endnote',\n id: attr(c, 'id') ?? '',\n })\n text += FIELD_ATOM\n continue\n }\n if (c.localName === 'bookmarkStart') {\n const name = attr(c, 'name')\n if (name) bookmarks.push(name)\n continue\n }\n if (c.localName === 'hyperlink') {\n const anchor = attr(c, 'anchor')\n const next = anchor ? { anchor, text: '', offset: text.length } : undefined\n walk(c, next ?? link)\n if (next) links.push(next)\n continue\n }\n if (c.kind === 'textValue') {\n if (fieldDepth > 0) {\n const open = current as (DocField & { inResult: boolean }) | null\n if (fieldDepth === 1 && open?.inResult) open.result += c.value ?? ''\n continue\n }\n if (runStyle && c.value) {\n const last = marks[marks.length - 1]\n if (last && last.styleId === runStyle && last.offset + last.text.length === text.length)\n last.text += c.value\n else marks.push({ styleId: runStyle, offset: text.length, text: c.value })\n }\n text += c.value ?? ''\n if (link) link.text += c.value ?? ''\n continue\n }\n if (c.localName === 'tab' && fieldDepth === 0) text += '\\t'\n walk(c, link)\n }\n }\n walk(node)\n const paraId = attr(node, 'paraId')\n return {\n id: node.id,\n ...(paraId ? { paraId } : {}),\n text,\n heading: outline || (!!styleId && HEADING_STYLE.test(styleId)),\n styleId,\n topLevel,\n bookmarks,\n links,\n ...(fields.length ? { fields } : {}),\n ...(marks.length ? { marks } : {}),\n ...(notes.length ? { notes } : {}),\n ...(revisions.length ? { revisions } : {}),\n }\n}\n\n/** The text a tracked deletion removes (its `w:delText`; a deleted tab counts as one character). */\nfunction deletedText(node: OoxmlNodeLike): string {\n let out = ''\n for (const c of node.children ?? []) {\n if (c.localName === 'instrText') continue\n if (c.localName === 'delText') out += (c.children ?? []).map((t) => t.value ?? '').join('')\n else if (c.localName === 'tab') out += '\\t'\n else if (c.localName !== 'rPr') out += deletedText(c)\n }\n return out\n}\n\n/** Style id to style name (`Heading1` → `heading 1`), from a styles part's tree. */\nexport function styleNames(root: OoxmlNodeLike | null | undefined): Map<string, string> {\n const names = new Map<string, string>()\n for (const style of root?.children ?? []) {\n if (style.localName !== 'style') continue\n const id = attr(style, 'styleId')\n const name = style.children?.find((c) => c.localName === 'name')\n if (id) names.set(id, (name && attr(name, 'val')) || id)\n }\n return names\n}\n","/**\n * Cross-reference targets: the document's numbered paragraphs (clauses, sub-clauses, numbered\n * captions) and its headings, with the number Word's `REF \\r` shows for each.\n *\n * The number is what the editor computes for a `REF … \\r` field — and it has to be exactly that,\n * because the engine shows a field's live value only while the field's cached result matches what\n * it computes (otherwise it keeps the cached text for good). So this mirrors the engine: the\n * paragraph's own list level, preceded by each higher level whose number its level text does not\n * already show (`%1.%2` already shows level 1; `(%3)` does not show `2.1`), and one trailing\n * period dropped (`2.` reads `2`).\n */\n\nimport type { DocParagraph, OoxmlNodeLike } from './read'\nimport {\n buildNumberingIndex,\n buildStyleCascadeTable,\n resolveNumberingLevel,\n resolveStoryListItems,\n withNumberingStyleLinks,\n} from '@docx-editor.dev/core/layout'\n\n/** A paragraph's resolved list numbering (the engine's list item). */\nexport interface ListItemInfo {\n numId: string\n ilvl: number\n markerText: string\n numFmt: string\n}\n\n/** A list level's definition: its level text (`%1.%2`) and number format. */\nexport interface LevelInfo {\n lvlText: string\n numFmt: string\n}\n\nexport type LevelOf = (numId: string, ilvl: number) => LevelInfo | null\n\nconst numbers = (level: { numFmt: string; lvlText?: string; markerText?: string } | null) =>\n !!level &&\n level.numFmt !== 'bullet' &&\n level.numFmt !== 'none' &&\n (level.lvlText ?? level.markerText ?? '').length > 0\n\n/**\n * The number `REF \\r` shows for a paragraph, or null when it is not numbered. `order` is every\n * paragraph id in document order (for the markers of the levels above it).\n */\nexport function paragraphNumber(\n order: readonly string[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf,\n paragraphId: string\n): string | null {\n const item = items.get(paragraphId)\n if (!item || !numbers(item)) return null\n const at = order.indexOf(paragraphId)\n /** The marker the nearest paragraph at `ilvl` of this list had, up to the target. */\n const markerAt = (ilvl: number): string | null => {\n if (ilvl === item.ilvl) return item.markerText\n for (let i = at - 1; i >= 0; i--) {\n const other = items.get(order[i])\n if (other && other.numId === item.numId && other.ilvl === ilvl) return other.markerText\n }\n return null\n }\n const chain: number[] = []\n const texts: string[] = []\n for (let u = item.ilvl; u >= 0; u--) {\n const level = levelOf(item.numId, u)\n if (!level || !numbers(level)) continue\n if (u !== item.ilvl && texts.some((t) => t.includes(`%${u + 1}`))) continue\n chain.push(u)\n texts.push(level.lvlText)\n }\n const value = chain\n .reverse()\n .map((u) => markerAt(u) ?? '')\n .join('')\n if (!value) return null\n return value.length > 1 && value.endsWith('.') ? value.slice(0, -1) : value\n}\n\n/** One place a cross-reference can point at. */\nexport interface CrossReferenceTarget {\n paragraphId: string\n /** A numbered paragraph (clause, sub-clause, caption) or an unnumbered heading. */\n kind: 'numbered' | 'heading'\n /** What `REF \\r` shows (`8.2`), or null for an unnumbered heading. */\n number: string | null\n /** The paragraph's list marker as painted (`8.2`, `(a)`), or empty. */\n marker: string\n /** The paragraph's text (without its marker). */\n text: string\n heading: boolean\n /** Its list level (0 for a top-level clause), or 0 for a heading. */\n level: number\n}\n\n/** Every numbered paragraph and every heading, in document order. */\nexport function listTargets(\n paragraphs: readonly DocParagraph[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf\n): CrossReferenceTarget[] {\n const order = paragraphs.map((p) => p.id)\n const out: CrossReferenceTarget[] = []\n for (const p of paragraphs) {\n const text = p.text.replace(//g, '').trim()\n if (!text) continue\n const number = paragraphNumber(order, items, levelOf, p.id)\n const item = items.get(p.id)\n if (number !== null)\n out.push({\n paragraphId: p.id,\n kind: 'numbered',\n number,\n marker: item?.markerText ?? '',\n text,\n heading: p.heading,\n level: item?.ilvl ?? 0,\n })\n else if (p.heading)\n out.push({\n paragraphId: p.id,\n kind: 'heading',\n number: null,\n marker: '',\n text,\n heading: true,\n level: 0,\n })\n }\n return out\n}\n\n/** Targets whose number or text contains the query (case-insensitive). */\nexport function filterTargets(\n targets: readonly CrossReferenceTarget[],\n query: string\n): CrossReferenceTarget[] {\n const q = query.trim().toLowerCase()\n if (!q) return [...targets]\n return targets.filter(\n (t) => (t.number ?? '').toLowerCase().startsWith(q) || t.text.toLowerCase().includes(q)\n )\n}\n\n/** What the engine's numbering needs of a document: its parts' trees. */\nexport interface NumberingSource {\n /** The main document part's root. */\n root(): OoxmlNodeLike\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A document's list numbering as the engine resolves it. */\nexport interface DocumentNumbering {\n /** Each numbered paragraph's list item, by paragraph (node) id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/**\n * The numbering of a document, as the editor paints it: from a live editor's session or from a\n * headless document view alike.\n */\nexport function documentNumbering(source: NumberingSource): DocumentNumbering {\n type Index = ReturnType<typeof buildNumberingIndex>\n type Cascade = ReturnType<typeof buildStyleCascadeTable>\n let numbering: Index | undefined\n let cascade: Cascade | undefined\n const index = () => {\n if (!numbering) {\n cascade = buildStyleCascadeTable(\n source.stylesRoot() as Parameters<typeof buildStyleCascadeTable>[0],\n undefined,\n source.settingsRoot() as Parameters<typeof buildStyleCascadeTable>[2]\n )\n numbering = withNumberingStyleLinks(\n buildNumberingIndex(source.numberingRoot() as Parameters<typeof buildNumberingIndex>[0]),\n cascade\n )\n }\n return numbering\n }\n return {\n listItems: () => {\n const body = source.root().children?.find((n) => n.kind === 'body')\n const items = resolveStoryListItems(\n (body?.children ?? []) as unknown as Parameters<typeof resolveStoryListItems>[0],\n index(),\n cascade\n )\n const out = new Map<string, ListItemInfo>()\n for (const [id, item] of items)\n out.set(id, {\n numId: item.numId,\n ilvl: item.ilvl,\n markerText: item.markerText,\n numFmt: item.numFmt,\n })\n return out\n },\n levelOf: (numId, ilvl) => {\n const level = resolveNumberingLevel(index(), numId, ilvl)?.level\n return level ? { lvlText: level.lvlText, numFmt: level.numFmt } : null\n },\n }\n}\n","/**\n * The minimal WordprocessingML a command writes: escaped text, a `word/document.xml` and\n * `word/styles.xml` around it, and the `.docx` package that carries them (a paste fragment).\n */\n\nimport { strToU8, zipSync } from 'fflate'\n\nexport const W_NAMESPACES =\n 'xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"'\n\n// Text that is not allowed in XML 1.0 at all (control characters) is dropped, not escaped.\n// eslint-disable-next-line no-control-regex\nconst INVALID_XML = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F￾￿]/g\n\n/** Text as XML character data or an attribute value. */\nexport const esc = (text: string) =>\n text\n .replace(INVALID_XML, '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n\n/** A `word/document.xml` around body content (paragraphs, tables, then the section). */\nexport const documentXml = (body: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document ${W_NAMESPACES}><w:body>${body}</w:body></w:document>`\n\n/** `word/styles.xml` holding the given style definitions. */\nexport const stylesXml = (defaults: string, styles: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">${defaults}${styles}</w:styles>`\n\nconst CONTENT_TYPES = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/><Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/><Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/></Types>`\n\nconst ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/></Relationships>`\n\n/** `word/_rels/document.xml.rels`: the styles part, then any further relationships given. */\nconst documentRels = (more = '') => `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>${more}</Relationships>`\n\n/** A relationship to an external hyperlink target, for `w:hyperlink r:id`. */\nexport const hyperlinkRelationship = (id: string, url: string) =>\n `<Relationship Id=\"${esc(id)}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${esc(url)}\" TargetMode=\"External\"/>`\n\nconst coreXml = (\n title: string,\n at: string\n) => `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><dc:title>${esc(\n title\n)}</dc:title><dcterms:created xsi:type=\"dcterms:W3CDTF\">${at}</dcterms:created><dcterms:modified xsi:type=\"dcterms:W3CDTF\">${at}</dcterms:modified></cp:coreProperties>`\n\n/** The minimal `.docx` package: a document, its styles, and its title and time. */\nexport function docxPackage(parts: {\n document: string\n styles: string\n title: string\n /** ISO time; default now. */\n at?: string\n /** Further `word/document.xml` relationships (e.g. {@link hyperlinkRelationship}). */\n relationships?: string\n}): Uint8Array {\n const at = new Date(parts.at ?? Date.now()).toISOString().replace(/\\.\\d{3}Z$/, 'Z')\n return zipSync({\n '[Content_Types].xml': strToU8(CONTENT_TYPES),\n '_rels/.rels': strToU8(ROOT_RELS),\n 'docProps/core.xml': strToU8(coreXml(parts.title, at)),\n 'word/document.xml': strToU8(parts.document),\n 'word/styles.xml': strToU8(parts.styles),\n 'word/_rels/document.xml.rels': strToU8(documentRels(parts.relationships)),\n })\n}\n","/**\n * Cross-references, the way Word does them, and their status.\n *\n * Within the document: a hidden `_Ref…` bookmark on the target paragraph and a `REF` field at the\n * caret — `REF _Ref123 \\\\r \\\\h` for a numbered paragraph (Word's Cross-reference › Numbered item ›\n * Paragraph number), `REF _Ref123 \\\\h` for a heading's text. The field's cached result is the value\n * the editor computes, so it updates live when the clauses are renumbered, and Word updates it\n * with the document's other fields.\n *\n * To another document: a hyperlink with the reference text (\"SPA, clause 8.2\"), aimed at the app\n * address of that document's passage (so it works from Word too), with a screen tip saying so.\n *\n * Every cross-reference reads as current, stale (a clause renumbered, a heading reworded) or broken\n * (the target is gone).\n */\n\nimport {\n BROKEN_CROSS_REFERENCE_STYLE,\n CROSS_REFERENCE_STYLE,\n FIELD_ATOM,\n type DocParagraph,\n type DocPoint,\n type OoxmlNodeLike,\n} from './read'\nimport {\n paragraphNumber,\n type CrossReferenceTarget,\n type LevelOf,\n type ListItemInfo,\n} from './numbering'\nimport { esc, hyperlinkRelationship } from './ooxml'\nimport type { ReferencesPort } from './port'\n\n/** Prefix of Word's hidden cross-reference bookmarks. */\nexport const REF_BOOKMARK_PREFIX = '_Ref'\n\nexport type CrossReferenceMode = 'number' | 'text'\n\nconst REF_FIELD = /^REF\\s+(\\S+)((?:\\s+\\\\[A-Za-z*]+(?:\\s+MERGEFORMAT)?)*)\\s*$/i\n\n/** What reading cross-references needs of a document. */\nexport interface ReferencesReader {\n paragraphs(): DocParagraph[]\n /** Each numbered paragraph's list item, by paragraph id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/** One `REF` field to a `_Ref` bookmark. */\nexport interface CrossReference {\n paragraphId: string\n offset: number\n instruction: string\n bookmark: string\n mode: CrossReferenceMode\n /** The field's cached result (what it shows). */\n cached: string\n /** The paragraph the bookmark is in, or null when it is gone (the reference is broken). */\n target: string | null\n /** What the reference should show now, or null when that cannot be computed. */\n value: string | null\n}\n\n/** A `REF` field whose cached result no longer says what its target now is. */\nexport interface StaleReference {\n paragraphId: string\n offset: number\n instruction: string\n /** The current value, or null when the target is gone (the reference is broken). */\n value: string | null\n /** The field's cached result (what it last showed). */\n cached: string\n bookmark: string\n mode: CrossReferenceMode\n}\n\n/** A cross-reference whose target was deleted: its last text, marked in the Broken style. */\nexport interface BrokenReference {\n paragraphId: string\n offset: number\n text: string\n}\n\n/** Every cross-reference of the document, in document order. */\nexport function crossReferences(port: ReferencesReader): CrossReference[] {\n const paragraphs = port.paragraphs()\n if (!paragraphs.some((p) => p.fields?.length)) return []\n const items = port.listItems()\n const order = paragraphs.map((p) => p.id)\n const owner = new Map<string, string>()\n for (const p of paragraphs) for (const b of p.bookmarks) if (!owner.has(b)) owner.set(b, p.id)\n const out: CrossReference[] = []\n for (const p of paragraphs)\n for (const field of p.fields ?? []) {\n const match = REF_FIELD.exec(field.instruction)\n if (!match || !match[1].startsWith(REF_BOOKMARK_PREFIX)) continue\n const switches = match[2].toLowerCase()\n const mode: CrossReferenceMode = /\\\\[rwn]\\b/.test(switches) ? 'number' : 'text'\n const target = owner.get(match[1]) ?? null\n const value = !target\n ? null\n : mode === 'number'\n ? switches.includes('\\\\r')\n ? paragraphNumber(order, items, port.levelOf, target)\n : null\n : (paragraphs.find((x) => x.id === target)?.text ?? '').replace(//g, '').trim()\n out.push({\n paragraphId: p.id,\n offset: field.offset,\n instruction: field.instruction,\n bookmark: match[1],\n mode,\n cached: field.result,\n target,\n value,\n })\n }\n return out\n}\n\n/**\n * The cross-references whose cached result is out of date: a clause renumbered, a heading\n * reworded, or the target gone. The editor paints a field's live value only while its cached\n * result matches what it computes, so a stale cache shows the OLD number after the document is\n * reopened (and Word shows the cached result until its fields are updated).\n */\nexport function staleCrossReferences(port: ReferencesReader): StaleReference[] {\n return crossReferences(port)\n .filter((ref) => !ref.target || (ref.value && ref.value !== ref.cached.trim()))\n .map(({ paragraphId, offset, instruction, value, cached, bookmark, mode }) => ({\n paragraphId,\n offset,\n instruction,\n value,\n cached,\n bookmark,\n mode,\n }))\n}\n\n/** The broken cross-references marked in the document, in document order. */\nexport function brokenCrossReferences(\n port: Pick<ReferencesReader, 'paragraphs'>\n): BrokenReference[] {\n return port\n .paragraphs()\n .flatMap((p) =>\n (p.marks ?? [])\n .filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE)\n .map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))\n )\n}\n\n/** A new `_Ref` bookmark name: Word's shape (`_Ref` and nine digits), not yet in the document. */\nexport function newRefBookmark(taken: ReadonlySet<string>, random: () => number = Math.random) {\n for (;;) {\n const name = `${REF_BOOKMARK_PREFIX}${String(Math.floor(random() * 9e8) + 1e8)}`\n if (!taken.has(name)) return name\n }\n}\n\nconst styled = (style?: string) => (style ? `<w:rPr><w:rStyle w:val=\"${style}\"/></w:rPr>` : '')\nconst run = (text: string, style?: string) =>\n `<w:r>${styled(style)}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/**\n * A complex `REF` field with its cached result, every run in the Cross Reference style (Word gives\n * an updated result the formatting of the field's first run).\n */\nexport function refFieldXml(instruction: string, cached: string): string {\n const r = (inner: string) => `<w:r>${styled(CROSS_REFERENCE_STYLE)}${inner}</w:r>`\n return `${r('<w:fldChar w:fldCharType=\"begin\"/>')}${r(\n `<w:instrText xml:space=\"preserve\"> ${esc(instruction)} </w:instrText>`\n )}${r('<w:fldChar w:fldCharType=\"separate\"/>')}${run(cached, CROSS_REFERENCE_STYLE)}${r(\n '<w:fldChar w:fldCharType=\"end\"/>'\n )}`\n}\n\n/** The screen tip of a reference to this document: \"Cross-reference to clause 2.2\". */\nexport const refTooltip = (value: string, mode: CrossReferenceMode) =>\n mode === 'number' ? `Cross-reference to clause ${value}` : `Cross-reference to “${value}”`\n\n/**\n * A reference to this document: the `REF` field inside a link to the same bookmark, which carries\n * the screen tip Word shows on hover (\"Cross-reference to clause 2.2\").\n */\nexport function crossReferenceXml(bookmark: string, mode: CrossReferenceMode, value: string) {\n return `<w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(\n refTooltip(value, mode)\n )}\" w:history=\"1\">${refFieldXml(refInstruction(bookmark, mode), value)}</w:hyperlink>`\n}\n\n/** The field instruction for a target: its paragraph number, or its text. */\nexport const refInstruction = (bookmark: string, mode: CrossReferenceMode) =>\n mode === 'number' ? `REF ${bookmark} \\\\r \\\\h` : `REF ${bookmark} \\\\h`\n\n/** What the reference reads in the text. */\nexport const refResult = (target: CrossReferenceTarget, mode: CrossReferenceMode) =>\n mode === 'number' && target.number ? target.number : target.text\n\nconst allBookmarks = (port: ReferencesPort) =>\n new Set(port.paragraphs().flatMap((p) => p.bookmarks))\n\n/**\n * The `_Ref` bookmark a target carries: an existing one at the paragraph, else a new one. For a\n * paragraph number it is an empty bookmark at the paragraph's start (the number is the\n * paragraph's); for heading text it wraps the heading's runs (REF shows the bookmarked text).\n */\nexport function ensureTargetBookmark(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode\n): string {\n const paragraph = port.paragraphs().find((p) => p.id === target.paragraphId)\n if (!paragraph) throw new Error('That clause is no longer in the document.')\n const existing = paragraph.bookmarks.find((b) => b.startsWith(REF_BOOKMARK_PREFIX))\n if (existing && mode === 'number') return existing\n const name = newRefBookmark(allBookmarks(port))\n const start = `<w:bookmarkStart w:id=\"0\" w:name=\"${name}\"/>`\n const end = '<w:bookmarkEnd w:id=\"0\"/>'\n if (mode === 'number') {\n port.setCaret({ paragraphId: paragraph.id, offset: 0 })\n if (!port.paste(`<w:p>${start}${end}</w:p>`, '', false))\n throw new Error('The cross-reference target could not be marked.')\n return name\n }\n const runs = port.runsXml(paragraph.id)\n if (!runs) throw new Error('This heading cannot be referred to by its text; use its number.')\n // The heading's text is replaced by the same runs inside the bookmark.\n port.deleteRange(\n { paragraphId: paragraph.id, offset: 0 },\n { paragraphId: paragraph.id, offset: paragraph.text.length }\n )\n if (!port.paste(`<w:p>${start}${runs}${end}</w:p>`, paragraph.text, false))\n throw new Error('The cross-reference target could not be marked.')\n return name\n}\n\n/**\n * Where to paste at `caret`. Right after a field the engine would paste INTO the field (its result\n * runs), so a space is typed first and the paste goes after it.\n */\nfunction pastePoint(port: ReferencesPort, caret: DocPoint): DocPoint {\n const paragraph = port.paragraphs().find((p) => p.id === caret.paragraphId)\n if (paragraph?.text[caret.offset - 1] !== FIELD_ATOM) return caret\n port.setCaret(caret)\n port.typeText(' ')\n return { paragraphId: caret.paragraphId, offset: caret.offset + 1 }\n}\n\n/**\n * Mark a cross-reference's target (see {@link ensureTargetBookmark}): what the reference will\n * address and read. A paragraph number falls back to the heading text when it has none. Done as a\n * direct edit even while suggesting — the bookmark is hidden, and a heading's text is put back as\n * it was — so rejecting the reference leaves the target as it was.\n */\nexport function markCrossReferenceTarget(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode\n): { bookmark: string; mode: CrossReferenceMode; value: string } {\n if (mode === 'number' && !target.number) mode = 'text'\n const bookmark = ensureTargetBookmark(port, target, mode)\n return { bookmark, mode, value: refResult(target, mode) }\n}\n\n/**\n * Insert the `REF` field of a marked target at `caret`; the caret ends after it. With a port\n * whose pastes are tracked, the reference is one suggestion.\n */\nexport function insertCrossReferenceField(\n port: ReferencesPort,\n { bookmark, mode, value }: { bookmark: string; mode: CrossReferenceMode; value: string },\n caret: DocPoint\n): { bookmark: string } {\n caret = pastePoint(port, caret)\n port.setCaret(caret)\n if (!port.paste(`<w:p>${crossReferenceXml(bookmark, mode, value)}</w:p>`, value, false))\n throw new Error('The cross-reference could not be inserted.')\n // A field is one character of the paragraph.\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + 1 })\n return { bookmark }\n}\n\n/** Insert a cross-reference to a target of this document at `caret`; the caret ends after it. */\nexport function insertCrossReference(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode,\n caret: DocPoint\n): { bookmark: string } {\n return insertCrossReferenceField(port, markCrossReferenceTarget(port, target, mode), caret)\n}\n\n/** The screen tip of a reference to another document: \"Cross-reference: SPA, clause 8.2 — opens in ARBI\". */\nexport const documentReferenceTooltip = (text: string, appName = 'ARBI') =>\n `Cross-reference: ${text} — opens in ${appName}`\n\n/**\n * Insert a reference to another document's passage: the reference text in the Cross Reference\n * style, linked to the passage's (absolute) app address, at `caret`.\n */\nexport function insertDocumentReference(\n port: ReferencesPort,\n reference: { text: string; url: string; appName?: string },\n caret: DocPoint\n): void {\n const text = reference.text.trim()\n if (!text) throw new Error('Enter the reference text.')\n const tooltip = documentReferenceTooltip(text, reference.appName).slice(0, 255)\n caret = pastePoint(port, caret)\n port.setCaret(caret)\n const link = `<w:p><w:hyperlink r:id=\"rIdRef1\"${\n tooltip ? ` w:tooltip=\"${esc(tooltip)}\"` : ''\n } w:history=\"1\">${run(text, CROSS_REFERENCE_STYLE)}</w:hyperlink></w:p>`\n if (!port.paste(link, text, false, hyperlinkRelationship('rIdRef1', reference.url)))\n throw new Error('The reference could not be inserted.')\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + text.length })\n}\n\nexport interface RefreshResult {\n /** References rewritten with their current number or text. */\n refreshed: number\n /** References whose target is gone, now (or already) marked broken. */\n broken: BrokenReference[]\n}\n\n/**\n * Bring every cross-reference up to date: a stale one is replaced by the same reference with its\n * current value (and screen tip); one whose target was deleted becomes its last text in the Cross\n * Reference Broken style — never Word's \"Error! Reference source not found.\" A field directly\n * after another field is left alone: a paste there would land inside the previous field.\n */\nexport function refreshCrossReferences(port: ReferencesPort): RefreshResult {\n const stale = staleCrossReferences(port).sort((a, b) =>\n a.paragraphId === b.paragraphId ? b.offset - a.offset : 0\n )\n let refreshed = 0\n for (const ref of stale) {\n const paragraph = port.paragraphs().find((p) => p.id === ref.paragraphId)\n if (!paragraph || paragraph.text[ref.offset - 1] === FIELD_ATOM) continue\n const at = { paragraphId: ref.paragraphId, offset: ref.offset }\n port.deleteRange(at, { paragraphId: ref.paragraphId, offset: ref.offset + 1 })\n port.setCaret(at)\n const text = ref.value ?? (ref.cached.trim() || ref.bookmark)\n const body =\n ref.value === null\n ? run(text, BROKEN_CROSS_REFERENCE_STYLE)\n : crossReferenceXml(ref.bookmark, ref.mode, ref.value)\n if (port.paste(`<w:p>${body}</w:p>`, text, false) && ref.value !== null) refreshed++\n }\n return { refreshed, broken: brokenCrossReferences(port) }\n}\n\ntype Attr = { localName: string; value: string; prefix?: string }\ntype Element = OoxmlNodeLike & { prefix?: string }\n\n/** Run content a heading may hold and still be rewritten as runs. */\nconst RUN_PARTS = new Set(['rPr', 't', 'tab', 'br', 'lastRenderedPageBreak'])\n/** Paragraph children that are not content (kept out of the rewrite). */\nconst SKIPPED = new Set(['pPr', 'bookmarkStart', 'bookmarkEnd', 'proofErr', 'permStart', 'permEnd'])\n\nfunction serialize(node: Element): string {\n if (node.kind === 'textValue') return esc(node.value ?? '')\n const name = `${node.prefix ?? 'w'}:${node.localName}`\n const attrs = ((node.attributes ?? []) as readonly Attr[])\n .map((a) => ` ${a.prefix ? `${a.prefix}:` : ''}${a.localName}=\"${esc(a.value)}\"`)\n .join('')\n const children = (node.children ?? []).map((c) => serialize(c as Element)).join('')\n return children ? `<${name}${attrs}>${children}</${name}>` : `<${name}${attrs}/>`\n}\n\n/** A paragraph's runs as XML (formatting kept), or null for anything but plain runs. */\nexport function paragraphRunsXml(paragraph: OoxmlNodeLike): string | null {\n const runs: string[] = []\n for (const child of (paragraph.children ?? []) as Element[]) {\n if (child.localName && SKIPPED.has(child.localName)) continue\n if (child.localName !== 'r') return null\n if ((child.children ?? []).some((c) => !c.localName || !RUN_PARTS.has(c.localName))) return null\n runs.push(serialize(child))\n }\n return runs.length ? runs.join('') : null\n}\n","/**\n * Signature fields in a Word document (ARBI `docs/signature-anchor-fields.md`).\n *\n * A field is a content control tagged `arbi-signature:<kind>[:<key>]` whose text is a chip\n * (\"Signature — Priya Shah\"), locked against typing. A keyed field carries a hidden payload in a\n * customXml part (`SIGNATURE_FIELDS_NAMESPACE`) naming its signer: their email and name, and\n * whether the field is required. When a version is rendered to PDF, ARBI's parser turns each\n * field into an invisible anchor, and a signature request places the field exactly there, for\n * that signer. A field with no key has no signer yet: it is assigned when the request is made.\n *\n * The collaboration service (ARBI's `insert_signature_field`) writes the same control.\n */\nimport type { OoxmlNodeLike } from './read'\n\nexport const SIGNATURE_FIELDS_NAMESPACE = 'urn:arbi:signature-fields'\nexport const SIGNATURE_FIELD_TAG_PREFIX = 'arbi-signature:'\n\nexport const SIGNATURE_FIELD_KINDS = ['signature', 'initials', 'date', 'name'] as const\nexport type SignatureFieldKind = (typeof SIGNATURE_FIELD_KINDS)[number]\n\n/** The labels a signature request uses for the same kinds (`FIELD_TYPE_LABELS`). */\nexport const SIGNATURE_FIELD_LABELS: Record<SignatureFieldKind, string> = {\n signature: 'Signature',\n initials: 'Initials',\n date: 'Date signed',\n name: 'Name',\n}\n\nconst TAG = /^arbi-signature:(signature|initials|date|name)(?::([0-9a-f]{8}))?$/\nconst EMAIL = /^[^@\\s<>,;]{1,64}@[^@\\s<>,;]{1,255}\\.[^@\\s<>,;]{1,63}$/\n\nexport interface SignatureFieldSpec {\n kind: SignatureFieldKind\n /** The signer's email; omitted for a field whose signer is chosen when the request is made. */\n email?: string | null\n name?: string | null\n required?: boolean\n}\n\n/** What the payload of a keyed field holds. */\nexport interface SignatureFieldPayload {\n key: string\n kind: SignatureFieldKind\n email: string\n name: string | null\n required: boolean\n}\n\nexport const isSignerEmail = (value: string) => EMAIL.test(value.trim())\n\n/** 8 random hex digits: the key the field and its PDF anchor share. */\nexport function newSignatureFieldKey(): string {\n const bytes = new Uint8Array(4)\n globalThis.crypto.getRandomValues(bytes)\n return [...bytes].map((b) => b.toString(16).padStart(2, '0')).join('')\n}\n\nexport const signatureFieldTag = (kind: SignatureFieldKind, key?: string | null) =>\n `${SIGNATURE_FIELD_TAG_PREFIX}${kind}${key ? `:${key}` : ''}`\n\n/** The chip's text: what the field is, and for whom (\"Signature — Priya Shah\"). */\nexport const signatureFieldLabel = (kind: SignatureFieldKind, who?: string | null) =>\n who?.trim() ? `${SIGNATURE_FIELD_LABELS[kind]} — ${who.trim()}` : SIGNATURE_FIELD_LABELS[kind]\n\nexport function parseSignatureFieldTag(\n tag: string | null | undefined\n): { kind: SignatureFieldKind; key: string | null } | null {\n const m = TAG.exec(tag ?? '')\n return m ? { kind: m[1] as SignatureFieldKind, key: m[2] ?? null } : null\n}\n\n/**\n * The engine's custom-node write for a field at `at` (the store's `insertCustomNode`): the\n * control, and for a field with a signer its payload, in one transaction.\n */\nexport function signatureFieldWrite(\n spec: SignatureFieldSpec,\n at: { paragraphId: string; offset: number },\n key: string = newSignatureFieldKey()\n) {\n const email = spec.email?.trim().toLowerCase() || null\n if (email && !isSignerEmail(email)) throw new Error('Enter the signer’s email address.')\n const name = spec.name?.trim().slice(0, 200) || null\n const text = signatureFieldLabel(spec.kind, name || email)\n const payload: SignatureFieldPayload | null = email\n ? { key, kind: spec.kind, email, name, required: spec.required !== false }\n : null\n return {\n key: payload ? key : null,\n tag: signatureFieldTag(spec.kind, payload ? key : null),\n write: {\n paragraphId: at.paragraphId,\n offset: at.offset,\n tag: signatureFieldTag(spec.kind, payload ? key : null),\n text,\n alias: text,\n lock: 'contentLocked' as const,\n ...(payload\n ? {\n payload: {\n namespaceUri: SIGNATURE_FIELDS_NAMESPACE,\n rootLocalName: 'fields',\n nodeId: `sig-${key}`,\n label: text,\n data: JSON.stringify(payload),\n },\n }\n : {}),\n },\n }\n}\n\nconst attr = (node: OoxmlNodeLike | undefined, name: string) =>\n node?.attributes?.find((a) => a.localName === name)?.value\n\n/** Every signature field control in a part's tree, in document order. */\nexport function signatureFieldControls(\n root: OoxmlNodeLike\n): { nodeId: string; tag: string; kind: SignatureFieldKind; key: string | null }[] {\n const out: { nodeId: string; tag: string; kind: SignatureFieldKind; key: string | null }[] = []\n const visit = (node: OoxmlNodeLike) => {\n if (node.localName === 'sdt') {\n const props = node.children?.find((c) => c.localName === 'sdtPr')\n const tag = attr(\n props?.children?.find((c) => c.localName === 'tag'),\n 'val'\n )\n const parsed = parseSignatureFieldTag(tag)\n if (parsed && tag) out.push({ nodeId: node.id, tag, ...parsed })\n }\n if (node.kind !== 'textValue') for (const child of node.children ?? []) visit(child)\n }\n visit(root)\n return out\n}\n","/**\n * Undo for the changes ARBI applies directly (they cannot be tracked): a paragraph style or format,\n * a table's properties, the page setup, refreshed field results. Before the change, the state it\n * replaces is captured as a small JSON record, kept in the room (the `agentUndo` map of the room's\n * Y.Doc, keyed by the id of the comment that announces the change) so it survives a reload. Undo\n * turns the record back into store ops, addressed by `w14:paraId` so they resolve on any replica:\n * the collaboration service and a browser alike.\n */\nimport {\n ACCEPTED_PARAGRAPH_PROPERTIES,\n type OoxmlProperty,\n type TabStopWrite,\n type TreeDocOp,\n} from '@docx-editor.dev/core/store'\nimport type { OoxmlNodeLike } from './read'\nimport { signatureFieldControls } from './signatureFields'\n\n/** The room's Y.Map of undo records, by comment id. */\nexport const AGENT_UNDO_MAP = 'agentUndo'\n\n/** A paragraph's own properties as they were. */\nexport interface ParagraphState {\n paraId: string\n /** The flat accepted properties (`pStyle`, `jc`, `spacing`, `ind`…). */\n properties: OoxmlProperty[]\n numbering: { numId: string; level: number } | null\n tabs: TabStopWrite[]\n}\n\n/** One section's page setup as it was; `paraId` is the paragraph whose mark ends it (null: the last). */\nexport interface SectionState {\n paraId: string | null\n pageWidthTwips?: number\n pageHeightTwips?: number\n orientation?: 'portrait' | 'landscape'\n marginTopTwips?: number\n marginRightTwips?: number\n marginBottomTwips?: number\n marginLeftTwips?: number\n}\n\nexport type UndoRecord =\n | { kind: 'paragraphs'; paragraphs: ParagraphState[] }\n | { kind: 'sections'; sections: SectionState[] }\n /** A table, found by a paragraph in it. */\n | { kind: 'table'; paraId: string; styleId: string | null; headerRowCount: number }\n /** Field results as they were: the `index`-th field of the paragraph. */\n | { kind: 'fields'; fields: { paraId: string; index: number; text: string }[] }\n /** A signature field ARBI inserted (by its tag, which its key makes unique): undo removes it. */\n | { kind: 'signatureField'; tag: string }\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\nconst child = (node: OoxmlNodeLike | undefined, name: string) =>\n node?.children?.find((c) => c.localName === name)\nconst twips = (node: OoxmlNodeLike | undefined, name: string) => {\n const value = node && attr(node, name)\n return value === undefined ? undefined : Number(value)\n}\nconst FLAT = new Set<string>(\n ACCEPTED_PARAGRAPH_PROPERTIES.filter((n) => n !== 'numPr' && n !== 'tabs')\n)\n\n/** Every paragraph of a part, by `w14:paraId`, and the body's own paragraphs in order. */\nexport function paragraphIndex(root: OoxmlNodeLike) {\n const byParaId = new Map<string, OoxmlNodeLike>()\n const parentOf = new Map<OoxmlNodeLike, OoxmlNodeLike>()\n const visit = (node: OoxmlNodeLike) => {\n for (const c of node.children ?? []) {\n parentOf.set(c, node)\n if (c.kind === 'paragraph') {\n const id = attr(c, 'paraId')\n if (id) byParaId.set(id, c)\n }\n if (c.kind !== 'textValue') visit(c)\n }\n }\n visit(root)\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n return { byParaId, parentOf, body }\n}\n\n/** A paragraph's own properties, to restore later. */\nexport function paragraphState(paragraph: OoxmlNodeLike): ParagraphState {\n const pPr = paragraph.children?.find((c) => c.localName === 'pPr')\n const properties: OoxmlProperty[] = []\n let numbering: ParagraphState['numbering'] = null\n const tabs: TabStopWrite[] = []\n for (const p of pPr?.children ?? []) {\n if (p.localName && FLAT.has(p.localName)) {\n properties.push({\n localName: p.localName,\n attributes: Object.fromEntries((p.attributes ?? []).map((a) => [a.localName, a.value])),\n })\n } else if (p.localName === 'numPr') {\n const numId = attr(child(p, 'numId') ?? p, 'val')\n if (numId) numbering = { numId, level: Number(attr(child(p, 'ilvl') ?? p, 'val') ?? 0) }\n } else if (p.localName === 'tabs') {\n for (const tab of p.children ?? []) {\n const val = attr(tab, 'val')\n if (!val || val === 'clear') continue\n tabs.push({\n positionTwips: Number(attr(tab, 'pos') ?? 0),\n alignment: (val === 'start'\n ? 'left'\n : val === 'end'\n ? 'right'\n : val) as TabStopWrite['alignment'],\n ...(attr(tab, 'leader') ? { leader: attr(tab, 'leader') as TabStopWrite['leader'] } : {}),\n })\n }\n }\n }\n return { paraId: attr(paragraph, 'paraId') ?? '', properties, numbering, tabs }\n}\n\n/** Every section's page setup, to restore later. */\nexport function sectionStates(root: OoxmlNodeLike): SectionState[] {\n const { body } = paragraphIndex(root)\n const state = (sectPr: OoxmlNodeLike, paraId: string | null): SectionState => {\n const size = child(sectPr, 'pgSz')\n const margin = child(sectPr, 'pgMar')\n const orient = size && attr(size, 'orient')\n return {\n paraId,\n pageWidthTwips: twips(size, 'w'),\n pageHeightTwips: twips(size, 'h'),\n orientation: orient === 'landscape' ? 'landscape' : 'portrait',\n marginTopTwips: twips(margin, 'top'),\n marginRightTwips: twips(margin, 'right'),\n marginBottomTwips: twips(margin, 'bottom'),\n marginLeftTwips: twips(margin, 'left'),\n }\n }\n const out: SectionState[] = []\n for (const block of body.children ?? []) {\n const sectPr = block.kind === 'paragraph' ? child(child(block, 'pPr'), 'sectPr') : undefined\n if (sectPr) out.push(state(sectPr, attr(block, 'paraId') ?? null))\n else if (block.localName === 'sectPr') out.push(state(block, null))\n }\n return out\n}\n\n/** The table a paragraph is in, or undefined. */\nexport function tableOf(root: OoxmlNodeLike, paraId: string): OoxmlNodeLike | undefined {\n const { byParaId, parentOf } = paragraphIndex(root)\n let node = byParaId.get(paraId)\n while (node && node.localName !== 'tbl') node = parentOf.get(node)\n return node\n}\n\n/** A table's style and header rows, to restore later (`paraId`: a paragraph in it). */\nexport function tableState(root: OoxmlNodeLike, paraId: string): UndoRecord | null {\n const table = tableOf(root, paraId)\n if (!table) return null\n const style = child(child(table, 'tblPr'), 'tblStyle')\n let headerRowCount = 0\n for (const row of table.children ?? []) {\n if (row.localName !== 'tr') continue\n const header = child(child(row, 'trPr'), 'tblHeader')\n if (!header || ['0', 'false', 'off'].includes(attr(header, 'val') ?? '')) break\n headerRowCount++\n }\n return { kind: 'table', paraId, styleId: (style && attr(style, 'val')) ?? null, headerRowCount }\n}\n\n/** The begin `w:fldChar` node ids of a paragraph's complex fields, in order (as `DocParagraph.fields`). */\nexport function fieldNodeIds(paragraph: OoxmlNodeLike): string[] {\n const out: string[] = []\n let depth = 0\n const walk = (node: OoxmlNodeLike) => {\n for (const c of node.children ?? []) {\n if (c.localName === 'del') continue\n if (c.localName === 'fldChar') {\n const type = attr(c, 'fldCharType')\n if (type === 'begin' && depth++ === 0) out.push(c.id)\n else if (type === 'end') depth = Math.max(0, depth - 1)\n } else if (c.kind !== 'textValue') walk(c)\n }\n }\n walk(paragraph)\n return out\n}\n\n/**\n * The store ops that put back what a record captured, against the document as it now is (`root`,\n * the main part's tree). Null when what it changed is no longer there (a paragraph or table gone).\n */\nexport function undoOps(root: OoxmlNodeLike, record: UndoRecord): TreeDocOp[] | null {\n const { byParaId, body } = paragraphIndex(root)\n const ops: TreeDocOp[] = []\n if (record.kind === 'paragraphs') {\n for (const state of record.paragraphs) {\n const paragraph = byParaId.get(state.paraId)\n if (!paragraph) return null\n ops.push(\n { op: 'setParagraphProperties', paragraphId: paragraph.id, properties: state.properties },\n {\n op: 'setListNumbering',\n paragraphId: paragraph.id,\n numId: state.numbering?.numId ?? null,\n ...(state.numbering ? { level: state.numbering.level } : {}),\n },\n { op: 'setParagraphTabStops', paragraphId: paragraph.id, stops: state.tabs }\n )\n }\n } else if (record.kind === 'sections') {\n const last = [...(body.children ?? [])].reverse().find((b) => b.kind === 'paragraph')\n for (const { paraId, ...setup } of record.sections) {\n const anchor = paraId === null ? last : byParaId.get(paraId)\n if (!anchor) return null\n const fields = Object.fromEntries(Object.entries(setup).filter(([, v]) => v !== undefined))\n ops.push({ op: 'setSectionProperties', anchorParagraphId: anchor.id, ...fields })\n }\n } else if (record.kind === 'table') {\n const table = tableOf(root, record.paraId)\n if (!table) return null\n ops.push({\n op: 'setTableProperties',\n tableId: table.id,\n styleId: record.styleId ?? '',\n headerRowCount: record.headerRowCount,\n })\n } else if (record.kind === 'signatureField') {\n const controls = signatureFieldControls(root).filter((c) => c.tag === record.tag)\n if (!controls.length) return null\n for (const control of controls) {\n // Unlock first: a locked control refuses removal.\n ops.push(\n { op: 'setContentControlProperties', controlId: control.nodeId, lock: 'unlocked' },\n { op: 'removeContentControl', controlId: control.nodeId, keepContent: false }\n )\n }\n } else {\n const updates = []\n for (const { paraId, index, text } of record.fields) {\n const paragraph = byParaId.get(paraId)\n const fieldNodeId = paragraph && fieldNodeIds(paragraph)[index]\n if (!paragraph || !fieldNodeId) return null\n updates.push({ paragraphId: paragraph.id, fieldNodeId, text })\n }\n ops.push({ op: 'refreshFieldResults', updates })\n }\n return ops\n}\n","/**\n * Defined terms in text: a definition's term read from the start of its text (`\"Shares\" means …`,\n * `**Business Day** shall mean …`, `Completion: the date …`), the order of a glossary, and the hidden\n * Word bookmark a term links to. Shared by the editor's Defined Terms and ARBI's headless tools.\n */\n\n/** A definition's text split into its term and the rest. */\nexport interface ParsedDefinition {\n /** The term as written, without quotes or emphasis (`Business Day`). */\n term: string\n /** What follows the term, its connecting word included (`means a day …`, `: the date …`). */\n rest: string\n /** Just the meaning, the connecting word dropped (`a day …`). */\n meaning: string\n}\n\n/** A definition as the commands insert it: the id of its fact, its term and the rest. */\nexport interface DefinitionText extends Pick<ParsedDefinition, 'term' | 'rest'> {\n id: string\n}\n\nconst QUOTES = `\"“”„‟'‘’‚‛«»`\nconst OPEN_CLOSE: Record<string, string> = {\n '\"': '\"',\n '“': '”',\n '„': '“',\n '‟': '”',\n \"'\": \"'\",\n '‘': '’',\n '‚': '‘',\n '‛': '’',\n '«': '»',\n}\nconst EMPHASIS = /^(\\*\\*|__|\\*|_)/\n/** The words (or punctuation) joining a term to its meaning, longest first. */\nconst CONNECTORS =\n /^(?:shall\\s+(?:have\\s+the\\s+meaning|mean|include)s?|ha(?:s|ve)\\s+the\\s+meanings?|means?\\s+and\\s+includes?|means|mean|includes|include|[:—–]|\\s-\\s|-\\s)/i\nconst MAX_TERM_LENGTH = 80\nconst MAX_TERM_WORDS = 10\n\n/** Markdown emphasis and escapes dropped, whitespace collapsed. */\nfunction plain(text: string): string {\n return text\n .replace(/\\\\([\\\\`*_{}[\\]()#+\\-.!\"'])/g, '$1')\n .replace(/(\\*\\*|__)(.+?)\\1/g, '$2')\n .replace(/\\s+/g, ' ')\n .trim()\n}\n\n/** The matching key of a term: case and whitespace folded, quotes and emphasis dropped. */\nexport function termKey(term: string): string {\n return plain(term)\n .replace(new RegExp(`[${QUOTES}*_]`, 'g'), '')\n .replace(/\\s+/g, ' ')\n .trim()\n .toLowerCase()\n}\n\nconst validTerm = (term: string) =>\n term.length > 0 &&\n term.length <= MAX_TERM_LENGTH &&\n term.split(/\\s+/).length <= MAX_TERM_WORDS &&\n /\\p{L}/u.test(term)\n\n/** A connector at the start of `rest` (after optional whitespace): its length, or 0. */\nfunction connectorAt(rest: string): number {\n const lead = rest.length - rest.trimStart().length\n // A spaced hyphen needs its leading space, so try the raw text before the trimmed one.\n const spaced = /^\\s-\\s/.exec(rest)\n if (spaced) return spaced[0].length\n const match = CONNECTORS.exec(rest.slice(lead))\n return match ? lead + match[0].length : 0\n}\n\n/**\n * Read a definition's term from the start of its text, or `null` when it does not start with one.\n *\n * Optional straight or curly quotes and bold markers around the term are dropped; the term is what\n * comes before \"means\", \"shall mean\", \"includes\", \"has the meaning\", a colon, or a dash. A quoted\n * term is taken whole, so `\"Long-Stop Date\" means …` keeps its hyphen.\n */\nexport function parseDefinition(text: string): ParsedDefinition | null {\n let s = plain(text)\n // Leading emphasis markers (`**\"Shares\"** means`), any order with the opening quote.\n for (let i = 0; i < 3; i++) s = s.replace(EMPHASIS, '').trimStart()\n let term: string\n let rest: string\n const open = s[0]\n const close = open ? OPEN_CLOSE[open] : undefined\n if (close) {\n const end = s.indexOf(close, 1)\n if (end < 0) return null\n term = s.slice(1, end)\n rest = s.slice(end + 1)\n // Emphasis or a closing quote between the term and its connector (`\"Shares\"**`, `**\"X**\"`).\n rest = rest.replace(new RegExp(`^(?:\\\\*\\\\*|__|\\\\*|_|[${QUOTES}])+`), '')\n } else {\n // Unquoted: the term runs up to the first connector.\n const match =\n /^(.+?)(\\s+(?:shall\\s+(?:have\\s+the\\s+meaning|mean|include)s?|ha(?:s|ve)\\s+the\\s+meanings?|means?\\s+and\\s+includes?|means|includes)\\b|\\s*[:—–]|\\s+-\\s)/i.exec(\n s\n )\n if (!match) return null\n term = match[1]\n rest = s.slice(match[1].length)\n }\n term = term.replace(/(\\*\\*|__|\\*|_)/g, '').trim()\n const joint = connectorAt(rest)\n if (!joint || !validTerm(term)) return null\n const meaning = rest.slice(joint).trim()\n if (!meaning) return null\n return { term, rest: rest.replace(/^\\s+/, ' ').replace(/^ (?=[:—–])/, ''), meaning }\n}\n\n/** Alphabetical order of terms, as a reader sorts a glossary (case and accents folded). */\nexport const compareTerms = (a: string, b: string) =>\n a.localeCompare(b, undefined, { sensitivity: 'base', numeric: true })\n\n/** Prefix of every bookmark a defined term links to: hidden in Word (leading underscore). */\nexport const DEFINITION_BOOKMARK_PREFIX = '_dt_'\nconst MAX_BOOKMARK_LENGTH = 40\n\n/**\n * The Word bookmark of a definition: `_dt_` and the fact id in valid bookmark characters\n * (`fct-AbC12345` → `_dt_fct_AbC12345`), at most 40 characters as Word requires.\n */\nexport function definitionBookmark(factId: string): string {\n return (DEFINITION_BOOKMARK_PREFIX + factId.replace(/[^A-Za-z0-9_]/g, '_')).slice(\n 0,\n MAX_BOOKMARK_LENGTH\n )\n}\n\n/** The fact id a definition bookmark names, or `null` for any other bookmark. */\nexport function definitionIdOfBookmark(name: string): string | null {\n const match = /^_dt_([a-z]{3})_([A-Za-z0-9]+)$/.exec(name)\n return match ? `${match[1]}-${match[2]}` : null\n}\n","/**\n * A small mutable XML tree over core's hardened reader (`readXml`: no DTDs or entities, bounded),\n * for rewriting WordprocessingML parts. Names are qualified as written (`w:style`); every part this\n * module edits is written by Word, LibreOffice or this engine with the conventional prefixes, and\n * `readPart` refuses a part whose `w` prefix is bound elsewhere rather than editing it blind.\n */\nimport { readXml } from '@docx-editor.dev/core/store'\n\nexport const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\nexport const R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\n\nexport interface El {\n name: string\n attrs: Record<string, string>\n children: Node[]\n}\nexport type Node = El | string\n\nexport class TemplateError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'TemplateError'\n }\n}\n\n/** Parse one part. Text is decoded; comments and the declaration are dropped. */\nexport function parse(xml: string, part = 'part'): El {\n const read = readXml(xml, { maxBytes: 64 * 1024 * 1024, maxElements: 2_000_000 })\n if (!read.ok) throw new TemplateError(`${part} is not readable XML (${read.reason})`)\n const convert = (node: (typeof read.nodes)[number]): Node =>\n node.type === 'text'\n ? node.value\n : { name: node.name, attrs: { ...node.attributes }, children: node.children.map(convert) }\n const root = read.nodes.map(convert).find((n): n is El => typeof n !== 'string')\n if (!root) throw new TemplateError(`${part} has no root element`)\n const w = root.attrs['xmlns:w']\n if (w !== undefined && w !== W_NS) throw new TemplateError(`${part} binds w: to ${w}`)\n return root\n}\n\nconst escText = (s: string) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\nconst escAttr = (s: string) => escText(s).replace(/\"/g, '&quot;')\n\nexport function serialize(root: El): string {\n const out: string[] = ['<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n']\n const walk = (node: Node) => {\n if (typeof node === 'string') return void out.push(escText(node))\n out.push('<', node.name)\n for (const [k, v] of Object.entries(node.attrs)) out.push(' ', k, '=\"', escAttr(v), '\"')\n if (node.children.length === 0) return void out.push('/>')\n out.push('>')\n node.children.forEach(walk)\n out.push('</', node.name, '>')\n }\n walk(root)\n return out.join('')\n}\n\nexport const el = (\n name: string,\n attrs: Record<string, string> = {},\n children: Node[] = []\n): El => ({\n name,\n attrs,\n children,\n})\nexport const isEl = (n: Node | undefined): n is El => typeof n === 'object' && n !== null\nexport const kids = (e: El, name?: string): El[] =>\n e.children.filter((c): c is El => isEl(c) && (name === undefined || c.name === name))\nexport const kid = (e: El | undefined, name: string): El | undefined =>\n e ? kids(e, name)[0] : undefined\n/** `w:val` of a child, e.g. `val(style, 'w:basedOn')`. */\nexport const val = (e: El | undefined, name: string): string | undefined =>\n kid(e, name)?.attrs['w:val']\n\n/** Every descendant element (depth-first, document order), the root included. */\nexport function* walk(e: El): Generator<El> {\n yield e\n for (const c of e.children) if (isEl(c)) yield* walk(c)\n}\n\nexport const clone = <T extends Node>(n: T): T =>\n (typeof n === 'string'\n ? n\n : { name: n.name, attrs: { ...n.attrs }, children: n.children.map(clone) }) as T\n\n/** Text of an element's `w:t` descendants. */\nexport const textOf = (e: El): string =>\n [...walk(e)]\n .filter((x) => x.name === 'w:t')\n .map((x) => x.children.filter((c): c is string => typeof c === 'string').join(''))\n .join('')\n","/**\n * A DOCX/DOTX as a map of part names to bytes, with the OPC plumbing a merge needs: content types,\n * relationships, and resolving a relationship's target to a part name.\n */\nimport { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\nimport { el, kids, parse, serialize, TemplateError, type El } from './xml'\n\nexport const REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\nexport const RT = {\n officeDocument: `${REL}/officeDocument`,\n styles: `${REL}/styles`,\n numbering: `${REL}/numbering`,\n theme: `${REL}/theme`,\n fontTable: `${REL}/fontTable`,\n settings: `${REL}/settings`,\n header: `${REL}/header`,\n footer: `${REL}/footer`,\n image: `${REL}/image`,\n hyperlink: `${REL}/hyperlink`,\n glossary: `${REL}/glossaryDocument`,\n attachedTemplate: `${REL}/attachedTemplate`,\n} as const\nconst WML = 'application/vnd.openxmlformats-officedocument.wordprocessingml'\nexport const CT = {\n document: `${WML}.document.main+xml`,\n template: `${WML}.template.main+xml`,\n macroDocument: 'application/vnd.ms-word.document.macroEnabled.main+xml',\n macroTemplate: 'application/vnd.ms-word.template.macroEnabledTemplate.main+xml',\n styles: `${WML}.styles+xml`,\n numbering: `${WML}.numbering+xml`,\n settings: `${WML}.settings+xml`,\n fontTable: `${WML}.fontTable+xml`,\n header: `${WML}.header+xml`,\n footer: `${WML}.footer+xml`,\n glossary: `${WML}.document.glossary+xml`,\n theme: 'application/vnd.openxmlformats-officedocument.theme+xml',\n rels: 'application/vnd.openxmlformats-package.relationships+xml',\n} as const\n\nexport interface Rel {\n id: string\n type: string\n target: string\n external: boolean\n}\n\n/** Part names are kept without the leading slash, as the zip stores them. */\nexport class Pkg {\n readonly files: Map<string, Uint8Array>\n private types: El\n\n constructor(files: Map<string, Uint8Array>) {\n this.files = files\n const ct = this.find('[Content_Types].xml')\n if (!ct) throw new TemplateError('not a Word package: no [Content_Types].xml')\n this.types = parse(strFromU8(files.get(ct)!), '[Content_Types].xml')\n }\n\n static read(bytes: Uint8Array): Pkg {\n let files: Record<string, Uint8Array>\n try {\n files = unzipSync(bytes)\n } catch {\n throw new TemplateError('not a Word package: not a zip')\n }\n return new Pkg(new Map(Object.entries(files).filter(([n]) => !n.endsWith('/'))))\n }\n\n write(): Uint8Array {\n this.files.set(\n this.find('[Content_Types].xml') ?? '[Content_Types].xml',\n strToU8(serialize(this.types))\n )\n return zipSync(Object.fromEntries(this.files), { level: 6 })\n }\n\n /** The stored name of a part, matched case-insensitively as OPC does. */\n find(name: string): string | undefined {\n const key = name.replace(/^\\//, '').toLowerCase()\n for (const n of this.files.keys()) if (n.toLowerCase() === key) return n\n return undefined\n }\n has(name: string) {\n return this.find(name) !== undefined\n }\n text(name: string): string | undefined {\n const n = this.find(name)\n return n === undefined ? undefined : strFromU8(this.files.get(n)!)\n }\n xml(name: string): El | undefined {\n const t = this.text(name)\n return t === undefined ? undefined : parse(t, name)\n }\n setXml(name: string, root: El, contentType?: string) {\n this.files.set(this.find(name) ?? name, strToU8(serialize(root)))\n if (contentType) this.setContentType(name, contentType)\n }\n setBytes(name: string, bytes: Uint8Array, contentType?: string) {\n this.files.set(this.find(name) ?? name, bytes)\n if (contentType) this.setContentType(name, contentType)\n }\n remove(name: string) {\n const n = this.find(name)\n if (n === undefined) return\n this.files.delete(n)\n this.types.children = this.types.children.filter(\n (c) =>\n !(\n typeof c !== 'string' &&\n c.name === 'Override' &&\n c.attrs.PartName.toLowerCase() === `/${n.toLowerCase()}`\n )\n )\n this.files.delete(relsName(n))\n }\n\n contentType(name: string): string | undefined {\n const part = `/${name.replace(/^\\//, '')}`.toLowerCase()\n const override = kids(this.types, 'Override').find(\n (o) => o.attrs.PartName.toLowerCase() === part\n )\n if (override) return override.attrs.ContentType\n const ext = part.slice(part.lastIndexOf('.') + 1)\n return kids(this.types, 'Default').find((d) => d.attrs.Extension.toLowerCase() === ext)?.attrs\n .ContentType\n }\n setContentType(name: string, type: string) {\n const part = `/${name.replace(/^\\//, '')}`\n const override = kids(this.types, 'Override').find(\n (o) => o.attrs.PartName.toLowerCase() === part.toLowerCase()\n )\n if (override) override.attrs.ContentType = type\n else this.types.children.push(el('Override', { PartName: part, ContentType: type }))\n }\n /** A `Default` for an extension (media), unless one exists. */\n ensureDefault(ext: string, type: string) {\n if (\n !kids(this.types, 'Default').some(\n (d) => d.attrs.Extension.toLowerCase() === ext.toLowerCase()\n )\n )\n this.types.children.unshift(el('Default', { Extension: ext, ContentType: type }))\n }\n\n rels(owner: string): Rel[] {\n const root = this.xml(relsName(owner))\n if (!root) return []\n return kids(root, 'Relationship').map((r) => ({\n id: r.attrs.Id,\n type: r.attrs.Type,\n target: r.attrs.Target,\n external: r.attrs.TargetMode === 'External',\n }))\n }\n setRels(owner: string, rels: Rel[]) {\n const root = el(\n 'Relationships',\n { xmlns: 'http://schemas.openxmlformats.org/package/2006/relationships' },\n rels.map((r) =>\n el('Relationship', {\n Id: r.id,\n Type: r.type,\n Target: r.target,\n ...(r.external ? { TargetMode: 'External' } : {}),\n })\n )\n )\n this.setXml(relsName(owner), root)\n }\n /** Add a relationship from `owner`; returns its new id. */\n addRel(owner: string, type: string, target: string, external = false): string {\n const rels = this.rels(owner)\n const id = freshId(new Set(rels.map((r) => r.id)), 'rIdT')\n rels.push({ id, type, target, external })\n this.setRels(owner, rels)\n return id\n }\n\n /** The part a relationship of `owner` points at (internal targets only). */\n target(owner: string, rel: Rel): string {\n return resolveTarget(owner, rel.target)\n }\n /** The first internal part of a relationship type from `owner`. */\n partOf(owner: string, type: string): string | undefined {\n const rel = this.rels(owner).find((r) => r.type === type && !r.external)\n return rel && this.find(this.target(owner, rel))\n }\n /** The main document part (`word/document.xml` by convention). */\n get main(): string {\n const main = this.partOf('', RT.officeDocument)\n if (!main) throw new TemplateError('not a Word package: no main document part')\n return main\n }\n}\n\n/** `word/document.xml` → `word/_rels/document.xml.rels`; '' (the package) → `_rels/.rels`. */\nexport function relsName(owner: string): string {\n const slash = owner.lastIndexOf('/')\n return `${owner.slice(0, slash + 1)}_rels/${owner.slice(slash + 1)}.rels`\n}\n\nexport function resolveTarget(owner: string, target: string): string {\n if (target.startsWith('/')) return target.slice(1)\n const base = owner\n .slice(0, owner.lastIndexOf('/') + 1)\n .split('/')\n .filter(Boolean)\n for (const seg of target.split('/')) {\n if (seg === '..') base.pop()\n else if (seg !== '.' && seg !== '') base.push(seg)\n }\n return base.join('/')\n}\n\n/** A target for `part` relative to `owner`'s folder. */\nexport function relativeTarget(owner: string, part: string): string {\n const from = owner.slice(0, owner.lastIndexOf('/') + 1)\n return part.startsWith(from) ? part.slice(from.length) : `/${part}`\n}\n\nexport function freshId(taken: ReadonlySet<string>, prefix: string): string {\n for (let i = 1; ; i++) if (!taken.has(`${prefix}${i}`)) return `${prefix}${i}`\n}\n\n/** An unused part name like `word/header3.xml` / `word/media/image2.png`. */\nexport function freshPartName(pkg: Pkg, folder: string, stem: string, ext: string): string {\n for (let i = 1; ; i++) {\n const name = `${folder}${stem}${i}.${ext}`\n if (!pkg.has(name)) return name\n }\n}\n","/**\n * A fragment package marked as one tracked insertion, so that pasting it while suggesting lands a\n * change to review rather than an untracked edit. The editor's paste keeps `w:ins` from a\n * fragment (renumbering its id), and accepting or rejecting the change takes the whole insertion.\n */\nimport { Pkg } from './pkg'\nimport { el, isEl, kid, type El } from './xml'\n\n/** Who made a tracked change and when (`w:author`, `w:date`). */\nexport interface Revision {\n author: string\n /** ISO 8601, seconds precision, e.g. `2026-10-19T09:30:00Z`. */\n date: string\n}\n\n/** Already tracked in the fragment: left as they are. */\nconst TRACKED = new Set(['w:ins', 'w:del', 'w:moveFrom', 'w:moveTo'])\n\n/**\n * The fragment with every run wrapped in `w:ins` and every new paragraph mark marked inserted. A\n * table row is marked inserted as a whole, its cells left as they are: the editor rejects an\n * inserted row whose content is tracked as well only partly. A run is not descended into, so a\n * text box goes in with its run. `covered`: the fragment's last paragraph mark is pasted too (a\n * block before the caret's paragraph); otherwise the last paragraph runs into the text after the\n * caret and its mark is not new.\n */\nexport function trackInsertion(\n fragment: Uint8Array,\n revision: Revision,\n covered: boolean\n): Uint8Array {\n const pkg = Pkg.read(fragment)\n const main = pkg.main\n const root = pkg.xml(main)\n const body = kid(root, 'w:body')\n if (!root || !body) return fragment\n const attrs = { 'w:id': '1', 'w:author': revision.author, 'w:date': revision.date }\n const lastParagraph = body.children.filter(isEl).findLast((c) => c.name === 'w:p')\n\n const visit = (node: El) => {\n node.children = node.children.map((child) => {\n if (!isEl(child)) return child\n if (child.name === 'w:r') return TRACKED.has(node.name) ? child : el('w:ins', attrs, [child])\n if (TRACKED.has(child.name)) return child\n if (child.name === 'w:tr') {\n markRow(child, attrs)\n return child\n }\n visit(child)\n if (child.name === 'w:p' && (covered || child !== lastParagraph)) markParagraph(child, attrs)\n return child\n })\n }\n visit(body)\n pkg.setXml(main, root)\n return pkg.write()\n}\n\n/** `w:pPr/w:rPr/w:ins`: the paragraph mark is inserted (`w:ins` comes first in `CT_ParaRPr`). */\nfunction markParagraph(p: El, attrs: Record<string, string>) {\n let pPr = kid(p, 'w:pPr')\n if (!pPr) p.children.unshift((pPr = el('w:pPr')))\n let rPr = kid(pPr, 'w:rPr')\n if (!rPr) {\n rPr = el('w:rPr')\n // Before `w:sectPr` and `w:pPrChange`, which close `CT_PPr`.\n const at = pPr.children.findIndex(\n (c) => isEl(c) && (c.name === 'w:sectPr' || c.name === 'w:pPrChange')\n )\n pPr.children.splice(at < 0 ? pPr.children.length : at, 0, rPr)\n }\n if (!kid(rPr, 'w:ins')) rPr.children.unshift(el('w:ins', attrs))\n}\n\n/** `w:trPr/w:ins`: the table row is inserted (after the row properties, before `w:trPrChange`). */\nfunction markRow(tr: El, attrs: Record<string, string>) {\n let trPr = kid(tr, 'w:trPr')\n if (!trPr) {\n trPr = el('w:trPr')\n const after = tr.children.findIndex((c) => isEl(c) && c.name === 'w:tblPrEx')\n tr.children.splice(after + 1, 0, trPr)\n }\n if (kid(trPr, 'w:ins')) return\n const at = trPr.children.findIndex((c) => isEl(c) && c.name === 'w:trPrChange')\n trPr.children.splice(at < 0 ? trPr.children.length : at, 0, el('w:ins', attrs))\n}\n","/**\n * Defined-term and cross-reference content as WordprocessingML, and the clipboard fragment (a small\n * `.docx` package) that carries it into a document. The engine has no \"insert bookmark\" command, but\n * its paste lands an embedded fragment with everything in it — `w:bookmarkStart`/`w:bookmarkEnd` and\n * `w:hyperlink w:anchor` included — freshening bookmark ids as it goes.\n */\n\nimport { docxPackage, documentXml, esc, stylesXml } from './ooxml'\nimport { trackInsertion, type Revision } from '../template/track'\nimport {\n BROKEN_CROSS_REFERENCE_STYLE,\n CROSS_REFERENCE_STYLE,\n DEFINED_TERM_STYLE,\n type OoxmlNodeLike,\n} from './read'\nimport type { ParsedDefinition } from './terms'\n\ntype Definition = Pick<ParsedDefinition, 'term' | 'rest'>\n\n/**\n * The character styles the inserted content uses. A paste brings a style the document does not\n * define; one it already defines (a house template's) is used as it is, so only the missing ones\n * go into a fragment (see {@link stylesUsed}).\n */\nexport const CHARACTER_STYLES: Record<string, string> = {\n [DEFINED_TERM_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${DEFINED_TERM_STYLE}\"><w:name w:val=\"Defined Term\"/><w:rPr><w:u w:val=\"dotted\" w:color=\"7F7F7F\"/></w:rPr></w:style>`,\n [CROSS_REFERENCE_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${CROSS_REFERENCE_STYLE}\"><w:name w:val=\"Cross Reference\"/><w:rPr><w:color w:val=\"1F4E79\"/><w:u w:val=\"dotted\" w:color=\"8EA9C1\"/></w:rPr></w:style>`,\n [BROKEN_CROSS_REFERENCE_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${BROKEN_CROSS_REFERENCE_STYLE}\"><w:name w:val=\"Cross Reference Broken\"/><w:basedOn w:val=\"${CROSS_REFERENCE_STYLE}\"/><w:rPr><w:color w:val=\"C00000\"/><w:u w:val=\"wave\" w:color=\"C00000\"/></w:rPr></w:style>`,\n}\n\n/** The character styles a fragment's runs use (`w:rStyle`), as ids. */\nexport function stylesUsed(body: string): string[] {\n return [...new Set([...body.matchAll(/<w:rStyle w:val=\"([^\"]+)\"/g)].map((m) => m[1]))]\n}\n\n// No document defaults: the paste writes a fragment's defaults onto its runs as direct formatting,\n// and pasted terms and definitions should take the formatting of the document they land in.\nconst fragmentStyles = (ids: readonly string[]) =>\n stylesXml(\n '',\n `<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style>${ids\n .map((id) => CHARACTER_STYLES[id] ?? '')\n .join('')}`\n )\n\nconst textRun = (text: string, props = '') =>\n `<w:r>${props ? `<w:rPr>${props}</w:rPr>` : ''}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/** What Word shows on hover over a term: its definition, as one line of at most 255 characters. */\nexport function definitionTooltip(definition: Definition): string {\n const line = `“${definition.term}”${definition.rest}`.replace(/\\s+/g, ' ').trim()\n return line.length > 255 ? `${line.slice(0, 254)}…` : line\n}\n\n/** The definition paragraph's text as the document shows it: `“Shares” means the issued shares.` */\nexport const definitionParagraphText = (definition: Definition) =>\n `“${definition.term}”${definition.rest}`\n\n/**\n * A definition paragraph: the quoted term in bold, bookmarked (`bookmark`), then the definition as\n * the fact writes it. `id` is the bookmark id inside the fragment; the paste renumbers it.\n */\nexport function definitionParagraphXml(definition: Definition, bookmark: string, id = 0): string {\n return `<w:p><w:bookmarkStart w:id=\"${id}\" w:name=\"${esc(bookmark)}\"/>${textRun('“')}${textRun(\n definition.term,\n '<w:b/>'\n )}${textRun('”')}<w:bookmarkEnd w:id=\"${id}\"/>${textRun(definition.rest)}</w:p>`\n}\n\n/** A heading paragraph: the document's own heading style when it has one, else bold text. */\nexport function headingParagraphXml(text: string, styleId?: string): string {\n return styleId\n ? `<w:p><w:pPr><w:pStyle w:val=\"${esc(styleId)}\"/></w:pPr>${textRun(text)}</w:p>`\n : `<w:p><w:pPr><w:keepNext/></w:pPr>${textRun(text, '<w:b/>')}</w:p>`\n}\n\n/** The term as an internal link to its definition's bookmark, with the definition as its tooltip. */\nexport function termLinkXml(term: string, bookmark: string, tooltip: string): string {\n return `<w:p><w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(tooltip)}\" w:history=\"1\">${textRun(\n term,\n `<w:rStyle w:val=\"${DEFINED_TERM_STYLE}\"/>`\n )}</w:hyperlink></w:p>`\n}\n\n/**\n * The fragment package carrying `body` (paragraph XML). `covered` says the last paragraph mark is\n * part of it: the paste then ends with a whole paragraph (a block inserted before the caret's\n * paragraph) instead of running into the text after the caret (inline). With a `revision`, the\n * fragment is one tracked insertion by it.\n */\nexport function fragmentPackage(\n body: string,\n covered: boolean,\n {\n revision,\n relationships,\n styles = stylesUsed(body),\n }: {\n revision?: Revision | null\n /** Relationships the body refers to (a hyperlink's target). */\n relationships?: string\n /** The character styles to bring (default: every one the body uses). */\n styles?: readonly string[]\n } = {}\n): Uint8Array {\n const untracked = docxPackage({\n document: documentXml(body),\n styles: fragmentStyles(styles),\n title: 'Defined terms',\n relationships,\n })\n return revision ? trackInsertion(untracked, revision, covered) : untracked\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** The style ids a document's styles part defines. */\nexport function documentStyleIds(root: OoxmlNodeLike | null | undefined): Set<string> {\n const ids = new Set<string>()\n for (const style of root?.children ?? [])\n if (style.localName === 'style') {\n const id = attr(style, 'styleId')\n if (id) ids.add(id)\n }\n return ids\n}\n","/**\n * The defined-term commands: insert a term as a link to its definition (adding the definition to\n * the document's Definitions section when it is not there yet). Written against\n * {@link DefinitionsPort}, so they run on the live editor and on the in-memory model the tests use\n * alike.\n *\n * Where the Definitions section is: the first top-level paragraph titled \"Definitions\",\n * \"Definitions and interpretation\", \"Interpretation\", \"Defined terms\" or \"Glossary\" (clause numbers\n * ignored), up to the next heading. A document without one gets a \"Definitions\" heading at its end:\n * appended, it never splits the clause being drafted, and it is where a reader of a draft looks\n * for a schedule of terms. Inside the section, definitions are kept in alphabetical order.\n */\n\nimport {\n compareTerms,\n definitionBookmark,\n definitionIdOfBookmark,\n parseDefinition,\n type DefinitionText,\n} from './terms'\nimport {\n definitionParagraphXml,\n definitionTooltip,\n headingParagraphXml,\n termLinkXml,\n} from './fragment'\nimport type { DefinitionsPort } from './port'\nimport { engineLength, type DocParagraph, type DocPoint } from './read'\n\ntype Definition = DefinitionText\n\n/** Title of a Definitions section the commands create. */\nexport const DEFINITIONS_HEADING = 'Definitions'\n\nconst SECTION_TITLE =\n /^(definitions?(\\s*(and|&)\\s*interpretations?)?|interpretations?(\\s*(and|&)\\s*definitions?)?|defined\\s+terms|glossary)$/i\n/** Clause numbering in front of a title: `1.`, `1.1`, `Clause 1`, `A)`, `Schedule 2 -`. */\nconst NUMBERING =\n /^(?:(?:clause|section|article|schedule|part)\\s+)?(?:[0-9]+(?:\\.[0-9]+)*|[A-Z]|[ivxlc]+)[.):]?\\s+(?:[-–—]\\s*)?/i\n\n/** Whether a paragraph titles a Definitions section. */\nexport function isDefinitionsTitle(paragraph: DocParagraph): boolean {\n if (!paragraph.topLevel) return false\n const title = paragraph.text\n .trim()\n .replace(NUMBERING, '')\n .replace(/[.:]+$/, '')\n .trim()\n return SECTION_TITLE.test(title) && (paragraph.heading || title.length <= 40)\n}\n\n/** The Definitions section: its title's index and the paragraphs after it, up to the next heading. */\nexport interface DefinitionsSection {\n title: number\n /** First paragraph after the title. */\n start: number\n /** Index after the section's last paragraph (the next heading, a table, or the end). */\n end: number\n}\n\nexport function findDefinitionsSection(\n paragraphs: readonly DocParagraph[]\n): DefinitionsSection | null {\n const title = paragraphs.findIndex(isDefinitionsTitle)\n if (title < 0) return null\n let end = title + 1\n while (end < paragraphs.length && paragraphs[end].topLevel && !paragraphs[end].heading) end++\n return { title, start: title + 1, end }\n}\n\n/** The term a section paragraph defines, or `null` (an interpretation rule, a blank line…). */\nconst termOf = (paragraph: DocParagraph) => parseDefinition(paragraph.text)?.term ?? null\n\n/**\n * Where a definition of `term` goes in the section, alphabetically: before the first definition\n * whose term sorts after it, else after the last definition (else right after the title).\n */\nexport function insertionIndex(\n paragraphs: readonly DocParagraph[],\n section: DefinitionsSection,\n term: string,\n skip: ReadonlySet<string> = new Set()\n): number {\n let afterLast = section.start\n for (let i = section.start; i < section.end; i++) {\n if (skip.has(paragraphs[i].id)) continue\n const other = termOf(paragraphs[i])\n if (other === null) continue\n if (compareTerms(other, term) > 0) return i\n afterLast = i + 1\n }\n return afterLast\n}\n\n/** The document's heading style, read off its headings (so a new section matches them). */\nconst headingStyle = (paragraphs: readonly DocParagraph[]) =>\n paragraphs.find((p) => p.topLevel && p.heading && p.styleId)?.styleId\n\n/**\n * Paste `body` (`count` paragraphs) as paragraphs at `index`: before the paragraph there, or after\n * the last one. Answers the paragraph id of `keep` afterwards — pasting before a paragraph hands its\n * node to the first pasted paragraph, so a caret is tracked by position, not by id.\n */\nfunction insertParagraphs(\n port: DefinitionsPort,\n index: number,\n body: string,\n count: number,\n keep?: DocPoint\n): DocPoint | undefined {\n const before = port.paragraphs()\n const kept = keep ? before.findIndex((p) => p.id === keep.paragraphId) : -1\n if (index < before.length) {\n port.setCaret({ paragraphId: before[index].id, offset: 0 })\n } else {\n // At the end: open an empty paragraph to paste in front of (it stays as the last line). Its end\n // counts pending deleted text, as every engine offset does.\n const last = before[before.length - 1]\n port.setCaret({ paragraphId: last.id, offset: engineLength(last) })\n port.splitParagraph()\n const opened = port.paragraphs()\n port.setCaret({ paragraphId: opened[opened.length - 1].id, offset: 0 })\n }\n if (!port.paste(body, '', true)) throw new Error('The definition could not be added.')\n if (!keep || kept < 0) return keep\n const after = port.paragraphs()\n const moved = index <= kept ? kept + count : kept\n return { paragraphId: after[moved]?.id ?? keep.paragraphId, offset: keep.offset }\n}\n\n/**\n * Add a definition paragraph to the Definitions section (made at the end of the document when there\n * is none), in alphabetical order. Answers where `keep` moved to.\n */\nexport function addDefinition(\n port: DefinitionsPort,\n definition: Definition,\n keep?: DocPoint\n): DocPoint | undefined {\n const paragraphs = port.paragraphs()\n const section = findDefinitionsSection(paragraphs)\n const paragraph = definitionParagraphXml(definition, definitionBookmark(definition.id))\n if (section)\n return insertParagraphs(\n port,\n insertionIndex(paragraphs, section, definition.term),\n paragraph,\n 1,\n keep\n )\n return insertParagraphs(\n port,\n paragraphs.length,\n headingParagraphXml(DEFINITIONS_HEADING, headingStyle(paragraphs)) + paragraph,\n 2,\n keep\n )\n}\n\n/** Whether a bookmark is declared anywhere in the body. */\nconst hasBookmark = (paragraphs: readonly DocParagraph[], name: string) =>\n paragraphs.some((p) => p.bookmarks.includes(name))\n\nexport interface InsertTermResult {\n /** The definition was not in the document yet and was added to its Definitions section. */\n addedDefinition: boolean\n}\n\n/** A paragraph's words between two engine offsets, as a replacement addresses them. */\nexport interface ReplacedSpan {\n paragraphId: string\n from: number\n to: number\n}\n\nconst paragraphOf = (port: DefinitionsPort, id: string) =>\n port.paragraphs().find((p) => p.id === id)\n\n/**\n * Replace `span` with what `insert` puts at the caret (`length` characters), as one change that\n * never removes words without their replacement: the replacement goes in first, right after the\n * words, and only once it is in are the words deleted. A refused insert changes nothing; a refused\n * deletion takes the insert back out (deleting an insertion of one's own removes it). Answers\n * whether the replacement landed, the caret after it.\n */\nexport function replaceSpan(\n port: DefinitionsPort,\n span: ReplacedSpan,\n insert: () => boolean,\n length: number\n): boolean {\n const { paragraphId, from, to } = span\n if (from > to) throw new Error('A replacement runs forwards.')\n const before = paragraphOf(port, paragraphId)\n if (!before) throw new Error('That paragraph is no longer in the document.')\n const length0 = engineLength(before)\n port.setCaret({ paragraphId, offset: to })\n if (!insert()) return false\n if (from < to) {\n try {\n port.deleteRange({ paragraphId, offset: from }, { paragraphId, offset: to })\n } catch (error) {\n port.deleteRange({ paragraphId, offset: to }, { paragraphId, offset: to + length })\n throw error\n }\n }\n // A tracked deletion keeps the words (before the replacement); an untracked one removes them.\n const after = paragraphOf(port, paragraphId)\n const kept = after && engineLength(after) - length0 === length\n port.setCaret({ paragraphId, offset: (kept ? to : from) + length })\n return true\n}\n\n/**\n * Insert a defined term at the caret: the term as an internal link to its definition's bookmark\n * (its definition as the link's tooltip), the definition added to the Definitions section first\n * when the document does not have it. `replace` characters before the caret (a typed `@@query`,\n * or the term's own plain words) are replaced by it, as one change (see {@link replaceSpan}): a\n * term that cannot be inserted leaves them in place. The caret ends after the term.\n */\nexport function insertDefinedTerm(\n port: DefinitionsPort,\n definition: Definition,\n options: { replace?: number } = {}\n): InsertTermResult {\n const start = port.caret()\n if (!start) throw new Error('Place the cursor where the term should go.')\n const bookmark = definitionBookmark(definition.id)\n const addedDefinition = !hasBookmark(port.paragraphs(), bookmark)\n const caret = (addedDefinition && addDefinition(port, definition, start)) || start\n const insert = () =>\n port.paste(\n termLinkXml(definition.term, bookmark, definitionTooltip(definition)),\n definition.term,\n false\n )\n const from = Math.max(0, caret.offset - (options.replace ?? 0))\n if (\n !replaceSpan(\n port,\n { paragraphId: caret.paragraphId, from, to: caret.offset },\n insert,\n definition.term.length\n )\n )\n throw new Error('The term could not be inserted.')\n return { addedDefinition }\n}\n\n/** Term groups keyed for quick lookup of the definition a bookmark points at. */\nexport function definitionsById<D extends Definition>(definitions: readonly D[]): Map<string, D> {\n return new Map(definitions.map((d) => [d.id, d]))\n}\n\n/** The definition an internal link points at, from its bookmark name. */\nexport function definitionOfAnchor<D extends Definition>(\n anchor: string,\n definitions: ReadonlyMap<string, D>\n): D | undefined {\n const id = definitionIdOfBookmark(anchor.replace(/^#/, ''))\n return id ? definitions.get(id) : undefined\n}\n","/**\n * A defined term applied across a whole document in one command: the other words used for it\n * (`variants`: \"Vendor\", \"Provider\", \"supplier\") each replaced by the term, and, with `link`, every\n * use of the term linked to its definition. Each occurrence is its own tracked change, made with\n * the defined-term commands ({@link replaceSpan}, the term link of {@link insertDefinedTerm}), so a\n * reviewer accepts or rejects them one by one.\n *\n * Which words are uses: whole words only (not part of a longer word or a hyphenated compound),\n * matched exactly as written, case included. A defined term is written with its capitals, so the\n * ordinary word (\"supplier\") is not a use of the term (\"Supplier\") unless it is listed as a\n * variant. A variant written with its article (\"the Vendor\") counts only with that article in\n * front, and keeps it: only the name is replaced (\"the Supplier\"). Never touched: the definition of the term or of a variant, words inside a link (an\n * already linked term among them) or inside a field (a cross-reference's or other computed text),\n * and words inside a pending tracked change.\n */\nimport { addDefinition, replaceSpan } from './definitions'\nimport { definitionTooltip, termLinkXml } from './fragment'\nimport type { DefinitionsPort } from './port'\nimport { engineOffset, FIELD_ATOM, type DocParagraph } from './read'\nimport { definitionBookmark, parseDefinition, termKey, type DefinitionText } from './terms'\n\nexport interface TermSpec {\n /** The defined term, as the document writes it (\"Supplier\"). */\n term: string\n /** Other words used for it, each replaced by the term. */\n variants?: readonly string[]\n /** Link every use of the term (the replaced variants included) to its definition. */\n link?: boolean\n}\n\n/** One use of the term or a variant: `offset` into its paragraph's `text`. */\nexport interface TermUse {\n paragraphId: string\n paraId?: string\n offset: number\n text: string\n kind: 'term' | 'variant'\n}\n\nexport type TermSkipReason =\n 'definition' | 'linked' | 'link' | 'field' | 'pending-change' | 'unsupported-content' | 'refused'\n\n/** A use left as it is, and why. */\nexport interface TermSkip extends TermUse {\n reason: TermSkipReason\n}\n\n/** A use changed: replaced by the term (`text` → `to`), linked to its definition or both. */\nexport interface TermChange extends TermUse {\n to: string\n linked: boolean\n}\n\nexport interface TermEverywhereResult {\n changed: TermChange[]\n skipped: TermSkip[]\n /** The definition was not in the document and was added to its Definitions section. */\n addedDefinition: boolean\n}\n\n/** Words a whole word never runs into: letters, digits and the joins of a compound. */\nconst WORD = '[\\\\p{L}\\\\p{N}_\\\\-‐‑]'\n\nconst escape = (text: string) => text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/**\n * An article in front of a name (\"the Vendor\"). A variant may be written with one, and then only\n * uses with it count, but the article is never replaced: \"the Vendor\" becomes \"the Supplier\", not\n * \"Supplier\". Its first letter matches either case, as at the start of a sentence.\n */\nconst ARTICLE = /^(the|a|an|this|that|such|said)\\s+/i\n\n/** A term or variant without a leading article (\"the Supplier\" is the term \"Supplier\"). */\nexport const withoutArticle = (words: string) =>\n words.replace(/\\s+/g, ' ').trim().replace(ARTICLE, '')\n\nconst anyCase = (word: string) =>\n `[${word[0].toUpperCase()}${word[0].toLowerCase()}]${escape(word.slice(1))}`\n\n/** The words to look for: the variants (distinct, never the term itself), and the term to link. */\nfunction needlesOf(spec: TermSpec): { text: string; kind: TermUse['kind']; pattern: RegExp }[] {\n const term = withoutArticle(spec.term)\n const seen = new Set<string>()\n const needles: { text: string; article: string; kind: TermUse['kind'] }[] = []\n for (const raw of spec.variants ?? []) {\n const words = raw.replace(/\\s+/g, ' ').trim()\n const article = ARTICLE.exec(words)?.[1] ?? ''\n const text = words.slice(article ? ARTICLE.exec(words)![0].length : 0)\n const key = `${article.toLowerCase()} ${text}`\n if (!text || text === term || seen.has(key)) continue\n seen.add(key)\n needles.push({ text, article, kind: 'variant' })\n }\n if (spec.link) needles.push({ text: term, article: '', kind: 'term' })\n return needles.map((n) => ({\n text: n.text,\n kind: n.kind,\n pattern: new RegExp(\n `(?<!${WORD})(${n.article ? `${anyCase(n.article)}\\\\s+` : ''})(${n.text\n .split(' ')\n .map(escape)\n .join('\\\\s+')})(?!${WORD})`,\n 'gu'\n ),\n }))\n}\n\n/** Whole-word matches in `text`, leftmost first and the longest where two start together. */\nfunction matchesIn(text: string, needles: ReturnType<typeof needlesOf>) {\n const found: { offset: number; text: string; kind: TermUse['kind'] }[] = []\n for (const needle of needles)\n for (const m of text.matchAll(needle.pattern))\n found.push({ offset: (m.index ?? 0) + m[1].length, text: m[2], kind: needle.kind })\n found.sort((a, b) => a.offset - b.offset || b.text.length - a.text.length)\n const out: typeof found = []\n for (const m of found)\n if (!out.length || m.offset >= out[out.length - 1].offset + out[out.length - 1].text.length)\n out.push(m)\n return out\n}\n\nconst overlaps = (start: number, end: number, from: number, to: number) => start < to && from < end\n\n/**\n * Every use of the term (when linking) and of its variants in `paragraphs`: the ones to change,\n * and the ones left as they are with the reason. `bookmark` is the definition's, which tells an\n * already linked term apart from a word inside some other link.\n */\nexport function findTermUses(\n paragraphs: readonly DocParagraph[],\n spec: TermSpec,\n bookmark?: string\n): { uses: TermUse[]; skipped: TermSkip[] } {\n const needles = needlesOf(spec)\n const defining = new Set(\n [spec.term, ...(spec.variants ?? [])].map((w) => termKey(withoutArticle(w)))\n )\n const uses: TermUse[] = []\n const skipped: TermSkip[] = []\n for (const p of paragraphs) {\n const at = { paragraphId: p.id, ...(p.paraId ? { paraId: p.paraId } : {}) }\n const defined = parseDefinition(p.text.split(FIELD_ATOM).join(''))\n const isDefinition = defined !== null && defining.has(termKey(defined.term))\n for (const m of matchesIn(p.text, needles)) {\n const use = { ...at, ...m }\n const end = m.offset + m.text.length\n const link = p.links.find(\n (l) => l.offset !== undefined && overlaps(m.offset, end, l.offset, l.offset + l.text.length)\n )\n const pending = (p.revisions ?? []).some((r) =>\n r.kind === 'insert'\n ? overlaps(m.offset, end, r.offset, r.offset + r.length)\n : r.offset > m.offset && r.offset < end\n )\n const reason: TermSkipReason | null = isDefinition\n ? 'definition'\n : link\n ? link.anchor === bookmark\n ? 'linked'\n : 'link'\n : pending\n ? 'pending-change'\n : null\n if (reason) skipped.push({ ...use, reason })\n else uses.push(use)\n }\n // A field's text (a cross-reference's number, a document property) is computed, not written.\n for (const field of p.fields ?? [])\n for (const m of matchesIn(field.result, needles))\n skipped.push({ ...at, offset: field.offset, text: m.text, kind: m.kind, reason: 'field' })\n }\n return { uses, skipped }\n}\n\n/** `text` with each of `uses` (offsets into it) replaced by `term`. */\nfunction replacedText(text: string, uses: readonly TermUse[], term: string): string {\n let out = text\n for (const use of [...uses].sort((a, b) => b.offset - a.offset))\n out = out.slice(0, use.offset) + term + out.slice(use.offset + use.text.length)\n return out\n}\n\n/** Raised when a paragraph does not read as intended afterwards: the caller discards the change. */\nexport class TermEverywhereError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'TermEverywhereError'\n }\n}\n\n/**\n * Apply a defined term across the document (see the module's description): variants replaced by\n * the term, and with `link` every use linked to `definition` (added to the Definitions section\n * first when the document does not have it). Every replacement is one change that never leaves\n * words removed without the term in their place ({@link replaceSpan}); a use the editor refuses is\n * reported as skipped. After each paragraph its text is checked against what the replacements\n * should make it, and a paragraph that reads otherwise throws {@link TermEverywhereError}: run\n * this on a staged copy of the document and keep the copy only when it returns.\n *\n * `accept` may turn a whole paragraph down (its uses are skipped as `unsupported-content`).\n */\nexport function applyTermEverywhere(\n port: DefinitionsPort,\n spec: TermSpec & { definition?: DefinitionText },\n { accept }: { accept?: (paragraph: DocParagraph) => boolean } = {}\n): TermEverywhereResult {\n const term = withoutArticle(spec.term)\n if (!term) throw new Error('Name the defined term.')\n let addedDefinition = false\n let link: { bookmark: string; tooltip: string } | undefined\n if (spec.link) {\n if (!spec.definition) throw new Error(`Linking \"${term}\" needs its definition.`)\n link = {\n bookmark: definitionBookmark(spec.definition.id),\n tooltip: definitionTooltip(spec.definition),\n }\n if (!port.paragraphs().some((p) => p.bookmarks.includes(link!.bookmark))) {\n addDefinition(port, spec.definition)\n addedDefinition = true\n }\n }\n // Read after the definition is in: adding it can move paragraphs and their ids.\n const paragraphs = port.paragraphs()\n const { uses, skipped } = findTermUses(paragraphs, { ...spec, term }, link?.bookmark)\n const changed: TermChange[] = []\n const insert = link\n ? () => port.paste(termLinkXml(term, link.bookmark, link.tooltip), term, false)\n : () => {\n port.typeText(term)\n return true\n }\n for (const p of paragraphs) {\n const mine = uses.filter((u) => u.paragraphId === p.id)\n if (!mine.length) continue\n if (accept && !accept(p)) {\n skipped.push(...mine.map((u) => ({ ...u, reason: 'unsupported-content' as const })))\n continue\n }\n const current = () =>\n port.paragraphs().find((x) => (p.paraId ? x.paraId === p.paraId : x.id === p.id))\n const done: TermUse[] = []\n // From the last use back, so each one's offsets still hold when its turn comes.\n for (const use of [...mine].sort((a, b) => b.offset - a.offset)) {\n const now = current()\n let ok = false\n if (now) {\n const span = {\n paragraphId: now.id,\n from: engineOffset(p, use.offset, true),\n to: engineOffset(p, use.offset + use.text.length),\n }\n try {\n ok = replaceSpan(port, span, insert, term.length)\n } catch {\n ok = false\n }\n }\n if (ok) {\n done.push(use)\n changed.push({ ...use, to: term, linked: Boolean(link) })\n } else skipped.push({ ...use, reason: 'refused' })\n }\n const want = replacedText(p.text, done, term)\n const got = current()?.text\n if (got !== want)\n throw new TermEverywhereError(\n `A paragraph did not read as intended after the changes: expected \"${want}\", got \"${got ?? '(missing)'}\".`\n )\n }\n changed.sort(\n (a, b) =>\n paragraphs.findIndex((p) => p.id === a.paragraphId) -\n paragraphs.findIndex((p) => p.id === b.paragraphId) || a.offset - b.offset\n )\n return { changed, skipped, addedDefinition }\n}\n","/**\n * Word-editor commands shared by the editor's toolbar and ARBI's headless tools in the\n * collaboration service. Pure functions over the engine's OOXML tree, so they run on a live\n * editor's session and on a headless document view alike.\n */\nimport { openHeadlessDocument } from '@docx-editor.dev/core/store'\nimport { readParagraphs, styleNames, type DocParagraph, type OoxmlNodeLike } from './read'\nimport { documentNumbering, type DocumentNumbering } from './numbering'\nimport type { ReferencesReader } from './references'\n\nexport * from './read'\nexport * from './numbering'\nexport * from './references'\nexport * from './undo'\nexport * from './ooxml'\nexport * from './terms'\nexport * from './fragment'\nexport * from './port'\nexport * from './definitions'\nexport * from './everywhere'\nexport * from './signatureFields'\n\n/** A document's parts as trees: a live editor's session or a headless view (`openHeadlessDocument`). */\nexport interface DocumentTrees {\n part(): { root: unknown }\n /** The package, for its notes parts (absent on a live editor's session). */\n currentPackage?(): { parts: ReadonlyMap<string, { root: unknown }> }\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A read-only snapshot of a document: its paragraphs, numbering and style names. */\nexport interface DocumentReader extends ReferencesReader, DocumentNumbering {\n /** A style's name (`heading 1`) by its id, or the id when the document does not name it. */\n styleName(styleId: string): string\n /** A footnote's or endnote's text by its `w:id`. */\n noteText(kind: 'footnote' | 'endnote', id: string): string | undefined\n}\n\n/** Read a document whose trees do not change while the reader is used (a headless view). */\nexport function documentReader(view: DocumentTrees): DocumentReader {\n const root = () => view.part().root as OoxmlNodeLike\n let paragraphs: DocParagraph[] | undefined\n let items: ReturnType<DocumentNumbering['listItems']> | undefined\n let names: Map<string, string> | undefined\n let notes: Map<string, string> | undefined\n const readNotes = () => {\n const out = new Map<string, string>()\n for (const part of view.currentPackage?.().parts.values() ?? []) {\n const root = part.root as OoxmlNodeLike | undefined\n const kind =\n root?.localName === 'footnotes'\n ? 'footnote'\n : root?.localName === 'endnotes'\n ? 'endnote'\n : null\n if (!kind) continue\n for (const note of root?.children ?? []) {\n const id = note.attributes?.find((a) => a.localName === 'id')?.value\n if (id)\n out.set(\n `${kind}:${id}`,\n readParagraphs(note)\n .map((p) => p.text)\n .join(' ')\n )\n }\n }\n return out\n }\n const numbering = documentNumbering({ ...view, root })\n return {\n paragraphs: () => (paragraphs ??= readParagraphs(root())),\n listItems: () => (items ??= numbering.listItems()),\n levelOf: numbering.levelOf,\n noteText: (kind, id) => (notes ??= readNotes()).get(`${kind}:${id}`),\n styleName: (id) =>\n (names ??= styleNames(view.stylesRoot() as OoxmlNodeLike | null)).get(id) ?? id,\n }\n}\n\n/** Read a document from its bytes (a collaboration room's `readRoom`). Throws on a bad package. */\nexport function readDocument(bytes: Uint8Array): DocumentReader {\n const opened = openHeadlessDocument(bytes)\n if (!opened.ok) throw new Error(`The document cannot be read (${opened.reason}).`)\n return documentReader(opened.view)\n}\n"]}