@beyondwork/docx-react-component 1.0.27 → 1.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canonical-document-BLEbzL2J.d.cts +844 -0
- package/dist/canonical-document-BLEbzL2J.d.ts +844 -0
- package/dist/chunk-2FJS5GZM.js +763 -0
- package/dist/chunk-2FJS5GZM.js.map +1 -0
- package/{src/core/commands/section-layout-commands.ts → dist/chunk-2OQBZS3F.js} +106 -340
- package/dist/chunk-2OQBZS3F.js.map +1 -0
- package/dist/chunk-2S7W4KFO.js +127 -0
- package/dist/chunk-2S7W4KFO.js.map +1 -0
- package/dist/chunk-2TG72QSW.js +3874 -0
- package/dist/chunk-2TG72QSW.js.map +1 -0
- package/{src/core/commands/table-structure-commands.ts → dist/chunk-36QNIZBO.js} +126 -315
- package/dist/chunk-36QNIZBO.js.map +1 -0
- package/dist/chunk-4AQOYAW4.js +3069 -0
- package/dist/chunk-4AQOYAW4.js.map +1 -0
- package/dist/chunk-4D5EWJ3P.js +77 -0
- package/dist/chunk-4D5EWJ3P.js.map +1 -0
- package/dist/chunk-5FN54NDH.js +2257 -0
- package/dist/chunk-5FN54NDH.js.map +1 -0
- package/dist/chunk-BOYGQYRQ.js +7306 -0
- package/dist/chunk-BOYGQYRQ.js.map +1 -0
- package/dist/chunk-CN3XMECL.js +212 -0
- package/dist/chunk-CN3XMECL.js.map +1 -0
- package/dist/chunk-EBI3BX6U.js +164 -0
- package/dist/chunk-EBI3BX6U.js.map +1 -0
- package/dist/chunk-EILUG3VB.js +1275 -0
- package/dist/chunk-EILUG3VB.js.map +1 -0
- package/dist/chunk-FUDY333O.js +70 -0
- package/dist/chunk-FUDY333O.js.map +1 -0
- package/dist/chunk-GBVOWFIK.js +1237 -0
- package/dist/chunk-GBVOWFIK.js.map +1 -0
- package/dist/chunk-H4TQ3H3Y.js +262 -0
- package/dist/chunk-H4TQ3H3Y.js.map +1 -0
- package/{src/core/commands/style-commands.ts → dist/chunk-JGB3IXZO.js} +40 -113
- package/dist/chunk-JGB3IXZO.js.map +1 -0
- package/dist/chunk-KD2QRQPY.js +4342 -0
- package/dist/chunk-KD2QRQPY.js.map +1 -0
- package/dist/chunk-KLMXQVYK.js +369 -0
- package/dist/chunk-KLMXQVYK.js.map +1 -0
- package/dist/chunk-KZUG5KFQ.js +214 -0
- package/dist/chunk-KZUG5KFQ.js.map +1 -0
- package/{src/core/state/text-transaction.ts → dist/chunk-QDAQ4CJU.js} +79 -236
- package/dist/chunk-QDAQ4CJU.js.map +1 -0
- package/{src/legal/bookmarks.ts → dist/chunk-RMH72RZI.js} +44 -130
- package/dist/chunk-RMH72RZI.js.map +1 -0
- package/dist/chunk-SWKWQZXM.js +117 -0
- package/dist/chunk-SWKWQZXM.js.map +1 -0
- package/{src/core/commands/formatting-commands.ts → dist/chunk-TJBP2K4T.js} +196 -536
- package/dist/chunk-TJBP2K4T.js.map +1 -0
- package/dist/chunk-TLCEAQDQ.js +542 -0
- package/dist/chunk-TLCEAQDQ.js.map +1 -0
- package/{src/core/commands/text-commands.ts → dist/chunk-UZXBISGO.js} +86 -142
- package/dist/chunk-UZXBISGO.js.map +1 -0
- package/dist/chunk-WGBAKP3Q.js +3220 -0
- package/dist/chunk-WGBAKP3Q.js.map +1 -0
- package/dist/compare/index.cjs +5475 -0
- package/dist/compare/index.cjs.map +1 -0
- package/dist/compare/index.d.cts +114 -0
- package/dist/compare/index.d.ts +114 -0
- package/dist/compare/index.js +731 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/core/commands/formatting-commands.cjs +828 -0
- package/dist/core/commands/formatting-commands.cjs.map +1 -0
- package/dist/core/commands/formatting-commands.d.cts +63 -0
- package/dist/core/commands/formatting-commands.d.ts +63 -0
- package/dist/core/commands/formatting-commands.js +37 -0
- package/dist/core/commands/formatting-commands.js.map +1 -0
- package/dist/core/commands/image-commands.cjs +2023 -0
- package/dist/core/commands/image-commands.cjs.map +1 -0
- package/dist/core/commands/image-commands.d.cts +58 -0
- package/dist/core/commands/image-commands.d.ts +58 -0
- package/dist/core/commands/image-commands.js +18 -0
- package/dist/core/commands/image-commands.js.map +1 -0
- package/dist/core/commands/section-layout-commands.cjs +477 -0
- package/dist/core/commands/section-layout-commands.cjs.map +1 -0
- package/dist/core/commands/section-layout-commands.d.cts +62 -0
- package/dist/core/commands/section-layout-commands.d.ts +62 -0
- package/dist/core/commands/section-layout-commands.js +21 -0
- package/dist/core/commands/section-layout-commands.js.map +1 -0
- package/dist/core/commands/style-commands.cjs +214 -0
- package/dist/core/commands/style-commands.cjs.map +1 -0
- package/dist/core/commands/style-commands.d.cts +13 -0
- package/dist/core/commands/style-commands.d.ts +13 -0
- package/dist/core/commands/style-commands.js +9 -0
- package/dist/core/commands/style-commands.js.map +1 -0
- package/dist/core/commands/table-structure-commands.cjs +1883 -0
- package/dist/core/commands/table-structure-commands.cjs.map +1 -0
- package/dist/core/commands/table-structure-commands.d.cts +59 -0
- package/dist/core/commands/table-structure-commands.d.ts +59 -0
- package/dist/core/commands/table-structure-commands.js +12 -0
- package/dist/core/commands/table-structure-commands.js.map +1 -0
- package/dist/core/commands/text-commands.cjs +2391 -0
- package/dist/core/commands/text-commands.cjs.map +1 -0
- package/dist/core/commands/text-commands.d.cts +24 -0
- package/dist/core/commands/text-commands.d.ts +24 -0
- package/dist/core/commands/text-commands.js +28 -0
- package/dist/core/commands/text-commands.js.map +1 -0
- package/dist/core/selection/mapping.cjs +200 -0
- package/dist/core/selection/mapping.cjs.map +1 -0
- package/dist/core/selection/mapping.d.cts +2 -0
- package/dist/core/selection/mapping.d.ts +2 -0
- package/dist/core/selection/mapping.js +31 -0
- package/dist/core/selection/mapping.js.map +1 -0
- package/dist/core/state/editor-state.cjs +2278 -0
- package/dist/core/state/editor-state.cjs.map +1 -0
- package/dist/core/state/editor-state.d.cts +2 -0
- package/dist/core/state/editor-state.d.ts +2 -0
- package/dist/core/state/editor-state.js +26 -0
- package/dist/core/state/editor-state.js.map +1 -0
- package/dist/index.cjs +38553 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +7856 -0
- package/dist/index.js.map +1 -0
- package/dist/io/docx-session.cjs +16236 -0
- package/dist/io/docx-session.cjs.map +1 -0
- package/dist/io/docx-session.d.cts +21 -0
- package/dist/io/docx-session.d.ts +21 -0
- package/dist/io/docx-session.js +18 -0
- package/dist/io/docx-session.js.map +1 -0
- package/dist/legal/index.cjs +3900 -0
- package/dist/legal/index.cjs.map +1 -0
- package/dist/legal/index.d.cts +86 -0
- package/dist/legal/index.d.ts +86 -0
- package/dist/legal/index.js +616 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/public-types-7ZL_94cz.d.ts +1573 -0
- package/dist/public-types-CeMaDueh.d.cts +1573 -0
- package/dist/public-types.cjs +19 -0
- package/dist/public-types.cjs.map +1 -0
- package/dist/public-types.d.cts +2 -0
- package/dist/public-types.d.ts +2 -0
- package/dist/public-types.js +1 -0
- package/dist/public-types.js.map +1 -0
- package/dist/runtime/document-runtime.cjs +11140 -0
- package/dist/runtime/document-runtime.cjs.map +1 -0
- package/dist/runtime/document-runtime.d.cts +231 -0
- package/dist/runtime/document-runtime.d.ts +231 -0
- package/dist/runtime/document-runtime.js +21 -0
- package/dist/runtime/document-runtime.js.map +1 -0
- package/dist/structural-helpers-CilgOVhh.d.cts +10 -0
- package/dist/structural-helpers-q0Gd-eBN.d.ts +10 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +313 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +1 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js +23 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +1 -0
- package/dist/ui-tailwind/index.cjs +4833 -0
- package/dist/ui-tailwind/index.cjs.map +1 -0
- package/dist/ui-tailwind/index.d.cts +617 -0
- package/dist/ui-tailwind/index.d.ts +617 -0
- package/dist/ui-tailwind/index.js +575 -0
- package/dist/ui-tailwind/index.js.map +1 -0
- package/package.json +64 -54
- package/src/README.md +0 -85
- package/src/api/README.md +0 -26
- package/src/api/public-types.ts +0 -1418
- package/src/api/session-state.ts +0 -60
- package/src/compare/diff-engine.ts +0 -623
- package/src/compare/export-redlines.ts +0 -280
- package/src/compare/index.ts +0 -25
- package/src/compare/snapshot.ts +0 -97
- package/src/component-inventory.md +0 -99
- package/src/core/README.md +0 -10
- package/src/core/commands/README.md +0 -3
- package/src/core/commands/image-commands.ts +0 -373
- package/src/core/commands/index.ts +0 -1757
- package/src/core/commands/list-commands.ts +0 -565
- package/src/core/commands/paragraph-layout-commands.ts +0 -339
- package/src/core/commands/review-commands.ts +0 -108
- package/src/core/commands/structural-helpers.ts +0 -309
- package/src/core/schema/README.md +0 -3
- package/src/core/schema/text-schema.ts +0 -516
- package/src/core/search/search-text.ts +0 -357
- package/src/core/selection/README.md +0 -3
- package/src/core/selection/mapping.ts +0 -289
- package/src/core/selection/review-anchors.ts +0 -183
- package/src/core/state/README.md +0 -3
- package/src/core/state/editor-state.ts +0 -892
- package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
- package/src/formats/xlsx/io/parse-sheet.ts +0 -459
- package/src/formats/xlsx/io/parse-styles.ts +0 -59
- package/src/formats/xlsx/io/parse-workbook.ts +0 -75
- package/src/formats/xlsx/io/serialize-shared-strings.ts +0 -72
- package/src/formats/xlsx/io/serialize-sheet.ts +0 -333
- package/src/formats/xlsx/io/serialize-styles.ts +0 -98
- package/src/formats/xlsx/io/serialize-workbook.ts +0 -429
- package/src/formats/xlsx/io/xlsx-session.ts +0 -314
- package/src/formats/xlsx/model/cell.ts +0 -189
- package/src/formats/xlsx/model/sheet.ts +0 -326
- package/src/formats/xlsx/model/styles.ts +0 -118
- package/src/formats/xlsx/model/workbook.ts +0 -453
- package/src/formats/xlsx/runtime/cell-commands.ts +0 -567
- package/src/formats/xlsx/runtime/sheet-commands.ts +0 -206
- package/src/formats/xlsx/runtime/workbook-runtime.ts +0 -177
- package/src/formats/xlsx/runtime/workbook-transaction.ts +0 -822
- package/src/index.ts +0 -101
- package/src/io/README.md +0 -10
- package/src/io/docx-session.ts +0 -2882
- package/src/io/export/README.md +0 -3
- package/src/io/export/export-session.ts +0 -220
- package/src/io/export/minimal-docx.ts +0 -115
- package/src/io/export/reattach-preserved-parts.ts +0 -54
- package/src/io/export/serialize-comments.ts +0 -947
- package/src/io/export/serialize-footnotes.ts +0 -399
- package/src/io/export/serialize-headers-footers.ts +0 -372
- package/src/io/export/serialize-main-document.ts +0 -1376
- package/src/io/export/serialize-numbering.ts +0 -118
- package/src/io/export/serialize-revisions.ts +0 -389
- package/src/io/export/serialize-runtime-revisions.ts +0 -269
- package/src/io/export/serialize-tables.ts +0 -174
- package/src/io/export/split-review-boundaries.ts +0 -356
- package/src/io/normalize/README.md +0 -3
- package/src/io/normalize/normalize-text.ts +0 -639
- package/src/io/ooxml/README.md +0 -3
- package/src/io/ooxml/highlight-colors.ts +0 -39
- package/src/io/ooxml/numbering-sentinels.ts +0 -44
- package/src/io/ooxml/parse-comments.ts +0 -846
- package/src/io/ooxml/parse-complex-content.ts +0 -287
- package/src/io/ooxml/parse-fields.ts +0 -834
- package/src/io/ooxml/parse-footnotes.ts +0 -896
- package/src/io/ooxml/parse-headers-footers.ts +0 -1169
- package/src/io/ooxml/parse-inline-media.ts +0 -461
- package/src/io/ooxml/parse-main-document.ts +0 -2877
- package/src/io/ooxml/parse-numbering.ts +0 -432
- package/src/io/ooxml/parse-revisions.ts +0 -931
- package/src/io/ooxml/parse-settings.ts +0 -184
- package/src/io/ooxml/parse-shapes.ts +0 -296
- package/src/io/ooxml/parse-styles.ts +0 -463
- package/src/io/ooxml/parse-tables.ts +0 -618
- package/src/io/ooxml/parse-theme.ts +0 -346
- package/src/io/ooxml/part-manifest.ts +0 -136
- package/src/io/ooxml/revision-boundaries.ts +0 -351
- package/src/io/opc/README.md +0 -3
- package/src/io/opc/corrupt-package.ts +0 -166
- package/src/io/opc/docx-package.ts +0 -74
- package/src/io/opc/package-reader.ts +0 -325
- package/src/io/opc/package-writer.ts +0 -273
- package/src/io/source-package-provenance.ts +0 -241
- package/src/legal/cross-references.ts +0 -414
- package/src/legal/defined-terms.ts +0 -203
- package/src/legal/index.ts +0 -32
- package/src/legal/signature-blocks.ts +0 -259
- package/src/model/README.md +0 -3
- package/src/model/canonical-document.ts +0 -2632
- package/src/model/cds-1.0.0.ts +0 -212
- package/src/model/snapshot.ts +0 -649
- package/src/preservation/README.md +0 -3
- package/src/preservation/markup-compatibility.ts +0 -48
- package/src/preservation/opaque-fragment-store.ts +0 -89
- package/src/preservation/opaque-region.ts +0 -233
- package/src/preservation/package-preservation.ts +0 -113
- package/src/preservation/preserved-part-manifest.ts +0 -56
- package/src/preservation/relationship-retention.ts +0 -57
- package/src/preservation/store.ts +0 -185
- package/src/review/README.md +0 -16
- package/src/review/store/README.md +0 -3
- package/src/review/store/comment-anchors.ts +0 -70
- package/src/review/store/comment-remapping.ts +0 -154
- package/src/review/store/comment-store.ts +0 -331
- package/src/review/store/comment-thread.ts +0 -109
- package/src/review/store/revision-actions.ts +0 -394
- package/src/review/store/revision-store.ts +0 -312
- package/src/review/store/revision-types.ts +0 -171
- package/src/review/store/runtime-comment-store.ts +0 -43
- package/src/runtime/README.md +0 -3
- package/src/runtime/ai-action-policy.ts +0 -764
- package/src/runtime/collab-review-sync.ts +0 -254
- package/src/runtime/document-layout.ts +0 -332
- package/src/runtime/document-navigation.ts +0 -603
- package/src/runtime/document-runtime.ts +0 -3159
- package/src/runtime/document-search.ts +0 -145
- package/src/runtime/numbering-prefix.ts +0 -216
- package/src/runtime/page-layout-estimation.ts +0 -212
- package/src/runtime/read-only-diagnostics-runtime.ts +0 -241
- package/src/runtime/review-runtime.ts +0 -44
- package/src/runtime/revision-runtime.ts +0 -107
- package/src/runtime/session-capabilities.ts +0 -192
- package/src/runtime/story-context.ts +0 -164
- package/src/runtime/story-targeting.ts +0 -162
- package/src/runtime/surface-projection.ts +0 -1357
- package/src/runtime/table-commands.ts +0 -173
- package/src/runtime/table-schema.ts +0 -309
- package/src/runtime/view-state.ts +0 -477
- package/src/runtime/virtualized-rendering.ts +0 -258
- package/src/runtime/workflow-markup.ts +0 -353
- package/src/ui/README.md +0 -30
- package/src/ui/WordReviewEditor.tsx +0 -4097
- package/src/ui/browser-export.ts +0 -52
- package/src/ui/comments/README.md +0 -3
- package/src/ui/compatibility/README.md +0 -3
- package/src/ui/editor-command-bag.ts +0 -120
- package/src/ui/editor-runtime-boundary.ts +0 -1457
- package/src/ui/editor-shell-view.tsx +0 -142
- package/src/ui/editor-surface/README.md +0 -3
- package/src/ui/editor-surface-controller.tsx +0 -63
- package/src/ui/headless/comment-decoration-model.ts +0 -124
- package/src/ui/headless/preserve-editor-selection.ts +0 -5
- package/src/ui/headless/revision-decoration-model.ts +0 -128
- package/src/ui/headless/selection-helpers.ts +0 -54
- package/src/ui/headless/selection-toolbar-model.ts +0 -34
- package/src/ui/headless/use-editor-keyboard.ts +0 -103
- package/src/ui/review/README.md +0 -3
- package/src/ui/runtime-snapshot-selectors.ts +0 -197
- package/src/ui/shared/revision-filters.ts +0 -31
- package/src/ui/status/README.md +0 -3
- package/src/ui/theme/README.md +0 -3
- package/src/ui/toolbar/README.md +0 -3
- package/src/ui/workflow-surface-blocked-rails.ts +0 -94
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -64
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +0 -129
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +0 -114
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +0 -34
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +0 -386
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -186
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +0 -139
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +0 -128
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
- package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
- package/src/ui-tailwind/editor-surface/perf-probe.ts +0 -179
- package/src/ui-tailwind/editor-surface/pm-collab-plugins.ts +0 -40
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -178
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +0 -31
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -427
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
- package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -876
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -504
- package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -168
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +0 -61
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -129
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -58
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -973
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -436
- package/src/ui-tailwind/index.ts +0 -62
- package/src/ui-tailwind/page-chrome-model.ts +0 -27
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -406
- package/src/ui-tailwind/review/tw-health-panel.tsx +0 -149
- package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
- package/src/ui-tailwind/status/tw-status-bar.tsx +0 -61
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -52
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -1064
- package/src/ui-tailwind/tw-review-workspace.tsx +0 -1417
- package/src/validation/README.md +0 -3
- package/src/validation/compatibility-engine.ts +0 -634
- package/src/validation/compatibility-report.ts +0 -161
- package/src/validation/diagnostics.ts +0 -204
- package/src/validation/docx-comment-proof.ts +0 -707
- package/src/validation/import-diagnostics.ts +0 -128
- package/src/validation/low-priority-word-surfaces.ts +0 -373
- /package/{src → dist}/ui-tailwind/theme/editor-theme.css +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/io/docx-session.ts","../../src/api/session-state.ts","../../src/core/selection/mapping.ts","../../src/model/cds-1.0.0.ts","../../src/model/canonical-document.ts","../../src/model/snapshot.ts","../../src/core/state/editor-state.ts","../../src/io/ooxml/part-manifest.ts","../../src/io/opc/package-writer.ts","../../src/io/opc/docx-package.ts","../../src/io/opc/package-reader.ts","../../src/io/ooxml/parse-inline-media.ts","../../src/io/ooxml/parse-numbering.ts","../../src/io/ooxml/parse-complex-content.ts","../../src/io/ooxml/parse-shapes.ts","../../src/io/ooxml/parse-fields.ts","../../src/io/ooxml/highlight-colors.ts","../../src/io/ooxml/parse-main-document.ts","../../src/io/normalize/normalize-text.ts","../../src/io/opc/corrupt-package.ts","../../src/io/export/reattach-preserved-parts.ts","../../src/io/export/export-session.ts","../../src/preservation/store.ts","../../src/preservation/relationship-retention.ts","../../src/io/ooxml/numbering-sentinels.ts","../../src/io/export/serialize-numbering.ts","../../src/io/export/serialize-main-document.ts","../../src/review/store/revision-types.ts","../../src/review/store/revision-store.ts","../../src/io/ooxml/revision-boundaries.ts","../../src/io/ooxml/parse-revisions.ts","../../src/review/store/comment-anchors.ts","../../src/review/store/comment-thread.ts","../../src/io/ooxml/parse-comments.ts","../../src/io/export/serialize-comments.ts","../../src/io/export/split-review-boundaries.ts","../../src/io/export/serialize-runtime-revisions.ts","../../src/review/store/comment-store.ts","../../src/review/store/runtime-comment-store.ts","../../src/validation/compatibility-engine.ts","../../src/validation/diagnostics.ts","../../src/validation/import-diagnostics.ts","../../src/runtime/read-only-diagnostics-runtime.ts","../../src/io/ooxml/parse-headers-footers.ts","../../src/io/ooxml/parse-footnotes.ts","../../src/io/ooxml/parse-theme.ts","../../src/io/ooxml/parse-settings.ts","../../src/io/ooxml/parse-styles.ts","../../src/io/export/serialize-headers-footers.ts","../../src/io/export/serialize-footnotes.ts","../../src/io/source-package-provenance.ts"],"sourcesContent":["import type {\n CompatibilityReport as PublicCompatibilityReport,\n EditorError,\n EditorSessionState,\n EditorWarning as PublicEditorWarning,\n EditorAnchorProjection as PublicEditorAnchorProjection,\n ExportDocxOptions,\n ExportResult,\n PersistedEditorSnapshot,\n ProtectionRange,\n ProtectionSnapshot,\n} from \"../api/public-types.ts\";\nimport { editorSessionStateFromPersistedSnapshot } from \"../api/session-state.ts\";\nimport type {\n CanonicalDocumentEnvelope,\n CompatibilityFeatureEntry as InternalCompatibilityFeatureEntry,\n CompatibilityReport as InternalCompatibilityReport,\n CommentThreadRecord,\n EditorError as InternalEditorError,\n RevisionRecord as RuntimeRevisionRecord,\n EditorWarning as InternalEditorWarning,\n} from \"../core/state/editor-state.ts\";\nimport { createCanonicalDocumentId } from \"../core/state/editor-state.ts\";\nimport {\n createDetachedAnchor,\n type EditorAnchorProjection as InternalEditorAnchorProjection,\n} from \"../core/selection/mapping.ts\";\nimport { DOCX_MIME_TYPE } from \"./opc/docx-package.ts\";\nimport { readOpcPackage, type OpcPackage } from \"./opc/package-reader.ts\";\nimport {\n parseMainDocumentXml,\n type ParsedBlockNode,\n type ParsedInlineNode,\n type ParsedPermStartInlineNode,\n} from \"./ooxml/parse-main-document.ts\";\nimport { normalizeParsedTextDocument } from \"./normalize/normalize-text.ts\";\nimport {\n CONTENT_TYPES_PATH,\n PACKAGE_RELATIONSHIPS_PATH,\n getRelationshipsPartPath,\n normalizePartPath,\n resolveRelationshipTarget,\n type OpcRelationship,\n} from \"./ooxml/part-manifest.ts\";\nimport {\n classifyCorruptPackageError,\n createBrokenRelationshipIssue,\n createMissingPartIssue,\n} from \"./opc/corrupt-package.ts\";\nimport { createExportSession } from \"./export/export-session.ts\";\nimport { serializeMainDocument } from \"./export/serialize-main-document.ts\";\nimport { parseRevisionsFromDocumentXml, type ParsedRevisionsResult } from \"./ooxml/parse-revisions.ts\";\nimport { parseCommentsFromOoxml } from \"./ooxml/parse-comments.ts\";\nimport { parseNumberingXml } from \"./ooxml/parse-numbering.ts\";\nimport {\n createCommentExportIdMap,\n mapParagraphBoundaries,\n serializeCommentAnchorsIntoDocumentXml,\n serializeMergedCommentsXml,\n} from \"./export/serialize-comments.ts\";\nimport { splitDocumentAtReviewBoundaries } from \"./export/split-review-boundaries.ts\";\nimport { serializeRuntimeRevisionsIntoDocumentXml } from \"./export/serialize-runtime-revisions.ts\";\nimport { createCommentStoreFromRuntimeComments } from \"../review/store/runtime-comment-store.ts\";\nimport type { CommentThread } from \"../review/store/comment-store.ts\";\nimport type { RevisionRecord as ReviewRevisionRecord } from \"../review/store/revision-types.ts\";\nimport { getRevisionActionability } from \"../review/store/revision-types.ts\";\nimport { buildCompatibilityReport } from \"../validation/compatibility-engine.ts\";\nimport {\n createPackageImportDiagnostics,\n createValidationImportDiagnostics,\n type ImportDiagnosticsResult,\n} from \"../validation/import-diagnostics.ts\";\nimport type {\n BlockNode,\n FootnoteCollection,\n HeaderDocument,\n FooterDocument,\n MediaCatalog,\n NumberingCatalog,\n OpaqueFragmentRecord,\n PreservedPackagePart,\n SubPartsCatalog,\n} from \"../model/canonical-document.ts\";\nimport { createCanonicalDocumentSignature } from \"../model/canonical-document.ts\";\nimport type {\n CommentImportDiagnostic,\n ImportedCommentDefinition,\n ParsedCommentsResult,\n} from \"./ooxml/parse-comments.ts\";\nimport { createReadOnlyDiagnosticsRuntime } from \"../runtime/read-only-diagnostics-runtime.ts\";\nimport {\n WORD_NUMBERING_CONTENT_TYPE,\n hasSerializableNumberingEntries,\n serializeNumberingXml,\n} from \"./export/serialize-numbering.ts\";\nimport {\n parseHeaderFooterReferences,\n parseHeaderXml,\n parseFooterXml,\n} from \"./ooxml/parse-headers-footers.ts\";\nimport { parseFootnotesXml, parseEndnotesXml } from \"./ooxml/parse-footnotes.ts\";\nimport { parseThemeXml } from \"./ooxml/parse-theme.ts\";\nimport { resolveTheme } from \"./ooxml/parse-theme.ts\";\nimport { parseSettingsXml } from \"./ooxml/parse-settings.ts\";\nimport { parseStylesXml, type ParseStylesResult } from \"./ooxml/parse-styles.ts\";\nimport {\n serializeHeaderXml,\n serializeFooterXml,\n WORD_HEADER_CONTENT_TYPE,\n WORD_FOOTER_CONTENT_TYPE,\n} from \"./export/serialize-headers-footers.ts\";\nimport {\n serializeFootnotesXml,\n serializeEndnotesXml,\n WORD_FOOTNOTES_CONTENT_TYPE,\n WORD_ENDNOTES_CONTENT_TYPE,\n} from \"./export/serialize-footnotes.ts\";\nimport { createPersistedSourcePackage } from \"./source-package-provenance.ts\";\nimport { validatePersistedEditorSnapshot } from \"../model/snapshot.ts\";\nimport {\n createSyntheticDocxNullNumberingCatalog,\n DOCX_NULL_NUMBERING_INSTANCE_ID,\n} from \"./ooxml/numbering-sentinels.ts\";\n\nconst MAIN_DOCUMENT_PATH = \"/word/document.xml\";\nconst NUMBERING_PART_PATH = \"/word/numbering.xml\";\nconst COMMENTS_PART_PATH = \"/word/comments.xml\";\nconst COMMENTS_EXTENDED_PART_PATH = \"/word/commentsExtended.xml\";\nconst COMMENTS_IDS_PART_PATH = \"/word/commentsIds.xml\";\nconst PEOPLE_PART_PATH = \"/word/people.xml\";\nconst APP_PROPERTIES_PART_PATH = \"/docProps/app.xml\";\nconst CORE_PROPERTIES_PART_PATH = \"/docProps/core.xml\";\nconst MAIN_DOCUMENT_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\";\nconst APP_PROPERTIES_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.extended-properties+xml\";\nconst CORE_PROPERTIES_CONTENT_TYPE =\n \"application/vnd.openxmlformats-package.core-properties+xml\";\nconst NUMBERING_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\";\nconst COMMENTS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\";\nconst COMMENTS_EXTENDED_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml\";\nconst COMMENTS_IDS_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml\";\nconst PEOPLE_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.people+xml\";\nconst COMMENTS_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\";\nconst COMMENTS_EXTENDED_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2011/relationships/commentsExtended\";\nconst COMMENTS_IDS_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2016/09/relationships/commentsIds\";\nconst PEOPLE_RELATIONSHIP_TYPE =\n \"http://schemas.microsoft.com/office/2011/relationships/people\";\nconst APP_PROPERTIES_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\";\nconst CORE_PROPERTIES_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\";\nconst OFFICE_DOCUMENT_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\";\nconst HEADER_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/header\";\nconst FOOTER_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer\";\nconst FOOTNOTES_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes\";\nconst ENDNOTES_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes\";\nconst SETTINGS_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\";\nconst STYLES_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\";\nconst STYLES_PART_PATH = \"/word/styles.xml\";\nconst FOOTNOTES_PART_PATH = \"/word/footnotes.xml\";\nconst ENDNOTES_PART_PATH = \"/word/endnotes.xml\";\nconst SETTINGS_PART_PATH = \"/word/settings.xml\";\n\ninterface LoadDocxEditorSessionOptions {\n documentId: string;\n sourceLabel?: string;\n bytes: Uint8Array | ArrayBuffer;\n editorBuild?: string;\n}\n\nexport interface LoadedDocxEditorSession {\n initialSessionState: EditorSessionState;\n initialSnapshot: PersistedEditorSnapshot;\n fatalError?: EditorError;\n readOnly: boolean;\n protectionSnapshot: ProtectionSnapshot;\n exportDocx: (\n sessionState: EditorSessionState | PersistedEditorSnapshot,\n options?: ExportDocxOptions,\n ) => Promise<ExportResult>;\n}\n\ninterface ImportedDocxState {\n sourceBytes: Uint8Array;\n sourcePackage: OpcPackage;\n sourceDocumentPartPath: string;\n sourceDocumentRelationships: readonly OpcRelationship[];\n sourceDocumentAttributes: Record<string, string>;\n sourceNumberingPartPath?: string;\n sourceNumberingRelationshipId?: string;\n sourceCommentsPartPath?: string;\n sourceCommentsRelationshipId?: string;\n sourceCommentsRootTag?: string;\n sourceCommentsExtendedPartPath?: string;\n sourceCommentsExtendedRelationshipId?: string;\n sourceCommentsExtendedRootTag?: string;\n sourceCommentsIdsPartPath?: string;\n sourceCommentsIdsRelationshipId?: string;\n sourceCommentsIdsRootTag?: string;\n sourcePeoplePartPath?: string;\n sourcePeopleRelationshipId?: string;\n sourcePeopleRootTag?: string;\n sourcePeopleAuthors: readonly string[];\n protectionSnapshot: ProtectionSnapshot;\n preservedCommentDefinitions: readonly ImportedCommentDefinition[];\n blockingCommentDiagnostics: readonly CommentImportDiagnostic[];\n initialCanonicalSignature: string;\n sourceSubPartPaths: {\n headers: Array<{ partPath: string; relationshipId: string }>;\n footers: Array<{ partPath: string; relationshipId: string }>;\n footnotesPartPath?: string;\n footnotesRelationshipId?: string;\n endnotesPartPath?: string;\n endnotesRelationshipId?: string;\n themePartPath?: string;\n themeRelationshipId?: string;\n };\n}\n\ninterface NormalizedImportedCommentsResult extends ParsedCommentsResult {\n preservedDefinitions: readonly ImportedCommentDefinition[];\n}\n\nconst BLOCKING_COMMENT_DIAGNOSTIC_CODES = new Set<CommentImportDiagnostic[\"code\"]>([\n \"missing_comment_definition\",\n \"missing_anchor_reference\",\n \"multi_paragraph_anchor_preserve_only\",\n \"opaque_anchor_preserve_only\",\n \"preserve_only_revision_overlap\",\n]);\n\nexport function loadDocxEditorSession(\n options: LoadDocxEditorSessionOptions,\n): LoadedDocxEditorSession {\n const editorBuild =\n typeof options.editorBuild === \"string\" && options.editorBuild.length > 0\n ? options.editorBuild\n : \"dev\";\n const sourceBytes = toUint8Array(options.bytes);\n let sourcePackage: OpcPackage;\n\n try {\n sourcePackage = readOpcPackage(sourceBytes);\n } catch (error) {\n return createDiagnosticsSession(\n options,\n createPackageImportDiagnostics({\n issue: classifyCorruptPackageError(error),\n }),\n );\n }\n\n const mainDocumentPath = resolveMainDocumentPartPath(sourcePackage);\n const brokenRelationshipIssues = collectBrokenInternalRelationshipIssues(\n sourcePackage,\n mainDocumentPath,\n );\n if (brokenRelationshipIssues.length > 0) {\n return createDiagnosticsSession(\n options,\n createPackageImportDiagnostics({\n issue: {\n ...brokenRelationshipIssues[0],\n message: summarizeBrokenRelationshipIssues(brokenRelationshipIssues),\n details: {\n issueCount: brokenRelationshipIssues.length,\n targets: brokenRelationshipIssues.map((issue) => issue.targetPartPath).filter(Boolean),\n },\n },\n }),\n );\n }\n\n if (!mainDocumentPath) {\n return createDiagnosticsSession(\n options,\n createPackageImportDiagnostics({\n issue: createMissingPartIssue(MAIN_DOCUMENT_PATH),\n }),\n );\n }\n\n const documentPart = sourcePackage.parts.get(mainDocumentPath);\n if (!documentPart) {\n return createDiagnosticsSession(\n options,\n createPackageImportDiagnostics({\n issue: createMissingPartIssue(mainDocumentPath),\n }),\n );\n }\n if (documentPart.contentType !== MAIN_DOCUMENT_CONTENT_TYPE) {\n return createDiagnosticsSession(\n options,\n createValidationImportDiagnostics({\n message: `DOCX main document part ${mainDocumentPath} must use content type ${MAIN_DOCUMENT_CONTENT_TYPE}.`,\n }),\n );\n }\n\n try {\n const sourceDocumentXml = decodeUtf8(documentPart.bytes);\n const importedRevisions = parseRevisionsFromDocumentXml(sourceDocumentXml);\n const numberingPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n NUMBERING_RELATIONSHIP_TYPE,\n NUMBERING_PART_PATH,\n );\n const parsedNumbering = numberingPartPath\n ? parseNumberingXml(\n decodeUtf8(sourcePackage.parts.get(numberingPartPath)?.bytes ?? new Uint8Array()),\n )\n : createEmptyNumberingCatalog();\n const mediaParts = collectInlineMediaParts(sourcePackage);\n const parsedDocument = parseMainDocumentXml(\n sourceDocumentXml,\n documentPart.relationships,\n mediaParts,\n mainDocumentPath,\n );\n const protectionRanges = extractProtectionRanges(parsedDocument.blocks);\n const normalizedDocument = normalizeParsedTextDocument(\n parsedDocument,\n mainDocumentPath,\n );\n const commentsPartPath = resolveCommentsPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n );\n const commentsExtendedPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n COMMENTS_EXTENDED_RELATIONSHIP_TYPE,\n COMMENTS_EXTENDED_PART_PATH,\n );\n const commentsIdsPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n COMMENTS_IDS_RELATIONSHIP_TYPE,\n COMMENTS_IDS_PART_PATH,\n );\n const peoplePartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n PEOPLE_RELATIONSHIP_TYPE,\n PEOPLE_PART_PATH,\n );\n const parsedComments = commentsPartPath\n ? parseCommentsFromOoxml(\n sourceDocumentXml,\n {\n commentsXml: decodeUtf8(sourcePackage.parts.get(commentsPartPath)?.bytes ?? new Uint8Array()),\n commentsExtendedXml: decodeUtf8(\n sourcePackage.parts.get(commentsExtendedPartPath ?? \"\")?.bytes ?? new Uint8Array(),\n ),\n commentsIdsXml: decodeUtf8(\n sourcePackage.parts.get(commentsIdsPartPath ?? \"\")?.bytes ?? new Uint8Array(),\n ),\n peopleXml: decodeUtf8(\n sourcePackage.parts.get(peoplePartPath ?? \"\")?.bytes ?? new Uint8Array(),\n ),\n },\n )\n : {\n threads: [] as CommentThread[],\n diagnostics: [] as CommentImportDiagnostic[],\n definitions: [] as ImportedCommentDefinition[],\n sourceRootTag: undefined,\n sourceExtendedRootTag: undefined,\n sourceIdsRootTag: undefined,\n sourcePeopleRootTag: undefined,\n peopleAuthors: [] as string[],\n };\n const normalizedRevisions = normalizeImportedRevisionRecords(\n importedRevisions,\n normalizedDocument.content,\n normalizedDocument.preservation.opaqueFragments,\n );\n const normalizedComments = normalizeImportedCommentThreads(\n parsedComments,\n normalizedDocument.preservation.opaqueFragments,\n normalizedRevisions.revisions,\n );\n const subPartOpaqueState = createSubPartOpaqueImportState(\n normalizedDocument.preservation.opaqueFragments,\n normalizedDocument.diagnostics.warnings,\n );\n // ---- Parse sub-parts: headers, footers, footnotes, endnotes, theme ----\n const headerFooterRefs = parseHeaderFooterReferences(sourceDocumentXml);\n const parsedHeaders: HeaderDocument[] = [];\n const parsedFooters: FooterDocument[] = [];\n const sourceHeaderPaths: Array<{ partPath: string; relationshipId: string }> = [];\n const sourceFooterPaths: Array<{ partPath: string; relationshipId: string }> = [];\n const seenSubPartKeys = new Set<string>();\n\n for (const ref of headerFooterRefs) {\n const dedupeKey = `${ref.kind}:${ref.variant}:${ref.relationshipId}`;\n if (seenSubPartKeys.has(dedupeKey)) {\n continue;\n }\n seenSubPartKeys.add(dedupeKey);\n\n const relationship = documentPart.relationships.find(\n (r) => r.id === ref.relationshipId && r.targetMode === \"internal\",\n );\n if (!relationship) {\n continue;\n }\n\n const partPath = resolveRelationshipTarget(mainDocumentPath, relationship);\n const partBytes = sourcePackage.parts.get(partPath)?.bytes;\n if (!partBytes) {\n continue;\n }\n\n const xml = decodeUtf8(partBytes);\n if (ref.kind === \"header\") {\n const parsed = parseHeaderXml(xml);\n parsedHeaders.push({\n variant: ref.variant,\n partPath,\n relationshipId: ref.relationshipId,\n ...(ref.sectionIndex !== undefined ? { sectionIndex: ref.sectionIndex } : {}),\n blocks: normalizeSubPartOpaqueBlocks(\n parsed.blocks,\n normalizedDocument.preservation.opaqueFragments,\n normalizedDocument.diagnostics.warnings,\n partPath,\n subPartOpaqueState,\n ),\n });\n sourceHeaderPaths.push({ partPath, relationshipId: ref.relationshipId });\n } else {\n const parsed = parseFooterXml(xml);\n parsedFooters.push({\n variant: ref.variant,\n partPath,\n relationshipId: ref.relationshipId,\n ...(ref.sectionIndex !== undefined ? { sectionIndex: ref.sectionIndex } : {}),\n blocks: normalizeSubPartOpaqueBlocks(\n parsed.blocks,\n normalizedDocument.preservation.opaqueFragments,\n normalizedDocument.diagnostics.warnings,\n partPath,\n subPartOpaqueState,\n ),\n });\n sourceFooterPaths.push({ partPath, relationshipId: ref.relationshipId });\n }\n }\n\n const footnotesPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n FOOTNOTES_RELATIONSHIP_TYPE,\n FOOTNOTES_PART_PATH,\n );\n const footnotesRelationshipId = documentPart.relationships.find(\n (r) => r.type === FOOTNOTES_RELATIONSHIP_TYPE && r.targetMode === \"internal\",\n )?.id;\n const endnotesPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n ENDNOTES_RELATIONSHIP_TYPE,\n ENDNOTES_PART_PATH,\n );\n const endnotesRelationshipId = documentPart.relationships.find(\n (r) => r.type === ENDNOTES_RELATIONSHIP_TYPE && r.targetMode === \"internal\",\n )?.id;\n\n let footnoteCollection: FootnoteCollection | undefined;\n if (footnotesPartPath) {\n footnoteCollection = parseFootnotesXml(\n decodeUtf8(sourcePackage.parts.get(footnotesPartPath)?.bytes ?? new Uint8Array()),\n );\n normalizeFootnoteCollectionOpaqueBlocks(\n footnoteCollection,\n \"footnote\",\n normalizedDocument.preservation.opaqueFragments,\n normalizedDocument.diagnostics.warnings,\n footnotesPartPath,\n subPartOpaqueState,\n );\n }\n if (endnotesPartPath) {\n footnoteCollection = parseEndnotesXml(\n decodeUtf8(sourcePackage.parts.get(endnotesPartPath)?.bytes ?? new Uint8Array()),\n footnoteCollection,\n );\n normalizeFootnoteCollectionOpaqueBlocks(\n footnoteCollection,\n \"endnote\",\n normalizedDocument.preservation.opaqueFragments,\n normalizedDocument.diagnostics.warnings,\n endnotesPartPath,\n subPartOpaqueState,\n );\n }\n\n const themeRelationship = documentPart.relationships.find(\n (r) => r.type === \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" &&\n r.targetMode === \"internal\",\n );\n const themePartPath = themeRelationship\n ? resolveRelationshipTarget(mainDocumentPath, themeRelationship)\n : undefined;\n const parsedTheme =\n themePartPath && sourcePackage.parts.has(themePartPath)\n ? parseThemeXml(\n decodeUtf8(sourcePackage.parts.get(themePartPath)?.bytes ?? new Uint8Array()),\n )\n : undefined;\n const resolvedTheme = parsedTheme ? resolveTheme(parsedTheme) : undefined;\n const settingsPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n SETTINGS_RELATIONSHIP_TYPE,\n SETTINGS_PART_PATH,\n );\n const parsedSettings =\n settingsPartPath && sourcePackage.parts.has(settingsPartPath)\n ? parseSettingsXml(\n decodeUtf8(sourcePackage.parts.get(settingsPartPath)?.bytes ?? new Uint8Array()),\n )\n : undefined;\n const settingsXmlForProtection =\n settingsPartPath && sourcePackage.parts.has(settingsPartPath)\n ? decodeUtf8(sourcePackage.parts.get(settingsPartPath)?.bytes ?? new Uint8Array())\n : \"\";\n const documentProtection = extractDocumentProtection(settingsXmlForProtection);\n const importedProtectionSnapshot = buildProtectionSnapshot(documentProtection, protectionRanges);\n\n // ---- Parse styles.xml for canonical style catalog ----\n const stylesPartPath = resolveDocumentRelatedPartPath(\n sourcePackage,\n mainDocumentPath,\n documentPart.relationships,\n STYLES_RELATIONSHIP_TYPE,\n STYLES_PART_PATH,\n );\n const parsedStyles =\n stylesPartPath && sourcePackage.parts.has(stylesPartPath)\n ? parseStylesXml(\n decodeUtf8(sourcePackage.parts.get(stylesPartPath)?.bytes ?? new Uint8Array()),\n )\n : parseStylesXml(\"\");\n\n const subParts: SubPartsCatalog | undefined =\n parsedHeaders.length > 0 ||\n parsedFooters.length > 0 ||\n footnoteCollection !== undefined ||\n parsedTheme !== undefined ||\n normalizedDocument.finalSectionProperties !== undefined ||\n resolvedTheme !== undefined ||\n parsedSettings !== undefined\n ? {\n headers: parsedHeaders,\n footers: parsedFooters,\n ...(footnoteCollection !== undefined ? { footnoteCollection } : {}),\n ...(parsedTheme !== undefined ? { theme: parsedTheme } : {}),\n ...(normalizedDocument.finalSectionProperties !== undefined\n ? { finalSectionProperties: normalizedDocument.finalSectionProperties }\n : {}),\n ...(resolvedTheme !== undefined ? { resolvedTheme } : {}),\n ...(parsedSettings !== undefined ? { settings: parsedSettings } : {}),\n }\n : undefined;\n\n const timestamp = new Date().toISOString();\n const document = createImportedCanonicalDocument({\n documentId: options.documentId,\n timestamp,\n numbering: parsedNumbering,\n media: normalizedDocument.media,\n content: normalizedDocument.content,\n subParts,\n parsedStyles,\n preservation: {\n ...normalizedDocument.preservation,\n packageParts: {\n ...normalizedDocument.preservation.packageParts,\n ...collectPreservedPackageParts(sourcePackage, [\n mainDocumentPath,\n numberingPartPath,\n commentsPartPath,\n commentsExtendedPartPath,\n commentsIdsPartPath,\n peoplePartPath,\n ]),\n },\n },\n diagnostics: {\n warnings: [\n ...createBrokenRelationshipWarnings(sourcePackage, mainDocumentPath),\n ...normalizedDocument.diagnostics.warnings,\n ...normalizedRevisions.diagnostics.map((diagnostic, index) => ({\n diagnosticId: `diagnostic:revision-import-${index + 1}`,\n warningId: `warning:revision-import-${diagnostic.revisionId}`,\n source: \"review\" as const,\n message: diagnostic.message,\n })),\n ...normalizedComments.diagnostics.map((diagnostic, index) => ({\n diagnosticId: `diagnostic:comment-import-${index + 1}`,\n warningId: `warning:comment-import-${diagnostic.commentId}`,\n source: \"review\" as const,\n message: diagnostic.message,\n })),\n ],\n errors: [],\n },\n review: {\n comments: toRuntimeCommentRecords(normalizedComments.threads),\n revisions: toRuntimeRevisionRecords(normalizedRevisions.revisions),\n },\n });\n const compatibility = buildCompatibilityReport({\n document,\n generatedAt: timestamp,\n });\n const snapshot = createImportedSnapshot({\n documentId: options.documentId,\n editorBuild,\n timestamp,\n document,\n compatibility: toPublicCompatibilityReport(compatibility),\n protectionSnapshot: importedProtectionSnapshot,\n sourcePackage: createPersistedSourcePackage(sourceBytes, options.sourceLabel),\n });\n const snapshotIssues = validatePersistedEditorSnapshot(snapshot);\n if (snapshotIssues.length > 0) {\n const firstIssue = snapshotIssues[0];\n return createDiagnosticsSession(\n options,\n createValidationImportDiagnostics({\n message: `DOCX import produced an invalid editor state during validation${firstIssue ? ` (${firstIssue.path}: ${firstIssue.message})` : \".\"}`,\n source: \"import\",\n details: {\n issueCount: snapshotIssues.length,\n firstIssuePath: firstIssue?.path,\n },\n }),\n );\n }\n const initialSessionState = editorSessionStateFromPersistedSnapshot(snapshot);\n const importedState: ImportedDocxState = {\n sourceBytes: new Uint8Array(sourceBytes),\n sourcePackage,\n sourceDocumentPartPath: mainDocumentPath,\n sourceDocumentRelationships: documentPart.relationships,\n sourceDocumentAttributes: extractDocumentRootAttributes(sourceDocumentXml),\n sourceNumberingPartPath: numberingPartPath,\n sourceNumberingRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === NUMBERING_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourceCommentsPartPath: commentsPartPath,\n sourceCommentsRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === COMMENTS_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourceCommentsRootTag: normalizedComments.sourceRootTag,\n sourceCommentsExtendedPartPath: commentsExtendedPartPath,\n sourceCommentsExtendedRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === COMMENTS_EXTENDED_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourceCommentsExtendedRootTag: normalizedComments.sourceExtendedRootTag,\n sourceCommentsIdsPartPath: commentsIdsPartPath,\n sourceCommentsIdsRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === COMMENTS_IDS_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourceCommentsIdsRootTag: normalizedComments.sourceIdsRootTag,\n sourcePeoplePartPath: peoplePartPath,\n sourcePeopleRelationshipId: documentPart.relationships.find(\n (relationship) =>\n relationship.type === PEOPLE_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"internal\",\n )?.id,\n sourcePeopleRootTag: normalizedComments.sourcePeopleRootTag,\n sourcePeopleAuthors: normalizedComments.peopleAuthors,\n protectionSnapshot: buildProtectionSnapshot(documentProtection, protectionRanges),\n preservedCommentDefinitions: normalizedComments.preservedDefinitions,\n blockingCommentDiagnostics: normalizedComments.diagnostics.filter((diagnostic) =>\n BLOCKING_COMMENT_DIAGNOSTIC_CODES.has(diagnostic.code),\n ),\n initialCanonicalSignature: serializeCanonicalDocumentForExport(document),\n sourceSubPartPaths: {\n headers: sourceHeaderPaths,\n footers: sourceFooterPaths,\n footnotesPartPath,\n footnotesRelationshipId,\n endnotesPartPath,\n endnotesRelationshipId,\n themePartPath,\n themeRelationshipId: themeRelationship?.id,\n },\n };\n\n return {\n initialSessionState,\n initialSnapshot: snapshot,\n readOnly: false,\n protectionSnapshot: importedProtectionSnapshot,\n exportDocx: async (nextSessionState, exportOptions) =>\n exportDocxEditorSession(importedState, nextSessionState, exportOptions),\n };\n } catch (error) {\n return createDiagnosticsSession(\n options,\n createImportDiagnosticsFromError(error),\n );\n }\n}\n\nfunction exportDocxEditorSession(\n state: ImportedDocxState,\n sessionStateOrSnapshot: EditorSessionState | PersistedEditorSnapshot,\n options?: ExportDocxOptions,\n): ExportResult {\n const sessionState = toEditorSessionState(sessionStateOrSnapshot);\n\n if (sessionState.compatibility.blockExport) {\n throw new Error(\"DOCX export is blocked by the current compatibility report.\");\n }\n\n const currentDocument = sessionState.canonicalDocument as CanonicalDocumentEnvelope;\n const signatureMatch = serializeCanonicalDocumentForExport(currentDocument) ===\n state.initialCanonicalSignature;\n const canReuse = canReuseSourceBytesForCurrentDocument(state, currentDocument);\n const commentCount = Object.keys(currentDocument.review?.comments ?? {}).length;\n\n if (signatureMatch && canReuse) {\n return {\n bytes: new Uint8Array(state.sourceBytes),\n mimeType: DOCX_MIME_TYPE,\n fileName: options?.fileName ?? `${sessionState.documentId}.docx`,\n delivery: {\n mode: \"exported-bytes-only\",\n },\n };\n }\n const preservedCommentIds = new Set(\n state.preservedCommentDefinitions.map((definition) => definition.commentId),\n );\n const blockingCommentCount = Math.max(\n state.blockingCommentDiagnostics.length,\n preservedCommentIds.size,\n );\n if (blockingCommentCount > 0) {\n throw new Error(\n `DOCX export is blocked because ${blockingCommentCount} preserve-only comment anchors cannot be safely remapped after runtime edits.`,\n );\n }\n const currentRevisions = toReviewRevisionRecords(currentDocument.review.revisions);\n const actionableRevisions = currentRevisions.filter(\n (revision) => getRevisionActionability(revision) === \"actionable\",\n );\n const secondaryStoryActionableRevisions = actionableRevisions.filter(\n (revision) => revision.metadata.storyTarget?.kind && revision.metadata.storyTarget.kind !== \"main\",\n );\n if (secondaryStoryActionableRevisions.length > 0) {\n throw new Error(\n `DOCX export is blocked because ${secondaryStoryActionableRevisions.length} secondary-story tracked changes cannot yet be serialized safely.`,\n );\n }\n const commentThreads = Object.values(\n createCommentStoreFromRuntimeComments(currentDocument.review.comments).threads,\n );\n const ownedCommentThreads = commentThreads.filter(\n (thread) => !preservedCommentIds.has(thread.commentId),\n );\n const serialized = serializeMainDocument(\n splitDocumentAtReviewBoundaries(\n currentDocument.content as never,\n ownedCommentThreads,\n actionableRevisions,\n ) as never,\n currentDocument.preservation as never,\n state.sourceDocumentRelationships,\n {\n documentAttributes: state.sourceDocumentAttributes,\n media: currentDocument.media as MediaCatalog,\n finalSectionProperties: currentDocument.subParts?.finalSectionProperties,\n },\n );\n const revisionDocument = serializeRuntimeRevisionsIntoDocumentXml(\n serialized.documentXml,\n actionableRevisions,\n serialized.paragraphBoundaries,\n );\n if (revisionDocument.skippedRevisionIds.length > 0) {\n throw new Error(\n `DOCX export is blocked because ${revisionDocument.skippedRevisionIds.length} active revisions overlap unsupported serialization boundaries.`,\n );\n }\n\n const strippedDocumentXml = stripCommentMarkup(\n revisionDocument.documentXml,\n ownedCommentThreads.map((thread) => thread.commentId),\n );\n const exportCommentIds = createCommentExportIdMap(\n ownedCommentThreads,\n state.preservedCommentDefinitions,\n );\n const serializedComments = serializeMergedCommentsXml(ownedCommentThreads, {\n exportCommentIds,\n preservedDefinitions: state.preservedCommentDefinitions,\n sourceRootTag: state.sourceCommentsRootTag,\n sourceExtendedRootTag: state.sourceCommentsExtendedRootTag,\n sourceIdsRootTag: state.sourceCommentsIdsRootTag,\n sourcePeopleRootTag: state.sourcePeopleRootTag,\n peopleAuthors: state.sourcePeopleAuthors,\n });\n const annotatedDocument = serializeCommentAnchorsIntoDocumentXml(\n strippedDocumentXml,\n ownedCommentThreads,\n undefined,\n {\n exportCommentIds,\n },\n );\n const protectedDocumentXml = serializeProtectionRangesIntoDocumentXml(\n annotatedDocument.documentXml,\n state.protectionSnapshot,\n );\n const blockingSkippedCommentIds = annotatedDocument.skippedCommentIds.filter((commentId) => {\n const thread = ownedCommentThreads.find((candidate) => candidate.commentId === commentId);\n return !thread || thread.anchor.kind !== \"detached\";\n });\n if (blockingSkippedCommentIds.length > 0) {\n throw new Error(\n `DOCX export is blocked because ${blockingSkippedCommentIds.length} comments no longer map to serializable ranges.`,\n );\n }\n const commentsPartPath =\n state.sourceCommentsPartPath ?? COMMENTS_PART_PATH;\n const commentsExtendedPartPath =\n state.sourceCommentsExtendedPartPath ?? COMMENTS_EXTENDED_PART_PATH;\n const commentsIdsPartPath =\n state.sourceCommentsIdsPartPath ?? COMMENTS_IDS_PART_PATH;\n const peoplePartPath =\n state.sourcePeoplePartPath ?? PEOPLE_PART_PATH;\n const numberingPartPath =\n state.sourceNumberingPartPath ?? NUMBERING_PART_PATH;\n const serializedNumberingXml = hasSerializableNumberingEntries(\n currentDocument.numbering as NumberingCatalog,\n )\n ? serializeNumberingXml(currentDocument.numbering as NumberingCatalog)\n : undefined;\n const nextRelationships = withDocumentRelatedParts(\n serialized.relationships,\n [\n {\n relationshipType: NUMBERING_RELATIONSHIP_TYPE,\n partPath: numberingPartPath,\n existingRelationshipId: state.sourceNumberingRelationshipId,\n include:\n Boolean(serializedNumberingXml) ||\n Boolean(state.sourceNumberingPartPath),\n },\n {\n relationshipType: COMMENTS_RELATIONSHIP_TYPE,\n partPath: commentsPartPath,\n existingRelationshipId: state.sourceCommentsRelationshipId,\n include:\n serializedComments.serializedCommentIds.length > 0 ||\n Boolean(state.sourceCommentsPartPath),\n },\n {\n relationshipType: COMMENTS_EXTENDED_RELATIONSHIP_TYPE,\n partPath: commentsExtendedPartPath,\n existingRelationshipId: state.sourceCommentsExtendedRelationshipId,\n include:\n Boolean(serializedComments.commentsExtendedXml) ||\n Boolean(state.sourceCommentsExtendedPartPath),\n },\n {\n relationshipType: COMMENTS_IDS_RELATIONSHIP_TYPE,\n partPath: commentsIdsPartPath,\n existingRelationshipId: state.sourceCommentsIdsRelationshipId,\n include:\n Boolean(serializedComments.commentsIdsXml) ||\n Boolean(state.sourceCommentsIdsPartPath),\n },\n {\n relationshipType: PEOPLE_RELATIONSHIP_TYPE,\n partPath: peoplePartPath,\n existingRelationshipId: state.sourcePeopleRelationshipId,\n include:\n Boolean(serializedComments.peopleXml) ||\n Boolean(state.sourcePeoplePartPath),\n },\n ],\n );\n\n const exportedSubParts = currentDocument.subParts as SubPartsCatalog | undefined;\n const subPartOwnedPaths: string[] = [];\n if (exportedSubParts) {\n for (const header of exportedSubParts.headers) {\n subPartOwnedPaths.push(header.partPath);\n }\n for (const footer of exportedSubParts.footers) {\n subPartOwnedPaths.push(footer.partPath);\n }\n if (exportedSubParts.footnoteCollection) {\n if (state.sourceSubPartPaths.footnotesPartPath) {\n subPartOwnedPaths.push(state.sourceSubPartPaths.footnotesPartPath);\n }\n if (state.sourceSubPartPaths.endnotesPartPath) {\n subPartOwnedPaths.push(state.sourceSubPartPaths.endnotesPartPath);\n }\n }\n if (exportedSubParts.theme && state.sourceSubPartPaths.themePartPath) {\n subPartOwnedPaths.push(state.sourceSubPartPaths.themePartPath);\n }\n }\n\n const exportSession = createExportSession(state.sourcePackage, [\n state.sourceDocumentPartPath,\n APP_PROPERTIES_PART_PATH,\n CORE_PROPERTIES_PART_PATH,\n numberingPartPath,\n commentsPartPath,\n commentsExtendedPartPath,\n commentsIdsPartPath,\n peoplePartPath,\n ...subPartOwnedPaths,\n ]);\n\n exportSession.replaceOwnedPart({\n path: state.sourceDocumentPartPath,\n bytes: new TextEncoder().encode(protectedDocumentXml),\n contentType: MAIN_DOCUMENT_CONTENT_TYPE,\n relationships: nextRelationships,\n });\n\n if (serializedNumberingXml || state.sourceNumberingPartPath) {\n exportSession.replaceOwnedPart({\n path: numberingPartPath,\n bytes: new TextEncoder().encode(\n serializedNumberingXml ??\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"></w:numbering>`,\n ),\n contentType:\n state.sourcePackage.parts.get(numberingPartPath)?.contentType ??\n WORD_NUMBERING_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.serializedCommentIds.length > 0 || state.sourceCommentsPartPath) {\n exportSession.replaceOwnedPart({\n path: commentsPartPath,\n bytes: new TextEncoder().encode(serializedComments.commentsXml),\n contentType:\n state.sourcePackage.parts.get(commentsPartPath)?.contentType ?? COMMENTS_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.commentsExtendedXml || state.sourceCommentsExtendedPartPath) {\n exportSession.replaceOwnedPart({\n path: commentsExtendedPartPath,\n bytes: new TextEncoder().encode(\n serializedComments.commentsExtendedXml ?? `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w15:commentsEx xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"></w15:commentsEx>`,\n ),\n contentType:\n state.sourcePackage.parts.get(commentsExtendedPartPath)?.contentType ??\n COMMENTS_EXTENDED_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.commentsIdsXml || state.sourceCommentsIdsPartPath) {\n exportSession.replaceOwnedPart({\n path: commentsIdsPartPath,\n bytes: new TextEncoder().encode(\n serializedComments.commentsIdsXml ?? `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w16cid:commentsIds xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\"></w16cid:commentsIds>`,\n ),\n contentType:\n state.sourcePackage.parts.get(commentsIdsPartPath)?.contentType ??\n COMMENTS_IDS_CONTENT_TYPE,\n });\n }\n\n if (serializedComments.peopleXml || state.sourcePeoplePartPath) {\n exportSession.replaceOwnedPart({\n path: peoplePartPath,\n bytes: new TextEncoder().encode(\n serializedComments.peopleXml ?? `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<w15:people xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"></w15:people>`,\n ),\n contentType:\n state.sourcePackage.parts.get(peoplePartPath)?.contentType ??\n PEOPLE_CONTENT_TYPE,\n });\n }\n\n if (exportedSubParts) {\n for (const header of exportedSubParts.headers) {\n exportSession.replaceOwnedPart({\n path: header.partPath,\n bytes: new TextEncoder().encode(serializeHeaderXml(header)),\n contentType:\n state.sourcePackage.parts.get(header.partPath)?.contentType ?? WORD_HEADER_CONTENT_TYPE,\n });\n }\n for (const footer of exportedSubParts.footers) {\n exportSession.replaceOwnedPart({\n path: footer.partPath,\n bytes: new TextEncoder().encode(serializeFooterXml(footer)),\n contentType:\n state.sourcePackage.parts.get(footer.partPath)?.contentType ?? WORD_FOOTER_CONTENT_TYPE,\n });\n }\n if (exportedSubParts.footnoteCollection) {\n if (state.sourceSubPartPaths.footnotesPartPath) {\n exportSession.replaceOwnedPart({\n path: state.sourceSubPartPaths.footnotesPartPath,\n bytes: new TextEncoder().encode(serializeFootnotesXml(exportedSubParts.footnoteCollection)),\n contentType:\n state.sourcePackage.parts.get(state.sourceSubPartPaths.footnotesPartPath)?.contentType ??\n WORD_FOOTNOTES_CONTENT_TYPE,\n });\n }\n if (state.sourceSubPartPaths.endnotesPartPath) {\n exportSession.replaceOwnedPart({\n path: state.sourceSubPartPaths.endnotesPartPath,\n bytes: new TextEncoder().encode(serializeEndnotesXml(exportedSubParts.footnoteCollection)),\n contentType:\n state.sourcePackage.parts.get(state.sourceSubPartPaths.endnotesPartPath)?.contentType ??\n WORD_ENDNOTES_CONTENT_TYPE,\n });\n }\n }\n if (exportedSubParts.theme && state.sourceSubPartPaths.themePartPath) {\n const sourceThemePart = state.sourcePackage.parts.get(state.sourceSubPartPaths.themePartPath);\n if (sourceThemePart) {\n exportSession.replaceOwnedPart({\n path: state.sourceSubPartPaths.themePartPath,\n bytes: sourceThemePart.bytes,\n contentType:\n sourceThemePart.contentType ??\n \"application/vnd.openxmlformats-officedocument.theme+xml\",\n relationships: sourceThemePart.relationships,\n compression: sourceThemePart.compression,\n });\n }\n }\n }\n\n ensureHostMetadataParts(exportSession, state.sourcePackage, currentDocument);\n\n return {\n bytes: exportSession.serialize(),\n mimeType: DOCX_MIME_TYPE,\n fileName: options?.fileName ?? `${sessionState.documentId}.docx`,\n delivery: {\n mode: \"exported-bytes-only\",\n },\n };\n}\n\nfunction toEditorSessionState(\n sessionStateOrSnapshot: EditorSessionState | PersistedEditorSnapshot,\n): EditorSessionState {\n return \"sessionVersion\" in sessionStateOrSnapshot\n ? sessionStateOrSnapshot\n : editorSessionStateFromPersistedSnapshot(sessionStateOrSnapshot);\n}\n\nfunction createImportedCanonicalDocument(input: {\n documentId: string;\n timestamp: string;\n numbering: CanonicalDocumentEnvelope[\"numbering\"];\n media: CanonicalDocumentEnvelope[\"media\"];\n content: CanonicalDocumentEnvelope[\"content\"];\n subParts?: SubPartsCatalog;\n parsedStyles?: ParseStylesResult;\n preservation: CanonicalDocumentEnvelope[\"preservation\"];\n diagnostics: CanonicalDocumentEnvelope[\"diagnostics\"];\n review: CanonicalDocumentEnvelope[\"review\"];\n}): CanonicalDocumentEnvelope {\n const numbering = ensureImportedNumberingCatalogSupportsContent(\n input.numbering,\n input.content,\n );\n\n // Use package-backed style catalog when available; fall back to synthetic\n // styles derived from referenced styleId values when styles.xml is missing\n // or could not be parsed.\n const styles = buildStylesCatalog(input.parsedStyles, input.content, input.subParts);\n\n return {\n schemaVersion: \"cds/1.0.0\",\n docId: createCanonicalDocumentId(input.documentId),\n createdAt: input.timestamp,\n updatedAt: input.timestamp,\n metadata: {\n customProperties: {},\n },\n styles,\n numbering,\n media: input.media,\n content: input.content,\n review: input.review,\n preservation: input.preservation,\n diagnostics: input.diagnostics,\n ...(input.subParts !== undefined ? { subParts: input.subParts } : {}),\n };\n}\n\ntype SubPartOpaqueImportState = {\n nextFragmentIndex: number;\n nextWarningIndex: number;\n nextDiagnosticIndex: number;\n cursor: number;\n};\n\nfunction createSubPartOpaqueImportState(\n opaqueFragments: Record<string, OpaqueFragmentRecord>,\n warnings: CanonicalDocumentEnvelope[\"diagnostics\"][\"warnings\"],\n): SubPartOpaqueImportState {\n const maxByPrefix = (values: Iterable<string>, prefix: string): number => {\n let max = 0;\n for (const value of values) {\n const match = new RegExp(`^${prefix}(\\\\d+)$`).exec(value);\n if (!match) {\n continue;\n }\n const parsed = Number.parseInt(match[1] ?? \"0\", 10);\n if (Number.isFinite(parsed) && parsed > max) {\n max = parsed;\n }\n }\n return max;\n };\n\n const maxCursor = Object.values(opaqueFragments).reduce(\n (currentMax, fragment) => Math.max(currentMax, fragment.lastKnownRange?.to ?? 0),\n 0,\n );\n\n return {\n nextFragmentIndex:\n maxByPrefix(Object.keys(opaqueFragments), \"fragment:import-\") + 1,\n nextWarningIndex:\n maxByPrefix(\n [\n ...Object.values(opaqueFragments).map((fragment) => fragment.warningId),\n ...warnings.map((warning) => warning.warningId),\n ],\n \"warning:import-\",\n ) + 1,\n nextDiagnosticIndex:\n maxByPrefix(warnings.map((warning) => warning.diagnosticId), \"diagnostic:import-\") + 1,\n cursor: maxCursor,\n };\n}\n\nfunction normalizeSubPartOpaqueBlocks(\n blocks: BlockNode[],\n opaqueFragments: Record<string, OpaqueFragmentRecord>,\n warnings: CanonicalDocumentEnvelope[\"diagnostics\"][\"warnings\"],\n packagePartName: string,\n state: SubPartOpaqueImportState,\n): BlockNode[] {\n return blocks.map((block) => {\n if (block.type !== \"opaque_block\" || typeof block.rawXml !== \"string\") {\n return block;\n }\n return recordImportedOpaqueBlock(\n block.rawXml,\n opaqueFragments,\n warnings,\n packagePartName,\n state,\n );\n });\n}\n\nfunction normalizeFootnoteCollectionOpaqueBlocks(\n collection: FootnoteCollection | undefined,\n kind: \"footnote\" | \"endnote\",\n opaqueFragments: Record<string, OpaqueFragmentRecord>,\n warnings: CanonicalDocumentEnvelope[\"diagnostics\"][\"warnings\"],\n packagePartName: string,\n state: SubPartOpaqueImportState,\n): void {\n if (!collection) {\n return;\n }\n const notes = kind === \"footnote\" ? collection.footnotes : collection.endnotes;\n for (const definition of Object.values(notes)) {\n definition.blocks = normalizeSubPartOpaqueBlocks(\n definition.blocks,\n opaqueFragments,\n warnings,\n packagePartName,\n state,\n );\n }\n}\n\nfunction recordImportedOpaqueBlock(\n rawXml: string,\n opaqueFragments: Record<string, OpaqueFragmentRecord>,\n warnings: CanonicalDocumentEnvelope[\"diagnostics\"][\"warnings\"],\n packagePartName: string,\n state: SubPartOpaqueImportState,\n): BlockNode {\n const fragmentId = `fragment:import-${state.nextFragmentIndex}`;\n state.nextFragmentIndex += 1;\n const warningId = `warning:import-${state.nextWarningIndex}`;\n state.nextWarningIndex += 1;\n const diagnosticId = `diagnostic:import-${state.nextDiagnosticIndex}`;\n state.nextDiagnosticIndex += 1;\n\n const rangeStart = state.cursor;\n const rangeEnd = state.cursor + 1;\n state.cursor = rangeEnd;\n\n opaqueFragments[fragmentId] = {\n fragmentId,\n payloadKind: \"xml-subtree\",\n payloadReference: rawXml,\n featureClass: \"preserve-only\",\n lastKnownRange: {\n from: rangeStart,\n to: rangeEnd,\n },\n warningId,\n packagePartName,\n };\n warnings.push({\n diagnosticId,\n warningId,\n source: \"import\",\n message: \"Unsupported sub-part OOXML was preserved as an opaque placeholder.\",\n });\n\n return {\n type: \"opaque_block\",\n fragmentId,\n warningId,\n rawXml,\n };\n}\n\n// Canonical model styleId validation pattern — styleIds that don't match\n// are excluded from the catalog to avoid snapshot validation failures.\nconst VALID_STYLE_ID = /^[A-Za-z_][A-Za-z0-9._-]{0,127}$/;\n\nfunction buildStylesCatalog(\n parsedStyles: ParseStylesResult | undefined,\n content: CanonicalDocumentEnvelope[\"content\"],\n subParts?: SubPartsCatalog,\n): CanonicalDocumentEnvelope[\"styles\"] {\n if (parsedStyles?.fromPackage) {\n // Package-backed catalog: filter entries whose styleId does not satisfy\n // the canonical model pattern (e.g. numeric-only ids from Word).\n const catalog = filterValidStyleIds(parsedStyles.catalog);\n\n // Merge in any referenced styleIds that the package styles.xml did not\n // define (rare but defensive).\n const referencedIds = collectReferencedParagraphStyleIds(content, subParts);\n for (const styleId of referencedIds) {\n if (!catalog.paragraphs[styleId] && VALID_STYLE_ID.test(styleId)) {\n catalog.paragraphs[styleId] = {\n styleId,\n displayName: styleId,\n kind: \"paragraph\",\n isDefault: styleId === \"Normal\",\n };\n }\n }\n return {\n ...catalog,\n fromPackage: true,\n };\n }\n\n // Synthetic fallback: no styles.xml available\n const paragraphStyles = Object.fromEntries(\n [...collectReferencedParagraphStyleIds(content, subParts)]\n .sort((left, right) => left.localeCompare(right))\n .filter((styleId) => VALID_STYLE_ID.test(styleId))\n .map((styleId) => [\n styleId,\n {\n styleId,\n displayName: styleId,\n kind: \"paragraph\" as const,\n isDefault: styleId === \"Normal\",\n },\n ]),\n );\n return {\n paragraphs: paragraphStyles,\n characters: {},\n tables: {},\n fromPackage: false,\n };\n}\n\nfunction filterValidStyleIds(\n catalog: CanonicalDocumentEnvelope[\"styles\"],\n): CanonicalDocumentEnvelope[\"styles\"] {\n const filterRecord = <T extends { styleId: string }>(\n record: Record<string, T>,\n ): Record<string, T> => {\n const result: Record<string, T> = {};\n for (const [key, value] of Object.entries(record)) {\n if (VALID_STYLE_ID.test(key)) {\n result[key] = value;\n }\n }\n return result;\n };\n\n return {\n paragraphs: filterRecord(catalog.paragraphs),\n characters: filterRecord(catalog.characters),\n tables: filterRecord(catalog.tables),\n ...(catalog.latentStyles ? { latentStyles: catalog.latentStyles } : {}),\n ...(catalog.fromPackage !== undefined ? { fromPackage: catalog.fromPackage } : {}),\n };\n}\n\nfunction ensureImportedNumberingCatalogSupportsContent(\n catalog: NumberingCatalog,\n content: CanonicalDocumentEnvelope[\"content\"],\n): NumberingCatalog {\n if (\n catalog.instances[DOCX_NULL_NUMBERING_INSTANCE_ID] ||\n !collectReferencedNumberingInstanceIds(content).has(DOCX_NULL_NUMBERING_INSTANCE_ID)\n ) {\n return catalog;\n }\n\n const syntheticNullCatalog = createSyntheticDocxNullNumberingCatalog();\n return {\n abstractDefinitions: {\n ...catalog.abstractDefinitions,\n ...syntheticNullCatalog.abstractDefinitions,\n },\n instances: {\n ...catalog.instances,\n ...syntheticNullCatalog.instances,\n },\n };\n}\n\nfunction collectReferencedNumberingInstanceIds(\n content: CanonicalDocumentEnvelope[\"content\"],\n): Set<string> {\n const numberingInstanceIds = new Set<string>();\n\n const visitBlocks = (blocks: ReadonlyArray<BlockNode>) => {\n for (const block of blocks) {\n if (block.type === \"paragraph\" && block.numbering?.numberingInstanceId) {\n numberingInstanceIds.add(block.numbering.numberingInstanceId);\n }\n if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n visitBlocks(cell.children);\n }\n }\n } else if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n visitBlocks(block.children);\n }\n }\n };\n\n visitBlocks(content.children);\n return numberingInstanceIds;\n}\n\nfunction collectReferencedParagraphStyleIds(\n content: CanonicalDocumentEnvelope[\"content\"],\n subParts?: SubPartsCatalog,\n): Set<string> {\n const styleIds = new Set<string>();\n\n const visitBlocks = (blocks: ReadonlyArray<BlockNode>) => {\n for (const block of blocks) {\n if (\"styleId\" in block && typeof block.styleId === \"string\" && block.styleId.length > 0) {\n styleIds.add(block.styleId);\n }\n if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n visitBlocks(cell.children);\n }\n }\n } else if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n visitBlocks(block.children);\n }\n }\n };\n\n visitBlocks(content.children);\n if (subParts) {\n for (const header of subParts.headers) {\n visitBlocks(header.blocks);\n }\n for (const footer of subParts.footers) {\n visitBlocks(footer.blocks);\n }\n if (subParts.footnoteCollection) {\n for (const note of Object.values(subParts.footnoteCollection.footnotes)) {\n visitBlocks(note.blocks);\n }\n for (const note of Object.values(subParts.footnoteCollection.endnotes)) {\n visitBlocks(note.blocks);\n }\n }\n }\n\n return styleIds;\n}\n\nfunction createImportedSnapshot(input: {\n documentId: string;\n editorBuild: string;\n timestamp: string;\n document: CanonicalDocumentEnvelope;\n compatibility: PersistedEditorSnapshot[\"compatibility\"];\n protectionSnapshot: ProtectionSnapshot;\n sourcePackage?: PersistedEditorSnapshot[\"sourcePackage\"];\n}): PersistedEditorSnapshot {\n return {\n snapshotVersion: \"persisted-editor-snapshot/2\",\n schemaVersion: input.document.schemaVersion,\n documentId: input.documentId,\n docId: input.document.docId,\n createdAt: input.document.createdAt,\n updatedAt: input.document.updatedAt,\n savedAt: input.timestamp,\n editorBuild: input.editorBuild,\n canonicalDocument: input.document,\n compatibility: input.compatibility,\n warningLog: input.compatibility.warnings,\n protectionSnapshot: input.protectionSnapshot,\n sourcePackage: input.sourcePackage,\n };\n}\n\nfunction toPublicAnchorProjection(\n anchor: InternalEditorAnchorProjection,\n): PublicEditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\":\n return {\n kind: \"range\",\n from: anchor.range.from,\n to: anchor.range.to,\n assoc: anchor.assoc,\n };\n case \"node\":\n return {\n kind: \"node\",\n at: anchor.at,\n assoc: anchor.assoc,\n };\n case \"detached\":\n return {\n kind: \"detached\",\n lastKnownRange: anchor.lastKnownRange,\n reason: anchor.reason,\n };\n }\n}\n\nfunction toPublicCompatibilityFeatureEntry(entry: InternalCompatibilityFeatureEntry) {\n return {\n ...entry,\n affectedAnchor: entry.affectedAnchor\n ? toPublicAnchorProjection(entry.affectedAnchor)\n : undefined,\n };\n}\n\nfunction toPublicWarning(warning: InternalEditorWarning): PublicEditorWarning {\n return {\n ...warning,\n affectedAnchor: warning.affectedAnchor\n ? toPublicAnchorProjection(warning.affectedAnchor)\n : undefined,\n };\n}\n\nfunction toPublicError(error: InternalEditorError): EditorError {\n return { ...error };\n}\n\nfunction toPublicCompatibilityReport(\n report: InternalCompatibilityReport,\n): PublicCompatibilityReport {\n return {\n reportVersion: report.reportVersion,\n generatedAt: report.generatedAt,\n blockExport: report.blockExport,\n featureEntries: report.featureEntries.map((entry) =>\n toPublicCompatibilityFeatureEntry(entry),\n ),\n warnings: report.warnings.map((warning) => toPublicWarning(warning)),\n errors: report.errors.map((error) => toPublicError(error)),\n };\n}\n\nfunction createDiagnosticsSession(\n options: LoadDocxEditorSessionOptions,\n diagnostics: ImportDiagnosticsResult,\n): LoadedDocxEditorSession {\n const timestamp = new Date().toISOString();\n const editorBuild =\n typeof options.editorBuild === \"string\" && options.editorBuild.length > 0\n ? options.editorBuild\n : \"dev\";\n const runtime = createReadOnlyDiagnosticsRuntime({\n documentId: options.documentId,\n sourceLabel: options.sourceLabel,\n editorBuild,\n generatedAt: timestamp,\n diagnostics,\n });\n const initialSnapshot = runtime.getPersistedSnapshot();\n const initialSessionState = editorSessionStateFromPersistedSnapshot(initialSnapshot);\n\n return {\n initialSessionState,\n initialSnapshot,\n fatalError: diagnostics.fatalError,\n readOnly: true,\n protectionSnapshot: EMPTY_PROTECTION_SNAPSHOT,\n exportDocx: async (_sessionState, exportOptions) => runtime.exportDocx(exportOptions),\n };\n}\n\nfunction createImportDiagnosticsFromError(error: unknown): ImportDiagnosticsResult {\n if (isPackageImportError(error)) {\n return createPackageImportDiagnostics({\n issue: classifyCorruptPackageError(error),\n });\n }\n\n return createValidationImportDiagnostics({\n message:\n error instanceof Error\n ? error.message\n : \"DOCX import failed during validation.\",\n });\n}\n\nfunction normalizeImportedRevisionRecords(\n parsed: ParsedRevisionsResult,\n content: CanonicalDocumentEnvelope[\"content\"],\n opaqueFragments: Record<string, OpaqueFragmentRecord>,\n): ParsedRevisionsResult {\n const opaqueRanges = Object.values(opaqueFragments).map((fragment) => fragment.lastKnownRange);\n const paragraphRanges = collectCanonicalParagraphRanges(content);\n if (opaqueRanges.length === 0) {\n return {\n ...parsed,\n revisions: parsed.revisions.map((revision) => {\n if (revision.anchor.kind !== \"range\" || revision.metadata.preserveOnlyReason) {\n return revision;\n }\n\n const preserveOnlyReason = getStructuralPreserveOnlyReason(\n revision,\n paragraphRanges,\n );\n if (!preserveOnlyReason) {\n return revision;\n }\n\n return {\n ...revision,\n metadata: {\n ...revision.metadata,\n preserveOnlyReason,\n },\n };\n }),\n };\n }\n\n return {\n ...parsed,\n revisions: parsed.revisions.map((revision) => {\n const { anchor } = revision;\n if (anchor.kind !== \"range\" || revision.metadata.preserveOnlyReason) {\n return revision;\n }\n\n const preserveOnlyReason =\n getStructuralPreserveOnlyReason(revision, paragraphRanges) ??\n (opaqueRanges.some((range) => rangesIntersect(range, anchor.range))\n ? \"Imported revision overlaps preserve-only OOXML and remains preserve-only.\"\n : undefined);\n\n if (!preserveOnlyReason) {\n return revision;\n }\n\n return {\n ...revision,\n metadata: {\n ...revision.metadata,\n preserveOnlyReason,\n },\n };\n }),\n };\n}\n\nfunction normalizeImportedCommentThreads(\n parsed: ParsedCommentsResult,\n opaqueFragments: Record<string, OpaqueFragmentRecord>,\n revisions: readonly ReviewRevisionRecord[],\n): NormalizedImportedCommentsResult {\n const opaqueRanges = Object.values(opaqueFragments).map((fragment) => fragment.lastKnownRange);\n const preserveOnlyRevisionRanges = revisions.flatMap((revision) => {\n const { anchor } = revision;\n if (\n anchor.kind !== \"range\" ||\n typeof revision.metadata.preserveOnlyReason !== \"string\" ||\n revision.metadata.preserveOnlyReason.length === 0\n ) {\n return [];\n }\n return [anchor.range];\n });\n const preserveOnlyCommentIds = new Set(parsed.diagnostics.map((diagnostic) => diagnostic.commentId));\n const additionalDiagnostics: CommentImportDiagnostic[] = [];\n const normalizedThreads: CommentThread[] = parsed.threads.map((thread) => {\n const { anchor } = thread;\n if (anchor.kind !== \"range\") {\n preserveOnlyCommentIds.add(thread.commentId);\n return thread;\n }\n\n const opaqueOverlap = opaqueRanges.some((range) => rangesIntersect(range, anchor.range));\n if (opaqueOverlap) {\n preserveOnlyCommentIds.add(thread.commentId);\n additionalDiagnostics.push({\n commentId: thread.commentId,\n code: \"opaque_anchor_preserve_only\",\n message:\n \"Comment anchor intersects preserve-only OOXML content. Thread is visible but detached; anchor cannot be safely remapped.\",\n featureClass: \"preserve-only\",\n detachedReason: \"opaque-region\" as const,\n actionabilityNote: \"The comment body is preserved. The anchor overlaps opaque content that the editor cannot safely modify.\",\n });\n return {\n ...thread,\n anchor: createDetachedAnchor(anchor.range, \"importAmbiguity\"),\n status: \"detached\",\n };\n }\n\n const preserveOnlyRevisionOverlap = preserveOnlyRevisionRanges.some((range) =>\n rangesIntersect(range, anchor.range),\n );\n if (preserveOnlyRevisionOverlap) {\n preserveOnlyCommentIds.add(thread.commentId);\n additionalDiagnostics.push({\n commentId: thread.commentId,\n code: \"preserve_only_revision_overlap\",\n message:\n \"Comment anchor overlaps preserve-only review markup. Thread is visible but detached; anchor cannot be safely remapped during editing.\",\n featureClass: \"preserve-only\",\n detachedReason: \"revision-overlap\" as const,\n actionabilityNote: \"The comment body is preserved. The anchor overlaps preserve-only revision markup that the editor cannot safely modify.\",\n });\n return {\n ...thread,\n anchor: createDetachedAnchor(anchor.range, \"importAmbiguity\"),\n status: \"detached\",\n };\n }\n\n return thread;\n });\n\n return {\n ...parsed,\n threads: normalizedThreads,\n diagnostics: [...parsed.diagnostics, ...additionalDiagnostics],\n definitions: parsed.definitions,\n preservedDefinitions: parsed.definitions.filter((definition) =>\n preserveOnlyCommentIds.has(\n resolveDefinitionRootCommentId(definition, parsed.definitions),\n ),\n ),\n };\n}\n\nfunction resolveDefinitionRootCommentId(\n definition: ImportedCommentDefinition,\n definitions: readonly ImportedCommentDefinition[],\n): string {\n if (!definition.parentParaId) {\n return definition.commentId;\n }\n\n const definitionsByParaId = new Map(\n definitions\n .filter((candidate) => typeof candidate.paraId === \"string\")\n .map((candidate) => [candidate.paraId!, candidate]),\n );\n const visited = new Set<string>();\n let current: ImportedCommentDefinition | undefined = definition;\n\n while (current?.parentParaId) {\n if (visited.has(current.parentParaId)) {\n break;\n }\n visited.add(current.parentParaId);\n const parent = definitionsByParaId.get(current.parentParaId);\n if (!parent) {\n break;\n }\n current = parent;\n }\n\n return current?.commentId ?? definition.commentId;\n}\n\nfunction getStructuralPreserveOnlyReason(\n revision: ReviewRevisionRecord,\n paragraphRanges: ReadonlyArray<{ start: number; end: number }>,\n): string | undefined {\n const form = revision.metadata.importedRevisionForm;\n const { anchor } = revision;\n if (!form || anchor.kind !== \"range\") {\n return undefined;\n }\n\n if (\n (form === \"run-insertion\" || form === \"run-deletion\") &&\n anchor.range.from === anchor.range.to\n ) {\n return \"Imported zero-width run revision remains preserve-only.\";\n }\n\n if (form === \"paragraph-insertion\" || form === \"paragraph-deletion\") {\n const paragraphBoundary = paragraphRanges.find(\n (boundary) =>\n boundary.end === anchor.range.from ||\n (anchor.range.from >= boundary.start &&\n anchor.range.from <= boundary.end),\n );\n return paragraphBoundary\n ? undefined\n : \"Imported revision spans paragraph-level structure and remains preserve-only.\";\n }\n\n const paragraphBoundary = paragraphRanges.find(\n (boundary) =>\n anchor.range.from >= boundary.start &&\n anchor.range.to <= boundary.end,\n );\n return paragraphBoundary\n ? undefined\n : \"Imported revision spans structural boundaries and remains preserve-only.\";\n}\n\nfunction collectCanonicalParagraphRanges(\n content: CanonicalDocumentEnvelope[\"content\"],\n): Array<{ start: number; end: number }> {\n const ranges: Array<{ start: number; end: number }> = [];\n let cursor = 0;\n let previousWasParagraph = false;\n\n for (const block of content.children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n const start = cursor;\n cursor += measureCanonicalParagraph(block);\n ranges.push({ start, end: cursor });\n previousWasParagraph = true;\n continue;\n }\n\n cursor += 1;\n previousWasParagraph = false;\n }\n\n return ranges;\n}\n\nfunction measureCanonicalParagraph(paragraph: CanonicalDocumentEnvelope[\"content\"][\"children\"][number] & { type: \"paragraph\" }): number {\n return paragraph.children.reduce<number>((size, child) => {\n if (child.type === \"text\") {\n return size + child.text.length;\n }\n if (child.type === \"hyperlink\") {\n return (\n size +\n child.children.reduce<number>((childSize, entry) => {\n if (entry.type === \"text\") {\n return childSize + entry.text.length;\n }\n return childSize + 1;\n }, 0)\n );\n }\n return size + 1;\n }, 0);\n}\n\nfunction rangesIntersect(\n left: { from: number; to: number },\n right: { from: number; to: number },\n): boolean {\n return left.from < right.to && right.from < left.to;\n}\n\nfunction resolveCommentsPartPath(\n sourcePackage: OpcPackage,\n sourceDocumentPartPath: string,\n relationships: readonly OpcRelationship[],\n): string | undefined {\n return resolveDocumentRelatedPartPath(\n sourcePackage,\n sourceDocumentPartPath,\n relationships,\n COMMENTS_RELATIONSHIP_TYPE,\n COMMENTS_PART_PATH,\n );\n}\n\nfunction resolveDocumentRelatedPartPath(\n sourcePackage: OpcPackage,\n sourceDocumentPartPath: string,\n relationships: readonly OpcRelationship[],\n relationshipType: string,\n fallbackPartPath: string,\n): string | undefined {\n const relationship = relationships.find(\n (candidate) =>\n candidate.type === relationshipType &&\n candidate.targetMode === \"internal\",\n );\n if (!relationship) {\n return sourcePackage.parts.has(fallbackPartPath) ? fallbackPartPath : undefined;\n }\n\n const targetPath = resolveRelationshipTarget(sourceDocumentPartPath, relationship);\n return sourcePackage.parts.has(targetPath) ? targetPath : undefined;\n}\n\nfunction resolveMainDocumentPartPath(sourcePackage: OpcPackage): string | undefined {\n const relationship = sourcePackage.manifest.packageRelationships.find(\n (candidate) =>\n candidate.type === OFFICE_DOCUMENT_RELATIONSHIP_TYPE &&\n candidate.targetMode === \"internal\",\n );\n if (relationship) {\n return resolveRelationshipTarget(null, relationship);\n }\n\n return sourcePackage.parts.has(MAIN_DOCUMENT_PATH) ? MAIN_DOCUMENT_PATH : undefined;\n}\n\nfunction toRuntimeCommentRecords(\n threads: readonly CommentThread[],\n): Record<string, CommentThreadRecord> {\n return Object.fromEntries(\n threads.map((thread) => {\n return [\n thread.commentId,\n {\n commentId: thread.commentId,\n body: thread.entries.map((entry) => entry.body).join(\"\\n\"),\n anchor: thread.anchor,\n createdBy: thread.createdBy,\n authorId: thread.createdBy,\n createdAt: thread.createdAt,\n entries: thread.entries.map((entry) => ({\n entryId: entry.entryId,\n authorId: entry.authorId,\n body: entry.body,\n createdAt: entry.createdAt,\n metadata: entry.metadata\n ? {\n ooxmlCommentId: entry.metadata.ooxmlCommentId,\n paraId: entry.metadata.paraId,\n parentParaId: entry.metadata.parentParaId,\n durableId: entry.metadata.durableId,\n initials: entry.metadata.initials,\n }\n : undefined,\n })),\n status: thread.status,\n resolution: thread.resolution\n ? {\n resolvedAt: thread.resolution.resolvedAt,\n resolvedBy: thread.resolution.resolvedBy,\n }\n : undefined,\n resolvedAt: thread.resolution?.resolvedAt,\n warningIds: [...thread.warningIds],\n isResolved: thread.status === \"resolved\",\n metadata: thread.metadata\n ? {\n source: thread.metadata.source,\n rootOoxmlCommentId: thread.metadata.rootOoxmlCommentId,\n rootParaId: thread.metadata.rootParaId,\n }\n : undefined,\n } satisfies CommentThreadRecord,\n ];\n }),\n );\n}\n\nfunction toRuntimeRevisionRecords(\n revisions: readonly ReviewRevisionRecord[],\n): Record<string, RuntimeRevisionRecord> {\n return Object.fromEntries(\n revisions.map((revision) => [\n revision.revisionId,\n {\n changeId: revision.revisionId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId,\n createdAt: revision.createdAt,\n warningIds: [...revision.warningIds],\n metadata: {\n source: revision.metadata.source,\n storyTarget: revision.metadata.storyTarget,\n preserveOnlyReason: revision.metadata.preserveOnlyReason,\n importedRevisionForm: revision.metadata.importedRevisionForm,\n originalRevisionType: revision.metadata.originalRevisionType,\n ooxmlRevisionId: revision.metadata.ooxmlRevisionId,\n },\n status: revision.status === \"active\" ? \"open\" : revision.status,\n } satisfies RuntimeRevisionRecord,\n ]),\n );\n}\n\nfunction toReviewRevisionRecords(\n revisions: CanonicalDocumentEnvelope[\"review\"][\"revisions\"],\n): ReviewRevisionRecord[] {\n return Object.values(revisions).map((revision) => ({\n revisionId: revision.changeId,\n kind: revision.kind,\n anchor: revision.anchor,\n authorId: revision.authorId ?? \"unknown\",\n createdAt: revision.createdAt,\n warningIds: [...(revision.warningIds ?? [])],\n metadata: {\n source: revision.metadata?.source ?? \"runtime\",\n storyTarget: revision.metadata?.storyTarget,\n preserveOnlyReason: revision.metadata?.preserveOnlyReason,\n importedRevisionForm: revision.metadata?.importedRevisionForm,\n originalRevisionType: revision.metadata?.originalRevisionType,\n ooxmlRevisionId: revision.metadata?.ooxmlRevisionId,\n },\n status: revision.status === \"open\" ? \"active\" : revision.status,\n }));\n}\n\nexport function stripCommentMarkup(\n documentXml: string,\n ownedCommentIds: readonly string[],\n): string {\n if (ownedCommentIds.length === 0) {\n return documentXml;\n }\n\n let output = documentXml;\n for (const commentId of ownedCommentIds) {\n const escapedCommentId = escapeRegExp(commentId);\n const attributePattern = `(?:w:id|id)=[\"']${escapedCommentId}[\"']`;\n output = output\n .replace(\n new RegExp(`<w:commentRangeStart\\\\b[^>]*${attributePattern}[^>]*/>`, \"gu\"),\n \"\",\n )\n .replace(\n new RegExp(`<w:commentRangeEnd\\\\b[^>]*${attributePattern}[^>]*/>`, \"gu\"),\n \"\",\n )\n .replace(\n new RegExp(\n `<w:r\\\\b[^>]*>(?:(?!<w:t\\\\b|</w:r>)[\\\\s\\\\S])*?<w:commentReference\\\\b[^>]*${attributePattern}[^>]*/>(?:(?!<w:t\\\\b|</w:r>)[\\\\s\\\\S])*?</w:r>`,\n \"gu\",\n ),\n \"\",\n );\n }\n\n return output;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction withDocumentRelatedParts(\n relationships: readonly OpcRelationship[],\n relatedParts: ReadonlyArray<{\n relationshipType: string;\n partPath: string;\n existingRelationshipId?: string;\n include: boolean;\n }>,\n): OpcRelationship[] {\n const filteredTypes = new Set(relatedParts.map((part) => part.relationshipType));\n const nextRelationships = relationships\n .filter((relationship) => !filteredTypes.has(relationship.type))\n .map(cloneRelationship);\n\n for (const part of relatedParts) {\n if (!part.include) {\n continue;\n }\n\n nextRelationships.push({\n id: part.existingRelationshipId ?? createCommentsRelationshipId(nextRelationships),\n type: part.relationshipType,\n target: toDocumentRelativeTarget(part.partPath),\n targetMode: \"internal\",\n });\n }\n\n return nextRelationships;\n}\n\nfunction collectPreservedPackageParts(\n sourcePackage: OpcPackage,\n ownedPartPaths: ReadonlyArray<string | undefined>,\n): Record<string, PreservedPackagePart> {\n const normalizedOwnedPaths = new Set(\n ownedPartPaths\n .filter((value): value is string => typeof value === \"string\")\n .map((path) => normalizePartPath(path)),\n );\n return Object.fromEntries(\n [...sourcePackage.parts.values()]\n .filter((part) =>\n shouldPreservePackagePart(part.path, part.surfaceKind, normalizedOwnedPaths),\n )\n .map((part) => [\n part.path,\n {\n packagePartName: part.path,\n contentType: part.contentType ?? \"application/octet-stream\",\n relationshipIds: findRelationshipIdsTargetingPart(sourcePackage, part.path),\n } satisfies PreservedPackagePart,\n ]),\n );\n}\n\nfunction collectInlineMediaParts(\n sourcePackage: OpcPackage,\n): ReadonlyMap<string, { path: string; contentType: string }> {\n return new Map(\n [...sourcePackage.parts.values()]\n .filter(\n (part) =>\n part.path.startsWith(\"/word/media/\") && typeof part.contentType === \"string\",\n )\n .map((part) => [\n part.path,\n {\n path: part.path,\n contentType: part.contentType ?? \"application/octet-stream\",\n },\n ]),\n );\n}\n\nfunction createEmptyNumberingCatalog(): NumberingCatalog {\n return {\n abstractDefinitions: {},\n instances: {},\n };\n}\n\nfunction collectBrokenInternalRelationshipIssues(\n sourcePackage: OpcPackage,\n mainDocumentPath?: string,\n): ReturnType<typeof createBrokenRelationshipIssue>[] {\n const brokenTargets = new Map<string, ReturnType<typeof createBrokenRelationshipIssue>>();\n\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (relationship.targetMode !== \"internal\") {\n continue;\n }\n\n const target = resolveRelationshipTarget(null, relationship);\n if (\n !sourcePackage.parts.has(target) &&\n isFatalBrokenRelationship({\n relationshipSourcePath: null,\n relationship,\n targetPartPath: target,\n mainDocumentPath,\n })\n ) {\n brokenTargets.set(\n `package:${relationship.id}:${target}`,\n createBrokenRelationshipIssue({\n relationshipSourcePath: null,\n relationshipId: relationship.id,\n targetPartPath: target,\n }),\n );\n }\n }\n\n for (const part of sourcePackage.parts.values()) {\n for (const relationship of part.relationships) {\n if (relationship.targetMode !== \"internal\") {\n continue;\n }\n\n const target = resolveRelationshipTarget(part.path, relationship);\n if (\n !sourcePackage.parts.has(target) &&\n isFatalBrokenRelationship({\n relationshipSourcePath: part.path,\n relationship,\n targetPartPath: target,\n mainDocumentPath,\n })\n ) {\n brokenTargets.set(\n `${part.path}:${relationship.id}:${target}`,\n createBrokenRelationshipIssue({\n relationshipSourcePath: part.path,\n relationshipId: relationship.id,\n targetPartPath: target,\n }),\n );\n }\n }\n }\n\n return [...brokenTargets.values()].sort((left, right) =>\n `${left.relationshipSourcePath ?? \"\"}:${left.relationshipId}:${left.targetPartPath}`.localeCompare(\n `${right.relationshipSourcePath ?? \"\"}:${right.relationshipId}:${right.targetPartPath}`,\n ),\n );\n}\n\nfunction summarizeBrokenRelationshipIssues(\n issues: readonly ReturnType<typeof createBrokenRelationshipIssue>[],\n): string {\n return `DOCX package has unresolved internal relationships: ${issues\n .map((issue) => issue.targetPartPath ?? issue.message)\n .slice(0, 3)\n .join(\", \")}${issues.length > 3 ? \", ...\" : \"\"}.`;\n}\n\nfunction createBrokenRelationshipWarnings(\n sourcePackage: OpcPackage,\n mainDocumentPath?: string,\n): CanonicalDocumentEnvelope[\"diagnostics\"][\"warnings\"] {\n const warnings = new Map<string, CanonicalDocumentEnvelope[\"diagnostics\"][\"warnings\"][number]>();\n\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (relationship.targetMode !== \"internal\") {\n continue;\n }\n\n const target = resolveRelationshipTarget(null, relationship);\n if (\n sourcePackage.parts.has(target) ||\n isFatalBrokenRelationship({\n relationshipSourcePath: null,\n relationship,\n targetPartPath: target,\n mainDocumentPath,\n })\n ) {\n continue;\n }\n\n warnings.set(`package:${relationship.id}:${target}`, {\n diagnosticId: `diagnostic:broken-relationship-package-${relationship.id}`,\n warningId: `warning:broken-relationship:${relationship.id}`,\n source: \"preservation\",\n message: `DOCX package has unresolved internal relationships outside the editor-owned graph: ${target}.`,\n });\n }\n\n for (const part of sourcePackage.parts.values()) {\n for (const relationship of part.relationships) {\n if (relationship.targetMode !== \"internal\") {\n continue;\n }\n\n const target = resolveRelationshipTarget(part.path, relationship);\n if (\n sourcePackage.parts.has(target) ||\n isFatalBrokenRelationship({\n relationshipSourcePath: part.path,\n relationship,\n targetPartPath: target,\n mainDocumentPath,\n })\n ) {\n continue;\n }\n\n warnings.set(`${part.path}:${relationship.id}:${target}`, {\n diagnosticId: `diagnostic:broken-relationship-${relationship.id}`,\n warningId: `warning:broken-relationship:${relationship.id}`,\n source: \"preservation\",\n message: `DOCX package has unresolved internal relationships outside the editor-owned graph: ${target}.`,\n });\n }\n }\n\n return [...warnings.values()];\n}\n\nfunction isFatalBrokenRelationship(input: {\n relationshipSourcePath: string | null;\n relationship: OpcRelationship;\n targetPartPath: string;\n mainDocumentPath?: string;\n}): boolean {\n return (\n input.relationshipSourcePath === null &&\n input.relationship.type === OFFICE_DOCUMENT_RELATIONSHIP_TYPE &&\n input.targetPartPath === input.mainDocumentPath\n );\n}\n\nfunction shouldPreservePackagePart(\n partPath: string,\n surfaceKind: OpcPackage[\"parts\"] extends Map<string, infer T>\n ? T extends { surfaceKind: infer U }\n ? U\n : never\n : never,\n ownedPartPaths: ReadonlySet<string>,\n): boolean {\n if (surfaceKind !== \"content\") {\n return false;\n }\n\n if (\n ownedPartPaths.has(partPath) ||\n partPath.startsWith(\"/word/media/\") ||\n CORE_NON_PRESERVED_PART_PATHS.has(partPath)\n ) {\n return false;\n }\n\n return true;\n}\n\nfunction findRelationshipIdsTargetingPart(\n sourcePackage: OpcPackage,\n targetPartPath: string,\n): string[] {\n const ids = new Set<string>();\n\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (\n relationship.targetMode === \"internal\" &&\n resolveRelationshipTarget(null, relationship) === targetPartPath\n ) {\n ids.add(relationship.id);\n }\n }\n\n for (const part of sourcePackage.parts.values()) {\n for (const relationship of part.relationships) {\n if (\n relationship.targetMode === \"internal\" &&\n resolveRelationshipTarget(part.path, relationship) === targetPartPath\n ) {\n ids.add(relationship.id);\n }\n }\n }\n\n return [...ids].sort();\n}\n\nfunction extractDocumentRootAttributes(documentXml: string): Record<string, string> {\n const match = documentXml.match(\n /<(?:[A-Za-z_][A-Za-z0-9:._-]*:)?document\\b([^>]*)>/u,\n );\n if (!match) {\n return {};\n }\n\n const attributes: Record<string, string> = {};\n const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n for (const attributeMatch of (match[1] ?? \"\").matchAll(pattern)) {\n const name = attributeMatch[1];\n const value = attributeMatch[3] ?? attributeMatch[4] ?? \"\";\n if (!name) {\n continue;\n }\n attributes[name] = value;\n }\n\n return attributes;\n}\n\nfunction isPackageImportError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n\n const normalized = error.message.toLowerCase();\n return (\n normalized.includes(\"zip\") ||\n normalized.includes(\"opc package\") ||\n normalized.includes(\"compression\") ||\n normalized.includes(\"relationship\") ||\n normalized.includes(\"/[content_types].xml\") ||\n normalized.includes(\"/word/document.xml\") ||\n normalized.includes(\"xml\")\n );\n}\n\nconst CORE_NON_PRESERVED_PART_PATHS = new Set([\n \"/docProps/app.xml\",\n \"/docProps/core.xml\",\n \"/word/numbering.xml\",\n]);\n\nfunction createCommentsRelationshipId(\n relationships: readonly OpcRelationship[],\n): string {\n let nextIndex = 1;\n while (relationships.some((relationship) => relationship.id === `rIdComments${nextIndex}`)) {\n nextIndex += 1;\n }\n\n return `rIdComments${nextIndex}`;\n}\n\nfunction toDocumentRelativeTarget(partPath: string): string {\n const normalized = normalizePartPath(partPath);\n return normalized.startsWith(\"/word/\") ? normalized.slice(\"/word/\".length) : normalized.slice(1);\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nconst UTF8_DECODER = new TextDecoder(\"utf-8\");\n\nfunction decodeUtf8(bytes: Uint8Array | undefined): string {\n if (!bytes) {\n return \"\";\n }\n\n return UTF8_DECODER.decode(bytes);\n}\n\nfunction toUint8Array(bytes: Uint8Array | ArrayBuffer): Uint8Array {\n return bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\n}\n\nfunction serializeCanonicalDocumentForExport(document: CanonicalDocumentEnvelope): string {\n return createCanonicalDocumentSignature(document);\n}\n\nfunction canReuseSourceBytesForCurrentDocument(\n state: ImportedDocxState,\n document: CanonicalDocumentEnvelope,\n): boolean {\n if (requiresHostMetadataNormalization(state.sourcePackage, state.sourceDocumentPartPath)) {\n return false;\n }\n\n const commentThreads = Object.values(document.review.comments);\n const hasLiveComments = commentThreads.some((thread) => thread.anchor.kind !== \"detached\");\n if (!hasLiveComments) {\n return true;\n }\n\n return Boolean(\n state.sourceCommentsPartPath &&\n state.sourceCommentsExtendedPartPath &&\n state.sourceCommentsIdsPartPath &&\n state.sourcePeoplePartPath,\n );\n}\n\nfunction requiresHostMetadataNormalization(\n sourcePackage: OpcPackage,\n sourceDocumentPartPath: string,\n): boolean {\n return (\n isSuspiciouslySkeletalWordPackage(sourcePackage, sourceDocumentPartPath) &&\n !hasHostSafeMetadataPackageStructure(sourcePackage)\n );\n}\n\nfunction ensureHostMetadataParts(\n exportSession: ReturnType<typeof createExportSession>,\n sourcePackage: OpcPackage,\n document: CanonicalDocumentEnvelope,\n): void {\n const corePropertiesPart = sourcePackage.parts.get(CORE_PROPERTIES_PART_PATH);\n if (!corePropertiesPart || corePropertiesPart.contentType !== CORE_PROPERTIES_CONTENT_TYPE) {\n exportSession.replaceOwnedPart({\n path: CORE_PROPERTIES_PART_PATH,\n bytes: corePropertiesPart?.bytes ?? new TextEncoder().encode(buildCorePropertiesXml(document)),\n contentType: CORE_PROPERTIES_CONTENT_TYPE,\n compression: corePropertiesPart?.compression,\n });\n }\n\n const appPropertiesPart = sourcePackage.parts.get(APP_PROPERTIES_PART_PATH);\n if (!appPropertiesPart || appPropertiesPart.contentType !== APP_PROPERTIES_CONTENT_TYPE) {\n exportSession.replaceOwnedPart({\n path: APP_PROPERTIES_PART_PATH,\n bytes: appPropertiesPart?.bytes ?? new TextEncoder().encode(buildAppPropertiesXml()),\n contentType: APP_PROPERTIES_CONTENT_TYPE,\n compression: appPropertiesPart?.compression,\n });\n }\n\n exportSession.ensurePackageRelationship({\n type: CORE_PROPERTIES_RELATIONSHIP_TYPE,\n target: CORE_PROPERTIES_PART_PATH,\n preferredId: \"rIdDocPropsCore\",\n });\n exportSession.ensurePackageRelationship({\n type: APP_PROPERTIES_RELATIONSHIP_TYPE,\n target: APP_PROPERTIES_PART_PATH,\n preferredId: \"rIdDocPropsApp\",\n });\n}\n\nfunction hasHostSafeMetadataPackageStructure(sourcePackage: OpcPackage): boolean {\n const corePropertiesPart = sourcePackage.parts.get(CORE_PROPERTIES_PART_PATH);\n const appPropertiesPart = sourcePackage.parts.get(APP_PROPERTIES_PART_PATH);\n return (\n corePropertiesPart?.contentType === CORE_PROPERTIES_CONTENT_TYPE &&\n appPropertiesPart?.contentType === APP_PROPERTIES_CONTENT_TYPE &&\n hasPackageRelationshipTarget(\n sourcePackage,\n CORE_PROPERTIES_RELATIONSHIP_TYPE,\n CORE_PROPERTIES_PART_PATH,\n ) &&\n hasPackageRelationshipTarget(\n sourcePackage,\n APP_PROPERTIES_RELATIONSHIP_TYPE,\n APP_PROPERTIES_PART_PATH,\n )\n );\n}\n\nfunction hasPackageRelationshipTarget(\n sourcePackage: OpcPackage,\n relationshipType: string,\n targetPartPath: string,\n): boolean {\n return sourcePackage.manifest.packageRelationships.some(\n (relationship) =>\n relationship.type === relationshipType &&\n relationship.targetMode === \"internal\" &&\n resolveRelationshipTarget(null, relationship) === targetPartPath,\n );\n}\n\nfunction isSuspiciouslySkeletalWordPackage(\n sourcePackage: OpcPackage,\n sourceDocumentPartPath: string,\n): boolean {\n const allowedPaths = new Set<string>([\n CONTENT_TYPES_PATH,\n PACKAGE_RELATIONSHIPS_PATH,\n sourceDocumentPartPath,\n ]);\n const relationshipsPartPath = getRelationshipsPartPath(sourceDocumentPartPath);\n if (relationshipsPartPath) {\n allowedPaths.add(relationshipsPartPath);\n }\n\n return [...sourcePackage.parts.keys()].every((partPath) => allowedPaths.has(partPath));\n}\n\nfunction buildCorePropertiesXml(document: CanonicalDocumentEnvelope): string {\n const { metadata } = document;\n const keywords =\n Array.isArray(metadata.keywords) && metadata.keywords.length > 0\n ? metadata.keywords.join(\", \")\n : undefined;\n const propertyLines = [\n xmlNode(\"dc:title\", metadata.title),\n xmlNode(\"dc:subject\", metadata.subject),\n xmlNode(\"dc:description\", metadata.description),\n xmlNode(\"dc:language\", metadata.language),\n xmlNode(\"cp:keywords\", keywords),\n xmlNode(\"cp:category\", metadata.category),\n xmlNode('dcterms:created xsi:type=\"dcterms:W3CDTF\"', document.createdAt),\n xmlNode('dcterms:modified xsi:type=\"dcterms:W3CDTF\"', document.updatedAt),\n ].filter((line): line is string => Boolean(line));\n\n return [\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:dcmitype=\"http://purl.org/dc/dcmitype/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">`,\n ...propertyLines.map((line) => ` ${line}`),\n `</cp:coreProperties>`,\n ].join(\"\\n\");\n}\n\nfunction buildAppPropertiesXml(): string {\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">`,\n ` <Application>React OOXML Office</Application>`,\n ` <AppVersion>1.0</AppVersion>`,\n `</Properties>`,\n ].join(\"\\n\");\n}\n\nfunction xmlNode(tagName: string, value: string | undefined): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) {\n return undefined;\n }\n\n return `<${tagName}>${escapeXml(value)}</${tagName.split(\" \", 1)[0]}>`;\n}\n\nfunction serializeProtectionRangesIntoDocumentXml(\n documentXml: string,\n protection: ProtectionSnapshot,\n paragraphs = mapParagraphBoundaries(documentXml),\n): string {\n if (protection.ranges.length === 0) {\n return documentXml;\n }\n\n const insertions = new Map<number, string[]>();\n\n for (const range of protection.ranges) {\n if (typeof range.start !== \"number\" || typeof range.end !== \"number\") {\n continue;\n }\n const rangeStart = range.start;\n const rangeEnd = range.end;\n\n const startParagraph = paragraphs.find(\n (candidate) => rangeStart >= candidate.start && rangeStart <= candidate.end,\n );\n const endParagraph = paragraphs.find(\n (candidate) => rangeEnd >= candidate.start && rangeEnd <= candidate.end,\n );\n if (!startParagraph || !endParagraph) {\n continue;\n }\n\n const startIndex =\n startParagraph.boundaries.get(rangeStart) ??\n findNearestBoundaryIndex(startParagraph.boundaries, rangeStart, \"backward\");\n const endIndex =\n endParagraph.boundaries.get(rangeEnd) ??\n findNearestBoundaryIndex(endParagraph.boundaries, rangeEnd, \"forward\");\n if (startIndex === undefined || endIndex === undefined) {\n continue;\n }\n\n const permStartXml = [\n `<w:permStart`,\n ` w:id=\"${escapeXmlAttribute(range.rangeId)}\"`,\n range.editorGroup ? ` w:edGrp=\"${escapeXmlAttribute(range.editorGroup)}\"` : \"\",\n range.editor ? ` w:ed=\"${escapeXmlAttribute(range.editor)}\"` : \"\",\n `/>`,\n ].join(\"\");\n const permEndXml = `<w:permEnd w:id=\"${escapeXmlAttribute(range.rangeId)}\"/>`;\n\n pushProtectionInsertion(insertions, startIndex, permStartXml);\n pushProtectionInsertion(insertions, endIndex, permEndXml);\n }\n\n if (insertions.size === 0) {\n return documentXml;\n }\n\n const parts: string[] = [];\n let cursor = 0;\n for (const [index, snippets] of [...insertions.entries()].sort(([left], [right]) => left - right)) {\n parts.push(documentXml.slice(cursor, index));\n parts.push(...snippets);\n cursor = index;\n }\n parts.push(documentXml.slice(cursor));\n return parts.join(\"\");\n}\n\nfunction pushProtectionInsertion(\n insertions: Map<number, string[]>,\n index: number,\n xml: string,\n): void {\n const existing = insertions.get(index);\n if (existing) {\n existing.push(xml);\n return;\n }\n insertions.set(index, [xml]);\n}\n\nfunction findNearestBoundaryIndex(\n boundaries: Map<number, number>,\n position: number,\n direction: \"backward\" | \"forward\",\n): number | undefined {\n const ordered = [...boundaries.entries()].sort(([left], [right]) => left - right);\n if (direction === \"backward\") {\n for (let index = ordered.length - 1; index >= 0; index -= 1) {\n const [boundaryPos, boundaryIndex] = ordered[index]!;\n if (boundaryPos <= position) {\n return boundaryIndex;\n }\n }\n return undefined;\n }\n for (const [boundaryPos, boundaryIndex] of ordered) {\n if (boundaryPos >= position) {\n return boundaryIndex;\n }\n }\n return undefined;\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n// ---------------------------------------------------------------------------\n// Protection range extraction\n// ---------------------------------------------------------------------------\n\nconst EMPTY_PROTECTION_SNAPSHOT: ProtectionSnapshot = {\n hasDocumentProtection: false,\n enforcementActive: false,\n ranges: [],\n enforcedRangeCount: 0,\n preservedRangeCount: 0,\n};\n\ninterface DocumentProtectionMeta {\n editType?: string;\n enforcement: boolean;\n}\n\nfunction extractDocumentProtection(settingsXml: string): DocumentProtectionMeta {\n if (!settingsXml) return { enforcement: false };\n const match = settingsXml.match(/<w:documentProtection\\b([^/>]*)\\/?>/);\n if (!match) return { enforcement: false };\n const attrs = match[1];\n const editTypeMatch = attrs.match(/w:edit=\"([^\"]*)\"/);\n const enforcementMatch = attrs.match(/w:enforcement=\"([^\"]*)\"/);\n const editType = editTypeMatch?.[1];\n const enforcement = enforcementMatch?.[1] === \"1\" || enforcementMatch?.[1] === \"true\";\n return { editType, enforcement };\n}\n\nfunction extractProtectionRanges(blocks: readonly ParsedBlockNode[]): ProtectionRange[] {\n const ranges: ProtectionRange[] = [];\n const openRanges = new Map<string, Omit<ProtectionRange, \"end\">>();\n collectProtectionRangesFromBlocks(blocks, ranges, openRanges, 0);\n return ranges;\n}\n\nfunction collectProtectionRangesFromBlocks(\n blocks: readonly ParsedBlockNode[],\n ranges: ProtectionRange[],\n openRanges: Map<string, Omit<ProtectionRange, \"end\">>,\n cursor: number,\n): number {\n let nextCursor = cursor;\n let previousParagraph = false;\n\n for (const block of blocks) {\n if (block.type === \"paragraph\") {\n if (previousParagraph) {\n nextCursor += 1;\n }\n nextCursor = collectProtectionRangesFromInlines(\n block.children,\n ranges,\n openRanges,\n nextCursor,\n );\n previousParagraph = true;\n continue;\n }\n\n if (block.type === \"table\") {\n nextCursor += 1;\n previousParagraph = false;\n for (const row of block.rows) {\n for (const cell of row.cells) {\n nextCursor = collectProtectionRangesFromBlocks(\n cell.children,\n ranges,\n openRanges,\n nextCursor,\n );\n }\n }\n continue;\n }\n\n if (block.type === \"sdt\" || block.type === \"custom_xml\") {\n nextCursor = collectProtectionRangesFromBlocks(\n block.children,\n ranges,\n openRanges,\n nextCursor,\n );\n previousParagraph = false;\n continue;\n }\n\n nextCursor += 1;\n previousParagraph = false;\n }\n\n return nextCursor;\n}\n\nfunction collectProtectionRangesFromInlines(\n nodes: readonly ParsedInlineNode[],\n ranges: ProtectionRange[],\n openRanges: Map<string, Omit<ProtectionRange, \"end\">>,\n cursor: number,\n): number {\n let nextCursor = cursor;\n\n for (const node of nodes) {\n if (node.type === \"perm_start\") {\n openRanges.set(node.rangeId, {\n rangeId: node.rangeId,\n start: nextCursor,\n ...(node.editorGroup ? { editorGroup: node.editorGroup } : {}),\n ...(node.editor ? { editor: node.editor } : {}),\n enforced: false,\n enforcementReason:\n \"preserve-only: runtime does not yet enforce permission range boundaries\",\n });\n continue;\n }\n\n if (node.type === \"perm_end\") {\n const openRange = openRanges.get(node.rangeId);\n if (openRange) {\n ranges.push({\n ...openRange,\n end: nextCursor,\n });\n openRanges.delete(node.rangeId);\n }\n continue;\n }\n\n nextCursor += measureParsedInlineNode(node);\n }\n\n return nextCursor;\n}\n\nfunction measureParsedInlineNode(node: ParsedInlineNode): number {\n switch (node.type) {\n case \"text\":\n return node.text.length;\n case \"tab\":\n case \"hard_break\":\n case \"column_break\":\n case \"footnote_ref\":\n case \"image\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n return 1;\n case \"hyperlink\":\n return node.children.reduce((size, child) => size + measureParsedInlineNode(child), 0);\n case \"field\": {\n const content = parseMainDocumentXml(\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><w:document xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"><w:body><w:p>${node.contentXml}</w:p></w:body></w:document>`,\n );\n if (content.blocks[0]?.type === \"paragraph\") {\n return content.blocks[0].children.reduce(\n (size, child) => size + measureParsedInlineNode(child),\n 0,\n );\n }\n return 1;\n }\n default:\n return 1;\n }\n}\n\nfunction buildProtectionSnapshot(\n documentProtection: DocumentProtectionMeta,\n ranges: ProtectionRange[],\n): ProtectionSnapshot {\n const hasDocumentProtection =\n documentProtection.editType !== undefined || documentProtection.enforcement;\n const enforceRanges =\n documentProtection.editType === \"readOnly\" || documentProtection.editType === \"comments\";\n const normalizedRanges = ranges.map((range) => {\n const canEnforce =\n hasDocumentProtection &&\n documentProtection.enforcement &&\n enforceRanges &&\n typeof range.start === \"number\" &&\n typeof range.end === \"number\" &&\n range.end >= range.start;\n return {\n ...range,\n enforced: canEnforce,\n enforcementReason: canEnforce\n ? \"runtime-enforced: permission range is mapped to canonical positions\"\n : \"preserve-only: runtime does not yet enforce permission range boundaries\",\n };\n });\n return {\n hasDocumentProtection,\n editType: documentProtection.editType,\n enforcementActive: documentProtection.enforcement,\n ranges: normalizedRanges,\n enforcedRangeCount: normalizedRanges.filter((r) => r.enforced).length,\n preservedRangeCount: normalizedRanges.filter((r) => !r.enforced).length,\n };\n}\n","import type {\n EditorSessionState,\n PersistedEditorSnapshot,\n} from \"./public-types.ts\";\n\nexport const EDITOR_SESSION_STATE_VERSION = \"editor-session-state/1\" as const;\n\nfunction cloneStructuredValue<T>(value: T): T {\n return structuredClone(value);\n}\n\nexport function createEditorSessionState(\n input: Omit<EditorSessionState, \"sessionVersion\">,\n): EditorSessionState {\n return cloneStructuredValue({\n sessionVersion: EDITOR_SESSION_STATE_VERSION,\n ...input,\n });\n}\n\nexport function editorSessionStateFromPersistedSnapshot(\n snapshot: PersistedEditorSnapshot,\n): EditorSessionState {\n return createEditorSessionState({\n schemaVersion: snapshot.schemaVersion,\n documentId: snapshot.documentId,\n docId: snapshot.docId,\n createdAt: snapshot.createdAt,\n updatedAt: snapshot.updatedAt,\n editorBuild: snapshot.editorBuild,\n canonicalDocument: snapshot.canonicalDocument,\n compatibility: snapshot.compatibility,\n warningLog: snapshot.warningLog,\n protectionSnapshot: snapshot.protectionSnapshot,\n sourcePackage: snapshot.sourcePackage,\n });\n}\n\nexport function persistedSnapshotFromEditorSessionState(\n sessionState: EditorSessionState,\n options: {\n savedAt: string;\n },\n): PersistedEditorSnapshot {\n return cloneStructuredValue({\n snapshotVersion: \"persisted-editor-snapshot/2\",\n schemaVersion: sessionState.schemaVersion,\n documentId: sessionState.documentId,\n docId: sessionState.docId,\n createdAt: sessionState.createdAt,\n updatedAt: sessionState.updatedAt,\n savedAt: options.savedAt,\n editorBuild: sessionState.editorBuild,\n canonicalDocument: sessionState.canonicalDocument,\n compatibility: sessionState.compatibility,\n warningLog: sessionState.warningLog,\n protectionSnapshot: sessionState.protectionSnapshot,\n sourcePackage: sessionState.sourcePackage,\n });\n}\n","import type { EditorStoryTarget } from \"../../api/public-types\";\n\nexport type Position = number;\nexport type Assoc = -1 | 1;\n\nexport interface DocRange {\n from: Position;\n to: Position;\n}\n\nexport interface BoundaryAssoc {\n start: Assoc;\n end: Assoc;\n}\n\nexport interface RangeAnchor {\n kind: \"range\";\n range: DocRange;\n assoc: BoundaryAssoc;\n}\n\nexport interface NodeAnchor {\n kind: \"node\";\n at: Position;\n assoc: Assoc;\n}\n\nexport interface DetachedAnchor {\n kind: \"detached\";\n lastKnownRange: DocRange;\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n}\n\nexport type EditorAnchorProjection = RangeAnchor | NodeAnchor | DetachedAnchor;\n\nexport interface MappingStep {\n from: Position;\n to: Position;\n insertSize: number;\n}\n\nexport interface MappingResult {\n position: Position;\n deleted: boolean;\n}\n\nexport interface TransactionMapping {\n steps: MappingStep[];\n metadata?: {\n invalidatesStructures?: boolean;\n affectsComments?: boolean;\n affectsRevisions?: boolean;\n affectsOpaqueFragments?: boolean;\n [key: string]: unknown;\n };\n}\n\nexport const DEFAULT_BOUNDARY_ASSOC: BoundaryAssoc = {\n start: 1,\n end: -1,\n};\n\nexport function createRangeAnchor(\n from: Position,\n to = from,\n assoc: BoundaryAssoc = DEFAULT_BOUNDARY_ASSOC,\n): RangeAnchor {\n return {\n kind: \"range\",\n range: normalizeRange({ from, to }),\n assoc,\n };\n}\n\nexport function createNodeAnchor(at: Position, assoc: Assoc = 1): NodeAnchor {\n return {\n kind: \"node\",\n at,\n assoc,\n };\n}\n\nexport function createDetachedAnchor(\n lastKnownRange: DocRange,\n reason: DetachedAnchor[\"reason\"],\n): DetachedAnchor {\n return {\n kind: \"detached\",\n lastKnownRange: normalizeRange(lastKnownRange),\n reason,\n };\n}\n\nexport function createEmptyMapping(): TransactionMapping {\n return {\n steps: [],\n };\n}\n\nexport function normalizeRange(range: DocRange): DocRange {\n return range.from <= range.to\n ? { from: range.from, to: range.to }\n : { from: range.to, to: range.from };\n}\n\nexport function getEffectiveRange(anchor: EditorAnchorProjection): DocRange {\n if (anchor.kind === \"range\") {\n return anchor.range;\n }\n if (anchor.kind === \"node\") {\n return { from: anchor.at, to: anchor.at };\n }\n return anchor.lastKnownRange;\n}\n\nexport function mapPosition(\n position: Position,\n assoc: Assoc,\n mapping: TransactionMapping,\n): MappingResult {\n let mappedPosition = position;\n let deleted = false;\n\n for (const step of mapping.steps) {\n const next = mapPositionThroughStep(mappedPosition, assoc, step);\n mappedPosition = next.position;\n deleted = deleted || next.deleted;\n }\n\n return {\n position: mappedPosition,\n deleted,\n };\n}\n\nexport function mapAnchor(\n anchor: EditorAnchorProjection,\n mapping: TransactionMapping,\n): EditorAnchorProjection {\n if (anchor.kind === \"detached\") {\n return anchor;\n }\n\n if (anchor.kind === \"node\") {\n const mapped = mapPosition(anchor.at, anchor.assoc, mapping);\n\n if (mapped.deleted) {\n return createDetachedAnchor(\n { from: anchor.at, to: anchor.at + 1 },\n mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\",\n );\n }\n\n return createNodeAnchor(mapped.position, anchor.assoc);\n }\n\n const from = mapPosition(anchor.range.from, anchor.assoc.start, mapping);\n const to = mapPosition(anchor.range.to, anchor.assoc.end, mapping);\n const mappedRange = normalizeRange({ from: from.position, to: to.position });\n\n if (from.deleted && to.deleted && mappedRange.from === mappedRange.to) {\n return createDetachedAnchor(\n anchor.range,\n mapping.metadata?.invalidatesStructures\n ? \"invalidatedByStructureChange\"\n : \"deleted\",\n );\n }\n\n return createRangeAnchor(mappedRange.from, mappedRange.to, anchor.assoc);\n}\n\nexport function mapRange(\n range: DocRange,\n assoc: BoundaryAssoc,\n mapping: TransactionMapping,\n): RangeAnchor | DetachedAnchor {\n const mapped = mapAnchor(createRangeAnchor(range.from, range.to, assoc), mapping);\n return mapped.kind === \"node\" ? createRangeAnchor(mapped.at, mapped.at, assoc) : mapped;\n}\n\nexport function areAnchorsEqual(\n left: EditorAnchorProjection,\n right: EditorAnchorProjection,\n): boolean {\n if (left.kind !== right.kind) {\n return false;\n }\n\n if (left.kind === \"detached\" && right.kind === \"detached\") {\n return (\n left.reason === right.reason &&\n left.lastKnownRange.from === right.lastKnownRange.from &&\n left.lastKnownRange.to === right.lastKnownRange.to\n );\n }\n\n if (left.kind === \"node\" && right.kind === \"node\") {\n return left.at === right.at && left.assoc === right.assoc;\n }\n\n if (left.kind === \"range\" && right.kind === \"range\") {\n return (\n left.range.from === right.range.from &&\n left.range.to === right.range.to &&\n left.assoc.start === right.assoc.start &&\n left.assoc.end === right.assoc.end\n );\n }\n\n return false;\n}\n\nexport function storyTargetsEqual(\n left: EditorStoryTarget | undefined,\n right: EditorStoryTarget | undefined,\n): boolean {\n if (left === right) return true;\n if (!left || !right) return left === right;\n if (left.kind !== right.kind) return false;\n if (left.kind === \"main\") return true;\n if (left.kind === \"header\" && right.kind === \"header\") {\n return (\n left.relationshipId === right.relationshipId &&\n left.variant === right.variant &&\n (left.sectionIndex === undefined ||\n right.sectionIndex === undefined\n ? true\n : left.sectionIndex === right.sectionIndex)\n );\n }\n if (left.kind === \"footer\" && right.kind === \"footer\") {\n return (\n left.relationshipId === right.relationshipId &&\n left.variant === right.variant &&\n (left.sectionIndex === undefined ||\n right.sectionIndex === undefined\n ? true\n : left.sectionIndex === right.sectionIndex)\n );\n }\n if (left.kind === \"footnote\" && right.kind === \"footnote\") {\n return left.noteId === right.noteId;\n }\n if (left.kind === \"endnote\" && right.kind === \"endnote\") {\n return left.noteId === right.noteId;\n }\n return false;\n}\n\nexport const MAIN_STORY_TARGET: EditorStoryTarget = { kind: \"main\" };\n\nfunction mapPositionThroughStep(\n position: Position,\n assoc: Assoc,\n step: MappingStep,\n): MappingResult {\n if (position < step.from) {\n return { position, deleted: false };\n }\n\n if (position > step.to) {\n return {\n position: position + step.insertSize - (step.to - step.from),\n deleted: false,\n };\n }\n\n if (position === step.from) {\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: false,\n };\n }\n\n if (position === step.to) {\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: false,\n };\n }\n\n return {\n position: assoc < 0 ? step.from : step.from + step.insertSize,\n deleted: true,\n };\n}\n","export const CDS_SCHEMA_VERSION = \"cds/1.0.0\" as const;\nexport const LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION =\n \"persisted-editor-snapshot/1\" as const;\nexport const PERSISTED_EDITOR_SNAPSHOT_VERSION =\n \"persisted-editor-snapshot/2\" as const;\nexport const COMPATIBILITY_REPORT_VERSION = \"compatibility-report/1\" as const;\n\nexport type CDS_SchemaVersion = typeof CDS_SCHEMA_VERSION;\nexport type PersistedEditorSnapshotVersion =\n | typeof LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION\n | typeof PERSISTED_EDITOR_SNAPSHOT_VERSION;\nexport type CompatibilityReportVersion = typeof COMPATIBILITY_REPORT_VERSION;\n\nexport type Id = string;\nexport type UUID = string;\nexport type ISO8601DateTime = string;\nexport type Base64 = string;\nexport type PartName = string;\nexport type RelationshipId = string;\n\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonObject | JsonValue[];\n\nexport interface JsonObject {\n [key: string]: JsonValue | undefined;\n}\n\nexport interface ModelValidationIssue {\n path: string;\n message: string;\n}\n\nexport class ModelValidationError extends Error {\n readonly issues: readonly ModelValidationIssue[];\n\n constructor(message: string, issues: readonly ModelValidationIssue[]) {\n super(message);\n this.name = \"ModelValidationError\";\n this.issues = issues;\n }\n}\n\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst ISO_8601_UTC_PATTERN =\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/;\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nexport function isUuid(value: unknown): value is UUID {\n return typeof value === \"string\" && UUID_PATTERN.test(value);\n}\n\nexport function isIso8601UtcTimestamp(\n value: unknown,\n): value is ISO8601DateTime {\n return (\n typeof value === \"string\" &&\n ISO_8601_UTC_PATTERN.test(value) &&\n !Number.isNaN(Date.parse(value))\n );\n}\n\nexport function asPlainObject(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): Record<string, unknown> | null {\n if (!isPlainObject(value)) {\n issues.push({ path, message: \"Expected a plain object.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectString(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n if (!isNonEmptyString(value)) {\n issues.push({ path, message: \"Expected a non-empty string.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectStringAllowEmpty(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n if (typeof value !== \"string\") {\n issues.push({ path, message: \"Expected a string.\" });\n return null;\n }\n\n return value;\n}\n\nexport function expectExactString<T extends string>(\n value: unknown,\n expected: T,\n path: string,\n issues: ModelValidationIssue[],\n): T | null {\n if (value !== expected) {\n issues.push({\n path,\n message: `Expected ${JSON.stringify(expected)}.`,\n });\n return null;\n }\n\n return expected;\n}\n\nexport function expectIso8601UtcTimestamp(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): ISO8601DateTime | null {\n if (!isIso8601UtcTimestamp(value)) {\n issues.push({\n path,\n message: \"Expected an ISO 8601 UTC timestamp string.\",\n });\n return null;\n }\n\n return value;\n}\n\nexport function expectUuid(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): UUID | null {\n if (!isUuid(value)) {\n issues.push({\n path,\n message: \"Expected an RFC 4122 UUID string.\",\n });\n return null;\n }\n\n return value;\n}\n\nexport function sortRecordKeys<T>(\n record: Record<string, T>,\n): Array<[string, T]> {\n return Object.entries(record).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n}\n\nexport function assertValid(\n issues: readonly ModelValidationIssue[],\n message: string,\n): void {\n if (issues.length > 0) {\n throw new ModelValidationError(message, issues);\n }\n}\n\nfunction toStableJsonValue(value: unknown): JsonValue {\n if (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => toStableJsonValue(item));\n }\n\n if (!isPlainObject(value)) {\n throw new TypeError(\"Cannot serialize non-JSON value.\");\n }\n\n const sortedEntries = sortRecordKeys(value).filter(\n ([, entryValue]) => entryValue !== undefined,\n );\n const result: JsonObject = {};\n\n for (const [key, entryValue] of sortedEntries) {\n result[key] = toStableJsonValue(entryValue);\n }\n\n return result;\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(toStableJsonValue(value));\n}\n","import {\n CDS_SCHEMA_VERSION,\n type ISO8601DateTime,\n type ModelValidationIssue,\n type UUID,\n asPlainObject,\n assertValid,\n expectExactString,\n expectIso8601UtcTimestamp,\n expectString,\n expectStringAllowEmpty,\n expectUuid,\n stableStringify,\n} from \"./cds-1.0.0.ts\";\n\nconst CANONICAL_DOCUMENT_TOP_LEVEL_KEYS = [\n \"schemaVersion\",\n \"docId\",\n \"createdAt\",\n \"updatedAt\",\n \"metadata\",\n \"styles\",\n \"numbering\",\n \"media\",\n \"content\",\n \"review\",\n \"preservation\",\n \"diagnostics\",\n] as const;\n\nconst CANONICAL_DOCUMENT_OPTIONAL_KEYS = [\"subParts\", \"fieldRegistry\"] as const;\n\nconst ID_PATTERNS = {\n styleId: /^[A-Za-z_][A-Za-z0-9._-]{0,127}$/,\n abstractNumberingId: /^abstract-num:[A-Za-z0-9._-]{1,120}$/,\n numberingInstanceId: /^num:[A-Za-z0-9._-]{1,120}$/,\n mediaId: /^media:[A-Za-z0-9._/-]{1,120}$/,\n commentId:\n /^(?:comment:[A-Za-z0-9._-]{1,120}|comment-[A-Za-z0-9._-]{1,120}|[0-9]{1,18})$/,\n revisionId:\n /^(?:revision:[A-Za-z0-9._-]{1,120}|change-[A-Za-z0-9._-]{1,120})$/,\n fragmentId: /^fragment:[A-Za-z0-9._-]{1,120}$/,\n warningId: /^warning:[A-Za-z0-9._:-]{1,120}$/,\n diagnosticId: /^diagnostic:[A-Za-z0-9._-]{1,120}$/,\n packagePartName: /^\\/[A-Za-z0-9_.\\-\\/]+\\.[A-Za-z0-9]+$/,\n relationshipId: /^rId[A-Za-z0-9._-]{1,120}$/,\n} as const;\n\ntype StableIdDomain = keyof typeof ID_PATTERNS;\n\nexport interface CanonicalDocument {\n schemaVersion: typeof CDS_SCHEMA_VERSION;\n docId: UUID;\n createdAt: ISO8601DateTime;\n updatedAt: ISO8601DateTime;\n metadata: DocumentMetadata;\n styles: StylesCatalog;\n numbering: NumberingCatalog;\n media: MediaCatalog;\n content: DocumentRootNode;\n review: ReviewStore;\n preservation: PreservationStore;\n diagnostics: DiagnosticStore;\n subParts?: SubPartsCatalog;\n /** Package-backed field registry for supported field families. */\n fieldRegistry?: FieldRegistry;\n}\n\nexport interface DocumentMetadata {\n title?: string;\n subject?: string;\n description?: string;\n language?: string;\n keywords?: string[];\n category?: string;\n importMode?: string;\n customProperties: Record<string, string>;\n}\n\nexport interface StylesCatalog {\n paragraphs: Record<string, ParagraphStyleDefinition>;\n characters: Record<string, CharacterStyleDefinition>;\n tables: Record<string, TableStyleDefinition>;\n latentStyles?: Record<string, LatentStyleDefinition>;\n fromPackage?: boolean;\n}\n\nexport interface ParagraphStyleDefinition {\n styleId: string;\n basedOn?: string;\n nextStyle?: string;\n outlineLevel?: number;\n displayName: string;\n kind: \"paragraph\";\n isDefault: boolean;\n}\n\nexport interface CharacterStyleDefinition {\n styleId: string;\n basedOn?: string;\n displayName: string;\n kind: \"character\";\n isDefault: boolean;\n}\n\nexport interface TableStyleDefinition {\n styleId: string;\n basedOn?: string;\n displayName: string;\n kind: \"table\";\n isDefault: boolean;\n}\n\nexport interface LatentStyleDefinition {\n name: string;\n locked?: boolean;\n semiHidden?: boolean;\n unhideWhenUsed?: boolean;\n qFormat?: boolean;\n uiPriority?: number;\n}\n\nexport interface NumberingCatalog {\n abstractDefinitions: Record<string, AbstractNumberingDefinition>;\n instances: Record<string, NumberingInstance>;\n}\n\nexport interface AbstractNumberingDefinition {\n abstractNumberingId: string;\n levels: NumberingLevelDefinition[];\n}\n\nexport interface NumberingLevelDefinition {\n level: number;\n format: string;\n text: string;\n startAt?: number;\n paragraphStyleId?: string;\n isLegalNumbering?: boolean;\n suffix?: \"tab\" | \"space\" | \"nothing\";\n}\n\nexport interface NumberingInstance {\n numberingInstanceId: string;\n abstractNumberingId: string;\n overrides: NumberingLevelOverride[];\n}\n\nexport interface NumberingLevelOverride {\n level: number;\n startAt?: number;\n}\n\nexport interface MediaCatalog {\n items: Record<string, MediaItem>;\n}\n\nexport interface MediaItem {\n mediaId: string;\n contentType: string;\n filename: string;\n relationshipId?: string;\n packagePartName: string;\n altText?: string;\n display?: \"inline\" | \"floating\";\n widthEmu?: number;\n heightEmu?: number;\n}\n\n// ---- Sub-part canonical types ----\n\nexport type HeaderFooterVariant = \"default\" | \"first\" | \"even\";\n\nexport interface HeaderDocument {\n variant: HeaderFooterVariant;\n partPath: string;\n relationshipId: string;\n blocks: BlockNode[];\n sectionIndex?: number;\n}\n\nexport interface FooterDocument {\n variant: HeaderFooterVariant;\n partPath: string;\n relationshipId: string;\n blocks: BlockNode[];\n sectionIndex?: number;\n}\n\nexport interface FootnoteDefinition {\n noteId: string;\n kind: \"footnote\" | \"endnote\";\n blocks: BlockNode[];\n}\n\nexport interface FootnoteCollection {\n footnotes: Record<string, FootnoteDefinition>;\n endnotes: Record<string, FootnoteDefinition>;\n}\n\nexport interface ThemeColorScheme {\n name: string;\n colors: Record<string, string>;\n}\n\nexport interface ThemeFontScheme {\n name: string;\n majorFont?: string;\n minorFont?: string;\n}\n\nexport interface ThemeDefinition {\n name?: string;\n colorScheme?: ThemeColorScheme;\n fontScheme?: ThemeFontScheme;\n}\n\nexport interface DocumentSettings {\n evenAndOddHeaders?: boolean;\n zoomLevel?: \"pageWidth\" | \"onePage\" | number;\n}\n\nexport interface SubPartsCatalog {\n headers: HeaderDocument[];\n footers: FooterDocument[];\n footnoteCollection?: FootnoteCollection;\n theme?: ThemeDefinition;\n finalSectionProperties?: SectionProperties;\n resolvedTheme?: ResolvedTheme;\n settings?: DocumentSettings;\n}\n\nexport interface ResolvedTheme {\n colors: Record<string, string>;\n majorFont?: string;\n minorFont?: string;\n}\n\n// ---- Inline footnote reference node ----\n\nexport interface FootnoteRefNode {\n type: \"footnote_ref\";\n noteId: string;\n noteKind: \"footnote\" | \"endnote\";\n}\n\nexport type DocumentNode =\n | DocumentRootNode\n | ParagraphNode\n | TableNode\n | TableRowNode\n | TableCellNode\n | SdtNode\n | CustomXmlNode\n | AltChunkNode\n | TextNode\n | HardBreakNode\n | TabNode\n | ColumnBreakNode\n | SymbolNode\n | HyperlinkNode\n | ImageNode\n | FieldNode\n | BookmarkStartNode\n | BookmarkEndNode\n | SectionBreakNode\n | OpaqueInlineNode\n | OpaqueBlockNode\n | FootnoteRefNode\n | ChartPreviewNode\n | SmartArtPreviewNode\n | ShapeNode\n | WordArtNode\n | VmlShapeNode;\n\nexport interface DocumentRootNode {\n type: \"doc\";\n children: BlockNode[];\n}\n\nexport type BlockNode =\n | ParagraphNode\n | TableNode\n | SdtNode\n | CustomXmlNode\n | AltChunkNode\n | SectionBreakNode\n | OpaqueBlockNode;\n\nexport interface ParagraphSpacing {\n before?: number;\n after?: number;\n line?: number;\n lineRule?: \"auto\" | \"exact\" | \"atLeast\";\n}\n\nexport interface ParagraphIndentation {\n left?: number;\n right?: number;\n firstLine?: number;\n hanging?: number;\n}\n\nexport interface TabStop {\n position: number;\n align: \"left\" | \"center\" | \"right\" | \"decimal\" | \"bar\" | \"clear\";\n leader?: \"none\" | \"dot\" | \"hyphen\" | \"underscore\" | \"heavy\" | \"middleDot\";\n}\n\nexport interface ParagraphBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n bar?: BorderSpec;\n between?: BorderSpec;\n}\n\nexport interface ParagraphShading {\n fill?: string;\n color?: string;\n val?: string;\n}\n\nexport interface ParagraphNode {\n type: \"paragraph\";\n styleId?: string;\n numbering?: {\n numberingInstanceId: string;\n level: number;\n };\n alignment?: \"left\" | \"center\" | \"right\" | \"both\" | \"distribute\";\n spacing?: ParagraphSpacing;\n contextualSpacing?: boolean;\n indentation?: ParagraphIndentation;\n tabStops?: TabStop[];\n keepNext?: boolean;\n keepLines?: boolean;\n outlineLevel?: number;\n pageBreakBefore?: boolean;\n widowControl?: boolean;\n borders?: ParagraphBorders;\n shading?: ParagraphShading;\n bidi?: boolean;\n suppressLineNumbers?: boolean;\n cnfStyle?: string;\n children: InlineNode[];\n}\n\nexport interface BorderSpec {\n value?: string;\n size?: number;\n space?: number;\n color?: string;\n}\n\nexport interface TableBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n insideH?: BorderSpec;\n insideV?: BorderSpec;\n}\n\nexport interface TableCellBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n insideH?: BorderSpec;\n insideV?: BorderSpec;\n}\n\nexport interface TableWidth {\n value: number;\n type: \"dxa\" | \"auto\" | \"pct\" | \"nil\";\n}\n\nexport interface CellShading {\n fill?: string;\n color?: string;\n val?: string;\n}\n\nexport interface TableCellMargins {\n top?: number;\n left?: number;\n bottom?: number;\n right?: number;\n}\n\nexport interface TableLook {\n val?: string;\n firstRow?: boolean;\n lastRow?: boolean;\n firstColumn?: boolean;\n lastColumn?: boolean;\n noHBand?: boolean;\n noVBand?: boolean;\n}\n\nexport interface TableNode {\n type: \"table\";\n styleId?: string;\n propertiesXml?: string;\n gridColumns: number[];\n rows: TableRowNode[];\n width?: TableWidth;\n alignment?: \"left\" | \"center\" | \"right\";\n borders?: TableBorders;\n cellMargins?: TableCellMargins;\n tblLook?: TableLook;\n}\n\nexport interface TableRowNode {\n type: \"table_row\";\n propertiesXml?: string;\n cells: TableCellNode[];\n gridBefore?: number;\n widthBefore?: TableWidth;\n gridAfter?: number;\n widthAfter?: TableWidth;\n height?: number;\n heightRule?: \"auto\" | \"atLeast\" | \"exact\";\n isHeader?: boolean;\n}\n\nexport interface TableCellNode {\n type: \"table_cell\";\n propertiesXml?: string;\n gridSpan?: number;\n verticalMerge?: \"restart\" | \"continue\";\n children: BlockNode[];\n width?: TableWidth;\n borders?: TableCellBorders;\n shading?: CellShading;\n verticalAlign?: \"top\" | \"center\" | \"bottom\";\n}\n\nexport interface SdtCheckboxState {\n checked: boolean;\n checkedChar?: string;\n uncheckedChar?: string;\n}\n\nexport interface SdtDatePickerState {\n fullDate?: string;\n dateFormat?: string;\n lid?: string;\n}\n\nexport interface SdtDropdownListItem {\n displayText?: string;\n value: string;\n}\n\nexport interface SdtNode {\n type: \"sdt\";\n properties: {\n sdtType?: string;\n alias?: string;\n tag?: string;\n lock?: string;\n propertiesXml?: string;\n checkbox?: SdtCheckboxState;\n datePicker?: SdtDatePickerState;\n dropdownList?: SdtDropdownListItem[];\n comboBox?: SdtDropdownListItem[];\n showingPlcHdr?: boolean;\n };\n children: BlockNode[];\n}\n\nexport interface CustomXmlNode {\n type: \"custom_xml\";\n uri?: string;\n element?: string;\n children: BlockNode[];\n}\n\nexport interface AltChunkNode {\n type: \"alt_chunk\";\n relationshipId: string;\n}\n\n/**\n * Supported field families that receive first-class canonical treatment.\n * These families have stable registry IDs, dependency metadata, and\n * runtime-owned refresh behavior.\n */\nexport type SupportedFieldFamily = \"REF\" | \"PAGEREF\" | \"NOTEREF\" | \"TOC\";\n\n/**\n * Unsupported field families that remain preserve-only.\n * They survive round-trip but do not participate in runtime refresh.\n */\nexport type PreserveOnlyFieldFamily =\n | \"PAGE\"\n | \"NUMPAGES\"\n | \"DATE\"\n | \"TIME\"\n | \"AUTHOR\"\n | \"FILENAME\"\n | \"MERGEFIELD\"\n | \"IF\"\n | \"SEQ\"\n | \"INDEX\"\n | \"TC\"\n | \"STYLEREF\"\n | \"FORMULA\"\n | \"UNKNOWN\";\n\nexport type FieldFamily = SupportedFieldFamily | PreserveOnlyFieldFamily;\n\n/** Runtime refresh status for a field instance. */\nexport type FieldRefreshStatus =\n | \"current\"\n | \"stale\"\n | \"unresolvable\"\n | \"preserve-only\";\n\nexport interface FieldNode {\n type: \"field\";\n fieldType: \"simple\" | \"complex\";\n instruction: string;\n children: InlineNode[];\n /** Classified field family. Undefined for legacy snapshots. */\n fieldFamily?: FieldFamily;\n /** Target bookmark name for REF/PAGEREF/NOTEREF fields. */\n fieldTarget?: string;\n /** Runtime refresh status. Undefined for legacy or preserve-only fields. */\n refreshStatus?: FieldRefreshStatus;\n}\n\n// ─── Field registry ─────────────────────────────────────────────────────────\n\n/**\n * Package-backed field registry that catalogs every field instance in the\n * document, grouped by supported vs preserve-only families.\n *\n * Supported field entries carry dependency metadata (bookmark targets) and\n * participate in deterministic refresh. Preserve-only entries survive\n * round-trip but are not refreshable.\n */\nexport interface FieldRegistry {\n /** Supported field instances that participate in refresh. */\n supported: FieldRegistryEntry[];\n /** Preserve-only field instances cataloged for round-trip safety. */\n preserveOnly: FieldRegistryEntry[];\n /** Generated TOC structure extracted from heading-driven TOC fields. */\n tocStructure?: TocStructure;\n}\n\nexport interface FieldRegistryEntry {\n /** Stable document-order index of this field (0-based). */\n fieldIndex: number;\n /** Classified field family. */\n fieldFamily: FieldFamily;\n /** Whether the field is in the supported refresh slice. */\n supported: boolean;\n /** Field instruction text. */\n instruction: string;\n /** Target bookmark name for REF/PAGEREF/NOTEREF fields. */\n fieldTarget?: string;\n /** Current display text extracted from field content. */\n displayText: string;\n /** Paragraph index in document order where this field appears. */\n paragraphIndex: number;\n /** Runtime refresh status. */\n refreshStatus: FieldRefreshStatus;\n}\n\n/**\n * Generated table-of-contents structure extracted from TOC fields and\n * heading-styled paragraphs in the document.\n */\nexport interface TocStructure {\n /** The raw TOC field instruction (e.g. \"TOC \\\\o \\\"1-3\\\" \\\\h\"). */\n instruction: string;\n /** Heading level range the TOC covers. */\n levelRange: { from: number; to: number };\n /** Ordered TOC entries derived from heading paragraphs. */\n entries: TocEntry[];\n /** Whether the TOC content is current with the heading structure. */\n status: \"current\" | \"stale\";\n}\n\nexport interface TocEntry {\n /** Heading text. */\n text: string;\n /** Heading outline level (1-9). */\n level: number;\n /** Paragraph index of the heading in document order. */\n paragraphIndex: number;\n /** Style ID of the heading paragraph, if available. */\n styleId?: string;\n /** Bookmark name anchoring this heading, if present. */\n bookmarkName?: string;\n}\n\nexport interface BookmarkStartNode {\n type: \"bookmark_start\";\n bookmarkId: string;\n name: string;\n}\n\nexport interface BookmarkEndNode {\n type: \"bookmark_end\";\n bookmarkId: string;\n}\n\nexport interface SectionBreakNode {\n type: \"section_break\";\n sectionPropertiesXml?: string;\n /**\n * @deprecated Legacy field from older snapshots. New exports should use\n * sectionPropertiesXml and only contain raw <w:sectPr> content.\n */\n propertiesXml?: string;\n sectionProperties?: SectionProperties;\n}\n\nexport interface SectionProperties {\n pageSize?: PageSize;\n pageMargins?: PageMargins;\n columns?: ColumnProperties;\n pageNumbering?: PageNumbering;\n lineNumbering?: SectionLineNumbering;\n pageBorders?: SectionPageBorders;\n documentGrid?: SectionDocumentGrid;\n headerReferences?: HeaderFooterReference[];\n footerReferences?: HeaderFooterReference[];\n sectionType?: \"continuous\" | \"nextPage\" | \"evenPage\" | \"oddPage\" | \"nextColumn\";\n titlePage?: boolean;\n}\n\nexport interface PageSize {\n width: number;\n height: number;\n orientation?: \"portrait\" | \"landscape\";\n}\n\nexport interface PageMargins {\n top: number;\n right: number;\n bottom: number;\n left: number;\n header?: number;\n footer?: number;\n gutter?: number;\n}\n\nexport interface ColumnProperties {\n count?: number;\n space?: number;\n equalWidth?: boolean;\n columns?: Array<{ width: number; space?: number }>;\n separator?: boolean;\n}\n\nexport interface PageNumbering {\n format?: string;\n start?: number;\n chapStyle?: string;\n chapSep?: string;\n}\n\nexport interface SectionLineNumbering {\n countBy?: number;\n start?: number;\n distance?: number;\n restart?: \"newPage\" | \"newSection\" | \"continuous\";\n}\n\nexport interface SectionPageBorders {\n top?: BorderSpec;\n left?: BorderSpec;\n bottom?: BorderSpec;\n right?: BorderSpec;\n offsetFrom?: \"page\" | \"text\";\n display?: \"allPages\" | \"firstPage\" | \"notFirstPage\";\n zOrder?: \"front\" | \"back\";\n}\n\nexport interface SectionDocumentGrid {\n type?: \"default\" | \"lines\" | \"linesAndChars\" | \"snapToChars\";\n linePitch?: number;\n charSpace?: number;\n}\n\nexport interface HeaderFooterReference {\n variant: HeaderFooterVariant;\n relationshipId: string;\n}\n\nexport type InlineNode =\n | TextNode\n | HardBreakNode\n | ColumnBreakNode\n | TabNode\n | SymbolNode\n | HyperlinkNode\n | ImageNode\n | FieldNode\n | BookmarkStartNode\n | BookmarkEndNode\n | OpaqueInlineNode\n | FootnoteRefNode\n | ChartPreviewNode\n | SmartArtPreviewNode\n | ShapeNode\n | WordArtNode\n | VmlShapeNode;\n\nexport interface TextNode {\n type: \"text\";\n text: string;\n marks?: TextMark[];\n}\n\nexport type TextMark =\n | { type: \"bold\" }\n | { type: \"italic\" }\n | { type: \"underline\" }\n | { type: \"strikethrough\" }\n | { type: \"doubleStrikethrough\" }\n | { type: \"vanish\" }\n | { type: \"lang\"; val: string }\n | { type: \"highlight\"; color: string; val: string }\n | { type: \"backgroundColor\"; color: string }\n | { type: \"charSpacing\"; val: number }\n | { type: \"kerning\"; val: number }\n | { type: \"emboss\" }\n | { type: \"imprint\" }\n | { type: \"shadow\" }\n | { type: \"position\"; val: number }\n | { type: \"textFill\"; xml: string }\n | { type: \"fontFamily\"; val: string }\n | { type: \"fontSize\"; val: number }\n | { type: \"textColor\"; color: string }\n | { type: \"smallCaps\" }\n | { type: \"allCaps\" };\n\nexport interface HardBreakNode {\n type: \"hard_break\";\n}\n\nexport interface ColumnBreakNode {\n type: \"column_break\";\n}\n\nexport interface TabNode {\n type: \"tab\";\n}\n\nexport interface SymbolNode {\n type: \"symbol\";\n char: string;\n font?: string;\n marks?: TextMark[];\n}\n\nexport interface HyperlinkNode {\n type: \"hyperlink\";\n href: string;\n children: Array<TextNode | HardBreakNode | ColumnBreakNode | TabNode | SymbolNode>;\n}\n\nexport interface ImageNode {\n type: \"image\";\n mediaId: string;\n altText?: string;\n placementXml?: string;\n display?: \"inline\" | \"floating\";\n floating?: FloatingImageProperties;\n}\n\nexport interface FloatingImageProperties {\n horizontalPosition?: FloatingAxisPosition;\n verticalPosition?: FloatingAxisPosition;\n wrap?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n behindDoc?: boolean;\n layoutInCell?: boolean;\n allowOverlap?: boolean;\n}\n\nexport interface FloatingAxisPosition {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n}\n\nexport interface OpaqueInlineNode {\n type: \"opaque_inline\";\n fragmentId: string;\n warningId: string;\n}\n\n// ---- Complex rendering inline nodes (read-only previews) ----\n\n/**\n * Read-only preview of a chart (c:chart). The original drawing XML is stored in\n * rawXml for lossless round-trip export. If a fallback image was present in\n * mc:AlternateContent it is referenced by previewMediaId.\n */\nexport interface ChartPreviewNode {\n type: \"chart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\n/**\n * Read-only preview of a SmartArt diagram (dgm:*). The original drawing XML is\n * stored in rawXml for lossless round-trip export.\n */\nexport interface SmartArtPreviewNode {\n type: \"smartart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of a wps:wsp WordprocessingShape. Text content is\n * extracted for display. The original drawing XML is preserved in rawXml.\n */\nexport interface ShapeNode {\n type: \"shape\";\n text?: string;\n geometry?: string;\n isTextBox?: boolean;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of WordArt — a wps:wsp shape with a text-geometry preset.\n * Text is extracted for display. The original drawing XML is preserved in rawXml.\n */\nexport interface WordArtNode {\n type: \"wordart\";\n text: string;\n geometry?: string;\n rawXml: string;\n}\n\n/**\n * Read-only rendering of a VML shape (v:shape, v:rect, v:textbox) from a w:pict\n * element. Text is extracted for display. The original w:pict XML is preserved\n * in rawXml for lossless round-trip export.\n */\nexport interface VmlShapeNode {\n type: \"vml_shape\";\n text?: string;\n shapeType?: string;\n rawXml: string;\n}\n\nexport interface OpaqueBlockNode {\n type: \"opaque_block\";\n fragmentId: string;\n warningId: string;\n rawXml?: string;\n}\n\nexport interface DocRange {\n from: number;\n to: number;\n}\n\nexport interface BoundaryAssoc {\n start: -1 | 1;\n end: -1 | 1;\n}\n\nexport type CanonicalAnchor =\n | {\n kind: \"range\";\n range: DocRange;\n assoc: BoundaryAssoc;\n }\n | {\n kind: \"node\";\n at: number;\n assoc: -1 | 1;\n }\n | {\n kind: \"detached\";\n lastKnownRange: DocRange;\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n };\n\nexport interface ReviewStore {\n comments: Record<string, CommentThread>;\n revisions: Record<string, RevisionRecord>;\n}\n\nexport interface CommentThread {\n commentId: string;\n status: \"open\" | \"resolved\" | \"detached\";\n anchor: CanonicalAnchor;\n createdAt: ISO8601DateTime;\n createdBy?: string;\n authorId?: string;\n body?: string;\n entries?: CommentEntry[];\n resolution?: CommentResolution;\n resolvedAt?: ISO8601DateTime;\n warningIds: string[];\n isResolved?: boolean;\n metadata?: CommentThreadMetadata;\n}\n\nexport interface CommentEntry {\n entryId: string;\n authorId: string;\n createdAt: ISO8601DateTime;\n body: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface CommentEntryMetadata {\n ooxmlCommentId?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n initials?: string;\n}\n\nexport interface CommentResolution {\n resolvedAt: ISO8601DateTime;\n resolvedBy: string;\n}\n\nexport interface CommentThreadMetadata {\n source?: \"runtime\" | \"import\";\n rootOoxmlCommentId?: string;\n rootParaId?: string;\n}\n\nexport interface RevisionPropertyChangeData {\n xmlTag: \"pPrChange\" | \"sectPrChange\" | \"tblPrChange\" | \"rPrChange\";\n beforeXml: string;\n}\n\nexport interface RevisionMoveData {\n moveId: string;\n direction: \"from\" | \"to\";\n}\n\nexport type RevisionStoryTargetRecord =\n | { kind: \"main\" }\n | {\n kind: \"header\";\n relationshipId: string;\n variant: \"default\" | \"first\" | \"even\";\n sectionIndex?: number;\n }\n | {\n kind: \"footer\";\n relationshipId: string;\n variant: \"default\" | \"first\" | \"even\";\n sectionIndex?: number;\n }\n | { kind: \"footnote\"; noteId: string }\n | { kind: \"endnote\"; noteId: string };\n\nexport interface RevisionRecord {\n changeId: string;\n kind: \"insertion\" | \"deletion\" | \"formatting\" | \"move\" | \"property-change\";\n anchor: CanonicalAnchor;\n authorId?: string;\n createdAt: ISO8601DateTime;\n warningIds?: string[];\n metadata?: RevisionMetadataRecord;\n status: \"open\" | \"accepted\" | \"rejected\" | \"detached\";\n}\n\nexport interface RevisionMetadataRecord {\n source?: \"runtime\" | \"import\";\n storyTarget?: RevisionStoryTargetRecord;\n preserveOnlyReason?: string;\n importedRevisionForm?:\n | \"run-insertion\"\n | \"run-deletion\"\n | \"paragraph-insertion\"\n | \"paragraph-deletion\";\n originalRevisionType?: string;\n ooxmlRevisionId?: string;\n propertyChangeData?: RevisionPropertyChangeData;\n moveData?: RevisionMoveData;\n}\n\nexport interface PreservationStore {\n opaqueFragments: Record<string, OpaqueFragmentRecord>;\n packageParts: Record<string, PreservedPackagePart>;\n}\n\nexport interface OpaqueFragmentRecord {\n fragmentId: string;\n payloadKind: \"xml-subtree\" | \"package-part\";\n payloadReference: string;\n featureClass: \"preserve-only\";\n lastKnownRange: DocRange;\n warningId: string;\n packagePartName?: string;\n relationshipId?: string;\n}\n\nexport interface PreservedPackagePart {\n packagePartName: string;\n contentType: string;\n relationshipIds: string[];\n}\n\nexport interface DiagnosticStore {\n warnings: DiagnosticWarningEntry[];\n errors: DiagnosticErrorEntry[];\n}\n\nexport interface DiagnosticWarningEntry {\n diagnosticId: string;\n warningId: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n message: string;\n}\n\nexport interface DiagnosticErrorEntry {\n diagnosticId: string;\n code:\n | \"load_failed\"\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"host\" | \"export\";\n details?: unknown;\n}\n\nexport function createCanonicalDocument(\n input: Omit<CanonicalDocument, \"schemaVersion\">,\n): CanonicalDocument {\n const document: CanonicalDocument = {\n schemaVersion: CDS_SCHEMA_VERSION,\n ...input,\n };\n\n assertCanonicalDocument(document);\n return document;\n}\n\nexport function serializeCanonicalDocument(document: CanonicalDocument): string {\n assertCanonicalDocument(document);\n return stableStringify(document);\n}\n\nexport function createCanonicalDocumentSignature(document: unknown): string {\n return stableStringify(document);\n}\n\nexport function parseCanonicalDocument(json: string): CanonicalDocument {\n const parsed = JSON.parse(json) as unknown;\n assertCanonicalDocument(parsed);\n return parsed;\n}\n\nexport function projectCanonicalDocument(\n document: CanonicalDocument,\n): CanonicalDocument {\n assertCanonicalDocument(document);\n return JSON.parse(stableStringify(document)) as CanonicalDocument;\n}\n\nexport function assertCanonicalDocument(\n value: unknown,\n): asserts value is CanonicalDocument {\n const issues = validateCanonicalDocument(value);\n assertValid(issues, \"Invalid canonical document.\");\n}\n\nexport function validateCanonicalDocument(\n value: unknown,\n): ModelValidationIssue[] {\n const issues: ModelValidationIssue[] = [];\n const record = asPlainObject(value, \"$\", issues);\n if (!record) {\n return issues;\n }\n\n validateExactObjectKeys(record, CANONICAL_DOCUMENT_TOP_LEVEL_KEYS, \"$\", issues, CANONICAL_DOCUMENT_OPTIONAL_KEYS);\n expectExactString(record.schemaVersion, CDS_SCHEMA_VERSION, \"$.schemaVersion\", issues);\n expectUuid(record.docId, \"$.docId\", issues);\n expectIso8601UtcTimestamp(record.createdAt, \"$.createdAt\", issues);\n expectIso8601UtcTimestamp(record.updatedAt, \"$.updatedAt\", issues);\n\n validateMetadata(record.metadata, \"$.metadata\", issues);\n validateStylesCatalog(record.styles, \"$.styles\", issues);\n validateNumberingCatalog(record.numbering, \"$.numbering\", issues);\n validateMediaCatalog(record.media, \"$.media\", issues);\n validateDocumentNode(record.content, \"$.content\", issues);\n validateReviewStore(record.review, \"$.review\", issues);\n validatePreservationStore(record.preservation, \"$.preservation\", issues);\n validateDiagnosticStore(record.diagnostics, \"$.diagnostics\", issues);\n if (record.subParts !== undefined) {\n validateSubPartsCatalog(record.subParts, \"$.subParts\", issues);\n }\n validateDocumentReferences(record, issues);\n\n return issues;\n}\n\nfunction validateMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const customProperties = asPlainObject(record.customProperties, `${path}.customProperties`, issues);\n if (!customProperties) {\n return;\n }\n\n for (const [propertyKey, propertyValue] of Object.entries(customProperties)) {\n if (typeof propertyValue !== \"string\") {\n issues.push({\n path: `${path}.customProperties.${propertyKey}`,\n message: \"customProperties values must be strings.\",\n });\n }\n }\n}\n\nfunction validateStylesCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n validateStyleMap(record.paragraphs, `${path}.paragraphs`, issues);\n validateStyleMap(record.characters, `${path}.characters`, issues);\n validateStyleMap(record.tables, `${path}.tables`, issues);\n if (record.latentStyles !== undefined) {\n validateLatentStyleMap(record.latentStyles, `${path}.latentStyles`, issues);\n }\n}\n\nfunction validateStyleMap(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [styleId, definition] of Object.entries(record)) {\n expectDomainString(styleId, \"styleId\", `${path}.${styleId}`, issues);\n const definitionRecord = asPlainObject(definition, `${path}.${styleId}`, issues);\n if (!definitionRecord) {\n continue;\n }\n if (definitionRecord.styleId !== styleId) {\n issues.push({\n path: `${path}.${styleId}.styleId`,\n message: \"styleId must match the map key.\",\n });\n }\n }\n}\n\nfunction validateLatentStyleMap(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [styleName, definition] of Object.entries(record)) {\n const definitionRecord = asPlainObject(definition, `${path}.${styleName}`, issues);\n if (!definitionRecord) {\n continue;\n }\n if (definitionRecord.name !== styleName) {\n issues.push({\n path: `${path}.${styleName}.name`,\n message: \"name must match the map key.\",\n });\n }\n if (definitionRecord.uiPriority !== undefined && typeof definitionRecord.uiPriority !== \"number\") {\n issues.push({\n path: `${path}.${styleName}.uiPriority`,\n message: \"uiPriority must be a number.\",\n });\n }\n }\n}\n\nfunction validateNumberingCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const abstractDefinitions = asPlainObject(\n record.abstractDefinitions,\n `${path}.abstractDefinitions`,\n issues,\n );\n if (abstractDefinitions) {\n for (const [abstractId, definition] of Object.entries(abstractDefinitions)) {\n expectDomainString(\n abstractId,\n \"abstractNumberingId\",\n `${path}.abstractDefinitions.${abstractId}`,\n issues,\n );\n const definitionRecord = asPlainObject(\n definition,\n `${path}.abstractDefinitions.${abstractId}`,\n issues,\n );\n if (definitionRecord && definitionRecord.abstractNumberingId !== abstractId) {\n issues.push({\n path: `${path}.abstractDefinitions.${abstractId}.abstractNumberingId`,\n message: \"abstractNumberingId must match the map key.\",\n });\n }\n }\n }\n\n const instances = asPlainObject(record.instances, `${path}.instances`, issues);\n if (instances) {\n for (const [instanceId, instance] of Object.entries(instances)) {\n expectDomainString(\n instanceId,\n \"numberingInstanceId\",\n `${path}.instances.${instanceId}`,\n issues,\n );\n const instanceRecord = asPlainObject(\n instance,\n `${path}.instances.${instanceId}`,\n issues,\n );\n if (!instanceRecord) {\n continue;\n }\n if (instanceRecord.numberingInstanceId !== instanceId) {\n issues.push({\n path: `${path}.instances.${instanceId}.numberingInstanceId`,\n message: \"numberingInstanceId must match the map key.\",\n });\n }\n expectDomainString(\n instanceRecord.abstractNumberingId,\n \"abstractNumberingId\",\n `${path}.instances.${instanceId}.abstractNumberingId`,\n issues,\n );\n }\n }\n}\n\nfunction validateMediaCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const items = asPlainObject(record.items, `${path}.items`, issues);\n if (!items) {\n return;\n }\n\n for (const [mediaId, item] of Object.entries(items)) {\n expectDomainString(mediaId, \"mediaId\", `${path}.items.${mediaId}`, issues);\n const itemRecord = asPlainObject(item, `${path}.items.${mediaId}`, issues);\n if (!itemRecord) {\n continue;\n }\n if (itemRecord.mediaId !== mediaId) {\n issues.push({\n path: `${path}.items.${mediaId}.mediaId`,\n message: \"mediaId must match the map key.\",\n });\n }\n expectDomainString(\n itemRecord.packagePartName,\n \"packagePartName\",\n `${path}.items.${mediaId}.packagePartName`,\n issues,\n );\n if (itemRecord.relationshipId !== undefined) {\n expectDomainString(\n itemRecord.relationshipId,\n \"relationshipId\",\n `${path}.items.${mediaId}.relationshipId`,\n issues,\n );\n }\n }\n}\n\nfunction validateDocumentNode(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const type = expectString(record.type, `${path}.type`, issues);\n if (!type) {\n return;\n }\n\n switch (type) {\n case \"doc\":\n case \"paragraph\":\n case \"sdt\":\n case \"custom_xml\":\n case \"hyperlink\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, index) =>\n validateDocumentNode(child, `${path}.children[${index}]`, issues),\n );\n }\n if (type === \"paragraph\" && record.styleId !== undefined) {\n expectDomainString(record.styleId, \"styleId\", `${path}.styleId`, issues);\n }\n if (type === \"paragraph\" && record.numbering !== undefined) {\n const numbering = asPlainObject(record.numbering, `${path}.numbering`, issues);\n if (numbering) {\n expectDomainString(\n numbering.numberingInstanceId,\n \"numberingInstanceId\",\n `${path}.numbering.numberingInstanceId`,\n issues,\n );\n if (typeof numbering.level !== \"number\") {\n issues.push({\n path: `${path}.numbering.level`,\n message: \"level must be a number.\",\n });\n }\n }\n }\n if (type === \"hyperlink\") {\n expectString(record.href, `${path}.href`, issues);\n }\n return;\n case \"alt_chunk\":\n expectDomainString(record.relationshipId, \"relationshipId\", `${path}.relationshipId`, issues);\n return;\n case \"image\":\n expectDomainString(record.mediaId, \"mediaId\", `${path}.mediaId`, issues);\n if (record.placementXml !== undefined) {\n expectString(record.placementXml, `${path}.placementXml`, issues);\n }\n if (record.display !== undefined) {\n const display = expectString(record.display, `${path}.display`, issues);\n if (display && display !== \"inline\" && display !== \"floating\") {\n issues.push({\n path: `${path}.display`,\n message: \"display must be 'inline' or 'floating'.\",\n });\n }\n }\n if (record.floating !== undefined) {\n validateFloatingImageProperties(record.floating, `${path}.floating`, issues);\n }\n return;\n case \"opaque_inline\":\n case \"opaque_block\":\n expectDomainString(record.fragmentId, \"fragmentId\", `${path}.fragmentId`, issues);\n expectDomainString(record.warningId, \"warningId\", `${path}.warningId`, issues);\n if (record.rawXml !== undefined) {\n expectString(record.rawXml, `${path}.rawXml`, issues);\n }\n return;\n case \"table\":\n if (!Array.isArray(record.gridColumns)) {\n issues.push({ path: `${path}.gridColumns`, message: \"gridColumns must be an array.\" });\n }\n if (!Array.isArray(record.rows)) {\n issues.push({ path: `${path}.rows`, message: \"rows must be an array.\" });\n } else {\n record.rows.forEach((row, rowIndex) =>\n validateDocumentNode(row, `${path}.rows[${rowIndex}]`, issues),\n );\n }\n return;\n case \"table_row\":\n if (!Array.isArray(record.cells)) {\n issues.push({ path: `${path}.cells`, message: \"cells must be an array.\" });\n } else {\n record.cells.forEach((cell, cellIndex) =>\n validateDocumentNode(cell, `${path}.cells[${cellIndex}]`, issues),\n );\n }\n return;\n case \"table_cell\":\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, childIndex) =>\n validateDocumentNode(child, `${path}.children[${childIndex}]`, issues),\n );\n }\n return;\n case \"field\":\n expectString(record.fieldType, `${path}.fieldType`, issues);\n expectString(record.instruction, `${path}.instruction`, issues);\n if (!Array.isArray(record.children)) {\n issues.push({ path: `${path}.children`, message: \"children must be an array.\" });\n } else {\n record.children.forEach((child, index) =>\n validateDocumentNode(child, `${path}.children[${index}]`, issues),\n );\n }\n return;\n case \"bookmark_start\":\n expectString(record.bookmarkId, `${path}.bookmarkId`, issues);\n expectString(record.name, `${path}.name`, issues);\n return;\n case \"bookmark_end\":\n expectString(record.bookmarkId, `${path}.bookmarkId`, issues);\n return;\n case \"section_break\":\n return;\n case \"text\":\n if (typeof record.text !== \"string\") {\n issues.push({\n path: `${path}.text`,\n message: \"text must be a string.\",\n });\n }\n return;\n case \"hard_break\":\n case \"column_break\":\n case \"tab\":\n return;\n case \"symbol\":\n expectString(record.char, `${path}.char`, issues);\n if (record.font !== undefined) {\n expectString(record.font, `${path}.font`, issues);\n }\n return;\n case \"footnote_ref\":\n expectString(record.noteId, `${path}.noteId`, issues);\n if (record.noteKind !== \"footnote\" && record.noteKind !== \"endnote\") {\n issues.push({\n path: `${path}.noteKind`,\n message: \"noteKind must be 'footnote' or 'endnote'.\",\n });\n }\n return;\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n expectString(record.rawXml, `${path}.rawXml`, issues);\n return;\n default:\n issues.push({\n path: `${path}.type`,\n message: `Unsupported node type ${JSON.stringify(type)}.`,\n });\n }\n}\n\nfunction validateFloatingImageProperties(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.horizontalPosition !== undefined) {\n validateFloatingAxisPosition(record.horizontalPosition, `${path}.horizontalPosition`, issues);\n }\n if (record.verticalPosition !== undefined) {\n validateFloatingAxisPosition(record.verticalPosition, `${path}.verticalPosition`, issues);\n }\n if (record.wrap !== undefined) {\n const wrap = expectString(record.wrap, `${path}.wrap`, issues);\n if (\n wrap &&\n wrap !== \"none\" &&\n wrap !== \"square\" &&\n wrap !== \"tight\" &&\n wrap !== \"through\" &&\n wrap !== \"topAndBottom\"\n ) {\n issues.push({\n path: `${path}.wrap`,\n message: \"wrap must be one of none, square, tight, through, or topAndBottom.\",\n });\n }\n }\n}\n\nfunction validateFloatingAxisPosition(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.relativeFrom !== undefined) {\n expectString(record.relativeFrom, `${path}.relativeFrom`, issues);\n }\n if (record.align !== undefined) {\n expectString(record.align, `${path}.align`, issues);\n }\n if (record.offset !== undefined && typeof record.offset !== \"number\") {\n issues.push({\n path: `${path}.offset`,\n message: \"offset must be a number.\",\n });\n }\n}\n\nfunction validateReviewStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const comments = asPlainObject(record.comments, `${path}.comments`, issues);\n if (comments) {\n for (const [commentId, thread] of Object.entries(comments)) {\n expectDomainString(commentId, \"commentId\", `${path}.comments.${commentId}`, issues);\n const threadRecord = asPlainObject(thread, `${path}.comments.${commentId}`, issues);\n if (!threadRecord) {\n continue;\n }\n if (threadRecord.commentId !== commentId) {\n issues.push({\n path: `${path}.comments.${commentId}.commentId`,\n message: \"commentId must match the map key.\",\n });\n }\n validateAnchor(threadRecord.anchor, `${path}.comments.${commentId}.anchor`, issues);\n expectIso8601UtcTimestamp(\n threadRecord.createdAt,\n `${path}.comments.${commentId}.createdAt`,\n issues,\n );\n validateCommentStatus(threadRecord.status, `${path}.comments.${commentId}.status`, issues);\n if (threadRecord.createdBy !== undefined) {\n expectString(\n threadRecord.createdBy,\n `${path}.comments.${commentId}.createdBy`,\n issues,\n );\n }\n if (threadRecord.authorId !== undefined) {\n expectString(\n threadRecord.authorId,\n `${path}.comments.${commentId}.authorId`,\n issues,\n );\n }\n if (threadRecord.body !== undefined) {\n expectStringAllowEmpty(\n threadRecord.body,\n `${path}.comments.${commentId}.body`,\n issues,\n );\n }\n if (!Array.isArray(threadRecord.warningIds)) {\n issues.push({\n path: `${path}.comments.${commentId}.warningIds`,\n message: \"warningIds must be an array.\",\n });\n } else {\n threadRecord.warningIds.forEach((warningId, index) =>\n expectDomainString(\n warningId,\n \"warningId\",\n `${path}.comments.${commentId}.warningIds[${index}]`,\n issues,\n ),\n );\n }\n if (threadRecord.entries !== undefined) {\n validateCommentEntries(\n threadRecord.entries,\n `${path}.comments.${commentId}.entries`,\n issues,\n );\n }\n if (threadRecord.resolution !== undefined) {\n validateCommentResolution(\n threadRecord.resolution,\n `${path}.comments.${commentId}.resolution`,\n issues,\n );\n }\n if (threadRecord.resolvedAt !== undefined) {\n expectIso8601UtcTimestamp(\n threadRecord.resolvedAt,\n `${path}.comments.${commentId}.resolvedAt`,\n issues,\n );\n }\n if (\n threadRecord.isResolved !== undefined &&\n typeof threadRecord.isResolved !== \"boolean\"\n ) {\n issues.push({\n path: `${path}.comments.${commentId}.isResolved`,\n message: \"isResolved must be a boolean.\",\n });\n }\n if (threadRecord.metadata !== undefined) {\n validateCommentThreadMetadata(\n threadRecord.metadata,\n `${path}.comments.${commentId}.metadata`,\n issues,\n );\n }\n }\n }\n\n const revisions = asPlainObject(record.revisions, `${path}.revisions`, issues);\n if (revisions) {\n for (const [revisionId, revision] of Object.entries(revisions)) {\n expectDomainString(revisionId, \"revisionId\", `${path}.revisions.${revisionId}`, issues);\n const revisionRecord = asPlainObject(\n revision,\n `${path}.revisions.${revisionId}`,\n issues,\n );\n if (!revisionRecord) {\n continue;\n }\n if (revisionRecord.changeId !== revisionId) {\n issues.push({\n path: `${path}.revisions.${revisionId}.changeId`,\n message: \"changeId must match the map key.\",\n });\n }\n validateAnchor(revisionRecord.anchor, `${path}.revisions.${revisionId}.anchor`, issues);\n validateRevisionKind(revisionRecord.kind, `${path}.revisions.${revisionId}.kind`, issues);\n validateRevisionStatus(\n revisionRecord.status,\n `${path}.revisions.${revisionId}.status`,\n issues,\n );\n expectIso8601UtcTimestamp(\n revisionRecord.createdAt,\n `${path}.revisions.${revisionId}.createdAt`,\n issues,\n );\n if (revisionRecord.authorId !== undefined) {\n expectString(\n revisionRecord.authorId,\n `${path}.revisions.${revisionId}.authorId`,\n issues,\n );\n }\n if (revisionRecord.warningIds !== undefined) {\n validateWarningIds(\n revisionRecord.warningIds,\n `${path}.revisions.${revisionId}.warningIds`,\n issues,\n );\n }\n if (revisionRecord.metadata !== undefined) {\n validateRevisionMetadata(\n revisionRecord.metadata,\n `${path}.revisions.${revisionId}.metadata`,\n issues,\n );\n }\n }\n }\n}\n\nfunction validateCommentStatus(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (value === \"open\" || value === \"resolved\" || value === \"detached\") {\n return;\n }\n issues.push({\n path,\n message: \"status must be one of open, resolved, or detached.\",\n });\n}\n\nfunction validateCommentEntries(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (!Array.isArray(value)) {\n issues.push({\n path,\n message: \"entries must be an array.\",\n });\n return;\n }\n\n value.forEach((entry, index) => {\n const record = asPlainObject(entry, `${path}[${index}]`, issues);\n if (!record) {\n return;\n }\n expectString(record.entryId, `${path}[${index}].entryId`, issues);\n expectString(record.authorId, `${path}[${index}].authorId`, issues);\n expectStringAllowEmpty(record.body, `${path}[${index}].body`, issues);\n expectIso8601UtcTimestamp(record.createdAt, `${path}[${index}].createdAt`, issues);\n if (record.metadata !== undefined) {\n validateCommentEntryMetadata(record.metadata, `${path}[${index}].metadata`, issues);\n }\n });\n}\n\nfunction validateCommentEntryMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const field of [\n \"ooxmlCommentId\",\n \"paraId\",\n \"parentParaId\",\n \"durableId\",\n \"initials\",\n ] as const) {\n if (record[field] !== undefined) {\n expectString(record[field], `${path}.${field}`, issues);\n }\n }\n}\n\nfunction validateCommentResolution(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n expectIso8601UtcTimestamp(record.resolvedAt, `${path}.resolvedAt`, issues);\n expectString(record.resolvedBy, `${path}.resolvedBy`, issues);\n}\n\nfunction validateCommentThreadMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (\n record.source !== undefined &&\n record.source !== \"runtime\" &&\n record.source !== \"import\"\n ) {\n issues.push({\n path: `${path}.source`,\n message: \"source must be either runtime or import.\",\n });\n }\n if (record.rootOoxmlCommentId !== undefined) {\n expectString(record.rootOoxmlCommentId, `${path}.rootOoxmlCommentId`, issues);\n }\n if (record.rootParaId !== undefined) {\n expectString(record.rootParaId, `${path}.rootParaId`, issues);\n }\n}\n\nfunction validateRevisionKind(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (\n value === \"insertion\" ||\n value === \"deletion\" ||\n value === \"formatting\" ||\n value === \"move\" ||\n value === \"property-change\"\n ) {\n return;\n }\n issues.push({\n path,\n message: \"kind must be insertion, deletion, formatting, move, or property-change.\",\n });\n}\n\nfunction validateRevisionStatus(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (\n value === \"open\" ||\n value === \"accepted\" ||\n value === \"rejected\" ||\n value === \"detached\"\n ) {\n return;\n }\n issues.push({\n path,\n message: \"status must be one of open, accepted, rejected, or detached.\",\n });\n}\n\nfunction validateWarningIds(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (!Array.isArray(value)) {\n issues.push({\n path,\n message: \"warningIds must be an array.\",\n });\n return;\n }\n\n value.forEach((warningId, index) =>\n expectDomainString(warningId, \"warningId\", `${path}[${index}]`, issues),\n );\n}\n\nfunction validateRevisionMetadata(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (\n record.source !== undefined &&\n record.source !== \"runtime\" &&\n record.source !== \"import\"\n ) {\n issues.push({\n path: `${path}.source`,\n message: \"source must be either runtime or import.\",\n });\n }\n for (const field of [\n \"preserveOnlyReason\",\n \"importedRevisionForm\",\n \"originalRevisionType\",\n \"ooxmlRevisionId\",\n ] as const) {\n if (record[field] !== undefined) {\n expectString(record[field], `${path}.${field}`, issues);\n }\n }\n\n if (record.propertyChangeData !== undefined) {\n const pcd = asPlainObject(record.propertyChangeData, `${path}.propertyChangeData`, issues);\n if (pcd) {\n expectString(pcd.xmlTag, `${path}.propertyChangeData.xmlTag`, issues);\n expectString(pcd.beforeXml, `${path}.propertyChangeData.beforeXml`, issues);\n }\n }\n\n if (record.moveData !== undefined) {\n const md = asPlainObject(record.moveData, `${path}.moveData`, issues);\n if (md) {\n expectString(md.moveId, `${path}.moveData.moveId`, issues);\n expectString(md.direction, `${path}.moveData.direction`, issues);\n }\n }\n}\n\nfunction validatePreservationStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const opaqueFragments = asPlainObject(\n record.opaqueFragments,\n `${path}.opaqueFragments`,\n issues,\n );\n if (opaqueFragments) {\n for (const [fragmentId, fragment] of Object.entries(opaqueFragments)) {\n expectDomainString(fragmentId, \"fragmentId\", `${path}.opaqueFragments.${fragmentId}`, issues);\n const fragmentRecord = asPlainObject(\n fragment,\n `${path}.opaqueFragments.${fragmentId}`,\n issues,\n );\n if (!fragmentRecord) {\n continue;\n }\n if (fragmentRecord.fragmentId !== fragmentId) {\n issues.push({\n path: `${path}.opaqueFragments.${fragmentId}.fragmentId`,\n message: \"fragmentId must match the map key.\",\n });\n }\n validateRange(\n fragmentRecord.lastKnownRange,\n `${path}.opaqueFragments.${fragmentId}.lastKnownRange`,\n issues,\n );\n expectDomainString(\n fragmentRecord.warningId,\n \"warningId\",\n `${path}.opaqueFragments.${fragmentId}.warningId`,\n issues,\n );\n if (fragmentRecord.packagePartName !== undefined) {\n expectDomainString(\n fragmentRecord.packagePartName,\n \"packagePartName\",\n `${path}.opaqueFragments.${fragmentId}.packagePartName`,\n issues,\n );\n }\n if (fragmentRecord.relationshipId !== undefined) {\n expectDomainString(\n fragmentRecord.relationshipId,\n \"relationshipId\",\n `${path}.opaqueFragments.${fragmentId}.relationshipId`,\n issues,\n );\n }\n }\n }\n\n const packageParts = asPlainObject(record.packageParts, `${path}.packageParts`, issues);\n if (packageParts) {\n for (const [packagePartName, packagePart] of Object.entries(packageParts)) {\n expectDomainString(\n packagePartName,\n \"packagePartName\",\n `${path}.packageParts.${packagePartName}`,\n issues,\n );\n const packagePartRecord = asPlainObject(\n packagePart,\n `${path}.packageParts.${packagePartName}`,\n issues,\n );\n if (!packagePartRecord) {\n continue;\n }\n if (packagePartRecord.packagePartName !== packagePartName) {\n issues.push({\n path: `${path}.packageParts.${packagePartName}.packagePartName`,\n message: \"packagePartName must match the map key.\",\n });\n }\n if (Array.isArray(packagePartRecord.relationshipIds)) {\n packagePartRecord.relationshipIds.forEach((relationshipId, index) =>\n expectDomainString(\n relationshipId,\n \"relationshipId\",\n `${path}.packageParts.${packagePartName}.relationshipIds[${index}]`,\n issues,\n ),\n );\n }\n }\n }\n}\n\nfunction validateDiagnosticStore(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (Array.isArray(record.warnings)) {\n record.warnings.forEach((warning, index) => {\n const warningRecord = asPlainObject(warning, `${path}.warnings[${index}]`, issues);\n if (!warningRecord) {\n return;\n }\n expectDomainString(\n warningRecord.diagnosticId,\n \"diagnosticId\",\n `${path}.warnings[${index}].diagnosticId`,\n issues,\n );\n expectDomainString(\n warningRecord.warningId,\n \"warningId\",\n `${path}.warnings[${index}].warningId`,\n issues,\n );\n });\n }\n\n if (Array.isArray(record.errors)) {\n record.errors.forEach((error, index) => {\n const errorRecord = asPlainObject(error, `${path}.errors[${index}]`, issues);\n if (!errorRecord) {\n return;\n }\n expectDomainString(\n errorRecord.diagnosticId,\n \"diagnosticId\",\n `${path}.errors[${index}].diagnosticId`,\n issues,\n );\n });\n }\n}\n\nfunction validateAnchor(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const kind = expectString(record.kind, `${path}.kind`, issues);\n if (!kind) {\n return;\n }\n\n if (kind === \"range\") {\n validateRange(record.range, `${path}.range`, issues);\n validateBoundaryAssoc(record.assoc, `${path}.assoc`, issues);\n } else if (kind === \"node\") {\n if (typeof record.at !== \"number\") {\n issues.push({\n path: `${path}.at`,\n message: \"node anchors must contain a numeric at value.\",\n });\n }\n if (record.assoc !== -1 && record.assoc !== 1) {\n issues.push({\n path: `${path}.assoc`,\n message: \"node anchor assoc must be -1 or 1.\",\n });\n }\n } else if (kind === \"detached\") {\n validateRange(record.lastKnownRange, `${path}.lastKnownRange`, issues);\n if (\n record.reason !== \"deleted\" &&\n record.reason !== \"invalidatedByStructureChange\" &&\n record.reason !== \"importAmbiguity\"\n ) {\n issues.push({\n path: `${path}.reason`,\n message: \"detached anchor reason must be deleted, invalidatedByStructureChange, or importAmbiguity.\",\n });\n }\n } else {\n issues.push({\n path: `${path}.kind`,\n message: \"anchor kind must be range, node, or detached.\",\n });\n }\n}\n\nfunction validateBoundaryAssoc(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.start !== -1 && record.start !== 1) {\n issues.push({\n path: `${path}.start`,\n message: \"assoc.start must be -1 or 1.\",\n });\n }\n if (record.end !== -1 && record.end !== 1) {\n issues.push({\n path: `${path}.end`,\n message: \"assoc.end must be -1 or 1.\",\n });\n }\n}\n\nfunction validateDocumentReferences(\n record: Record<string, unknown>,\n issues: ModelValidationIssue[],\n): void {\n const paragraphStyleIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.styles, \"$.styles\", [])?.paragraphs, \"$.styles.paragraphs\", []) ?? {}),\n );\n const numberingInstanceIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.numbering, \"$.numbering\", [])?.instances, \"$.numbering.instances\", []) ?? {}),\n );\n const abstractNumberingIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.numbering, \"$.numbering\", [])?.abstractDefinitions, \"$.numbering.abstractDefinitions\", []) ?? {}),\n );\n const mediaIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.media, \"$.media\", [])?.items, \"$.media.items\", []) ?? {}),\n );\n const warningIds = new Set(\n (Array.isArray(asPlainObject(record.diagnostics, \"$.diagnostics\", [])?.warnings)\n ? (asPlainObject(record.diagnostics, \"$.diagnostics\", [])?.warnings as Array<Record<string, unknown>>)\n : []\n ).flatMap((warning) => typeof warning.warningId === \"string\" ? [warning.warningId] : []),\n );\n const fragmentIds = new Set(\n Object.keys(asPlainObject(asPlainObject(record.preservation, \"$.preservation\", [])?.opaqueFragments, \"$.preservation.opaqueFragments\", []) ?? {}),\n );\n const noteIds = collectNoteIds(record);\n\n const numberingInstances = asPlainObject(\n asPlainObject(record.numbering, \"$.numbering\", [])?.instances,\n \"$.numbering.instances\",\n [],\n );\n if (numberingInstances) {\n for (const [instanceId, instance] of Object.entries(numberingInstances)) {\n const instanceRecord = asPlainObject(instance, `$.numbering.instances.${instanceId}`, []);\n if (\n instanceRecord &&\n typeof instanceRecord.abstractNumberingId === \"string\" &&\n !abstractNumberingIds.has(instanceRecord.abstractNumberingId)\n ) {\n issues.push({\n path: `$.numbering.instances.${instanceId}.abstractNumberingId`,\n message: \"abstractNumberingId must reference an existing abstract numbering definition.\",\n });\n }\n }\n }\n\n validateDocumentNodeReferences(record.content, \"$.content\", issues, {\n paragraphStyleIds,\n numberingInstanceIds,\n mediaIds,\n warningIds,\n fragmentIds,\n noteIds,\n });\n validateSubPartReferences(record.subParts, \"$.subParts\", issues, {\n paragraphStyleIds,\n numberingInstanceIds,\n mediaIds,\n warningIds,\n fragmentIds,\n noteIds,\n });\n validateReviewReferences(record.review, \"$.review\", issues, warningIds);\n}\n\nfunction validateDocumentNodeReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n references: {\n paragraphStyleIds: ReadonlySet<string>;\n numberingInstanceIds: ReadonlySet<string>;\n mediaIds: ReadonlySet<string>;\n warningIds: ReadonlySet<string>;\n fragmentIds: ReadonlySet<string>;\n noteIds: ReadonlySet<string>;\n },\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const type = typeof record.type === \"string\" ? record.type : undefined;\n if (type === \"paragraph\") {\n if (\n typeof record.styleId === \"string\" &&\n !references.paragraphStyleIds.has(record.styleId)\n ) {\n issues.push({\n path: `${path}.styleId`,\n message: \"styleId must reference an existing paragraph style definition.\",\n });\n }\n const numbering = asPlainObject(record.numbering, `${path}.numbering`, []);\n if (\n numbering &&\n typeof numbering.numberingInstanceId === \"string\" &&\n !references.numberingInstanceIds.has(numbering.numberingInstanceId)\n ) {\n issues.push({\n path: `${path}.numbering.numberingInstanceId`,\n message: \"numberingInstanceId must reference an existing numbering instance.\",\n });\n }\n } else if (type === \"image\") {\n if (typeof record.mediaId === \"string\" && !references.mediaIds.has(record.mediaId)) {\n issues.push({\n path: `${path}.mediaId`,\n message: \"mediaId must reference an existing media catalog item.\",\n });\n }\n } else if (type === \"opaque_inline\" || type === \"opaque_block\") {\n if (typeof record.fragmentId === \"string\" && !references.fragmentIds.has(record.fragmentId)) {\n issues.push({\n path: `${path}.fragmentId`,\n message: \"fragmentId must reference an existing opaque fragment.\",\n });\n }\n if (typeof record.warningId === \"string\" && !references.warningIds.has(record.warningId)) {\n issues.push({\n path: `${path}.warningId`,\n message: \"warningId must reference an existing diagnostic warning.\",\n });\n }\n } else if (type === \"footnote_ref\") {\n if (typeof record.noteId === \"string\" && !references.noteIds.has(`${record.noteKind}:${record.noteId}`)) {\n issues.push({\n path: `${path}.noteId`,\n message: \"noteId must reference an existing footnote or endnote definition.\",\n });\n }\n }\n\n if (Array.isArray(record.children)) {\n record.children.forEach((child, index) =>\n validateDocumentNodeReferences(child, `${path}.children[${index}]`, issues, references),\n );\n }\n if (Array.isArray(record.rows)) {\n record.rows.forEach((row, index) =>\n validateDocumentNodeReferences(row, `${path}.rows[${index}]`, issues, references),\n );\n }\n if (Array.isArray(record.cells)) {\n record.cells.forEach((cell, index) =>\n validateDocumentNodeReferences(cell, `${path}.cells[${index}]`, issues, references),\n );\n }\n}\n\nfunction validateReviewReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n warningIds: ReadonlySet<string>,\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const comments = asPlainObject(record.comments, `${path}.comments`, []);\n if (comments) {\n for (const [commentId, thread] of Object.entries(comments)) {\n const threadRecord = asPlainObject(thread, `${path}.comments.${commentId}`, []);\n if (!threadRecord || !Array.isArray(threadRecord.warningIds)) {\n continue;\n }\n threadRecord.warningIds.forEach((warningId, index) => {\n if (typeof warningId === \"string\" && !warningIds.has(warningId)) {\n issues.push({\n path: `${path}.comments.${commentId}.warningIds[${index}]`,\n message: \"warningIds must reference existing diagnostic warnings.\",\n });\n }\n });\n }\n }\n\n const revisions = asPlainObject(record.revisions, `${path}.revisions`, []);\n if (revisions) {\n for (const [revisionId, revision] of Object.entries(revisions)) {\n const revisionRecord = asPlainObject(revision, `${path}.revisions.${revisionId}`, []);\n if (!revisionRecord || !Array.isArray(revisionRecord.warningIds)) {\n continue;\n }\n revisionRecord.warningIds.forEach((warningId, index) => {\n if (typeof warningId === \"string\" && !warningIds.has(warningId)) {\n issues.push({\n path: `${path}.revisions.${revisionId}.warningIds[${index}]`,\n message: \"warningIds must reference existing diagnostic warnings.\",\n });\n }\n });\n }\n }\n}\n\nfunction validateSubPartReferences(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n references: {\n paragraphStyleIds: ReadonlySet<string>;\n numberingInstanceIds: ReadonlySet<string>;\n mediaIds: ReadonlySet<string>;\n warningIds: ReadonlySet<string>;\n fragmentIds: ReadonlySet<string>;\n noteIds: ReadonlySet<string>;\n },\n): void {\n if (value === undefined) {\n return;\n }\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n const headers = Array.isArray(record.headers) ? record.headers : [];\n headers.forEach((header, index) => {\n const headerRecord = asPlainObject(header, `${path}.headers[${index}]`, []);\n if (!headerRecord || !Array.isArray(headerRecord.blocks)) {\n return;\n }\n headerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(block, `${path}.headers[${index}].blocks[${blockIndex}]`, issues, references),\n );\n });\n\n const footers = Array.isArray(record.footers) ? record.footers : [];\n footers.forEach((footer, index) => {\n const footerRecord = asPlainObject(footer, `${path}.footers[${index}]`, []);\n if (!footerRecord || !Array.isArray(footerRecord.blocks)) {\n return;\n }\n footerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(block, `${path}.footers[${index}].blocks[${blockIndex}]`, issues, references),\n );\n });\n\n if (record.footnoteCollection !== undefined) {\n const footnoteCollection = asPlainObject(record.footnoteCollection, `${path}.footnoteCollection`, []);\n const footnotes = asPlainObject(footnoteCollection?.footnotes, `${path}.footnoteCollection.footnotes`, []);\n if (footnotes) {\n for (const [noteId, note] of Object.entries(footnotes)) {\n const noteRecord = asPlainObject(note, `${path}.footnoteCollection.footnotes.${noteId}`, []);\n if (!noteRecord || !Array.isArray(noteRecord.blocks)) {\n continue;\n }\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(\n block,\n `${path}.footnoteCollection.footnotes.${noteId}.blocks[${blockIndex}]`,\n issues,\n references,\n ),\n );\n }\n }\n\n const endnotes = asPlainObject(footnoteCollection?.endnotes, `${path}.footnoteCollection.endnotes`, []);\n if (endnotes) {\n for (const [noteId, note] of Object.entries(endnotes)) {\n const noteRecord = asPlainObject(note, `${path}.footnoteCollection.endnotes.${noteId}`, []);\n if (!noteRecord || !Array.isArray(noteRecord.blocks)) {\n continue;\n }\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNodeReferences(\n block,\n `${path}.footnoteCollection.endnotes.${noteId}.blocks[${blockIndex}]`,\n issues,\n references,\n ),\n );\n }\n }\n }\n}\n\nfunction collectNoteIds(record: Record<string, unknown>): Set<string> {\n const noteIds = new Set<string>();\n const subParts = asPlainObject(record.subParts, \"$.subParts\", []);\n const footnoteCollection = asPlainObject(subParts?.footnoteCollection, \"$.subParts.footnoteCollection\", []);\n const footnotes = asPlainObject(footnoteCollection?.footnotes, \"$.subParts.footnoteCollection.footnotes\", []);\n if (footnotes) {\n Object.keys(footnotes).forEach((noteId) => noteIds.add(`footnote:${noteId}`));\n }\n const endnotes = asPlainObject(footnoteCollection?.endnotes, \"$.subParts.footnoteCollection.endnotes\", []);\n if (endnotes) {\n Object.keys(endnotes).forEach((noteId) => noteIds.add(`endnote:${noteId}`));\n }\n return noteIds;\n}\n\nfunction validateRange(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (typeof record.from !== \"number\" || typeof record.to !== \"number\") {\n issues.push({\n path,\n message: \"Range must contain numeric from and to values.\",\n });\n }\n}\n\nfunction validateExactObjectKeys(\n record: Record<string, unknown>,\n expectedKeys: readonly string[],\n path: string,\n issues: ModelValidationIssue[],\n allowedOptionalKeys?: readonly string[],\n): void {\n const actualKeys = new Set(Object.keys(record));\n const expected = new Set(expectedKeys);\n const optional = new Set(allowedOptionalKeys ?? []);\n\n for (const expectedKey of expectedKeys) {\n if (!actualKeys.has(expectedKey)) {\n issues.push({\n path,\n message: `Missing required key ${JSON.stringify(expectedKey)}.`,\n });\n }\n }\n\n for (const actualKey of actualKeys) {\n if (!expected.has(actualKey) && !optional.has(actualKey)) {\n issues.push({\n path: `${path}.${actualKey}`,\n message:\n \"Unexpected canonical document key. Render/UI state is not part of the canonical envelope.\",\n });\n }\n }\n}\n\nfunction validateSubPartsCatalog(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n if (value === undefined) {\n return;\n }\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n if (record.headers !== undefined) {\n if (!Array.isArray(record.headers)) {\n issues.push({ path: `${path}.headers`, message: \"headers must be an array.\" });\n } else {\n record.headers.forEach((header, index) => {\n const headerRecord = asPlainObject(header, `${path}.headers[${index}]`, issues);\n if (headerRecord) {\n expectString(headerRecord.variant, `${path}.headers[${index}].variant`, issues);\n expectString(headerRecord.partPath, `${path}.headers[${index}].partPath`, issues);\n expectString(headerRecord.relationshipId, `${path}.headers[${index}].relationshipId`, issues);\n if (!Array.isArray(headerRecord.blocks)) {\n issues.push({ path: `${path}.headers[${index}].blocks`, message: \"blocks must be an array.\" });\n } else {\n headerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.headers[${index}].blocks[${blockIndex}]`, issues),\n );\n }\n }\n });\n }\n }\n\n if (record.footers !== undefined) {\n if (!Array.isArray(record.footers)) {\n issues.push({ path: `${path}.footers`, message: \"footers must be an array.\" });\n } else {\n record.footers.forEach((footer, index) => {\n const footerRecord = asPlainObject(footer, `${path}.footers[${index}]`, issues);\n if (footerRecord) {\n expectString(footerRecord.variant, `${path}.footers[${index}].variant`, issues);\n expectString(footerRecord.partPath, `${path}.footers[${index}].partPath`, issues);\n expectString(footerRecord.relationshipId, `${path}.footers[${index}].relationshipId`, issues);\n if (!Array.isArray(footerRecord.blocks)) {\n issues.push({ path: `${path}.footers[${index}].blocks`, message: \"blocks must be an array.\" });\n } else {\n footerRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.footers[${index}].blocks[${blockIndex}]`, issues),\n );\n }\n }\n });\n }\n }\n\n if (record.footnoteCollection !== undefined) {\n const footnoteCollection = asPlainObject(record.footnoteCollection, `${path}.footnoteCollection`, issues);\n if (footnoteCollection) {\n validateSubPartNoteMap(footnoteCollection.footnotes, \"footnote\", `${path}.footnoteCollection.footnotes`, issues);\n validateSubPartNoteMap(footnoteCollection.endnotes, \"endnote\", `${path}.footnoteCollection.endnotes`, issues);\n }\n }\n}\n\nfunction validateSubPartNoteMap(\n value: unknown,\n expectedKind: \"footnote\" | \"endnote\",\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n\n for (const [noteId, note] of Object.entries(record)) {\n const noteRecord = asPlainObject(note, `${path}.${noteId}`, issues);\n if (!noteRecord) {\n continue;\n }\n expectString(noteRecord.noteId, `${path}.${noteId}.noteId`, issues);\n if (noteRecord.noteId !== noteId) {\n issues.push({\n path: `${path}.${noteId}.noteId`,\n message: \"noteId must match the map key.\",\n });\n }\n if (noteRecord.kind !== expectedKind) {\n issues.push({\n path: `${path}.${noteId}.kind`,\n message: `kind must be ${expectedKind}.`,\n });\n }\n if (!Array.isArray(noteRecord.blocks)) {\n issues.push({ path: `${path}.${noteId}.blocks`, message: \"blocks must be an array.\" });\n } else {\n noteRecord.blocks.forEach((block, blockIndex) =>\n validateDocumentNode(block, `${path}.${noteId}.blocks[${blockIndex}]`, issues),\n );\n }\n }\n}\n\nfunction expectDomainString(\n value: unknown,\n domain: StableIdDomain,\n path: string,\n issues: ModelValidationIssue[],\n): string | null {\n const stableId = expectString(value, path, issues);\n if (!stableId) {\n return null;\n }\n\n if (!ID_PATTERNS[domain].test(stableId)) {\n issues.push({\n path,\n message: `Expected a valid ${domain}.`,\n });\n return null;\n }\n\n return stableId;\n}\n","import {\n CDS_SCHEMA_VERSION,\n COMPATIBILITY_REPORT_VERSION,\n LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION,\n PERSISTED_EDITOR_SNAPSHOT_VERSION,\n type CompatibilityReportVersion,\n type Base64,\n type ISO8601DateTime,\n type ModelValidationIssue,\n type PersistedEditorSnapshotVersion,\n asPlainObject,\n assertValid,\n expectExactString,\n expectIso8601UtcTimestamp,\n expectString,\n stableStringify,\n} from \"./cds-1.0.0.ts\";\nimport {\n type CanonicalDocument,\n assertCanonicalDocument,\n validateCanonicalDocument,\n} from \"./canonical-document.ts\";\n\nexport type EditorWarningCode =\n | \"unsupported_ooxml_preserved\"\n | \"unsupported_ooxml_locked\"\n | \"import_normalized\"\n | \"export_roundtrip_risk\"\n | \"comment_anchor_detached\"\n | \"revision_anchor_detached\"\n | \"large_document_degraded\"\n | \"font_substitution\"\n | \"image_missing\";\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n affectedAnchor?: Record<string, unknown>;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport type EditorErrorCode =\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n\nexport interface EditorError {\n errorId: string;\n code: EditorErrorCode;\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"host\" | \"export\";\n details?: Record<string, unknown>;\n}\n\nexport type CompatibilityFeatureClass =\n | \"supported-roundtrip\"\n | \"preserve-only\"\n | \"unsupported-fatal\";\n\nexport interface CompatibilityFeatureEntry {\n featureEntryId: string;\n featureKey: string;\n featureClass: CompatibilityFeatureClass;\n message: string;\n affectedAnchor?: Record<string, unknown>;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityReport {\n reportVersion: CompatibilityReportVersion;\n generatedAt: ISO8601DateTime;\n blockExport: boolean;\n featureEntries: CompatibilityFeatureEntry[];\n warnings: EditorWarning[];\n errors: EditorError[];\n}\n\nexport interface PersistedSourcePackage {\n format: \"docx\";\n storage: \"embedded-base64\";\n mimeType: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n sourceLabel?: string;\n sha256Hex: string;\n bytesBase64: Base64;\n}\n\nexport interface PersistedEditorSnapshot {\n snapshotVersion: PersistedEditorSnapshotVersion;\n schemaVersion: typeof CDS_SCHEMA_VERSION;\n documentId: string;\n docId: string;\n createdAt: ISO8601DateTime;\n updatedAt: ISO8601DateTime;\n savedAt: ISO8601DateTime;\n editorBuild: string;\n canonicalDocument: CanonicalDocument;\n compatibility: CompatibilityReport;\n warningLog: EditorWarning[];\n protectionSnapshot?: ProtectionSnapshotRecord;\n sourcePackage?: PersistedSourcePackage;\n}\n\nconst SNAPSHOT_REQUIRED_TOP_LEVEL_KEYS = [\n \"snapshotVersion\",\n \"schemaVersion\",\n \"documentId\",\n \"docId\",\n \"createdAt\",\n \"updatedAt\",\n \"savedAt\",\n \"editorBuild\",\n \"canonicalDocument\",\n \"compatibility\",\n \"warningLog\",\n] as const;\n\nconst SNAPSHOT_OPTIONAL_TOP_LEVEL_KEYS = [\"sourcePackage\", \"protectionSnapshot\"] as const;\n\nexport interface ProtectionRangeRecord {\n rangeId: string;\n start?: number;\n end?: number;\n editorGroup?: string;\n editor?: string;\n enforced: boolean;\n enforcementReason: string;\n}\n\nexport interface ProtectionSnapshotRecord {\n hasDocumentProtection: boolean;\n editType?: string;\n enforcementActive: boolean;\n ranges: ProtectionRangeRecord[];\n enforcedRangeCount: number;\n preservedRangeCount: number;\n}\n\nconst PERSISTED_EDITOR_SNAPSHOT_VERSIONS = new Set<PersistedEditorSnapshotVersion>([\n LEGACY_PERSISTED_EDITOR_SNAPSHOT_VERSION,\n PERSISTED_EDITOR_SNAPSHOT_VERSION,\n]);\n\nconst DOCX_SOURCE_PACKAGE_MIME_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\nconst COMPATIBILITY_FEATURE_CLASSES = new Set<CompatibilityFeatureClass>([\n \"supported-roundtrip\",\n \"preserve-only\",\n \"unsupported-fatal\",\n]);\nconst EDITOR_WARNING_CODES = new Set<EditorWarningCode>([\n \"unsupported_ooxml_preserved\",\n \"unsupported_ooxml_locked\",\n \"import_normalized\",\n \"export_roundtrip_risk\",\n \"comment_anchor_detached\",\n \"revision_anchor_detached\",\n \"large_document_degraded\",\n \"font_substitution\",\n \"image_missing\",\n]);\nconst EDITOR_WARNING_SEVERITIES = new Set<EditorWarning[\"severity\"]>([\"info\", \"warning\"]);\nconst EDITOR_WARNING_SOURCES = new Set<EditorWarning[\"source\"]>([\n \"import\",\n \"runtime\",\n \"review\",\n \"preservation\",\n \"validation\",\n \"export\",\n]);\nconst EDITOR_ERROR_CODES = new Set<EditorErrorCode>([\n \"import_failed\",\n \"export_failed\",\n \"package_corrupt\",\n \"validation_failed\",\n \"datastore_failed\",\n \"internal_invariant\",\n]);\nconst EDITOR_ERROR_SOURCES = new Set<EditorError[\"source\"]>([\n \"import\",\n \"runtime\",\n \"validation\",\n \"datastore\",\n \"host\",\n \"export\",\n]);\n\nexport function serializePersistedEditorSnapshot(\n snapshot: PersistedEditorSnapshot,\n): string {\n assertPersistedEditorSnapshot(snapshot);\n return stableStringify(snapshot);\n}\n\nexport function parsePersistedEditorSnapshot(\n json: string,\n): PersistedEditorSnapshot {\n const parsed = JSON.parse(json) as unknown;\n assertPersistedEditorSnapshot(parsed);\n return parsed;\n}\n\nexport function assertPersistedEditorSnapshot(\n snapshot: unknown,\n): asserts snapshot is PersistedEditorSnapshot {\n const issues = validatePersistedEditorSnapshot(snapshot);\n assertValid(issues, \"Invalid persisted editor snapshot.\");\n}\n\nexport function validatePersistedEditorSnapshot(\n snapshot: unknown,\n): ModelValidationIssue[] {\n const issues: ModelValidationIssue[] = [];\n const record = asPlainObject(snapshot, \"$\", issues);\n if (!record) {\n return issues;\n }\n\n validateExactObjectKeys(\n record,\n SNAPSHOT_REQUIRED_TOP_LEVEL_KEYS,\n SNAPSHOT_OPTIONAL_TOP_LEVEL_KEYS,\n \"$\",\n issues,\n );\n\n validateSnapshotVersion(record.snapshotVersion, \"$.snapshotVersion\", issues);\n expectExactString(\n record.schemaVersion,\n CDS_SCHEMA_VERSION,\n \"$.schemaVersion\",\n issues,\n );\n expectString(record.documentId, \"$.documentId\", issues);\n expectString(record.docId, \"$.docId\", issues);\n expectIso8601UtcTimestamp(record.createdAt, \"$.createdAt\", issues);\n expectIso8601UtcTimestamp(record.updatedAt, \"$.updatedAt\", issues);\n expectIso8601UtcTimestamp(record.savedAt, \"$.savedAt\", issues);\n expectString(record.editorBuild, \"$.editorBuild\", issues);\n\n const canonicalDocumentIssues = validateCanonicalDocument(record.canonicalDocument);\n issues.push(...canonicalDocumentIssues.map(prefixIssue(\"$.canonicalDocument\")));\n\n if (\n asPlainObject(record.canonicalDocument, \"$.canonicalDocument\", [])?.docId !==\n record.docId\n ) {\n issues.push({\n path: \"$.docId\",\n message: \"Snapshot docId must match canonicalDocument.docId.\",\n });\n }\n\n validateCompatibilityReport(record.compatibility, \"$.compatibility\", issues);\n\n if (!Array.isArray(record.warningLog)) {\n issues.push({\n path: \"$.warningLog\",\n message: \"warningLog must be an array.\",\n });\n } else {\n record.warningLog.forEach((warning, index) => {\n validateEditorWarning(warning, `$.warningLog[${index}]`, issues);\n });\n }\n\n if (record.sourcePackage !== undefined) {\n validatePersistedSourcePackage(record.sourcePackage, \"$.sourcePackage\", issues);\n }\n if (record.protectionSnapshot !== undefined) {\n validateProtectionSnapshot(record.protectionSnapshot, \"$.protectionSnapshot\", issues);\n }\n\n return issues;\n}\n\nexport function assertCompatibilityReport(\n report: unknown,\n): asserts report is CompatibilityReport {\n const issues = validateCompatibilityReport(report);\n assertValid(issues, \"Invalid compatibility report.\");\n}\n\nexport function validateCompatibilityReport(\n report: unknown,\n path = \"$\",\n issues: ModelValidationIssue[] = [],\n): ModelValidationIssue[] {\n const record = asPlainObject(report, path, issues);\n if (!record) {\n return issues;\n }\n\n expectExactString(\n record.reportVersion,\n COMPATIBILITY_REPORT_VERSION,\n `${path}.reportVersion`,\n issues,\n );\n expectIso8601UtcTimestamp(record.generatedAt, `${path}.generatedAt`, issues);\n\n if (typeof record.blockExport !== \"boolean\") {\n issues.push({\n path: `${path}.blockExport`,\n message: \"blockExport must be a boolean.\",\n });\n }\n\n if (!Array.isArray(record.featureEntries)) {\n issues.push({\n path: `${path}.featureEntries`,\n message: \"featureEntries must be an array.\",\n });\n } else {\n record.featureEntries.forEach((featureEntry, index) => {\n validateCompatibilityFeatureEntry(\n featureEntry,\n `${path}.featureEntries[${index}]`,\n issues,\n );\n });\n }\n\n if (!Array.isArray(record.warnings)) {\n issues.push({\n path: `${path}.warnings`,\n message: \"warnings must be an array.\",\n });\n } else {\n record.warnings.forEach((warning, index) => {\n validateEditorWarning(warning, `${path}.warnings[${index}]`, issues);\n });\n }\n\n if (!Array.isArray(record.errors)) {\n issues.push({\n path: `${path}.errors`,\n message: \"errors must be an array.\",\n });\n } else {\n record.errors.forEach((error, index) => {\n validateEditorError(error, `${path}.errors[${index}]`, issues);\n });\n }\n\n return issues;\n}\n\nfunction validateCompatibilityFeatureEntry(\n featureEntry: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(featureEntry, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.featureEntryId, `${path}.featureEntryId`, issues);\n expectString(record.featureKey, `${path}.featureKey`, issues);\n if (\n typeof record.featureClass !== \"string\" ||\n !COMPATIBILITY_FEATURE_CLASSES.has(record.featureClass as CompatibilityFeatureClass)\n ) {\n issues.push({\n path: `${path}.featureClass`,\n message: \"featureClass must be supported-roundtrip, preserve-only, or unsupported-fatal.\",\n });\n }\n expectString(record.message, `${path}.message`, issues);\n}\n\nfunction validateEditorWarning(\n warning: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(warning, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.warningId, `${path}.warningId`, issues);\n if (typeof record.code !== \"string\" || !EDITOR_WARNING_CODES.has(record.code as EditorWarningCode)) {\n issues.push({\n path: `${path}.code`,\n message: `code must be one of ${JSON.stringify([...EDITOR_WARNING_CODES])}.`,\n });\n }\n if (\n typeof record.severity !== \"string\" ||\n !EDITOR_WARNING_SEVERITIES.has(record.severity as EditorWarning[\"severity\"])\n ) {\n issues.push({\n path: `${path}.severity`,\n message: \"severity must be info or warning.\",\n });\n }\n expectString(record.message, `${path}.message`, issues);\n if (\n typeof record.source !== \"string\" ||\n !EDITOR_WARNING_SOURCES.has(record.source as EditorWarning[\"source\"])\n ) {\n issues.push({\n path: `${path}.source`,\n message: `source must be one of ${JSON.stringify([...EDITOR_WARNING_SOURCES])}.`,\n });\n }\n}\n\nfunction validateEditorError(\n error: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(error, path, issues);\n if (!record) {\n return;\n }\n\n expectString(record.errorId, `${path}.errorId`, issues);\n if (typeof record.code !== \"string\" || !EDITOR_ERROR_CODES.has(record.code as EditorErrorCode)) {\n issues.push({\n path: `${path}.code`,\n message: `code must be one of ${JSON.stringify([...EDITOR_ERROR_CODES])}.`,\n });\n }\n expectString(record.message, `${path}.message`, issues);\n if (\n typeof record.source !== \"string\" ||\n !EDITOR_ERROR_SOURCES.has(record.source as EditorError[\"source\"])\n ) {\n issues.push({\n path: `${path}.source`,\n message: `source must be one of ${JSON.stringify([...EDITOR_ERROR_SOURCES])}.`,\n });\n }\n\n if (typeof record.isFatal !== \"boolean\") {\n issues.push({\n path: `${path}.isFatal`,\n message: \"isFatal must be a boolean.\",\n });\n }\n}\n\nfunction validateExactObjectKeys(\n record: Record<string, unknown>,\n requiredKeys: readonly string[],\n optionalKeys: readonly string[],\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const actualKeys = new Set(Object.keys(record));\n const allowedKeys = new Set([...requiredKeys, ...optionalKeys]);\n\n for (const requiredKey of requiredKeys) {\n if (!actualKeys.has(requiredKey)) {\n issues.push({\n path,\n message: `Missing required key ${JSON.stringify(requiredKey)}.`,\n });\n }\n }\n\n for (const actualKey of actualKeys) {\n if (!allowedKeys.has(actualKey)) {\n issues.push({\n path: `${path}.${actualKey}`,\n message:\n \"Unexpected persisted snapshot key. Render/UI state is not part of the persistence contract.\",\n });\n }\n }\n}\n\nfunction prefixIssue(basePath: string) {\n return (issue: ModelValidationIssue): ModelValidationIssue => ({\n path: `${basePath}${issue.path === \"$\" ? \"\" : issue.path.slice(1)}`,\n message: issue.message,\n });\n}\n\nfunction validateSnapshotVersion(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): PersistedEditorSnapshotVersion | null {\n if (typeof value !== \"string\" || !PERSISTED_EDITOR_SNAPSHOT_VERSIONS.has(value as never)) {\n issues.push({\n path,\n message: `Expected one of ${JSON.stringify([...PERSISTED_EDITOR_SNAPSHOT_VERSIONS])}.`,\n });\n return null;\n }\n\n return value as PersistedEditorSnapshotVersion;\n}\n\nfunction validatePersistedSourcePackage(\n sourcePackage: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(sourcePackage, path, issues);\n if (!record) {\n return;\n }\n\n validateExactObjectKeys(\n record,\n [\"format\", \"storage\", \"mimeType\", \"sha256Hex\", \"bytesBase64\"],\n [\"sourceLabel\"],\n path,\n issues,\n );\n expectExactString(record.format, \"docx\", `${path}.format`, issues);\n expectExactString(record.storage, \"embedded-base64\", `${path}.storage`, issues);\n expectExactString(\n record.mimeType,\n DOCX_SOURCE_PACKAGE_MIME_TYPE,\n `${path}.mimeType`,\n issues,\n );\n expectString(record.sha256Hex, `${path}.sha256Hex`, issues);\n expectString(record.bytesBase64, `${path}.bytesBase64`, issues);\n\n if (\n typeof record.sha256Hex === \"string\" &&\n !/^[0-9a-f]{64}$/u.test(record.sha256Hex)\n ) {\n issues.push({\n path: `${path}.sha256Hex`,\n message: \"Expected a lowercase SHA-256 hex digest.\",\n });\n }\n\n if (record.sourceLabel !== undefined) {\n expectString(record.sourceLabel, `${path}.sourceLabel`, issues);\n }\n}\n\nexport function createPersistedEditorSnapshot(params: {\n documentId: string;\n savedAt: ISO8601DateTime;\n editorBuild: string;\n canonicalDocument: CanonicalDocument;\n compatibility: CompatibilityReport;\n warningLog?: EditorWarning[];\n protectionSnapshot?: ProtectionSnapshotRecord;\n sourcePackage?: PersistedSourcePackage;\n}): PersistedEditorSnapshot {\n assertCanonicalDocument(params.canonicalDocument);\n assertCompatibilityReport(params.compatibility);\n\n return {\n snapshotVersion: PERSISTED_EDITOR_SNAPSHOT_VERSION,\n schemaVersion: CDS_SCHEMA_VERSION,\n documentId: params.documentId,\n docId: params.canonicalDocument.docId,\n createdAt: params.canonicalDocument.createdAt,\n updatedAt: params.canonicalDocument.updatedAt,\n savedAt: params.savedAt,\n editorBuild: params.editorBuild,\n canonicalDocument: params.canonicalDocument,\n compatibility: params.compatibility,\n warningLog: params.warningLog ?? params.compatibility.warnings,\n protectionSnapshot: params.protectionSnapshot,\n sourcePackage: params.sourcePackage,\n };\n}\n\nfunction validateProtectionSnapshot(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n if (typeof record.hasDocumentProtection !== \"boolean\") {\n issues.push({ path: `${path}.hasDocumentProtection`, message: \"hasDocumentProtection must be a boolean.\" });\n }\n if (record.editType !== undefined) {\n expectString(record.editType, `${path}.editType`, issues);\n }\n if (typeof record.enforcementActive !== \"boolean\") {\n issues.push({ path: `${path}.enforcementActive`, message: \"enforcementActive must be a boolean.\" });\n }\n if (!Array.isArray(record.ranges)) {\n issues.push({ path: `${path}.ranges`, message: \"ranges must be an array.\" });\n } else {\n record.ranges.forEach((range, index) => validateProtectionRange(range, `${path}.ranges[${index}]`, issues));\n }\n if (!Number.isInteger(record.enforcedRangeCount)) {\n issues.push({ path: `${path}.enforcedRangeCount`, message: \"enforcedRangeCount must be an integer.\" });\n }\n if (!Number.isInteger(record.preservedRangeCount)) {\n issues.push({ path: `${path}.preservedRangeCount`, message: \"preservedRangeCount must be an integer.\" });\n }\n}\n\nfunction validateProtectionRange(\n value: unknown,\n path: string,\n issues: ModelValidationIssue[],\n): void {\n const record = asPlainObject(value, path, issues);\n if (!record) {\n return;\n }\n expectString(record.rangeId, `${path}.rangeId`, issues);\n if (record.start !== undefined && !Number.isInteger(record.start)) {\n issues.push({ path: `${path}.start`, message: \"start must be an integer.\" });\n }\n if (record.end !== undefined && !Number.isInteger(record.end)) {\n issues.push({ path: `${path}.end`, message: \"end must be an integer.\" });\n }\n if (record.editorGroup !== undefined) {\n expectString(record.editorGroup, `${path}.editorGroup`, issues);\n }\n if (record.editor !== undefined) {\n expectString(record.editor, `${path}.editor`, issues);\n }\n if (typeof record.enforced !== \"boolean\") {\n issues.push({ path: `${path}.enforced`, message: \"enforced must be a boolean.\" });\n }\n expectString(record.enforcementReason, `${path}.enforcementReason`, issues);\n}\n\nexport function projectAnchorToSnapshot(\n anchor: Record<string, unknown>,\n): Record<string, unknown> {\n return JSON.parse(JSON.stringify(anchor)) as Record<string, unknown>;\n}\n","import {\n DEFAULT_BOUNDARY_ASSOC,\n createDetachedAnchor,\n createNodeAnchor,\n createRangeAnchor,\n type EditorAnchorProjection,\n} from \"../selection/mapping.ts\";\nimport { isUuid } from \"../../model/cds-1.0.0.ts\";\nimport {\n assertPersistedEditorSnapshot as assertModelPersistedEditorSnapshot,\n createPersistedEditorSnapshot as createModelPersistedEditorSnapshot,\n validatePersistedEditorSnapshot as validateModelPersistedEditorSnapshot,\n type ProtectionSnapshotRecord as ModelProtectionSnapshotRecord,\n type PersistedEditorSnapshot as ModelPersistedEditorSnapshot,\n} from \"../../model/snapshot.ts\";\nimport {\n assertCanonicalDocument,\n type CanonicalDocument,\n type CommentEntry as ModelCommentEntry,\n type CommentResolution as ModelCommentResolution,\n type CommentThread as ModelCommentThread,\n type RevisionMetadataRecord as ModelRevisionMetadataRecord,\n type RevisionRecord as ModelRevisionRecord,\n} from \"../../model/canonical-document.ts\";\n\nexport type RuntimePhase = \"loading\" | \"ready\" | \"error\";\nexport type EditorWarningCode =\n | \"unsupported_ooxml_preserved\"\n | \"unsupported_ooxml_locked\"\n | \"import_normalized\"\n | \"export_roundtrip_risk\"\n | \"comment_anchor_detached\"\n | \"revision_anchor_detached\"\n | \"large_document_degraded\"\n | \"font_substitution\"\n | \"image_missing\";\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source:\n | \"import\"\n | \"runtime\"\n | \"review\"\n | \"preservation\"\n | \"validation\"\n | \"export\";\n affectedAnchor?: EditorAnchorProjection;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface EditorError {\n errorId: string;\n code:\n | \"import_failed\"\n | \"export_failed\"\n | \"package_corrupt\"\n | \"validation_failed\"\n | \"datastore_failed\"\n | \"internal_invariant\";\n message: string;\n isFatal: boolean;\n source: \"import\" | \"runtime\" | \"validation\" | \"datastore\" | \"host\" | \"export\";\n details?: Record<string, unknown>;\n}\n\nexport type CompatibilityFeatureClass =\n | \"supported-roundtrip\"\n | \"preserve-only\"\n | \"unsupported-fatal\";\n\nexport interface CompatibilityFeatureEntry {\n featureEntryId: string;\n featureKey: string;\n featureClass: CompatibilityFeatureClass;\n message: string;\n affectedAnchor?: EditorAnchorProjection;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityReport {\n reportVersion: \"compatibility-report/1\";\n generatedAt: string;\n blockExport: boolean;\n featureEntries: CompatibilityFeatureEntry[];\n warnings: EditorWarning[];\n errors: EditorError[];\n}\n\nexport type CommentEntryRecord = ModelCommentEntry;\nexport type CommentResolutionRecord = ModelCommentResolution;\nexport type CommentThreadRecord = ModelCommentThread;\nexport type RevisionMetadataRecord = ModelRevisionMetadataRecord;\nexport type RevisionRecord = ModelRevisionRecord;\nexport type ReviewStore = CanonicalDocument[\"review\"];\nexport type CanonicalDocumentEnvelope = CanonicalDocument;\n\nexport interface SelectionSnapshot {\n anchor: number;\n head: number;\n isCollapsed: boolean;\n activeRange: EditorAnchorProjection;\n}\n\nexport interface DocumentStats {\n paragraphCount: number;\n wordCount: number;\n characterCount: number;\n commentCount: number;\n revisionCount: number;\n}\n\nexport interface CommentSidebarSnapshot {\n activeCommentId?: string;\n openThreadCount: number;\n resolvedThreadCount: number;\n threads: CommentThreadRecord[];\n}\n\nexport interface TrackedChangesSnapshot {\n totalCount: number;\n pendingCount: number;\n acceptedCount: number;\n rejectedCount: number;\n}\n\nexport interface CompatibilityPanelSnapshot {\n report: CompatibilityReport;\n blockExport: boolean;\n totalEntries: number;\n}\n\nexport interface CommandStateSnapshot {\n canUndo: boolean;\n canRedo: boolean;\n canAddComment: boolean;\n canAcceptAllChanges: boolean;\n canRejectAllChanges: boolean;\n}\n\nexport interface RuntimeRenderSnapshot {\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n revisionToken: string;\n isReady: boolean;\n isDirty: boolean;\n readOnly: boolean;\n selection: SelectionSnapshot;\n documentStats: DocumentStats;\n comments: CommentSidebarSnapshot;\n trackedChanges: TrackedChangesSnapshot;\n compatibility: CompatibilityPanelSnapshot;\n warnings: EditorWarning[];\n fatalError?: EditorError;\n commandState: CommandStateSnapshot;\n}\n\nexport interface PersistedEditorSnapshot\n extends Omit<\n ModelPersistedEditorSnapshot,\n \"canonicalDocument\" | \"compatibility\" | \"warningLog\"\n > {\n canonicalDocument: CanonicalDocumentEnvelope;\n compatibility: CompatibilityReport;\n warningLog: EditorWarning[];\n}\n\nexport interface EditorRuntimeState {\n hasFocus: boolean;\n activeCommentId?: string;\n}\n\nexport interface EditorState {\n phase: RuntimePhase;\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n sourcePackage?: ModelPersistedEditorSnapshot[\"sourcePackage\"];\n revision: number;\n revisionToken: string;\n isDirty: boolean;\n readOnly: boolean;\n document: CanonicalDocumentEnvelope;\n selection: SelectionSnapshot;\n warnings: EditorWarning[];\n compatibility: CompatibilityReport;\n fatalError?: EditorError;\n runtime: EditorRuntimeState;\n}\n\nexport interface CreateEditorStateOptions {\n documentId: string;\n sessionId: string;\n sourceLabel?: string;\n readOnly?: boolean;\n canonicalDocument?: CanonicalDocumentEnvelope;\n persistedSnapshot?: PersistedEditorSnapshot;\n compatibility?: CompatibilityReport;\n warnings?: EditorWarning[];\n fatalError?: EditorError;\n}\n\nexport function createEmptyReviewStore(): ReviewStore {\n return {\n comments: {},\n revisions: {},\n };\n}\n\nexport function createDefaultCanonicalDocument(\n documentId: string,\n timestamp: string,\n): CanonicalDocumentEnvelope {\n return {\n schemaVersion: \"cds/1.0.0\",\n docId: createCanonicalDocumentId(documentId),\n createdAt: timestamp,\n updatedAt: timestamp,\n metadata: {\n customProperties: {},\n },\n styles: {\n paragraphs: {},\n characters: {},\n tables: {},\n },\n numbering: {\n abstractDefinitions: {},\n instances: {},\n },\n media: {\n items: {},\n },\n content: {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n },\n review: createEmptyReviewStore(),\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [],\n },\n };\n}\n\nexport function createSelectionSnapshot(anchor = 0, head = anchor): SelectionSnapshot {\n return {\n anchor,\n head,\n isCollapsed: anchor === head,\n activeRange: createRangeAnchor(anchor, head, DEFAULT_BOUNDARY_ASSOC),\n };\n}\n\nexport function createEmptyCompatibilityReport(generatedAt: string): CompatibilityReport {\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt,\n blockExport: false,\n featureEntries: [],\n warnings: [],\n errors: [],\n };\n}\n\nexport function createEditorState(options: CreateEditorStateOptions): EditorState {\n const timestamp = new Date(0).toISOString();\n const normalizedSnapshot = options.persistedSnapshot\n ? normalizePersistedSnapshotForRuntime(options.persistedSnapshot, options.documentId, timestamp)\n : undefined;\n if (options.canonicalDocument) {\n assertCanonicalDocument(options.canonicalDocument as unknown);\n }\n\n const normalizedDocument = normalizedSnapshot\n ? structuredClone(normalizedSnapshot.canonicalDocument)\n : options.canonicalDocument\n ? structuredClone(options.canonicalDocument)\n : createDefaultCanonicalDocument(options.documentId, timestamp);\n const warnings = normalizedSnapshot\n ? normalizeWarningLog(normalizedSnapshot.warningLog)\n : options.warnings ?? [];\n const compatibility =\n normalizedSnapshot\n ? normalizeCompatibilityReport(normalizedSnapshot.compatibility)\n : options.compatibility ?? createEmptyCompatibilityReport(normalizedDocument.updatedAt);\n\n return {\n phase: options.fatalError ? \"error\" : \"ready\",\n documentId: options.documentId,\n sessionId: options.sessionId,\n sourceLabel: options.sourceLabel,\n sourcePackage: normalizedSnapshot?.sourcePackage,\n revision: 0,\n revisionToken: `${options.sessionId}:0`,\n isDirty: false,\n readOnly: options.readOnly ?? false,\n document: normalizedDocument,\n selection: createSelectionSnapshot(),\n warnings,\n compatibility,\n fatalError: options.fatalError,\n runtime: {\n hasFocus: false,\n },\n };\n}\n\nfunction normalizePersistedSnapshotForRuntime(\n snapshot: PersistedEditorSnapshot,\n documentId: string,\n timestamp: string,\n): PersistedEditorSnapshot {\n const issues = validateModelPersistedEditorSnapshot(snapshot as unknown);\n if (issues.length === 0) {\n return snapshot;\n }\n\n if (!isRecord(snapshot) || !isRecord(snapshot.canonicalDocument)) {\n assertModelPersistedEditorSnapshot(snapshot as unknown);\n }\n\n const normalizedDocument = normalizeCanonicalDocumentEnvelope(\n snapshot.canonicalDocument,\n documentId,\n timestamp,\n );\n try {\n assertCanonicalDocument(normalizedDocument as unknown);\n } catch {\n assertModelPersistedEditorSnapshot(snapshot as unknown);\n }\n const repairWarning = createSnapshotRepairWarning(issues.length);\n const compatibility = coerceCompatibilityReport(\n snapshot.compatibility,\n normalizedDocument.updatedAt,\n repairWarning,\n );\n\n return {\n snapshotVersion:\n snapshot.snapshotVersion === \"persisted-editor-snapshot/1\" ||\n snapshot.snapshotVersion === \"persisted-editor-snapshot/2\"\n ? snapshot.snapshotVersion\n : \"persisted-editor-snapshot/2\",\n schemaVersion: \"cds/1.0.0\",\n documentId:\n typeof snapshot.documentId === \"string\" && snapshot.documentId.length > 0\n ? snapshot.documentId\n : documentId,\n docId: normalizedDocument.docId,\n createdAt: normalizedDocument.createdAt,\n updatedAt: normalizedDocument.updatedAt,\n savedAt:\n typeof snapshot.savedAt === \"string\" && snapshot.savedAt.length > 0\n ? snapshot.savedAt\n : normalizedDocument.updatedAt,\n editorBuild:\n typeof snapshot.editorBuild === \"string\" && snapshot.editorBuild.length > 0\n ? snapshot.editorBuild\n : \"dev\",\n canonicalDocument: normalizedDocument,\n compatibility,\n warningLog: dedupeWarnings([\n ...coerceWarnings(snapshot.warningLog),\n repairWarning,\n ]),\n sourcePackage: snapshot.sourcePackage,\n };\n}\n\nfunction normalizeCanonicalDocumentEnvelope(\n value: unknown,\n documentId: string,\n timestamp: string,\n): CanonicalDocumentEnvelope {\n const base = createDefaultCanonicalDocument(documentId, timestamp);\n const record = isRecord(value) ? value : {};\n const metadata = isRecord(record.metadata) ? record.metadata : {};\n\n return {\n ...base,\n ...record,\n schemaVersion: \"cds/1.0.0\",\n docId: isUuid(record.docId) ? record.docId : createCanonicalDocumentId(documentId),\n createdAt:\n typeof record.createdAt === \"string\" && record.createdAt.length > 0\n ? record.createdAt\n : base.createdAt,\n updatedAt:\n typeof record.updatedAt === \"string\" && record.updatedAt.length > 0\n ? record.updatedAt\n : base.updatedAt,\n metadata: {\n ...base.metadata,\n ...metadata,\n customProperties: isRecord(metadata.customProperties)\n ? (Object.fromEntries(\n Object.entries(metadata.customProperties).filter(([, entry]) => typeof entry === \"string\"),\n ) as Record<string, string>)\n : {},\n },\n styles:\n record.styles === undefined\n ? base.styles\n : (record.styles as CanonicalDocumentEnvelope[\"styles\"]),\n numbering:\n record.numbering === undefined\n ? base.numbering\n : (record.numbering as CanonicalDocumentEnvelope[\"numbering\"]),\n media:\n record.media === undefined\n ? base.media\n : (record.media as CanonicalDocumentEnvelope[\"media\"]),\n content: isRecord(record.content)\n ? (record.content as unknown as CanonicalDocumentEnvelope[\"content\"])\n : base.content,\n review:\n record.review === undefined\n ? base.review\n : (record.review as CanonicalDocumentEnvelope[\"review\"]),\n preservation:\n record.preservation === undefined\n ? base.preservation\n : (record.preservation as CanonicalDocumentEnvelope[\"preservation\"]),\n diagnostics:\n record.diagnostics === undefined\n ? base.diagnostics\n : (record.diagnostics as CanonicalDocumentEnvelope[\"diagnostics\"]),\n ...(isRecord(record.subParts)\n ? { subParts: record.subParts as unknown as CanonicalDocumentEnvelope[\"subParts\"] }\n : {}),\n };\n}\n\nfunction coerceCompatibilityReport(\n value: unknown,\n generatedAt: string,\n repairWarning: EditorWarning,\n): CompatibilityReport {\n const record = isRecord(value) ? value : {};\n const warnings = dedupeWarnings([\n ...coerceWarnings(record.warnings),\n repairWarning,\n ]);\n\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt:\n typeof record.generatedAt === \"string\" && record.generatedAt.length > 0\n ? record.generatedAt\n : generatedAt,\n blockExport: typeof record.blockExport === \"boolean\" ? record.blockExport : false,\n featureEntries: Array.isArray(record.featureEntries)\n ? record.featureEntries.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n if (\n typeof entry.featureEntryId !== \"string\" ||\n typeof entry.featureKey !== \"string\" ||\n typeof entry.featureClass !== \"string\" ||\n typeof entry.message !== \"string\"\n ) {\n return [];\n }\n return [{\n featureEntryId: entry.featureEntryId,\n featureKey: entry.featureKey,\n featureClass: entry.featureClass as CompatibilityFeatureEntry[\"featureClass\"],\n message: entry.message,\n ...(entry.affectedAnchor && isRecord(entry.affectedAnchor)\n ? { affectedAnchor: entry.affectedAnchor as unknown as EditorAnchorProjection }\n : {}),\n ...(isRecord(entry.details) ? { details: entry.details } : {}),\n }];\n })\n : [],\n warnings,\n errors: Array.isArray(record.errors)\n ? record.errors.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n if (\n typeof entry.errorId !== \"string\" ||\n typeof entry.code !== \"string\" ||\n typeof entry.message !== \"string\" ||\n typeof entry.source !== \"string\" ||\n typeof entry.isFatal !== \"boolean\"\n ) {\n return [];\n }\n return [{\n errorId: entry.errorId,\n code: entry.code as EditorError[\"code\"],\n message: entry.message,\n source: entry.source as EditorError[\"source\"],\n isFatal: entry.isFatal,\n ...(isRecord(entry.details) ? { details: entry.details } : {}),\n }];\n })\n : [],\n };\n}\n\nfunction coerceWarnings(value: unknown): EditorWarning[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.flatMap((warning) => {\n if (!isRecord(warning)) {\n return [];\n }\n if (\n typeof warning.warningId !== \"string\" ||\n typeof warning.code !== \"string\" ||\n typeof warning.severity !== \"string\" ||\n typeof warning.message !== \"string\" ||\n typeof warning.source !== \"string\"\n ) {\n return [];\n }\n\n return [{\n warningId: warning.warningId,\n code: warning.code as EditorWarning[\"code\"],\n severity: warning.severity as EditorWarning[\"severity\"],\n message: warning.message,\n source: warning.source as EditorWarning[\"source\"],\n ...(warning.affectedAnchor && isRecord(warning.affectedAnchor)\n ? { affectedAnchor: warning.affectedAnchor as unknown as EditorAnchorProjection }\n : {}),\n ...(typeof warning.featureEntryId === \"string\"\n ? { featureEntryId: warning.featureEntryId }\n : {}),\n ...(isRecord(warning.details) ? { details: warning.details } : {}),\n }];\n });\n}\n\nfunction createSnapshotRepairWarning(issueCount: number): EditorWarning {\n return {\n warningId: `warning:snapshot-repair:${issueCount}`,\n code: \"import_normalized\",\n severity: \"warning\",\n message: `Loaded a persisted snapshot after repairing ${issueCount} validation issue${issueCount === 1 ? \"\" : \"s\"}.`,\n source: \"validation\",\n };\n}\n\nfunction dedupeWarnings(warnings: EditorWarning[]): EditorWarning[] {\n const seen = new Set<string>();\n const result: EditorWarning[] = [];\n\n for (const warning of warnings) {\n if (!warning.warningId || seen.has(warning.warningId)) {\n continue;\n }\n seen.add(warning.warningId);\n result.push(warning);\n }\n\n return result;\n}\n\nexport function deriveDocumentStats(state: Pick<EditorState, \"document\">): DocumentStats {\n const serializedContent = extractText(state.document.content);\n\n return {\n paragraphCount: estimateParagraphCount(state.document.content),\n wordCount: serializedContent.trim().length === 0 ? 0 : serializedContent.trim().split(/\\s+/u).length,\n characterCount: Array.from(serializedContent).length,\n commentCount: Object.keys(state.document.review.comments).length,\n revisionCount: Object.keys(state.document.review.revisions).length,\n };\n}\n\nexport function deriveRenderSnapshot(\n state: EditorState,\n history: { canUndo: boolean; canRedo: boolean },\n): RuntimeRenderSnapshot {\n const comments = Object.values(state.document.review.comments).sort((left, right) =>\n left.createdAt.localeCompare(right.createdAt),\n );\n const revisions = Object.values(state.document.review.revisions);\n\n return {\n documentId: state.documentId,\n sessionId: state.sessionId,\n sourceLabel: state.sourceLabel,\n revisionToken: state.revisionToken,\n isReady: state.phase === \"ready\",\n isDirty: state.isDirty,\n readOnly: state.readOnly,\n selection: state.selection,\n documentStats: deriveDocumentStats(state),\n comments: {\n activeCommentId: state.runtime.activeCommentId,\n openThreadCount: comments.filter((comment) => comment.status === \"open\").length,\n resolvedThreadCount: comments.filter((comment) => comment.status === \"resolved\").length,\n threads: comments,\n },\n trackedChanges: {\n totalCount: revisions.length,\n pendingCount: revisions.filter((revision) => revision.status === \"open\").length,\n acceptedCount: revisions.filter((revision) => revision.status === \"accepted\").length,\n rejectedCount: revisions.filter((revision) => revision.status === \"rejected\").length,\n },\n compatibility: {\n report: state.compatibility,\n blockExport: state.compatibility.blockExport,\n totalEntries: state.compatibility.featureEntries.length,\n },\n warnings: state.warnings,\n fatalError: state.fatalError,\n commandState: {\n canUndo: history.canUndo,\n canRedo: history.canRedo,\n canAddComment: !state.readOnly,\n canAcceptAllChanges: revisions.some((revision) => revision.status === \"open\"),\n canRejectAllChanges: revisions.some((revision) => revision.status === \"open\"),\n },\n };\n}\n\nexport function createPersistedEditorSnapshot(\n state: EditorState,\n options: {\n editorBuild: string;\n savedAt: string;\n compatibility?: CompatibilityReport;\n protectionSnapshot?: ModelProtectionSnapshotRecord;\n },\n): PersistedEditorSnapshot {\n const snapshot = createModelPersistedEditorSnapshot({\n documentId: state.documentId,\n savedAt: options.savedAt,\n editorBuild: options.editorBuild,\n canonicalDocument: state.document,\n compatibility: (options.compatibility ?? state.compatibility) as never,\n warningLog: state.warnings as never,\n protectionSnapshot: options.protectionSnapshot,\n sourcePackage: state.sourcePackage,\n });\n return snapshot as PersistedEditorSnapshot;\n}\n\nfunction estimateParagraphCount(content: unknown): number {\n if (Array.isArray(content)) {\n return content.length;\n }\n\n if (content && typeof content === \"object\" && Array.isArray((content as { blocks?: unknown[] }).blocks)) {\n return ((content as { blocks: unknown[] }).blocks).length;\n }\n\n return extractText(content).length > 0 ? 1 : 0;\n}\n\nfunction normalizeWarningLog(warnings: EditorWarning[]): EditorWarning[] {\n return warnings.map((warning) => ({\n ...warning,\n affectedAnchor: warning.affectedAnchor\n ? normalizeAnchorProjection(warning.affectedAnchor)\n : undefined,\n }));\n}\n\nfunction normalizeCompatibilityReport(report: CompatibilityReport): CompatibilityReport {\n return {\n ...report,\n featureEntries: report.featureEntries.map((entry) => ({\n ...entry,\n affectedAnchor: entry.affectedAnchor\n ? normalizeAnchorProjection(entry.affectedAnchor)\n : undefined,\n })),\n warnings: normalizeWarningLog(report.warnings),\n };\n}\n\nfunction normalizeAnchorProjection(anchor: EditorAnchorProjection): EditorAnchorProjection {\n switch (anchor.kind) {\n case \"range\": {\n const rangeAnchor = anchor as EditorAnchorProjection & {\n range?: { from: number; to: number };\n from?: number;\n to?: number;\n assoc: { start: -1 | 1; end: -1 | 1 };\n };\n return rangeAnchor.range\n ? createRangeAnchor(rangeAnchor.range.from, rangeAnchor.range.to, rangeAnchor.assoc)\n : createRangeAnchor(rangeAnchor.from ?? 0, rangeAnchor.to ?? 0, rangeAnchor.assoc);\n }\n case \"node\":\n return createNodeAnchor(anchor.at, anchor.assoc);\n case \"detached\":\n return createDetachedAnchor(anchor.lastKnownRange, anchor.reason);\n }\n}\n\nfunction extractText(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => extractText(item)).join(\" \");\n }\n\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n\n return Object.values(value as Record<string, unknown>)\n .map((item) => extractText(item))\n .filter(Boolean)\n .join(\" \");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function createCanonicalDocumentId(documentId: string): string {\n const hashWord = (seed: string): string => {\n let hash = 0x811c9dc5;\n for (const char of seed) {\n hash ^= char.charCodeAt(0);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n };\n\n const raw =\n hashWord(`${documentId}:0`) +\n hashWord(`${documentId}:1`) +\n hashWord(`${documentId}:2`) +\n hashWord(`${documentId}:3`);\n\n return [\n raw.slice(0, 8),\n raw.slice(8, 12),\n `4${raw.slice(13, 16)}`,\n `8${raw.slice(17, 20)}`,\n raw.slice(20, 32),\n ].join(\"-\");\n}\n\nexport function normalizeCommentThreadRecord(value: unknown): CommentThreadRecord {\n const record = isRecord(value) ? value : {};\n const authorId =\n typeof record.createdBy === \"string\" && record.createdBy.length > 0\n ? record.createdBy\n : typeof record.authorId === \"string\" && record.authorId.length > 0\n ? record.authorId\n : \"unknown\";\n const createdAt =\n typeof record.createdAt === \"string\" && record.createdAt.length > 0\n ? record.createdAt\n : new Date(0).toISOString();\n const entries = Array.isArray(record.entries)\n ? record.entries\n .filter((entry): entry is Record<string, unknown> => isRecord(entry))\n .map((entry, index) => ({\n entryId:\n typeof entry.entryId === \"string\" && entry.entryId.length > 0\n ? entry.entryId\n : `${String(record.commentId ?? \"comment\")}-entry-${index + 1}`,\n authorId:\n typeof entry.authorId === \"string\" && entry.authorId.length > 0\n ? entry.authorId\n : authorId,\n body: typeof entry.body === \"string\" ? entry.body : \"\",\n createdAt:\n typeof entry.createdAt === \"string\" && entry.createdAt.length > 0\n ? entry.createdAt\n : createdAt,\n metadata: isRecord(entry.metadata)\n ? {\n ooxmlCommentId:\n typeof entry.metadata.ooxmlCommentId === \"string\"\n ? entry.metadata.ooxmlCommentId\n : undefined,\n paraId:\n typeof entry.metadata.paraId === \"string\"\n ? entry.metadata.paraId\n : undefined,\n parentParaId:\n typeof entry.metadata.parentParaId === \"string\"\n ? entry.metadata.parentParaId\n : undefined,\n durableId:\n typeof entry.metadata.durableId === \"string\"\n ? entry.metadata.durableId\n : undefined,\n initials:\n typeof entry.metadata.initials === \"string\"\n ? entry.metadata.initials\n : undefined,\n }\n : undefined,\n }))\n : [\n {\n entryId: `${String(record.commentId ?? \"comment\")}-entry-1`,\n authorId,\n body: typeof record.body === \"string\" ? record.body : \"\",\n createdAt,\n },\n ];\n const resolution = isRecord(record.resolution)\n ? {\n resolvedAt:\n typeof record.resolution.resolvedAt === \"string\"\n ? record.resolution.resolvedAt\n : typeof record.resolvedAt === \"string\"\n ? record.resolvedAt\n : createdAt,\n resolvedBy:\n typeof record.resolution.resolvedBy === \"string\" &&\n record.resolution.resolvedBy.length > 0\n ? record.resolution.resolvedBy\n : authorId,\n }\n : typeof record.resolvedAt === \"string\"\n ? {\n resolvedAt: record.resolvedAt,\n resolvedBy: authorId,\n }\n : undefined;\n const normalizedStatus =\n typeof record.status === \"string\"\n ? record.status\n : record.anchor && isRecord(record.anchor) && record.anchor.kind === \"detached\"\n ? \"detached\"\n : resolution || record.isResolved\n ? \"resolved\"\n : \"open\";\n\n return {\n commentId:\n typeof record.commentId === \"string\" && record.commentId.length > 0\n ? record.commentId\n : \"comment-generated\",\n anchor:\n isRecord(record.anchor) && typeof record.anchor.kind === \"string\"\n ? (record.anchor as unknown as EditorAnchorProjection)\n : createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n createdAt,\n createdBy: authorId,\n authorId,\n body: entries.map((entry) => entry.body).join(\"\\n\"),\n entries,\n status:\n normalizedStatus === \"resolved\" || normalizedStatus === \"detached\"\n ? normalizedStatus\n : \"open\",\n resolution,\n resolvedAt: resolution?.resolvedAt,\n warningIds: Array.isArray(record.warningIds)\n ? record.warningIds.filter((warningId): warningId is string => typeof warningId === \"string\")\n : [],\n isResolved: normalizedStatus === \"resolved\",\n metadata: isRecord(record.metadata)\n ? {\n source:\n record.metadata.source === \"import\" || record.metadata.source === \"runtime\"\n ? record.metadata.source\n : undefined,\n rootOoxmlCommentId:\n typeof record.metadata.rootOoxmlCommentId === \"string\"\n ? record.metadata.rootOoxmlCommentId\n : undefined,\n rootParaId:\n typeof record.metadata.rootParaId === \"string\"\n ? record.metadata.rootParaId\n : undefined,\n }\n : undefined,\n };\n}\n","export const CONTENT_TYPES_PATH = \"/[Content_Types].xml\";\nexport const PACKAGE_RELATIONSHIPS_PATH = \"/_rels/.rels\";\n\nexport type OpcCompressionMethod = \"store\" | \"deflate\";\nexport type OpcSurfaceKind = \"content\" | \"relationships\" | \"content-types\";\nexport type OpcRelationshipTargetMode = \"internal\" | \"external\";\n\nexport interface OpcRelationship {\n id: string;\n type: string;\n target: string;\n targetMode: OpcRelationshipTargetMode;\n}\n\nexport interface OpcPartManifestEntry {\n path: string;\n surfaceKind: OpcSurfaceKind;\n contentType: string | null;\n relationshipsPartPath: string | null;\n relationships: OpcRelationship[];\n compression: OpcCompressionMethod;\n byteLength: number;\n}\n\nexport interface OpcContentTypesManifest {\n defaults: Record<string, string>;\n overrides: Record<string, string>;\n}\n\nexport interface OpcPackageManifest {\n contentTypes: OpcContentTypesManifest;\n packageRelationships: OpcRelationship[];\n parts: OpcPartManifestEntry[];\n}\n\nexport interface OpcPackagePart {\n path: string;\n surfaceKind: OpcSurfaceKind;\n contentType: string | null;\n relationshipsPartPath: string | null;\n relationships: OpcRelationship[];\n compression: OpcCompressionMethod;\n bytes: Uint8Array;\n crc32: number;\n}\n\nexport function normalizePartPath(path: string): string {\n const normalized = path.replace(/\\\\/g, \"/\").trim();\n if (normalized.length === 0) {\n throw new Error(\"OPC part path must not be empty.\");\n }\n\n const withLeadingSlash = normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n const segments = withLeadingSlash.split(\"/\");\n const resolved: string[] = [];\n\n for (const segment of segments) {\n if (segment === \"\" || segment === \".\") {\n continue;\n }\n\n if (segment === \"..\") {\n if (resolved.length === 0) {\n throw new Error(`OPC part path escapes package root: ${path}`);\n }\n\n resolved.pop();\n continue;\n }\n\n resolved.push(segment);\n }\n\n return `/${resolved.join(\"/\")}`;\n}\n\nexport function getExtension(partPath: string): string {\n const normalized = normalizePartPath(partPath);\n const lastSlash = normalized.lastIndexOf(\"/\");\n const lastDot = normalized.lastIndexOf(\".\");\n if (lastDot <= lastSlash) {\n return \"\";\n }\n\n return normalized.slice(lastDot + 1).toLowerCase();\n}\n\nexport function getRelationshipsPartPath(partPath?: string | null): string {\n if (!partPath) {\n return PACKAGE_RELATIONSHIPS_PATH;\n }\n\n const normalized = normalizePartPath(partPath);\n const lastSlash = normalized.lastIndexOf(\"/\");\n const directory = lastSlash <= 0 ? \"\" : normalized.slice(0, lastSlash);\n const filename = normalized.slice(lastSlash + 1);\n return `${directory}/_rels/${filename}.rels`;\n}\n\nexport function getSourcePartPathFromRelationshipsPart(path: string): string | null {\n const normalized = normalizePartPath(path);\n if (normalized === PACKAGE_RELATIONSHIPS_PATH) {\n return null;\n }\n\n const marker = \"/_rels/\";\n const markerIndex = normalized.lastIndexOf(marker);\n if (markerIndex === -1 || !normalized.endsWith(\".rels\")) {\n throw new Error(`Invalid OPC relationships part path: ${path}`);\n }\n\n return normalizePartPath(\n `${normalized.slice(0, markerIndex)}${normalized.slice(markerIndex + marker.length, -\".rels\".length)}`,\n );\n}\n\nexport function resolveRelationshipTarget(\n sourcePartPath: string | null,\n relationship: Pick<OpcRelationship, \"target\" | \"targetMode\">,\n): string {\n if (relationship.targetMode === \"external\") {\n return relationship.target;\n }\n\n if (relationship.target.startsWith(\"/\")) {\n return normalizePartPath(relationship.target);\n }\n\n const basePath = sourcePartPath ? normalizePartPath(sourcePartPath) : \"/\";\n const baseDir = basePath === \"/\" ? \"/\" : basePath.slice(0, basePath.lastIndexOf(\"/\") + 1);\n return normalizePartPath(`${baseDir}${relationship.target}`);\n}\n\nexport function comparePartPaths(a: string, b: string): number {\n return normalizePartPath(a).localeCompare(normalizePartPath(b));\n}\n","import {\n CONTENT_TYPES_PATH,\n OpcCompressionMethod,\n OpcPackageManifest,\n OpcPackagePart,\n OpcRelationship,\n PACKAGE_RELATIONSHIPS_PATH,\n comparePartPaths,\n getExtension,\n getRelationshipsPartPath,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\nimport type { OpcPackage } from \"./package-reader.ts\";\n\ninterface ZipEntryPayload {\n path: string;\n compression: OpcCompressionMethod;\n uncompressedBytes: Uint8Array;\n compressedBytes: Uint8Array;\n crc32: number;\n}\n\nexport function writeOpcPackage(input: OpcPackage | { manifest: OpcPackageManifest; parts: Map<string, OpcPackagePart> }): Uint8Array {\n const entries = collectZipEntries(input.manifest, input.parts);\n return buildZipArchive(entries);\n}\n\nfunction collectZipEntries(\n manifest: OpcPackageManifest,\n parts: Map<string, OpcPackagePart>,\n): ZipEntryPayload[] {\n const entries: ZipEntryPayload[] = [];\n const contentParts = [...parts.values()]\n .filter((part) => part.surfaceKind === \"content\")\n .sort((left, right) => comparePartPaths(left.path, right.path));\n\n entries.push(createZipPayload(CONTENT_TYPES_PATH, \"deflate\", encodeXml(buildContentTypesXml(manifest, contentParts))));\n entries.push(\n createZipPayload(\n PACKAGE_RELATIONSHIPS_PATH,\n \"deflate\",\n encodeXml(buildRelationshipsXml(manifest.packageRelationships)),\n ),\n );\n\n for (const part of contentParts) {\n entries.push(createZipPayload(part.path, part.compression, part.bytes));\n\n if (part.relationships.length > 0) {\n entries.push(\n createZipPayload(\n getRelationshipsPartPath(part.path),\n \"deflate\",\n encodeXml(buildRelationshipsXml(part.relationships)),\n ),\n );\n }\n }\n\n return entries.sort((left, right) => comparePartPaths(left.path, right.path));\n}\n\nfunction buildContentTypesXml(\n manifest: OpcPackageManifest,\n parts: OpcPackagePart[],\n): string {\n const defaults: Record<string, string> = {\n ...manifest.contentTypes.defaults,\n rels: manifest.contentTypes.defaults.rels ?? \"application/vnd.openxmlformats-package.relationships+xml\",\n xml: manifest.contentTypes.defaults.xml ?? \"application/xml\",\n };\n\n const overrides = { ...manifest.contentTypes.overrides };\n\n for (const part of parts) {\n if (!part.contentType) {\n throw new Error(`Cannot write OPC package: missing content type for ${part.path}.`);\n }\n\n const extension = getExtension(part.path);\n if (!extension) {\n overrides[part.path] = part.contentType;\n continue;\n }\n\n const defaultContentType = defaults[extension];\n if (!defaultContentType) {\n defaults[extension] = part.contentType;\n delete overrides[part.path];\n continue;\n }\n\n if (defaultContentType === part.contentType) {\n delete overrides[part.path];\n continue;\n }\n\n overrides[part.path] = part.contentType;\n }\n\n const defaultEntries = Object.entries(defaults).sort(([left], [right]) => left.localeCompare(right));\n const overrideEntries = Object.entries(overrides).sort(([left], [right]) => comparePartPaths(left, right));\n\n const defaultXml = defaultEntries\n .map(([extension, contentType]) => ` <Default Extension=\"${escapeXml(extension)}\" ContentType=\"${escapeXml(contentType)}\"/>`)\n .join(\"\\n\");\n const overrideXml = overrideEntries\n .map(([partName, contentType]) => ` <Override PartName=\"${escapeXml(partName)}\" ContentType=\"${escapeXml(contentType)}\"/>`)\n .join(\"\\n\");\n const body = [defaultXml, overrideXml].filter((value) => value.length > 0).join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">`,\n body,\n `</Types>`,\n ].join(\"\\n\");\n}\n\nfunction buildRelationshipsXml(relationships: OpcRelationship[]): string {\n const relationshipXml = [...relationships]\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((relationship) => {\n const targetMode =\n relationship.targetMode === \"external\"\n ? ` TargetMode=\"External\"`\n : \"\";\n return ` <Relationship Id=\"${escapeXml(relationship.id)}\" Type=\"${escapeXml(relationship.type)}\" Target=\"${escapeXml(relationship.target)}\"${targetMode}/>`;\n })\n .join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`,\n relationshipXml,\n `</Relationships>`,\n ].join(\"\\n\");\n}\n\nfunction createZipPayload(\n path: string,\n compression: OpcCompressionMethod,\n bytes: Uint8Array,\n): ZipEntryPayload {\n const normalizedPath = normalizePartPath(path).slice(1);\n const uncompressedBytes = new Uint8Array(bytes);\n // Keep export browser-safe by storing entries without Node-only compression primitives.\n const compressedBytes = uncompressedBytes;\n const effectiveCompression: OpcCompressionMethod = \"store\";\n\n return {\n path: normalizedPath,\n compression: effectiveCompression,\n uncompressedBytes,\n compressedBytes,\n crc32: calculateCrc32(uncompressedBytes),\n };\n}\n\nfunction buildZipArchive(entries: ZipEntryPayload[]): Uint8Array {\n const localChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let localOffset = 0;\n\n for (const entry of entries) {\n const fileName = encodeUtf8(entry.path);\n const localHeader = createByteBuffer(30 + fileName.length);\n const localHeaderView = new DataView(localHeader.buffer);\n localHeaderView.setUint32(0, 0x04034b50, true);\n localHeaderView.setUint16(4, 20, true);\n localHeaderView.setUint16(6, 0, true);\n localHeaderView.setUint16(8, entry.compression === \"store\" ? 0 : 8, true);\n localHeaderView.setUint16(10, 0, true);\n localHeaderView.setUint16(12, 0, true);\n localHeaderView.setUint32(14, entry.crc32 >>> 0, true);\n localHeaderView.setUint32(18, entry.compressedBytes.byteLength, true);\n localHeaderView.setUint32(22, entry.uncompressedBytes.byteLength, true);\n localHeaderView.setUint16(26, fileName.length, true);\n localHeaderView.setUint16(28, 0, true);\n localHeader.set(fileName, 30);\n\n localChunks.push(localHeader, entry.compressedBytes);\n\n const centralHeader = createByteBuffer(46 + fileName.length);\n const centralHeaderView = new DataView(centralHeader.buffer);\n centralHeaderView.setUint32(0, 0x02014b50, true);\n centralHeaderView.setUint16(4, 20, true);\n centralHeaderView.setUint16(6, 20, true);\n centralHeaderView.setUint16(8, 0, true);\n centralHeaderView.setUint16(10, entry.compression === \"store\" ? 0 : 8, true);\n centralHeaderView.setUint16(12, 0, true);\n centralHeaderView.setUint16(14, 0, true);\n centralHeaderView.setUint32(16, entry.crc32 >>> 0, true);\n centralHeaderView.setUint32(20, entry.compressedBytes.byteLength, true);\n centralHeaderView.setUint32(24, entry.uncompressedBytes.byteLength, true);\n centralHeaderView.setUint16(28, fileName.length, true);\n centralHeaderView.setUint16(30, 0, true);\n centralHeaderView.setUint16(32, 0, true);\n centralHeaderView.setUint16(34, 0, true);\n centralHeaderView.setUint16(36, 0, true);\n centralHeaderView.setUint32(38, 0, true);\n centralHeaderView.setUint32(42, localOffset, true);\n centralHeader.set(fileName, 46);\n centralChunks.push(centralHeader);\n\n localOffset += localHeader.byteLength + entry.compressedBytes.byteLength;\n }\n\n const centralDirectoryOffset = localOffset;\n const centralDirectory = concatByteArrays(centralChunks);\n const endOfCentralDirectory = createByteBuffer(22);\n const endOfCentralDirectoryView = new DataView(endOfCentralDirectory.buffer);\n endOfCentralDirectoryView.setUint32(0, 0x06054b50, true);\n endOfCentralDirectoryView.setUint16(4, 0, true);\n endOfCentralDirectoryView.setUint16(6, 0, true);\n endOfCentralDirectoryView.setUint16(8, entries.length, true);\n endOfCentralDirectoryView.setUint16(10, entries.length, true);\n endOfCentralDirectoryView.setUint32(12, centralDirectory.byteLength, true);\n endOfCentralDirectoryView.setUint32(16, centralDirectoryOffset, true);\n endOfCentralDirectoryView.setUint16(20, 0, true);\n\n return concatByteArrays([...localChunks, centralDirectory, endOfCentralDirectory]);\n}\n\nfunction encodeXml(xml: string): Uint8Array {\n return encodeUtf8(xml);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\");\n}\n\nfunction calculateCrc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let bit = 0; bit < 8; bit += 1) {\n const mask = -(crc & 1);\n crc = (crc >>> 1) ^ (0xedb88320 & mask);\n }\n }\n\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction createByteBuffer(size: number): Uint8Array {\n return new Uint8Array(size);\n}\n\nfunction concatByteArrays(chunks: readonly Uint8Array[]): Uint8Array {\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return combined;\n}\n\nfunction encodeUtf8(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nexport { buildContentTypesXml, buildRelationshipsXml, calculateCrc32 };\n","import {\n getRelationshipsPartPath,\n type OpcPackageManifest,\n type OpcPackagePart,\n} from \"../ooxml/part-manifest.ts\";\nimport { writeOpcPackage } from \"./package-writer.ts\";\n\nexport const DOCX_MIME_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\nexport const DOCX_DOCUMENT_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\";\nexport const DOCX_DOCUMENT_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\";\n\ninterface WriteDocxPackageInput {\n documentXml: string;\n documentContentType?: string;\n packageRelationshipType?: string;\n}\n\nexport function writeDocxPackage(input: WriteDocxPackageInput): Uint8Array {\n const documentPath = \"/word/document.xml\";\n const contentType = input.documentContentType ?? DOCX_DOCUMENT_CONTENT_TYPE;\n const relationshipType =\n input.packageRelationshipType ?? DOCX_DOCUMENT_RELATIONSHIP_TYPE;\n const documentBytes = new TextEncoder().encode(input.documentXml);\n\n const documentPart: OpcPackagePart = {\n path: documentPath,\n surfaceKind: \"content\",\n contentType,\n relationshipsPartPath: getRelationshipsPartPath(documentPath),\n relationships: [],\n compression: \"deflate\",\n bytes: documentBytes,\n crc32: 0,\n };\n\n const manifest: OpcPackageManifest = {\n contentTypes: {\n defaults: {\n rels: \"application/vnd.openxmlformats-package.relationships+xml\",\n xml: \"application/xml\",\n },\n overrides: {\n [documentPath]: contentType,\n },\n },\n packageRelationships: [\n {\n id: \"rId1\",\n type: relationshipType,\n target: \"word/document.xml\",\n targetMode: \"internal\",\n },\n ],\n parts: [\n {\n path: documentPart.path,\n surfaceKind: documentPart.surfaceKind,\n contentType: documentPart.contentType,\n relationshipsPartPath: documentPart.relationshipsPartPath,\n relationships: documentPart.relationships,\n compression: documentPart.compression,\n byteLength: documentPart.bytes.byteLength,\n },\n ],\n };\n\n return writeOpcPackage({\n manifest,\n parts: new Map([[documentPart.path, documentPart]]),\n });\n}\n","import { inflateSync } from \"fflate\";\n\nimport {\n CONTENT_TYPES_PATH,\n OpcCompressionMethod,\n OpcPackageManifest,\n OpcPackagePart,\n OpcPartManifestEntry,\n OpcRelationship,\n PACKAGE_RELATIONSHIPS_PATH,\n getRelationshipsPartPath,\n getSourcePartPathFromRelationshipsPart,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\n\ninterface ZipCentralDirectoryEntry {\n path: string;\n compression: OpcCompressionMethod;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n generalPurposeBitFlag: number;\n}\n\nexport interface OpcPackage {\n manifest: OpcPackageManifest;\n parts: Map<string, OpcPackagePart>;\n sourceByteLength: number;\n}\n\nconst EOCD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\n\nexport function readOpcPackage(source: Uint8Array | ArrayBuffer): OpcPackage {\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\n const centralDirectory = readCentralDirectory(bytes);\n const parts = new Map<string, OpcPackagePart>();\n\n for (const entry of centralDirectory) {\n if (entry.path.endsWith(\"/\")) {\n continue;\n }\n\n const storedBytes = readZipEntry(bytes, entry);\n const normalizedPath = normalizePartPath(entry.path);\n const surfaceKind = getSurfaceKind(normalizedPath);\n\n parts.set(normalizedPath, {\n path: normalizedPath,\n surfaceKind,\n contentType: null,\n relationshipsPartPath:\n surfaceKind === \"content\" ? getRelationshipsPartPath(normalizedPath) : null,\n relationships: [],\n compression: entry.compression,\n bytes: storedBytes,\n crc32: entry.crc32 >>> 0,\n });\n }\n\n const contentTypesPart = parts.get(CONTENT_TYPES_PATH);\n if (!contentTypesPart) {\n throw new Error(\"Invalid OPC package: missing /[Content_Types].xml.\");\n }\n\n const contentTypes = parseContentTypesXml(decodeXml(contentTypesPart.bytes));\n const packageRelationshipsPart = parts.get(PACKAGE_RELATIONSHIPS_PATH);\n const packageRelationships = packageRelationshipsPart\n ? parseRelationshipsXml(decodeXml(packageRelationshipsPart.bytes))\n : [];\n\n const manifestParts: OpcPartManifestEntry[] = [];\n\n for (const [path, part] of [...parts.entries()].sort(([left], [right]) => left.localeCompare(right))) {\n const contentType = resolveContentType(path, contentTypes);\n const relationshipsPartPath = part.surfaceKind === \"content\" ? getRelationshipsPartPath(path) : null;\n const relationshipsPart = relationshipsPartPath ? parts.get(relationshipsPartPath) : undefined;\n const relationships = relationshipsPart\n ? parseRelationshipsXml(decodeXml(relationshipsPart.bytes))\n : [];\n\n const nextPart: OpcPackagePart = {\n ...part,\n contentType,\n relationshipsPartPath,\n relationships,\n };\n\n parts.set(path, nextPart);\n manifestParts.push({\n path,\n surfaceKind: nextPart.surfaceKind,\n contentType,\n relationshipsPartPath,\n relationships,\n compression: nextPart.compression,\n byteLength: nextPart.bytes.byteLength,\n });\n }\n\n return {\n manifest: {\n contentTypes,\n packageRelationships,\n parts: manifestParts,\n },\n parts,\n sourceByteLength: bytes.byteLength,\n };\n}\n\nfunction readCentralDirectory(archive: Uint8Array): ZipCentralDirectoryEntry[] {\n const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength);\n const eocdOffset = findEndOfCentralDirectory(archive, view);\n const entryCount = view.getUint16(eocdOffset + 10, true);\n const centralDirectoryOffset = view.getUint32(eocdOffset + 16, true);\n const entries: ZipCentralDirectoryEntry[] = [];\n let offset = centralDirectoryOffset;\n\n for (let index = 0; index < entryCount; index += 1) {\n const signature = view.getUint32(offset, true);\n if (signature !== CENTRAL_DIRECTORY_SIGNATURE) {\n throw new Error(`Invalid ZIP central directory signature at offset ${offset}.`);\n }\n\n const generalPurposeBitFlag = view.getUint16(offset + 8, true);\n const compressionMethod = view.getUint16(offset + 10, true);\n const crc32 = view.getUint32(offset + 16, true);\n const compressedSize = view.getUint32(offset + 20, true);\n const uncompressedSize = view.getUint32(offset + 24, true);\n const fileNameLength = view.getUint16(offset + 28, true);\n const extraFieldLength = view.getUint16(offset + 30, true);\n const fileCommentLength = view.getUint16(offset + 32, true);\n const localHeaderOffset = view.getUint32(offset + 42, true);\n const fileNameOffset = offset + 46;\n const fileName = decodeUtf8(archive.subarray(fileNameOffset, fileNameOffset + fileNameLength));\n\n entries.push({\n path: fileName,\n compression: mapCompressionMethod(compressionMethod),\n crc32,\n compressedSize,\n uncompressedSize,\n localHeaderOffset,\n generalPurposeBitFlag,\n });\n\n offset += 46 + fileNameLength + extraFieldLength + fileCommentLength;\n }\n\n return entries;\n}\n\nfunction findEndOfCentralDirectory(archive: Uint8Array, view: DataView): number {\n const minimumEocdSize = 22;\n const maximumCommentSize = 0xffff;\n const searchStart = Math.max(0, archive.length - minimumEocdSize - maximumCommentSize);\n\n for (let offset = archive.length - minimumEocdSize; offset >= searchStart; offset -= 1) {\n if (view.getUint32(offset, true) === EOCD_SIGNATURE) {\n return offset;\n }\n }\n\n throw new Error(\"Invalid ZIP archive: end of central directory not found.\");\n}\n\nfunction readZipEntry(archive: Uint8Array, entry: ZipCentralDirectoryEntry): Uint8Array {\n const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength);\n const headerOffset = entry.localHeaderOffset;\n const signature = view.getUint32(headerOffset, true);\n if (signature !== LOCAL_FILE_HEADER_SIGNATURE) {\n throw new Error(`Invalid ZIP local file header signature at offset ${headerOffset}.`);\n }\n\n const fileNameLength = view.getUint16(headerOffset + 26, true);\n const extraFieldLength = view.getUint16(headerOffset + 28, true);\n const dataOffset = headerOffset + 30 + fileNameLength + extraFieldLength;\n const compressed = archive.subarray(dataOffset, dataOffset + entry.compressedSize);\n\n switch (entry.compression) {\n case \"store\":\n return new Uint8Array(compressed);\n case \"deflate\":\n return inflateSync(compressed);\n default:\n throw new Error(`Unsupported ZIP compression for ${entry.path}.`);\n }\n}\n\nfunction mapCompressionMethod(method: number): OpcCompressionMethod {\n switch (method) {\n case 0:\n return \"store\";\n case 8:\n return \"deflate\";\n default:\n throw new Error(`Unsupported ZIP compression method ${method}.`);\n }\n}\n\nfunction getSurfaceKind(path: string): OpcPartManifestEntry[\"surfaceKind\"] {\n if (path === CONTENT_TYPES_PATH) {\n return \"content-types\";\n }\n\n if (path === PACKAGE_RELATIONSHIPS_PATH || path.includes(\"/_rels/\")) {\n return \"relationships\";\n }\n\n return \"content\";\n}\n\nfunction decodeXml(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\").decode(bytes);\n}\n\nfunction decodeUtf8(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\").decode(bytes);\n}\n\nfunction parseContentTypesXml(xml: string): OpcPackageManifest[\"contentTypes\"] {\n const defaults: Record<string, string> = {};\n const overrides: Record<string, string> = {};\n\n for (const attributes of findTagAttributes(xml, \"Default\")) {\n const extension = attributes.Extension?.toLowerCase();\n const contentType = attributes.ContentType;\n if (!extension || !contentType) {\n continue;\n }\n\n defaults[extension] = contentType;\n }\n\n for (const attributes of findTagAttributes(xml, \"Override\")) {\n const partName = attributes.PartName;\n const contentType = attributes.ContentType;\n if (!partName || !contentType) {\n continue;\n }\n\n overrides[normalizePartPath(partName)] = contentType;\n }\n\n return { defaults, overrides };\n}\n\nfunction parseRelationshipsXml(xml: string): OpcRelationship[] {\n const relationships: OpcRelationship[] = [];\n\n for (const attributes of findTagAttributes(xml, \"Relationship\")) {\n const id = attributes.Id;\n const type = attributes.Type;\n const target = attributes.Target;\n if (!id || !type || !target) {\n continue;\n }\n\n relationships.push({\n id,\n type,\n target,\n targetMode: attributes.TargetMode === \"External\" ? \"external\" : \"internal\",\n });\n }\n\n return relationships;\n}\n\nfunction findTagAttributes(xml: string, tagName: string): Record<string, string>[] {\n const tagPattern = new RegExp(`<(?:[A-Za-z_][\\\\w.-]*:)?${tagName}\\\\b([^>]*)\\\\/?>`, \"g\");\n const results: Record<string, string>[] = [];\n let tagMatch: RegExpExecArray | null = tagPattern.exec(xml);\n\n while (tagMatch) {\n results.push(parseAttributes(tagMatch[1] ?? \"\"));\n tagMatch = tagPattern.exec(xml);\n }\n\n return results;\n}\n\nfunction parseAttributes(rawAttributes: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attributePattern = /([A-Za-z_][\\w:.-]*)\\s*=\\s*([\"'])([\\s\\S]*?)\\2/g;\n let match: RegExpExecArray | null = attributePattern.exec(rawAttributes);\n\n while (match) {\n attributes[match[1]] = decodeXmlEntities(match[3]);\n match = attributePattern.exec(rawAttributes);\n }\n\n return attributes;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n}\n\nfunction resolveContentType(\n path: string,\n contentTypes: OpcPackageManifest[\"contentTypes\"],\n): string | null {\n if (path === CONTENT_TYPES_PATH) {\n return \"application/xml\";\n }\n\n const override = contentTypes.overrides[path];\n if (override) {\n return override;\n }\n\n const extension = path.includes(\".\") ? path.slice(path.lastIndexOf(\".\") + 1).toLowerCase() : \"\";\n return extension ? contentTypes.defaults[extension] ?? null : null;\n}\n\nexport { parseContentTypesXml, parseRelationshipsXml };\n","import type { OpcRelationship } from \"./part-manifest.ts\";\nimport { normalizePartPath, resolveRelationshipTarget } from \"./part-manifest.ts\";\n\nexport interface InlineMediaPart {\n path: string;\n contentType: string;\n}\n\nexport interface ParsedInlineMedia {\n type: \"image\";\n mediaId: string;\n relationshipId: string;\n packagePartName: string;\n contentType?: string;\n filename: string;\n altText?: string;\n widthEmu?: number;\n heightEmu?: number;\n display?: \"inline\" | \"floating\";\n floating?: {\n horizontalPosition?: {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n };\n verticalPosition?: {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n };\n wrap?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n behindDoc?: boolean;\n layoutInCell?: boolean;\n allowOverlap?: boolean;\n };\n}\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nexport function parseInlineMediaXml(\n xml: string,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart> = new Map(),\n sourcePartPath = \"/word/document.xml\",\n): ParsedInlineMedia[] {\n const root = parseXml(xml);\n const relationshipMap = new Map(relationships.map((relationship) => [relationship.id, relationship]));\n const drawings = findDescendants(root, \"drawing\");\n const media: ParsedInlineMedia[] = [];\n\n for (const drawing of drawings) {\n const inline = findFirstDescendant(drawing, \"inline\");\n const anchor = findFirstDescendant(drawing, \"anchor\");\n const container = anchor ?? inline;\n const blip = findFirstDescendant(drawing, \"blip\");\n if (!container || !blip) {\n continue;\n }\n\n const relationshipId = blip.attributes[\"r:embed\"] ?? blip.attributes.embed;\n if (!relationshipId) {\n continue;\n }\n\n const relationship = relationshipMap.get(relationshipId);\n if (!relationship || !relationship.type.endsWith(\"/image\")) {\n continue;\n }\n\n const packagePartName = normalizePartPath(\n resolveRelationshipTarget(sourcePartPath, relationship),\n );\n const mediaPart = mediaParts.get(packagePartName);\n const docProperties = findFirstDescendant(container, \"docPr\");\n const altText = readAltText(docProperties);\n const floating = anchor ? readFloatingProperties(anchor) : undefined;\n\n // Read extent dimensions (wp:extent cx/cy in EMUs)\n const extent = findDrawingExtent(container);\n const widthEmu = extent ? readEmuAttribute(extent, \"cx\") : undefined;\n const heightEmu = extent ? readEmuAttribute(extent, \"cy\") : undefined;\n\n media.push({\n type: \"image\",\n mediaId: `media:${packagePartName.slice(1)}`,\n relationshipId,\n packagePartName,\n ...(mediaPart ? { contentType: mediaPart.contentType } : {}),\n filename: packagePartName.slice(packagePartName.lastIndexOf(\"/\") + 1),\n ...(altText ? { altText } : {}),\n ...(widthEmu !== undefined ? { widthEmu } : {}),\n ...(heightEmu !== undefined ? { heightEmu } : {}),\n ...(anchor ? { display: \"floating\" as const } : {}),\n ...(floating ? { floating } : {}),\n });\n }\n\n return media;\n}\n\nfunction findDrawingExtent(node: XmlElementNode): XmlElementNode | undefined {\n const wordProcessingExtent = findFirstDescendant(node, \"extent\");\n if (wordProcessingExtent) {\n return wordProcessingExtent;\n }\n\n const transform = findFirstDescendant(node, \"xfrm\");\n if (!transform) {\n return undefined;\n }\n\n return findFirstDescendant(transform, \"ext\");\n}\n\nfunction readFloatingProperties(\n node: XmlElementNode,\n): NonNullable<ParsedInlineMedia[\"floating\"]> | undefined {\n const horizontalPosition = findFirstDescendant(node, \"positionH\");\n const verticalPosition = findFirstDescendant(node, \"positionV\");\n const wrap =\n findFirstDescendant(node, \"wrapNone\") ??\n findFirstDescendant(node, \"wrapSquare\") ??\n findFirstDescendant(node, \"wrapTight\") ??\n findFirstDescendant(node, \"wrapThrough\") ??\n findFirstDescendant(node, \"wrapTopAndBottom\");\n\n const properties: NonNullable<ParsedInlineMedia[\"floating\"]> = {};\n const horizontalAxis = readAxisPosition(horizontalPosition);\n const verticalAxis = readAxisPosition(verticalPosition);\n if (horizontalAxis) {\n properties.horizontalPosition = horizontalAxis;\n }\n if (verticalAxis) {\n properties.verticalPosition = verticalAxis;\n }\n if (wrap) {\n const wrapName = localName(wrap.name);\n properties.wrap =\n wrapName === \"wrapSquare\"\n ? \"square\"\n : wrapName === \"wrapTight\"\n ? \"tight\"\n : wrapName === \"wrapThrough\"\n ? \"through\"\n : wrapName === \"wrapTopAndBottom\"\n ? \"topAndBottom\"\n : \"none\";\n }\n\n properties.behindDoc = readBooleanAttribute(node, \"behindDoc\");\n properties.layoutInCell = readBooleanAttribute(node, \"layoutInCell\");\n properties.allowOverlap = readBooleanAttribute(node, \"allowOverlap\");\n\n return Object.values(properties).some((value) => value !== undefined) ? properties : undefined;\n}\n\nfunction readAxisPosition(\n node: XmlElementNode | undefined,\n): NonNullable<NonNullable<ParsedInlineMedia[\"floating\"]>[\"horizontalPosition\"]> | undefined {\n if (!node) {\n return undefined;\n }\n\n const align = findFirstDescendant(node, \"align\");\n const posOffset = findFirstDescendant(node, \"posOffset\");\n const position: NonNullable<NonNullable<ParsedInlineMedia[\"floating\"]>[\"horizontalPosition\"]> = {\n ...(readOptionalAttribute(node, \"relativeFrom\") ? { relativeFrom: readOptionalAttribute(node, \"relativeFrom\") } : {}),\n ...(align && extractText(align).trim() ? { align: extractText(align).trim() } : {}),\n };\n\n if (posOffset) {\n const offset = Number.parseInt(extractText(posOffset).trim(), 10);\n if (Number.isFinite(offset)) {\n position.offset = offset;\n }\n }\n\n return Object.keys(position).length > 0 ? position : undefined;\n}\n\nfunction readAltText(node: XmlElementNode | undefined): string | undefined {\n if (!node) {\n return undefined;\n }\n\n const description = node.attributes.descr?.trim();\n if (description) {\n return description;\n }\n\n const title = node.attributes.title?.trim();\n if (title) {\n return title;\n }\n\n const name = node.attributes.name?.trim();\n return name || undefined;\n}\n\nfunction findFirstDescendant(node: XmlElementNode, local: string): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) === local) {\n return child;\n }\n\n const nested = findFirstDescendant(child, local);\n if (nested) {\n return nested;\n }\n }\n\n return undefined;\n}\n\nfunction findDescendants(node: XmlElementNode, local: string): XmlElementNode[] {\n const results: XmlElementNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) === local) {\n results.push(child);\n }\n\n results.push(...findDescendants(child, local));\n }\n\n return results;\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction extractText(node: XmlElementNode): string {\n return node.children.map((child) => child.type === \"text\" ? child.text : extractText(child)).join(\"\");\n}\n\nfunction readOptionalAttribute(node: XmlElementNode, name: string): string | undefined {\n return node.attributes[`wp:${name}`]\n ?? node.attributes[`w:${name}`]\n ?? node.attributes[name];\n}\n\nfunction readEmuAttribute(node: XmlElementNode, name: string): number | undefined {\n const value = node.attributes[name] ?? node.attributes[`wp:${name}`];\n if (value === undefined) return undefined;\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nfunction readBooleanAttribute(node: XmlElementNode, name: string): boolean | undefined {\n const value = readOptionalAttribute(node, name);\n if (value === undefined) {\n return undefined;\n }\n return value !== \"0\" && value !== \"false\" && value !== \"off\";\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n const current = stack.pop();\n const name = xml.slice(cursor + 2, end).trim();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n };\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n if (cursor >= tagBody.length) {\n break;\n }\n\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const key = tagBody.slice(keyStart, cursor);\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n if (tagBody[cursor] !== \"=\") {\n attributes[key] = \"\";\n continue;\n }\n cursor += 1;\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) {\n throw new Error(`Malformed XML attribute ${key}.`);\n }\n cursor += 1;\n\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) {\n cursor += 1;\n }\n attributes[key] = decodeXmlEntities(tagBody.slice(valueStart, cursor));\n cursor += 1;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n\n while (cursor < xml.length) {\n const current = xml[cursor];\n if (quote) {\n if (current === quote) {\n quote = null;\n }\n cursor += 1;\n continue;\n }\n\n if (current === `\"` || current === `'`) {\n quote = current;\n cursor += 1;\n continue;\n }\n\n if (current === \">\") {\n return cursor;\n }\n\n cursor += 1;\n }\n\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return `\"`;\n case \"apos\":\n return \"'\";\n default:\n if (entity.startsWith(\"#x\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n }\n if (entity.startsWith(\"#\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n }\n return match;\n }\n });\n}\n","import type { NumberingCatalog, NumberingLevelDefinition, NumberingLevelOverride } from \"../../model/canonical-document.ts\";\n\nexport interface ParsedParagraphNumberingReference {\n paragraphIndex: number;\n numberingInstanceId: string;\n level: number;\n}\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nexport function parseNumberingXml(xml: string): NumberingCatalog {\n const root = parseXml(xml);\n const numberingElement = findChildElement(root, \"numbering\");\n const abstractDefinitions: NumberingCatalog[\"abstractDefinitions\"] = {};\n const instances: NumberingCatalog[\"instances\"] = {};\n\n for (const child of numberingElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"abstractNum\": {\n const rawId = child.attributes[\"w:abstractNumId\"] ?? child.attributes.abstractNumId;\n if (!rawId) {\n continue;\n }\n\n const abstractNumberingId = toCanonicalAbstractNumberingId(rawId);\n abstractDefinitions[abstractNumberingId] = {\n abstractNumberingId,\n levels: readLevels(child),\n };\n break;\n }\n case \"num\": {\n const rawId = child.attributes[\"w:numId\"] ?? child.attributes.numId;\n const abstractReference = findChildElementOptional(child, \"abstractNumId\");\n const rawAbstractId =\n abstractReference?.attributes[\"w:val\"] ?? abstractReference?.attributes.val;\n\n if (!rawId || !rawAbstractId) {\n continue;\n }\n\n const numberingInstanceId = toCanonicalNumberingInstanceId(rawId);\n instances[numberingInstanceId] = {\n numberingInstanceId,\n abstractNumberingId: toCanonicalAbstractNumberingId(rawAbstractId),\n overrides: readOverrides(child),\n };\n break;\n }\n }\n }\n\n return {\n abstractDefinitions,\n instances,\n };\n}\n\nexport function parseParagraphNumberingReferences(\n documentXml: string,\n): ParsedParagraphNumberingReference[] {\n const root = parseXml(documentXml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const references: ParsedParagraphNumberingReference[] = [];\n let paragraphIndex = 0;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"p\") {\n continue;\n }\n\n const paragraphProperties = findChildElementOptional(child, \"pPr\");\n const numberingProperties = paragraphProperties\n ? findChildElementOptional(paragraphProperties, \"numPr\")\n : undefined;\n\n if (numberingProperties) {\n const levelNode = findChildElementOptional(numberingProperties, \"ilvl\");\n const instanceNode = findChildElementOptional(numberingProperties, \"numId\");\n const rawLevel = levelNode?.attributes[\"w:val\"] ?? levelNode?.attributes.val;\n const rawInstanceId = instanceNode?.attributes[\"w:val\"] ?? instanceNode?.attributes.val;\n\n if (rawLevel !== undefined && rawInstanceId) {\n const level = parseInteger(rawLevel);\n if (level !== undefined) {\n references.push({\n paragraphIndex,\n numberingInstanceId: toCanonicalNumberingInstanceId(rawInstanceId),\n level,\n });\n }\n }\n }\n\n paragraphIndex += 1;\n }\n\n return references;\n}\n\nexport function toCanonicalAbstractNumberingId(value: string): string {\n return value.startsWith(\"abstract-num:\") ? value : `abstract-num:${value}`;\n}\n\nexport function toCanonicalNumberingInstanceId(value: string): string {\n return value.startsWith(\"num:\") ? value : `num:${value}`;\n}\n\nfunction readLevels(abstractNode: XmlElementNode): NumberingLevelDefinition[] {\n const levels: NumberingLevelDefinition[] = [];\n\n for (const child of abstractNode.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"lvl\") {\n continue;\n }\n\n const rawLevel = child.attributes[\"w:ilvl\"] ?? child.attributes.ilvl;\n const level = rawLevel === undefined ? undefined : parseInteger(rawLevel);\n if (level === undefined) {\n continue;\n }\n\n const startNode = findChildElementOptional(child, \"start\");\n const formatNode = findChildElementOptional(child, \"numFmt\");\n const textNode = findChildElementOptional(child, \"lvlText\");\n const paragraphStyleNode = findChildElementOptional(child, \"pStyle\");\n const rawStart = startNode?.attributes[\"w:val\"] ?? startNode?.attributes.val;\n const startAt = rawStart === undefined ? undefined : parseInteger(rawStart);\n const format = formatNode?.attributes[\"w:val\"] ?? formatNode?.attributes.val ?? \"decimal\";\n const text = textNode?.attributes[\"w:val\"] ?? textNode?.attributes.val ?? `%${level + 1}.`;\n const paragraphStyleId =\n paragraphStyleNode?.attributes[\"w:val\"] ?? paragraphStyleNode?.attributes.val;\n const isLegalNode = findChildElementOptional(child, \"isLgl\");\n const isLegalNumbering = isLegalNode !== undefined;\n const suffixNode = findChildElementOptional(child, \"suff\");\n const suffixVal = suffixNode?.attributes[\"w:val\"] ?? suffixNode?.attributes.val;\n const suffix = suffixVal === \"space\" || suffixVal === \"nothing\" ? suffixVal : suffixVal === \"tab\" ? \"tab\" : undefined;\n\n levels.push({\n level,\n format,\n text,\n ...(startAt !== undefined ? { startAt } : {}),\n ...(paragraphStyleId ? { paragraphStyleId } : {}),\n ...(isLegalNumbering ? { isLegalNumbering } : {}),\n ...(suffix ? { suffix } : {}),\n });\n }\n\n return levels.sort((left, right) => left.level - right.level);\n}\n\nfunction readOverrides(numNode: XmlElementNode): NumberingLevelOverride[] {\n const overrides: NumberingLevelOverride[] = [];\n\n for (const child of numNode.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"lvlOverride\") {\n continue;\n }\n\n const rawLevel = child.attributes[\"w:ilvl\"] ?? child.attributes.ilvl;\n const level = rawLevel === undefined ? undefined : parseInteger(rawLevel);\n if (level === undefined) {\n continue;\n }\n\n const startOverrideNode = findChildElementOptional(child, \"startOverride\");\n const rawStart = startOverrideNode?.attributes[\"w:val\"] ?? startOverrideNode?.attributes.val;\n const startAt = rawStart === undefined ? undefined : parseInteger(rawStart);\n\n overrides.push({\n level,\n ...(startAt !== undefined ? { startAt } : {}),\n });\n }\n\n return overrides.sort((left, right) => left.level - right.level);\n}\n\nfunction findChildElement(node: XmlElementNode, childLocalName: string): XmlElementNode {\n const child = findChildElementOptional(node, childLocalName);\n if (!child) {\n throw new Error(`Expected <${childLocalName}> element in numbering XML.`);\n }\n\n return child;\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction parseInteger(value: string): number | undefined {\n if (!/^-?\\d+$/.test(value)) {\n return undefined;\n }\n\n return Number.parseInt(value, 10);\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing closing >.\");\n }\n\n const name = xml.slice(cursor + 2, end).trim();\n const current = stack.pop();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n };\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n if (cursor >= tagBody.length) {\n break;\n }\n\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const key = tagBody.slice(keyStart, cursor);\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n if (tagBody[cursor] !== \"=\") {\n attributes[key] = \"\";\n continue;\n }\n cursor += 1;\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) {\n throw new Error(`Malformed XML attribute ${key}.`);\n }\n cursor += 1;\n\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) {\n cursor += 1;\n }\n const rawValue = tagBody.slice(valueStart, cursor);\n attributes[key] = decodeXmlEntities(rawValue);\n cursor += 1;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n\n while (cursor < xml.length) {\n const current = xml[cursor];\n if (quote) {\n if (current === quote) {\n quote = null;\n }\n cursor += 1;\n continue;\n }\n\n if (current === `\"` || current === `'`) {\n quote = current;\n cursor += 1;\n continue;\n }\n\n if (current === \">\") {\n return cursor;\n }\n\n cursor += 1;\n }\n\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return `\"`;\n case \"apos\":\n return \"'\";\n default:\n if (entity.startsWith(\"#x\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n }\n if (entity.startsWith(\"#\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n }\n return match;\n }\n });\n}\n","/**\n * parse-complex-content.ts\n *\n * Parses complex OOXML content embedded in w:drawing elements:\n * - Charts (c:chart via mc:AlternateContent, extracts fallback preview image)\n * - SmartArt diagrams (dgm:* via mc:AlternateContent, extracts fallback preview image)\n *\n * These content types are rendered as read-only previews. The original XML is\n * preserved in the canonical node's rawXml field for lossless round-trip export.\n */\n\nimport type { OpcRelationship } from \"./part-manifest.ts\";\nimport { normalizePartPath, resolveRelationshipTarget } from \"./part-manifest.ts\";\n\nexport interface InlineMediaPart {\n path: string;\n contentType: string;\n}\n\nexport interface ParsedChartContent {\n type: \"chart_preview\";\n /** Media ID of the fallback preview image, if one is present in mc:Fallback. */\n previewMediaId?: string;\n /** Original drawing XML slice for lossless round-trip export. */\n rawXml: string;\n}\n\nexport interface ParsedSmartArtContent {\n type: \"smartart_preview\";\n /** Media ID of the fallback preview image, if one is present in mc:Fallback. */\n previewMediaId?: string;\n /** Original drawing XML slice for lossless round-trip export. */\n rawXml: string;\n}\n\nexport type ParsedComplexContent = ParsedChartContent | ParsedSmartArtContent;\n\nconst CHART_GRAPHIC_URI = \"http://schemas.openxmlformats.org/drawingml/2006/chart\";\nconst CHART_GRAPHIC_URI_ALT = \"http://schemas.microsoft.com/office/drawing/2007/8/2/chart\";\nconst SMARTART_GRAPHIC_URI = \"http://schemas.microsoft.com/office/drawing/2007/8/2/diagram\";\nconst SMARTART_GRAPHIC_URI_ALT = \"http://schemas.openxmlformats.org/drawingml/2006/diagram\";\nconst PICTURE_GRAPHIC_URI = \"http://schemas.openxmlformats.org/drawingml/2006/picture\";\n\n/**\n * Attempt to parse a w:drawing XML fragment as chart or SmartArt complex content.\n *\n * Returns null if the drawing contains only a plain image (handled by parseInlineMediaXml)\n * or unrecognised content.\n */\nexport function parseComplexContentXml(\n drawingXml: string,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart> = new Map(),\n sourcePartPath = \"/word/document.xml\",\n): ParsedComplexContent | null {\n const root = parseXml(drawingXml);\n const relationshipMap = new Map(relationships.map((r) => [r.id, r]));\n\n // Look for mc:AlternateContent at any depth\n const altContent = findFirstDescendant(root, \"AlternateContent\");\n if (altContent) {\n return parseAlternateContent(altContent, drawingXml, relationshipMap, mediaParts, sourcePartPath);\n }\n\n // No mc:AlternateContent — look for direct graphic data\n const graphicData = findFirstDescendant(root, \"graphicData\");\n if (!graphicData) {\n return null;\n }\n\n const uri = graphicData.attributes.uri ?? graphicData.attributes[\"uri\"] ?? \"\";\n if (isChartUri(uri)) {\n return { type: \"chart_preview\", rawXml: drawingXml };\n }\n if (isSmartArtUri(uri)) {\n return { type: \"smartart_preview\", rawXml: drawingXml };\n }\n\n return null;\n}\n\nfunction parseAlternateContent(\n altContent: XmlElementNode,\n fullDrawingXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedComplexContent | null {\n const choice = findFirstChild(altContent, \"Choice\");\n const fallback = findFirstChild(altContent, \"Fallback\");\n\n // Determine content type from Choice element\n const choiceGraphicData = choice ? findFirstDescendant(choice, \"graphicData\") : null;\n const choiceUri = choiceGraphicData?.attributes.uri ?? \"\";\n\n let contentType: \"chart_preview\" | \"smartart_preview\" | null = null;\n if (isChartUri(choiceUri)) {\n contentType = \"chart_preview\";\n } else if (isSmartArtUri(choiceUri)) {\n contentType = \"smartart_preview\";\n } else {\n // Check for chart/SmartArt relationship references in the choice\n const chartRef = choice ? findFirstDescendant(choice, \"chart\") : null;\n if (chartRef) {\n contentType = \"chart_preview\";\n }\n const dmRef = choice ? findFirstDescendant(choice, \"relIds\") : null;\n if (dmRef) {\n contentType = \"smartart_preview\";\n }\n }\n\n if (!contentType) {\n return null;\n }\n\n // Extract fallback preview image if present\n let previewMediaId: string | undefined;\n if (fallback) {\n const fallbackBlip = findFirstDescendant(fallback, \"blip\");\n if (fallbackBlip) {\n const rId =\n fallbackBlip.attributes[\"r:embed\"] ??\n fallbackBlip.attributes.embed ??\n fallbackBlip.attributes[\"r:link\"];\n if (rId) {\n const rel = relationshipMap.get(rId);\n if (rel && rel.type.endsWith(\"/image\")) {\n const packagePartName = normalizePartPath(\n resolveRelationshipTarget(sourcePartPath, rel),\n );\n const mediaPart = mediaParts.get(packagePartName);\n if (mediaPart) {\n previewMediaId = `media:${packagePartName.slice(1)}`;\n }\n }\n }\n }\n }\n\n return {\n type: contentType,\n ...(previewMediaId ? { previewMediaId } : {}),\n rawXml: fullDrawingXml,\n };\n}\n\nfunction isChartUri(uri: string): boolean {\n return uri === CHART_GRAPHIC_URI || uri === CHART_GRAPHIC_URI_ALT;\n}\n\nfunction isSmartArtUri(uri: string): boolean {\n return (\n uri === SMARTART_GRAPHIC_URI ||\n uri === SMARTART_GRAPHIC_URI_ALT ||\n uri.includes(\"diagram\") ||\n uri.includes(\"dgm\")\n );\n}\n\n// ---- Minimal XML parser (local, self-contained) ----\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nfunction findFirstChild(node: XmlElementNode, local: string): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type === \"element\" && localName(child.name) === local) {\n return child;\n }\n }\n return undefined;\n}\n\nfunction findFirstDescendant(node: XmlElementNode, local: string): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n if (localName(child.name) === local) return child;\n const nested = findFirstDescendant(child, local);\n if (nested) return nested;\n }\n return undefined;\n}\n\nfunction localName(name: string): string {\n const i = name.indexOf(\":\");\n return i >= 0 ? name.slice(i + 1) : name;\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = { type: \"element\", name: \"__root__\", attributes: {}, children: [] };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = xml.slice(cursor, end);\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text });\n }\n cursor = end;\n continue;\n }\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n stack.pop();\n cursor = end + 1;\n continue;\n }\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = { type: \"element\", name, attributes, children: [] };\n stack[stack.length - 1]?.children.push(element);\n if (!selfClosing) stack.push(element);\n cursor = tagEnd + 1;\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n if (cursor >= tagBody.length) break;\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) cursor++;\n const key = tagBody.slice(keyStart, cursor);\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n if (tagBody[cursor] !== \"=\") { attributes[key] = \"\"; continue; }\n cursor++;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) break;\n cursor++;\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) cursor++;\n attributes[key] = tagBody.slice(valueStart, cursor);\n cursor++;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n while (cursor < xml.length) {\n const c = xml[cursor];\n if (quote) { if (c === quote) quote = null; cursor++; continue; }\n if (c === `\"` || c === `'`) { quote = c; cursor++; continue; }\n if (c === \">\") return cursor;\n cursor++;\n }\n return xml.length - 1;\n}\n","/**\n * parse-shapes.ts\n *\n * Parses shape-related OOXML content:\n * - wps:wsp (WordprocessingShape) from w:drawing — rendered as bordered div with text\n * - WordArt — wps:wsp with text-geometry preset (prst starts with \"text\")\n * - VML shapes (v:shape, v:rect, v:textbox) from w:pict — legacy pre-2007 content\n *\n * These content types are rendered as read-only previews. The original XML is\n * preserved in the canonical node's rawXml field for lossless round-trip export.\n */\n\nconst WPS_SHAPE_GRAPHIC_URI =\n \"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\";\n\nexport interface ParsedWpsShape {\n type: \"shape\";\n /** True if this shape is a text box (geometry=rect with txbx content). */\n isTextBox?: boolean;\n /** Extracted text content from wps:txbx for display. */\n text?: string;\n /** Raw txbxContent XML for structured re-rendering. */\n txbxContentXml?: string;\n /** DrawML geometry preset, e.g. \"rect\", \"roundRect\". */\n geometry?: string;\n /** Original drawing XML for lossless round-trip export. */\n rawXml: string;\n}\n\nexport interface ParsedWordArt {\n type: \"wordart\";\n /** Extracted text. */\n text: string;\n /** DrawML geometry preset, e.g. \"textWave\", \"textCurve\". */\n geometry?: string;\n /** Original drawing XML for lossless round-trip export. */\n rawXml: string;\n}\n\nexport interface ParsedVmlShape {\n type: \"vml_shape\";\n /** Shape type identifier, e.g. \"#_x0000_t202\" for a text box. */\n shapeType?: string;\n /** Extracted text from v:textbox content. */\n text?: string;\n /** Original w:pict XML for lossless round-trip export. */\n rawXml: string;\n}\n\nexport type ParsedShape = ParsedWpsShape | ParsedWordArt | ParsedVmlShape;\n\n/**\n * Attempt to parse a w:drawing XML fragment as a wps:wsp shape or WordArt.\n *\n * Returns null if the drawing does not contain a WPS shape.\n */\nexport function parseShapeXml(drawingXml: string): ParsedWpsShape | ParsedWordArt | null {\n const root = parseXml(drawingXml);\n const graphicData = findFirstDescendant(root, \"graphicData\");\n if (!graphicData) return null;\n\n const uri = graphicData.attributes.uri ?? \"\";\n if (uri !== WPS_SHAPE_GRAPHIC_URI) return null;\n\n const wsp = findFirstDescendant(root, \"wsp\");\n if (!wsp) return null;\n\n // Extract geometry preset\n const spPr = findFirstChild(wsp, \"spPr\");\n const prstGeom = spPr ? findFirstDescendant(spPr, \"prstGeom\") : null;\n const prst = prstGeom?.attributes.prst ?? prstGeom?.attributes[\"prst\"] ?? undefined;\n\n // Extract text from wps:txbx > w:txbxContent\n const txbx = findFirstChild(wsp, \"txbx\");\n const txbxContent = txbx ? findFirstDescendant(txbx, \"txbxContent\") : null;\n const text = txbxContent ? extractAllText(txbxContent).trim() || undefined : undefined;\n\n // WordArt detection: geometry preset names that start with \"text\"\n if (prst && /^text/i.test(prst)) {\n return {\n type: \"wordart\",\n text: text ?? \"\",\n ...(prst ? { geometry: prst } : {}),\n rawXml: drawingXml,\n };\n }\n\n // Text box detection: rect or no geometry with text content\n const isTextBox = Boolean(txbxContent && (!prst || prst === \"rect\"));\n\n // Extract raw txbxContent XML for structured re-rendering of text boxes\n const txbxContentXml = txbxContent ? extractRawXml(txbxContent, drawingXml) : undefined;\n\n return {\n type: \"shape\",\n ...(isTextBox ? { isTextBox: true } : {}),\n ...(text ? { text } : {}),\n ...(txbxContentXml ? { txbxContentXml } : {}),\n ...(prst ? { geometry: prst } : {}),\n rawXml: drawingXml,\n };\n}\n\n/**\n * Attempt to parse a w:pict XML fragment as one or more VML shapes.\n *\n * Returns null if the pict element contains no recognised VML shapes.\n * Returns the first recognised VML shape found.\n */\nexport function parseVmlXml(pictXml: string): ParsedVmlShape | null {\n const root = parseXml(pictXml);\n\n // Look for v:shape, v:rect, v:textbox at any depth\n const vShape = findFirstDescendant(root, \"shape\");\n const vRect = findFirstDescendant(root, \"rect\");\n const vTextbox = findFirstDescendant(root, \"textbox\");\n\n const vmlNode = vShape ?? vRect ?? vTextbox;\n if (!vmlNode) return null;\n\n const shapeType =\n vShape?.attributes.type ??\n vShape?.attributes[\"type\"] ??\n undefined;\n\n // Extract text from v:textbox or nested w:txbxContent\n let text: string | undefined;\n const textboxNode = findFirstDescendant(vmlNode, \"textbox\") ?? (localName(vmlNode.name) === \"textbox\" ? vmlNode : null);\n if (textboxNode) {\n const txbxContent = findFirstDescendant(textboxNode, \"txbxContent\");\n if (txbxContent) {\n text = extractAllText(txbxContent).trim() || undefined;\n } else {\n text = extractAllText(textboxNode).trim() || undefined;\n }\n }\n\n return {\n type: \"vml_shape\",\n ...(shapeType ? { shapeType } : {}),\n ...(text ? { text } : {}),\n rawXml: pictXml,\n };\n}\n\n// ---- Raw XML extraction helpers ----\n\nfunction extractRawXml(node: XmlElementNode, sourceXml: string): string | undefined {\n // Find the txbxContent element boundaries in the source XML by tag name\n const tagName = node.name;\n const openIdx = sourceXml.indexOf(`<${tagName}`);\n if (openIdx < 0) return undefined;\n const closeTag = `</${tagName}>`;\n const closeIdx = sourceXml.indexOf(closeTag, openIdx);\n if (closeIdx < 0) return undefined;\n return sourceXml.slice(openIdx, closeIdx + closeTag.length);\n}\n\n// ---- Text extraction helpers ----\n\nfunction extractAllText(node: XmlElementNode): string {\n return node.children\n .map((child) => {\n if (child.type === \"text\") return child.text;\n // Only collect from w:t elements\n if (child.type === \"element\" && localName(child.name) === \"t\") {\n return extractAllText(child);\n }\n return extractAllText(child);\n })\n .join(\"\");\n}\n\n// ---- Minimal XML parser (local, self-contained) ----\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nfunction findFirstChild(node: XmlElementNode, local: string): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type === \"element\" && localName(child.name) === local) return child;\n }\n return undefined;\n}\n\nfunction findFirstDescendant(node: XmlElementNode, local: string): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n if (localName(child.name) === local) return child;\n const nested = findFirstDescendant(child, local);\n if (nested) return nested;\n }\n return undefined;\n}\n\nfunction localName(name: string): string {\n const i = name.indexOf(\":\");\n return i >= 0 ? name.slice(i + 1) : name;\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = { type: \"element\", name: \"__root__\", attributes: {}, children: [] };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = xml.slice(cursor, end);\n if (text.length > 0) stack[stack.length - 1]?.children.push({ type: \"text\", text });\n cursor = end;\n continue;\n }\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n stack.pop();\n cursor = end + 1;\n continue;\n }\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = { type: \"element\", name, attributes, children: [] };\n stack[stack.length - 1]?.children.push(element);\n if (!selfClosing) stack.push(element);\n cursor = tagEnd + 1;\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n if (cursor >= tagBody.length) break;\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) cursor++;\n const key = tagBody.slice(keyStart, cursor);\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n if (tagBody[cursor] !== \"=\") { attributes[key] = \"\"; continue; }\n cursor++;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor++;\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) break;\n cursor++;\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) cursor++;\n attributes[key] = tagBody.slice(valueStart, cursor);\n cursor++;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n while (cursor < xml.length) {\n const c = xml[cursor];\n if (quote) { if (c === quote) quote = null; cursor++; continue; }\n if (c === `\"` || c === `'`) { quote = c; cursor++; continue; }\n if (c === \">\") return cursor;\n cursor++;\n }\n return xml.length - 1;\n}\n","/**\n * parse-fields.ts\n *\n * Standalone parsers for OOXML field codes (w:fldSimple, complex fldChar sequences)\n * and bookmarks (w:bookmarkStart / w:bookmarkEnd).\n *\n * These types mirror the canonical FieldNode / BookmarkStartNode / BookmarkEndNode\n * shapes from canonical-document.ts, but carry raw XML for preservation and are\n * pre-normalization (no fragmentId / warningId yet).\n *\n * Usage: call parseFieldsFromParagraphXml() or parseBookmarksFromXml() for\n * independent field/bookmark extraction. The functions are designed to be\n * imported by parse-main-document.ts when full pipeline integration is ready.\n */\n\n// ─── Parsed types ────────────────────────────────────────────────────────────\n\nexport interface ParsedSimpleFieldNode {\n type: \"field\";\n fieldType: \"simple\";\n instruction: string;\n /** Raw XML of the content runs inside <w:fldSimple>. */\n contentXml: string;\n rawXml: string;\n}\n\nexport interface ParsedComplexFieldNode {\n type: \"field\";\n fieldType: \"complex\";\n instruction: string;\n /** Raw XML of the content runs between the \"separate\" and \"end\" fldChar. */\n contentXml: string;\n /** Start index in the source document XML. */\n start: number;\n /** End index (exclusive) in the source document XML. */\n end: number;\n}\n\nexport type ParsedFieldNode = ParsedSimpleFieldNode | ParsedComplexFieldNode;\n\nexport interface ParsedBookmarkStartNode {\n type: \"bookmark_start\";\n bookmarkId: string;\n name: string;\n rawXml: string;\n}\n\nexport interface ParsedBookmarkEndNode {\n type: \"bookmark_end\";\n bookmarkId: string;\n rawXml: string;\n}\n\nexport type ParsedBookmarkNode = ParsedBookmarkStartNode | ParsedBookmarkEndNode;\n\n// ─── Internal XML types ───────────────────────────────────────────────────────\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Parse all simple fields and bookmarks from the XML of a single paragraph\n * element. Complex fields that span paragraphs are not fully resolved here;\n * use extractComplexFieldsFromBodyXml for body-level extraction.\n *\n * @param paragraphXml Raw XML string of a <w:p> element.\n */\nexport function parseFieldsFromParagraphXml(paragraphXml: string): {\n simpleFields: ParsedSimpleFieldNode[];\n bookmarks: ParsedBookmarkNode[];\n} {\n const root = parseXml(paragraphXml);\n const pEl = findFirstChild(root, \"p\");\n const target = pEl ?? root;\n\n const simpleFields: ParsedSimpleFieldNode[] = [];\n const bookmarks: ParsedBookmarkNode[] = [];\n\n for (const child of target.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n if (name === \"fldSimple\") {\n const field = parseFldSimple(child, paragraphXml);\n if (field) simpleFields.push(field);\n } else if (name === \"bookmarkStart\") {\n const bk = parseBookmarkStart(child, paragraphXml);\n if (bk) bookmarks.push(bk);\n } else if (name === \"bookmarkEnd\") {\n const bk = parseBookmarkEnd(child, paragraphXml);\n if (bk) bookmarks.push(bk);\n }\n }\n\n return { simpleFields, bookmarks };\n}\n\n/**\n * Extract complex field sequences from a body element XML string.\n * A complex field is a begin / instrText* / separate / content / end sequence\n * spread across multiple <w:r> siblings.\n *\n * @param bodyXml Raw XML string of a <w:body> element (or full document).\n */\nexport function extractComplexFieldsFromBodyXml(bodyXml: string): ParsedComplexFieldNode[] {\n const root = parseXml(bodyXml);\n const results: ParsedComplexFieldNode[] = [];\n\n // Walk all <w:p> children of the body\n const bodyEl = findFirstChild(root, \"body\") ?? findFirstChild(root, \"document\");\n const scanTarget = bodyEl ?? root;\n\n for (const block of scanTarget.children) {\n if (block.type !== \"element\") continue;\n if (localName(block.name) !== \"p\") continue;\n extractComplexFieldsFromParagraph(block, bodyXml, results);\n }\n\n return results;\n}\n\n/**\n * Parse all bookmark start/end nodes from a full document or body XML.\n */\nexport function extractBookmarksFromBodyXml(bodyXml: string): ParsedBookmarkNode[] {\n const root = parseXml(bodyXml);\n const results: ParsedBookmarkNode[] = [];\n collectBookmarks(root, bodyXml, results);\n return results;\n}\n\n// ─── Element-level parsers (exported for unit testing) ────────────────────────\n\nexport function parseFldSimple(\n element: { attributes: Record<string, string>; children: XmlNode[]; start: number; end: number },\n sourceXml: string,\n): ParsedSimpleFieldNode | undefined {\n const instruction = (element.attributes[\"w:instr\"] ?? element.attributes.instr ?? \"\").trim();\n const contentXml = element.children\n .filter((c): c is XmlElementNode => c.type === \"element\")\n .map((c) => sourceXml.slice(c.start, c.end))\n .join(\"\");\n return {\n type: \"field\",\n fieldType: \"simple\",\n instruction,\n contentXml,\n rawXml: sourceXml.slice(element.start, element.end),\n };\n}\n\nexport function parseBookmarkStart(\n element: { attributes: Record<string, string>; start: number; end: number },\n sourceXml: string,\n): ParsedBookmarkStartNode | undefined {\n const bookmarkId = element.attributes[\"w:id\"] ?? element.attributes.id ?? \"\";\n const name = element.attributes[\"w:name\"] ?? element.attributes.name ?? \"\";\n if (!bookmarkId) return undefined;\n return {\n type: \"bookmark_start\",\n bookmarkId,\n name,\n rawXml: sourceXml.slice(element.start, element.end),\n };\n}\n\nexport function parseBookmarkEnd(\n element: { attributes: Record<string, string>; start: number; end: number },\n sourceXml: string,\n): ParsedBookmarkEndNode | undefined {\n const bookmarkId = element.attributes[\"w:id\"] ?? element.attributes.id ?? \"\";\n if (!bookmarkId) return undefined;\n return {\n type: \"bookmark_end\",\n bookmarkId,\n rawXml: sourceXml.slice(element.start, element.end),\n };\n}\n\n// ─── Field family classification ─────────────────────────────────────────────\n\nimport type {\n CanonicalDocument,\n DocumentNode,\n FieldFamily,\n FieldNode,\n FieldRegistry,\n FieldRegistryEntry,\n FieldRefreshStatus,\n InlineNode,\n ParagraphNode,\n SubPartsCatalog,\n SupportedFieldFamily,\n TocEntry,\n TocStructure,\n} from \"../../model/canonical-document.ts\";\n\nconst FIELD_FAMILY_PATTERN =\n /^\\s*(REF|PAGEREF|NOTEREF|TOC|PAGE|NUMPAGES|DATE|TIME|AUTHOR|FILENAME|MERGEFIELD|IF|SEQ|INDEX|TC|STYLEREF)\\b/i;\n\nconst SUPPORTED_FAMILIES = new Set<string>([\"REF\", \"PAGEREF\", \"NOTEREF\", \"TOC\"]);\n\n/**\n * Classify a field instruction into its field family.\n * Returns the family enum value and whether it is in the supported slice.\n */\nexport function classifyFieldInstruction(instruction: string): {\n family: FieldFamily;\n supported: boolean;\n target?: string;\n} {\n const trimmed = instruction.trim();\n const match = FIELD_FAMILY_PATTERN.exec(trimmed);\n if (!match) {\n return { family: \"UNKNOWN\", supported: false };\n }\n\n const family = match[1].toUpperCase() as FieldFamily;\n const supported = SUPPORTED_FAMILIES.has(family);\n\n let target: string | undefined;\n if (family === \"REF\" || family === \"PAGEREF\" || family === \"NOTEREF\") {\n const targetMatch = /^\\s*(?:REF|PAGEREF|NOTEREF)\\s+(?:\"([^\"]+)\"|(\\S+))/i.exec(trimmed);\n target = (targetMatch?.[1] ?? targetMatch?.[2])?.trim();\n }\n\n return { family, supported, target };\n}\n\n/**\n * Returns true if the given field family is in the supported refresh slice.\n */\nexport function isSupportedFieldFamily(family: FieldFamily): family is SupportedFieldFamily {\n return SUPPORTED_FAMILIES.has(family);\n}\n\n// ─── Field registry builder ─────────────────────────────────────────────────\n\n/**\n * Build a field registry from a canonical document, cataloging every field\n * instance with its classification, dependency metadata, and refresh status.\n *\n * The registry partitions fields into `supported` (REF, PAGEREF, NOTEREF, TOC)\n * and `preserveOnly` (all others) slices.\n */\nexport function buildFieldRegistry(\n document: Pick<CanonicalDocument, \"content\" | \"styles\"> & {\n subParts?: SubPartsCatalog;\n },\n): FieldRegistry {\n const root = document.content;\n const supported: FieldRegistryEntry[] = [];\n const preserveOnly: FieldRegistryEntry[] = [];\n let fieldIndex = 0;\n let paragraphIndex = -1;\n let tocInstruction: string | undefined;\n\n walkFieldDocument(root, (node, pIdx) => {\n paragraphIndex = pIdx;\n if (node.type === \"field\") {\n const classification = node.fieldFamily\n ? { family: node.fieldFamily, supported: isSupportedFieldFamily(node.fieldFamily), target: node.fieldTarget }\n : classifyFieldInstruction(node.instruction);\n const displayText = flattenFieldText(node.children);\n const entry: FieldRegistryEntry = {\n fieldIndex,\n fieldFamily: classification.family,\n supported: classification.supported,\n instruction: node.instruction,\n ...(classification.target ? { fieldTarget: classification.target } : {}),\n displayText,\n paragraphIndex,\n refreshStatus: node.refreshStatus ?? (classification.supported ? \"stale\" : \"preserve-only\"),\n };\n if (classification.supported) {\n supported.push(entry);\n if (classification.family === \"TOC\" && !tocInstruction) {\n tocInstruction = node.instruction;\n }\n } else {\n preserveOnly.push(entry);\n }\n fieldIndex += 1;\n }\n });\n if (document.subParts) {\n walkSubPartFields(document.subParts, (node, pIdx) => {\n paragraphIndex = pIdx;\n if (node.type === \"field\") {\n const classification = node.fieldFamily\n ? { family: node.fieldFamily, supported: isSupportedFieldFamily(node.fieldFamily), target: node.fieldTarget }\n : classifyFieldInstruction(node.instruction);\n const displayText = flattenFieldText(node.children);\n const entry: FieldRegistryEntry = {\n fieldIndex,\n fieldFamily: classification.family,\n supported: classification.supported,\n instruction: node.instruction,\n ...(classification.target ? { fieldTarget: classification.target } : {}),\n displayText,\n paragraphIndex,\n refreshStatus: node.refreshStatus ?? (classification.supported ? \"stale\" : \"preserve-only\"),\n };\n if (classification.supported) {\n supported.push(entry);\n } else {\n preserveOnly.push(entry);\n }\n fieldIndex += 1;\n }\n });\n }\n\n const tocStructure = tocInstruction\n ? buildTocStructure(document, tocInstruction)\n : undefined;\n\n return {\n supported,\n preserveOnly,\n ...(tocStructure ? { tocStructure } : {}),\n };\n}\n\n/**\n * Parse the heading level range from a TOC field instruction.\n * The \\\\o switch specifies the outline level range (e.g. \\\\o \"1-3\").\n * Defaults to 1-9 if no \\\\o switch is present.\n */\nexport function parseTocLevelRange(instruction: string): { from: number; to: number } {\n const match = /\\\\o\\s+\"(\\d+)-(\\d+)\"/.exec(instruction);\n if (match) {\n return { from: Number.parseInt(match[1], 10), to: Number.parseInt(match[2], 10) };\n }\n return { from: 1, to: 9 };\n}\n\n/**\n * Build a TocStructure from the document's heading paragraphs and the\n * TOC field instruction. This produces a deterministic, package-backed\n * TOC model that the runtime can use for refresh without DOM recomputation.\n */\nexport function buildTocStructure(\n document: Pick<CanonicalDocument, \"content\" | \"styles\">,\n instruction: string,\n): TocStructure {\n const levelRange = parseTocLevelRange(instruction);\n const entries: TocEntry[] = [];\n let paragraphIndex = -1;\n\n walkFieldDocument(document.content, (node, pIdx) => {\n paragraphIndex = pIdx;\n if (node.type !== \"paragraph\") return;\n const paragraph = node as ParagraphNode;\n\n // Determine heading level from outlineLevel or style\n let level: number | undefined = paragraph.outlineLevel;\n if (level === undefined && paragraph.styleId) {\n const style = document.styles.paragraphs[paragraph.styleId];\n if (style?.outlineLevel !== undefined) {\n level = style.outlineLevel;\n }\n }\n\n if (level === undefined) return;\n // TOC outline levels are 0-based internally, 1-based in TOC notation\n const tocLevel = level + 1;\n if (tocLevel < levelRange.from || tocLevel > levelRange.to) return;\n\n const text = flattenParagraphInlineText(paragraph.children);\n if (text.trim().length === 0) return;\n\n // Find bookmark anchoring this heading\n let bookmarkName: string | undefined;\n for (const child of paragraph.children) {\n if (child.type === \"bookmark_start\" && child.name) {\n bookmarkName = child.name;\n break;\n }\n }\n\n entries.push({\n text: text.trim(),\n level: tocLevel,\n paragraphIndex,\n ...(paragraph.styleId ? { styleId: paragraph.styleId } : {}),\n ...(bookmarkName ? { bookmarkName } : {}),\n });\n });\n\n return {\n instruction,\n levelRange,\n entries,\n status: \"stale\",\n };\n}\n\n/**\n * Deterministic refresh helper for REF fields.\n * Given a bookmark name map and the document content, resolves the display\n * text for a REF field by extracting text from the bookmarked paragraph.\n *\n * Returns the resolved text, or undefined if the bookmark is not found.\n */\nexport function resolveRefFieldText(\n document: Pick<CanonicalDocument, \"content\">,\n bookmarkNameMap: Map<string, { bookmarkId: string; paragraphIndex: number }>,\n fieldTarget: string,\n): { text: string; refreshStatus: \"current\" | \"unresolvable\" } | undefined {\n const bookmark = bookmarkNameMap.get(fieldTarget);\n if (!bookmark) {\n return { text: \"\", refreshStatus: \"unresolvable\" };\n }\n\n // Find the paragraph at bookmarkIndex and extract its text content\n let paragraphIndex = -1;\n let resolvedText: string | undefined;\n\n walkFieldDocument(document.content, (node, pIdx) => {\n if (node.type !== \"paragraph\") return;\n paragraphIndex = pIdx;\n if (paragraphIndex === bookmark.paragraphIndex) {\n resolvedText = flattenBookmarkContent(node as ParagraphNode, bookmark.bookmarkId);\n }\n });\n\n if (resolvedText !== undefined) {\n return { text: resolvedText, refreshStatus: \"current\" };\n }\n return { text: \"\", refreshStatus: \"unresolvable\" };\n}\n\n/**\n * Deterministic refresh helper that updates all supported field entries\n * in a registry with their current resolved status.\n *\n * This does NOT mutate the document nodes — it returns a new registry\n * with updated refresh statuses. A3 owns the runtime wiring that\n * applies these to the live document.\n */\nexport function refreshFieldRegistry(\n registry: FieldRegistry,\n bookmarkNameMap: Map<string, { bookmarkId: string; paragraphIndex: number }>,\n): FieldRegistry {\n const refreshed: FieldRegistryEntry[] = registry.supported.map((entry) => {\n if (entry.fieldFamily === \"TOC\") {\n // TOC refresh is handled through tocStructure, not individual entries\n return { ...entry, refreshStatus: registry.tocStructure ? \"current\" : \"stale\" as FieldRefreshStatus };\n }\n if (!entry.fieldTarget) {\n return { ...entry, refreshStatus: \"unresolvable\" as FieldRefreshStatus };\n }\n const bookmark = bookmarkNameMap.get(entry.fieldTarget);\n if (!bookmark) {\n return { ...entry, refreshStatus: \"unresolvable\" as FieldRefreshStatus };\n }\n return { ...entry, refreshStatus: \"current\" as FieldRefreshStatus };\n });\n\n return {\n supported: refreshed,\n preserveOnly: registry.preserveOnly,\n ...(registry.tocStructure ? { tocStructure: registry.tocStructure } : {}),\n };\n}\n\n// ─── Field registry internal helpers ────────────────────────────────────────\n\nfunction walkFieldDocument(\n node: DocumentNode,\n visit: (node: DocumentNode, paragraphIndex: number) => void,\n paragraphIndex = -1,\n): number {\n if (node.type === \"paragraph\") {\n paragraphIndex += 1;\n }\n visit(node, paragraphIndex);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n paragraphIndex = walkFieldDocument(child as DocumentNode, visit, paragraphIndex);\n }\n }\n if (node.type === \"table\") {\n for (const row of node.rows) {\n paragraphIndex = walkFieldDocument(row, visit, paragraphIndex);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n paragraphIndex = walkFieldDocument(cell, visit, paragraphIndex);\n }\n }\n return paragraphIndex;\n}\n\nfunction walkSubPartFields(\n subParts: SubPartsCatalog,\n visit: (node: DocumentNode, paragraphIndex: number) => void,\n): void {\n for (const header of subParts.headers) {\n for (const block of header.blocks) {\n walkFieldDocument(block, visit);\n }\n }\n for (const footer of subParts.footers) {\n for (const block of footer.blocks) {\n walkFieldDocument(block, visit);\n }\n }\n if (subParts.footnoteCollection) {\n for (const note of Object.values(subParts.footnoteCollection.footnotes)) {\n for (const block of note.blocks) {\n walkFieldDocument(block, visit);\n }\n }\n for (const note of Object.values(subParts.footnoteCollection.endnotes)) {\n for (const block of note.blocks) {\n walkFieldDocument(block, visit);\n }\n }\n }\n}\n\nfunction flattenFieldText(children: InlineNode[]): string {\n return children\n .map((child) => {\n if (child.type === \"text\") return child.text;\n if (child.type === \"tab\") return \"\\t\";\n if (child.type === \"hard_break\" || child.type === \"column_break\") return \"\\n\";\n return \"\";\n })\n .join(\"\");\n}\n\nfunction flattenParagraphInlineText(children: InlineNode[]): string {\n return children\n .map((child) => {\n if (child.type === \"text\") return child.text;\n if (child.type === \"tab\") return \"\\t\";\n if (child.type === \"hard_break\" || child.type === \"column_break\") return \"\\n\";\n if (child.type === \"hyperlink\") return flattenFieldText(child.children);\n if (child.type === \"field\") return flattenFieldText(child.children);\n return \"\";\n })\n .join(\"\");\n}\n\nfunction flattenBookmarkContent(\n paragraph: ParagraphNode,\n bookmarkId: string,\n): string {\n let inside = false;\n const parts: string[] = [];\n for (const child of paragraph.children) {\n if (child.type === \"bookmark_start\" && child.bookmarkId === bookmarkId) {\n inside = true;\n continue;\n }\n if (child.type === \"bookmark_end\" && child.bookmarkId === bookmarkId) {\n break;\n }\n if (inside) {\n if (child.type === \"text\") parts.push(child.text);\n else if (child.type === \"tab\") parts.push(\"\\t\");\n else if (child.type === \"hard_break\") parts.push(\"\\n\");\n }\n }\n // If no bookmark boundaries found in this paragraph, return full paragraph text\n if (!inside) {\n return flattenParagraphInlineText(paragraph.children);\n }\n return parts.join(\"\");\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\nfunction extractComplexFieldsFromParagraph(\n paragraph: XmlElementNode,\n sourceXml: string,\n results: ParsedComplexFieldNode[],\n): void {\n type FieldState = \"idle\" | \"in-instr\" | \"in-content\";\n let state: FieldState = \"idle\";\n let instrParts: string[] = [];\n let contentStart = -1;\n let contentEnd = -1;\n let fieldStart = -1;\n\n for (const child of paragraph.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"r\") continue;\n\n const fldChar = findFirstChildEl(child, \"fldChar\");\n const instrText = findFirstChildEl(child, \"instrText\");\n\n if (fldChar) {\n const charType = (\n fldChar.attributes[\"w:fldCharType\"] ??\n fldChar.attributes.fldCharType ??\n \"\"\n ).toLowerCase();\n\n if (charType === \"begin\") {\n state = \"in-instr\";\n instrParts = [];\n fieldStart = child.start;\n contentStart = -1;\n contentEnd = -1;\n } else if (charType === \"separate\" && state === \"in-instr\") {\n state = \"in-content\";\n contentStart = child.end;\n } else if (charType === \"end\") {\n if (state === \"in-content\" || state === \"in-instr\") {\n if (state === \"in-content\") {\n contentEnd = child.start;\n }\n const instruction = instrParts.join(\"\").trim();\n const contentXml =\n contentStart >= 0 && contentEnd >= contentStart\n ? sourceXml.slice(contentStart, contentEnd)\n : \"\";\n results.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction,\n contentXml,\n start: fieldStart,\n end: child.end,\n });\n }\n state = \"idle\";\n instrParts = [];\n }\n } else if (instrText && state === \"in-instr\") {\n const text = instrText.children\n .filter((c): c is XmlTextNode => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n instrParts.push(text);\n }\n }\n}\n\nfunction collectBookmarks(\n node: XmlElementNode,\n sourceXml: string,\n results: ParsedBookmarkNode[],\n): void {\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n if (name === \"bookmarkStart\") {\n const bk = parseBookmarkStart(child, sourceXml);\n if (bk) results.push(bk);\n } else if (name === \"bookmarkEnd\") {\n const bk = parseBookmarkEnd(child, sourceXml);\n if (bk) results.push(bk);\n } else {\n collectBookmarks(child, sourceXml, results);\n }\n }\n}\n\nfunction findFirstChild(node: XmlElementNode, childLocalName: string): XmlElementNode | undefined {\n return node.children.find(\n (c): c is XmlElementNode => c.type === \"element\" && localName(c.name) === childLocalName,\n );\n}\n\nfunction findFirstChildEl(node: XmlElementNode, childLocalName: string): XmlElementNode | undefined {\n return node.children.find(\n (c): c is XmlElementNode => c.type === \"element\" && localName(c.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const sep = name.indexOf(\":\");\n return sep >= 0 ? name.slice(sep + 1) : name;\n}\n\n// ─── Minimal XML parser (same pattern as parse-tables.ts) ────────────────────\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: end >= 0 ? end + 3 : xml.length,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text, start: cursor, end });\n }\n cursor = end;\n continue;\n }\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) throw new Error(\"Malformed XML: missing >.\");\n const name = xml.slice(cursor + 2, end).trim();\n const current = stack.pop();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n current.end = end + 1;\n cursor = end + 1;\n continue;\n }\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start: cursor,\n end: tagEnd + 1,\n };\n stack[stack.length - 1]?.children.push(element);\n if (!selfClosing) stack.push(element);\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) throw new Error(\"Malformed XML: unclosed element.\");\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n if (cursor >= tagBody.length) break;\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n const key = tagBody.slice(keyStart, cursor);\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n if (tagBody[cursor] !== \"=\") { attributes[key] = \"\"; continue; }\n cursor += 1;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) cursor += 1;\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) throw new Error(`Malformed XML attribute ${key}.`);\n cursor += 1;\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) cursor += 1;\n attributes[key] = decodeXmlEntities(tagBody.slice(valueStart, cursor));\n cursor += 1;\n }\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n while (cursor < xml.length) {\n const c = xml[cursor];\n if (quote) { if (c === quote) quote = null; cursor += 1; continue; }\n if (c === `\"` || c === `'`) { quote = c; cursor += 1; continue; }\n if (c === \">\") return cursor;\n cursor += 1;\n }\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\": return \"&\";\n case \"lt\": return \"<\";\n case \"gt\": return \">\";\n case \"quot\": return `\"`;\n case \"apos\": return `'`;\n default:\n if (entity.startsWith(\"#x\")) return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n if (entity.startsWith(\"#\")) return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n return match;\n }\n });\n}\n","export const HIGHLIGHT_COLOR_MAP = {\n black: \"000000\",\n blue: \"0000FF\",\n cyan: \"00FFFF\",\n darkBlue: \"000080\",\n darkCyan: \"008080\",\n darkGray: \"808080\",\n darkGreen: \"008000\",\n darkMagenta: \"800080\",\n darkRed: \"8B0000\",\n darkYellow: \"808000\",\n green: \"00FF00\",\n lightGray: \"C0C0C0\",\n magenta: \"FF00FF\",\n red: \"FF0000\",\n white: \"FFFFFF\",\n yellow: \"FFFF00\",\n} as const;\n\nexport type HighlightColorName = keyof typeof HIGHLIGHT_COLOR_MAP;\n\nexport function resolveHighlightColor(\n value: string | null | undefined,\n): { color: string; val: HighlightColorName } | undefined {\n if (!value || value === \"none\") {\n return undefined;\n }\n\n const normalizedValue = value as HighlightColorName;\n const color = HIGHLIGHT_COLOR_MAP[normalizedValue];\n if (!color) {\n return undefined;\n }\n\n return {\n color,\n val: normalizedValue,\n };\n}\n","import type {\n BorderSpec,\n TextMark,\n ParagraphBorders,\n ParagraphShading,\n ParagraphSpacing,\n ParagraphIndentation,\n TabStop,\n TableLook,\n TableWidth,\n SectionProperties,\n PageSize,\n PageMargins,\n ColumnProperties,\n PageNumbering,\n HeaderFooterReference,\n HeaderFooterVariant,\n SectionDocumentGrid,\n SectionLineNumbering,\n SectionPageBorders,\n} from \"../../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"./part-manifest.ts\";\nimport {\n parseInlineMediaXml,\n type InlineMediaPart,\n} from \"./parse-inline-media.ts\";\nimport { toCanonicalNumberingInstanceId } from \"./parse-numbering.ts\";\nimport { parseComplexContentXml } from \"./parse-complex-content.ts\";\nimport { parseShapeXml, parseVmlXml } from \"./parse-shapes.ts\";\nimport { classifyFieldInstruction } from \"./parse-fields.ts\";\nimport { resolveHighlightColor } from \"./highlight-colors.ts\";\n\nexport interface ParsedMainDocument {\n blocks: ParsedBlockNode[];\n finalSectionProperties?: SectionProperties;\n}\n\nexport type ParsedBlockNode =\n | ParsedParagraphNode\n | ParsedTableBlockNode\n | ParsedSdtNode\n | ParsedCustomXmlNode\n | ParsedAltChunkNode\n | ParsedSectionBreakNode\n | ParsedOpaqueBlockNode;\n\nexport interface ParsedSectionBreakNode {\n type: \"section_break\";\n sectionPropertiesXml: string;\n sectionProperties: SectionProperties;\n}\n\nexport interface ParsedParagraphNode {\n type: \"paragraph\";\n styleId?: string;\n numbering?: {\n numberingInstanceId: string;\n level: number;\n };\n alignment?: \"left\" | \"center\" | \"right\" | \"both\" | \"distribute\";\n spacing?: ParagraphSpacing;\n contextualSpacing?: boolean;\n indentation?: ParagraphIndentation;\n tabStops?: TabStop[];\n keepNext?: boolean;\n keepLines?: boolean;\n outlineLevel?: number;\n pageBreakBefore?: boolean;\n widowControl?: boolean;\n borders?: ParagraphBorders;\n shading?: ParagraphShading;\n bidi?: boolean;\n suppressLineNumbers?: boolean;\n cnfStyle?: string;\n sectionProperties?: SectionProperties;\n sectionPropertiesXml?: string;\n children: ParsedInlineNode[];\n rawXml: string;\n}\n\nexport type ParsedInlineNode =\n | ParsedTextNode\n | ParsedBreakNode\n | ParsedColumnBreakNode\n | ParsedTabNode\n | ParsedSymbolNode\n | ParsedImageNode\n | ParsedHyperlinkNode\n | ParsedOpaqueInlineNode\n | ParsedChartPreviewNode\n | ParsedSmartArtPreviewNode\n | ParsedShapeInlineNode\n | ParsedWordArtInlineNode\n | ParsedVmlShapeInlineNode\n | ParsedBookmarkStartInlineNode\n | ParsedBookmarkEndInlineNode\n | ParsedFootnoteRefInlineNode\n | ParsedFieldInlineNode\n | ParsedPermStartInlineNode\n | ParsedPermEndInlineNode;\n\nexport interface ParsedTextNode {\n type: \"text\";\n text: string;\n marks?: TextMark[];\n}\n\nexport interface ParsedBreakNode {\n type: \"hard_break\";\n}\n\nexport interface ParsedColumnBreakNode {\n type: \"column_break\";\n}\n\nexport interface ParsedTabNode {\n type: \"tab\";\n}\n\nexport interface ParsedSymbolNode {\n type: \"symbol\";\n char: string;\n font?: string;\n marks?: TextMark[];\n}\n\nexport interface ParsedImageNode {\n type: \"image\";\n mediaId: string;\n relationshipId?: string;\n packagePartName?: string;\n contentType?: string;\n filename?: string;\n altText?: string;\n widthEmu?: number;\n heightEmu?: number;\n placementXml?: string;\n display?: \"inline\" | \"floating\";\n floating?: {\n horizontalPosition?: {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n };\n verticalPosition?: {\n relativeFrom?: string;\n align?: string;\n offset?: number;\n };\n wrap?: \"none\" | \"square\" | \"tight\" | \"through\" | \"topAndBottom\";\n behindDoc?: boolean;\n layoutInCell?: boolean;\n allowOverlap?: boolean;\n };\n}\n\nexport interface ParsedHyperlinkNode {\n type: \"hyperlink\";\n href: string;\n children: Array<ParsedTextNode | ParsedBreakNode | ParsedColumnBreakNode | ParsedTabNode | ParsedSymbolNode>;\n rawXml: string;\n}\n\nexport interface ParsedOpaqueInlineNode {\n type: \"opaque_inline\";\n rawXml: string;\n}\n\nexport interface ParsedChartPreviewNode {\n type: \"chart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\nexport interface ParsedSmartArtPreviewNode {\n type: \"smartart_preview\";\n previewMediaId?: string;\n rawXml: string;\n}\n\nexport interface ParsedShapeInlineNode {\n type: \"shape\";\n text?: string;\n geometry?: string;\n isTextBox?: boolean;\n rawXml: string;\n}\n\nexport interface ParsedWordArtInlineNode {\n type: \"wordart\";\n text: string;\n geometry?: string;\n rawXml: string;\n}\n\nexport interface ParsedVmlShapeInlineNode {\n type: \"vml_shape\";\n text?: string;\n shapeType?: string;\n rawXml: string;\n}\n\nexport interface ParsedBookmarkStartInlineNode {\n type: \"bookmark_start\";\n bookmarkId: string;\n name: string;\n rawXml: string;\n}\n\nexport interface ParsedBookmarkEndInlineNode {\n type: \"bookmark_end\";\n bookmarkId: string;\n rawXml: string;\n}\n\nexport interface ParsedFootnoteRefInlineNode {\n type: \"footnote_ref\";\n noteId: string;\n noteKind: \"footnote\" | \"endnote\";\n}\n\nexport interface ParsedFieldInlineNode {\n type: \"field\";\n fieldType: \"simple\" | \"complex\";\n instruction: string;\n contentXml?: string;\n children?: Array<ParsedTextNode | ParsedBreakNode | ParsedTabNode>;\n rawXml: string;\n}\n\nexport interface ParsedPermStartInlineNode {\n type: \"perm_start\";\n rangeId: string;\n editorGroup?: string;\n editor?: string;\n rawXml: string;\n}\n\nexport interface ParsedPermEndInlineNode {\n type: \"perm_end\";\n rangeId: string;\n rawXml: string;\n}\n\nexport interface ParsedOpaqueBlockNode {\n type: \"opaque_block\";\n rawXml: string;\n}\n\nexport interface ParsedSdtCheckboxState {\n checked: boolean;\n checkedChar?: string;\n uncheckedChar?: string;\n}\n\nexport interface ParsedSdtDatePickerState {\n fullDate?: string;\n dateFormat?: string;\n lid?: string;\n}\n\nexport interface ParsedSdtDropdownListItem {\n displayText?: string;\n value: string;\n}\n\nexport interface ParsedSdtNode {\n type: \"sdt\";\n properties: {\n sdtType?: string;\n alias?: string;\n tag?: string;\n lock?: string;\n propertiesXml?: string;\n checkbox?: ParsedSdtCheckboxState;\n datePicker?: ParsedSdtDatePickerState;\n dropdownList?: ParsedSdtDropdownListItem[];\n comboBox?: ParsedSdtDropdownListItem[];\n showingPlcHdr?: boolean;\n };\n children: ParsedBlockNode[];\n rawXml: string;\n}\n\nexport interface ParsedCustomXmlNode {\n type: \"custom_xml\";\n uri?: string;\n element?: string;\n children: ParsedBlockNode[];\n rawXml: string;\n}\n\nexport interface ParsedAltChunkNode {\n type: \"alt_chunk\";\n relationshipId: string;\n rawXml: string;\n}\n\nexport interface ParsedTableBlockNode {\n type: \"table\";\n styleId?: string;\n tblLook?: TableLook;\n propertiesXml?: string;\n gridColumns: number[];\n rows: ParsedTableRowNode[];\n rawXml: string;\n}\n\nexport interface ParsedTableRowNode {\n type: \"table_row\";\n propertiesXml?: string;\n cells: ParsedTableCellNode[];\n gridBefore?: number;\n widthBefore?: TableWidth;\n gridAfter?: number;\n widthAfter?: TableWidth;\n rawXml: string;\n}\n\nexport interface ParsedTableCellNode {\n type: \"table_cell\";\n propertiesXml?: string;\n gridSpan?: number;\n verticalMerge?: \"restart\" | \"continue\";\n children: ParsedBlockNode[];\n rawXml: string;\n}\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\ninterface RunParseResult {\n nodes: Array<ParsedTextNode | ParsedBreakNode | ParsedColumnBreakNode | ParsedTabNode | ParsedSymbolNode>;\n supported: boolean;\n}\n\ninterface MarksParseResult {\n marks: TextMark[];\n supported: boolean;\n}\n\nconst HYPERLINK_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\n\nexport function parseMainDocumentXml(\n xml: string,\n relationships: readonly OpcRelationship[] = [],\n mediaParts: ReadonlyMap<string, InlineMediaPart> = new Map(),\n sourcePartPath = \"/word/document.xml\",\n): ParsedMainDocument {\n const root = parseXml(xml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const relationshipMap = new Map(relationships.map((relationship) => [relationship.id, relationship]));\n\n const allBlocks = bodyElement.children\n .filter((node): node is XmlElementNode => node.type === \"element\")\n .map((node) => parseBodyChild(node, xml, relationshipMap, relationships, mediaParts, sourcePartPath));\n\n // The last body-level sectPr is the final section properties (not an intermediate section break).\n // Extract it from the blocks list and store it separately.\n let finalSectionProperties: SectionProperties | undefined;\n const blocks: ParsedBlockNode[] = [];\n for (let i = 0; i < allBlocks.length; i++) {\n const block = allBlocks[i];\n if (block.type === \"section_break\" && i === allBlocks.length - 1) {\n finalSectionProperties = block.sectionProperties;\n } else {\n blocks.push(block);\n }\n }\n\n return { blocks, finalSectionProperties };\n}\n\nfunction parseBodyChild(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedBlockNode {\n const nodeType = localName(node.name);\n\n if (nodeType === \"tbl\") {\n // Tables with revision markup (tracked changes inside cells) stay opaque\n // to preserve fidelity until revision-aware table editing is implemented\n const rawTableXml = sourceXml.slice(node.start, node.end);\n if (tableRequiresOpaquePreservation(rawTableXml)) {\n return {\n type: \"opaque_block\",\n rawXml: rawTableXml,\n };\n }\n try {\n return parseTableElement(node, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath);\n } catch {\n // If table parsing fails for any reason, fall back to opaque preservation\n return {\n type: \"opaque_block\",\n rawXml: rawTableXml,\n };\n }\n }\n\n if (nodeType === \"sdt\") {\n return parseSdtElement(node, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath);\n }\n\n if (nodeType === \"customXml\") {\n return parseCustomXmlElement(node, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath);\n }\n\n if (nodeType === \"altChunk\") {\n return parseAltChunkElement(node, sourceXml);\n }\n\n if (nodeType === \"sectPr\") {\n return parseSectionBreakElement(node, sourceXml);\n }\n\n if (nodeType !== \"p\") {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n let styleId: string | undefined;\n let numbering: ParsedParagraphNode[\"numbering\"];\n let alignment: ParsedParagraphNode[\"alignment\"];\n let spacing: ParsedParagraphNode[\"spacing\"];\n let contextualSpacing: ParsedParagraphNode[\"contextualSpacing\"];\n let indentation: ParsedParagraphNode[\"indentation\"];\n let tabStops: ParsedParagraphNode[\"tabStops\"];\n let keepNext: ParsedParagraphNode[\"keepNext\"];\n let keepLines: ParsedParagraphNode[\"keepLines\"];\n let outlineLevel: ParsedParagraphNode[\"outlineLevel\"];\n let pageBreakBefore: ParsedParagraphNode[\"pageBreakBefore\"];\n let widowControl: ParsedParagraphNode[\"widowControl\"];\n let borders: ParsedParagraphNode[\"borders\"];\n let shading: ParsedParagraphNode[\"shading\"];\n let bidi: ParsedParagraphNode[\"bidi\"];\n let suppressLineNumbers: ParsedParagraphNode[\"suppressLineNumbers\"];\n let cnfStyle: ParsedParagraphNode[\"cnfStyle\"];\n let sectionProperties: SectionProperties | undefined;\n let sectionPropertiesXml: string | undefined;\n let paragraphSupported = true;\n const children: ParsedInlineNode[] = [];\n let activeComplexField: {\n instruction: string;\n children: Array<ParsedTextNode | ParsedBreakNode | ParsedTabNode>;\n mode: \"instruction\" | \"result\";\n } | null = null;\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"pPr\":\n styleId = readParagraphStyleId(child);\n numbering = readParagraphNumbering(child);\n alignment = readParagraphAlignment(child);\n spacing = readParagraphSpacing(child);\n contextualSpacing = readOptionalOnOffParagraphProperty(child, \"contextualSpacing\");\n indentation = readParagraphIndentation(child);\n tabStops = readParagraphTabStops(child);\n keepNext = readOnOffParagraphProperty(child, \"keepNext\");\n keepLines = readOnOffParagraphProperty(child, \"keepLines\");\n outlineLevel = readParagraphOutlineLevel(child);\n pageBreakBefore = readOnOffParagraphProperty(child, \"pageBreakBefore\");\n widowControl = readOnOffParagraphProperty(child, \"widowControl\");\n borders = readParagraphBorders(child);\n shading = readParagraphShading(child);\n bidi = readOnOffParagraphProperty(child, \"bidi\");\n suppressLineNumbers = readOnOffParagraphProperty(child, \"suppressLineNumbers\");\n cnfStyle = readParagraphCnfStyle(child);\n sectionProperties = readSectionPropertiesFromPPr(child);\n sectionPropertiesXml = readSectionPropertiesXmlFromPPr(child, sourceXml);\n paragraphSupported = paragraphSupported && supportsParagraphProperties(child);\n break;\n case \"r\":\n activeComplexField = appendParagraphRunNodes(\n child,\n children,\n activeComplexField,\n sourceXml,\n relationships,\n mediaParts,\n sourcePartPath,\n );\n break;\n case \"hyperlink\": {\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n const hyperlink = parseHyperlink(child, sourceXml, relationshipMap);\n children.push(hyperlink);\n break;\n }\n case \"ins\":\n case \"del\": {\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push(...parseRevisionContainer(child, sourceXml, relationshipMap));\n break;\n }\n case \"commentRangeStart\":\n case \"commentRangeEnd\":\n break;\n case \"bookmarkStart\": {\n const bkId = child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n const bkName = child.attributes[\"w:name\"] ?? child.attributes.name ?? \"\";\n if (bkId) {\n const bookmarkNode = {\n type: \"bookmark_start\",\n bookmarkId: bkId,\n name: bkName,\n rawXml: sourceXml.slice(child.start, child.end),\n } as ParsedBookmarkStartInlineNode;\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push(bookmarkNode);\n } else {\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push({ type: \"opaque_inline\", rawXml: sourceXml.slice(child.start, child.end) });\n }\n break;\n }\n case \"bookmarkEnd\": {\n const bkEndId = child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (bkEndId) {\n const bookmarkNode = {\n type: \"bookmark_end\",\n bookmarkId: bkEndId,\n rawXml: sourceXml.slice(child.start, child.end),\n } as ParsedBookmarkEndInlineNode;\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push(bookmarkNode);\n } else {\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push({ type: \"opaque_inline\", rawXml: sourceXml.slice(child.start, child.end) });\n }\n break;\n }\n case \"fldSimple\": {\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n const fieldInstr = child.attributes[\"w:instr\"] ?? child.attributes.instr ?? \"\";\n const fieldContentXml = child.children\n .filter((c): c is XmlElementNode => c.type === \"element\")\n .map((c) => sourceXml.slice(c.start, c.end))\n .join(\"\");\n children.push({\n type: \"field\",\n fieldType: \"simple\",\n instruction: fieldInstr,\n contentXml: fieldContentXml,\n rawXml: sourceXml.slice(child.start, child.end),\n } as ParsedFieldInlineNode);\n break;\n }\n case \"proofErr\":\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n case \"permStart\":\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push(parsePermStartNode(child, sourceXml));\n break;\n case \"permEnd\":\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push(parsePermEndNode(child, sourceXml));\n break;\n case \"footnoteReference\": {\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n const noteId = child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n children.push({\n type: \"footnote_ref\",\n noteId,\n noteKind: \"footnote\",\n });\n }\n break;\n }\n case \"endnoteReference\": {\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n const noteId = child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n children.push({\n type: \"footnote_ref\",\n noteId,\n noteKind: \"endnote\",\n });\n }\n break;\n }\n default:\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n children.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n }\n }\n\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n\n if (!paragraphSupported) {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n return {\n type: \"paragraph\",\n styleId,\n ...(numbering ? { numbering } : {}),\n ...(alignment ? { alignment } : {}),\n ...(spacing ? { spacing } : {}),\n ...(contextualSpacing !== undefined ? { contextualSpacing } : {}),\n ...(indentation ? { indentation } : {}),\n ...(tabStops && tabStops.length > 0 ? { tabStops } : {}),\n ...(keepNext ? { keepNext } : {}),\n ...(keepLines ? { keepLines } : {}),\n ...(outlineLevel !== undefined ? { outlineLevel } : {}),\n ...(pageBreakBefore ? { pageBreakBefore } : {}),\n ...(widowControl ? { widowControl } : {}),\n ...(borders ? { borders } : {}),\n ...(shading ? { shading } : {}),\n ...(bidi ? { bidi } : {}),\n ...(suppressLineNumbers ? { suppressLineNumbers } : {}),\n ...(cnfStyle ? { cnfStyle } : {}),\n ...(sectionProperties ? { sectionProperties } : {}),\n ...(sectionPropertiesXml ? { sectionPropertiesXml } : {}),\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction appendParagraphRunNodes(\n node: XmlElementNode,\n children: ParsedInlineNode[],\n activeComplexField: {\n instruction: string;\n children: Array<ParsedTextNode | ParsedBreakNode | ParsedTabNode>;\n mode: \"instruction\" | \"result\";\n } | null,\n sourceXml: string,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): {\n instruction: string;\n children: Array<ParsedTextNode | ParsedBreakNode | ParsedTabNode>;\n mode: \"instruction\" | \"result\";\n} | null {\n const hasFieldMarkers = node.children.some(\n (child) =>\n child.type === \"element\" &&\n (localName(child.name) === \"fldChar\" || localName(child.name) === \"instrText\"),\n );\n\n if (activeComplexField?.mode === \"result\" && !hasFieldMarkers) {\n const run = parseRunContentOnly(node, sourceXml);\n if (\n run.supported &&\n run.nodes.every(\n (child) =>\n child.type === \"text\" || child.type === \"hard_break\" || child.type === \"tab\",\n )\n ) {\n activeComplexField.children.push(...run.nodes);\n return activeComplexField;\n }\n }\n\n if (!hasFieldMarkers) {\n children.push(...parseRun(node, sourceXml, relationships, mediaParts, sourcePartPath));\n return activeComplexField;\n }\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"fldChar\") {\n const fldType = child.attributes[\"w:fldCharType\"] ?? child.attributes.fldCharType;\n if (fldType === \"begin\") {\n activeComplexField = { instruction: \"\", children: [], mode: \"instruction\" };\n } else if (fldType === \"separate\" && activeComplexField) {\n activeComplexField.mode = \"result\";\n } else if (fldType === \"end\" && activeComplexField) {\n flushActiveComplexField(children, () => {\n activeComplexField = null;\n }, activeComplexField);\n }\n continue;\n }\n\n if (name === \"instrText\") {\n const instruction = child.children\n .filter((entry): entry is XmlTextNode => entry.type === \"text\")\n .map((entry) => entry.text)\n .join(\"\");\n if (activeComplexField) {\n activeComplexField.instruction += instruction;\n } else if (instruction.trim().length > 0) {\n children.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction,\n children: [],\n rawXml: sourceXml.slice(node.start, node.end),\n });\n }\n continue;\n }\n }\n\n return activeComplexField;\n}\n\nfunction flushActiveComplexField(\n children: ParsedInlineNode[],\n reset: () => void,\n activeComplexField: {\n instruction: string;\n children: Array<ParsedTextNode | ParsedBreakNode | ParsedTabNode>;\n mode: \"instruction\" | \"result\";\n } | null,\n): void {\n if (!activeComplexField || activeComplexField.instruction.trim().length === 0) {\n return;\n }\n\n children.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n rawXml: \"\",\n });\n reset();\n}\n\nfunction parseTableElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedTableBlockNode {\n let styleId: string | undefined;\n let tblLook: TableLook | undefined;\n let propertiesXml: string | undefined;\n let gridColumns: number[] = [];\n const rows: ParsedTableRowNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n\n switch (localName(child.name)) {\n case \"tblPr\": {\n propertiesXml = sourceXml.slice(child.start, child.end);\n styleId = readTableStyleId(child);\n tblLook = readTableLook(child);\n break;\n }\n case \"tblGrid\": {\n gridColumns = readTableGridColumns(child);\n break;\n }\n case \"tr\": {\n rows.push(parseTableRowElement(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n break;\n }\n }\n }\n\n return {\n type: \"table\",\n ...(styleId ? { styleId } : {}),\n ...(tblLook ? { tblLook } : {}),\n ...(propertiesXml ? { propertiesXml } : {}),\n gridColumns,\n rows,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseTableRowElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedTableRowNode {\n let propertiesXml: string | undefined;\n let gridBefore: number | undefined;\n let widthBefore: TableWidth | undefined;\n let gridAfter: number | undefined;\n let widthAfter: TableWidth | undefined;\n const cells: ParsedTableCellNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n\n switch (localName(child.name)) {\n case \"trPr\":\n propertiesXml = sourceXml.slice(child.start, child.end);\n gridBefore = readTableRowGridPosition(child, \"gridBefore\");\n widthBefore = readTableRowWidth(child, \"wBefore\");\n gridAfter = readTableRowGridPosition(child, \"gridAfter\");\n widthAfter = readTableRowWidth(child, \"wAfter\");\n break;\n case \"tc\":\n cells.push(parseTableCellElement(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n break;\n }\n }\n\n return {\n type: \"table_row\",\n ...(propertiesXml ? { propertiesXml } : {}),\n ...(gridBefore !== undefined ? { gridBefore } : {}),\n ...(widthBefore ? { widthBefore } : {}),\n ...(gridAfter !== undefined ? { gridAfter } : {}),\n ...(widthAfter ? { widthAfter } : {}),\n cells,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseTableCellElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedTableCellNode {\n let propertiesXml: string | undefined;\n let gridSpan: number | undefined;\n let verticalMerge: \"restart\" | \"continue\" | undefined;\n const children: ParsedBlockNode[] = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n\n switch (localName(child.name)) {\n case \"tcPr\": {\n propertiesXml = sourceXml.slice(child.start, child.end);\n gridSpan = readCellGridSpan(child);\n verticalMerge = readCellVerticalMerge(child);\n break;\n }\n default: {\n // Everything else in a cell is a block child (paragraphs, nested tables, etc.)\n children.push(parseBodyChild(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n break;\n }\n }\n }\n\n return {\n type: \"table_cell\",\n ...(propertiesXml ? { propertiesXml } : {}),\n ...(gridSpan ? { gridSpan } : {}),\n ...(verticalMerge ? { verticalMerge } : {}),\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseSdtElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedBlockNode {\n const propertiesNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"sdtPr\",\n );\n const contentNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"sdtContent\",\n );\n\n if (!contentNode) {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n const children = contentNode.children\n .filter((child): child is XmlElementNode => child.type === \"element\")\n .map((child) => parseBodyChild(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n\n return {\n type: \"sdt\",\n properties: readSdtProperties(propertiesNode, sourceXml),\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseCustomXmlElement(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedBlockNode {\n const uri = readOptionalAttribute(node, \"uri\");\n const element = readOptionalAttribute(node, \"element\");\n if (!uri && !element) {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n const children = node.children\n .filter(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) !== \"customXmlPr\",\n )\n .map((child) => parseBodyChild(child, sourceXml, relationshipMap, relationships, mediaParts, sourcePartPath));\n\n return {\n type: \"custom_xml\",\n ...(uri ? { uri } : {}),\n ...(element ? { element } : {}),\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseAltChunkElement(\n node: XmlElementNode,\n sourceXml: string,\n): ParsedBlockNode {\n const relationshipId = readOptionalAttribute(node, \"id\");\n if (!relationshipId) {\n return {\n type: \"opaque_block\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n return {\n type: \"alt_chunk\",\n relationshipId,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction readSdtProperties(\n node: XmlElementNode | undefined,\n sourceXml: string,\n): ParsedSdtNode[\"properties\"] {\n if (!node) {\n return {};\n }\n\n const properties: ParsedSdtNode[\"properties\"] = {\n propertiesXml: sourceXml.slice(node.start, node.end),\n };\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"alias\") {\n properties.alias = readOptionalAttribute(child, \"val\");\n continue;\n }\n if (name === \"tag\") {\n properties.tag = readOptionalAttribute(child, \"val\");\n continue;\n }\n if (name === \"lock\") {\n properties.lock = readOptionalAttribute(child, \"val\");\n continue;\n }\n if (name === \"showingPlcHdr\") {\n const val = readOptionalAttribute(child, \"val\");\n properties.showingPlcHdr = val !== \"false\" && val !== \"0\";\n continue;\n }\n\n // Checkbox (w14:checkbox)\n if (name === \"checkbox\") {\n properties.sdtType = \"checkbox\";\n const checkedNode = findFirstDescendant(child, \"checked\");\n const checkedVal = checkedNode ? (readOptionalAttribute(checkedNode, \"val\") ?? \"0\") : \"0\";\n const checkedCharNode = findFirstDescendant(child, \"checkedState\");\n const uncheckedCharNode = findFirstDescendant(child, \"uncheckedState\");\n properties.checkbox = {\n checked: checkedVal === \"1\" || checkedVal === \"true\",\n ...(checkedCharNode ? { checkedChar: readOptionalAttribute(checkedCharNode, \"val\") } : {}),\n ...(uncheckedCharNode ? { uncheckedChar: readOptionalAttribute(uncheckedCharNode, \"val\") } : {}),\n };\n continue;\n }\n\n // Date picker\n if (name === \"date\") {\n properties.sdtType = \"date\";\n const fullDate = readOptionalAttribute(child, \"fullDate\");\n const dateFormatNode = findFirstChild(child, \"dateFormat\");\n const lidNode = findFirstChild(child, \"lid\");\n properties.datePicker = {\n ...(fullDate ? { fullDate } : {}),\n ...(dateFormatNode ? { dateFormat: readOptionalAttribute(dateFormatNode, \"val\") } : {}),\n ...(lidNode ? { lid: readOptionalAttribute(lidNode, \"val\") } : {}),\n };\n continue;\n }\n\n // Dropdown list\n if (name === \"dropDownList\") {\n properties.sdtType = \"dropDownList\";\n properties.dropdownList = readSdtListItems(child);\n continue;\n }\n\n // Combo box\n if (name === \"comboBox\") {\n properties.sdtType = \"comboBox\";\n properties.comboBox = readSdtListItems(child);\n continue;\n }\n\n // Plain text\n if (name === \"text\") {\n properties.sdtType = \"plainText\";\n continue;\n }\n\n // Rich text (richText element is the default, but if explicitly present, tag it)\n if (name === \"richText\") {\n properties.sdtType = \"richText\";\n continue;\n }\n\n if (!properties.sdtType && name !== \"id\" && name !== \"placeholder\" && name !== \"showingPlcHdr\" && name !== \"rPr\") {\n properties.sdtType = name;\n }\n }\n\n return properties;\n}\n\nfunction readSdtListItems(node: XmlElementNode): ParsedSdtDropdownListItem[] {\n const items: ParsedSdtDropdownListItem[] = [];\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"listItem\") continue;\n const value = readOptionalAttribute(child, \"value\") ?? \"\";\n const displayText = readOptionalAttribute(child, \"displayText\");\n items.push({ value, ...(displayText ? { displayText } : {}) });\n }\n return items;\n}\n\nfunction findFirstChild(node: XmlElementNode, local: string): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type === \"element\" && localName(child.name) === local) return child;\n }\n return undefined;\n}\n\nfunction findFirstDescendant(node: XmlElementNode, local: string): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n if (localName(child.name) === local) return child;\n const nested = findFirstDescendant(child, local);\n if (nested) return nested;\n }\n return undefined;\n}\n\nfunction readTableStyleId(node: XmlElementNode): string | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tblStyle\") continue;\n const styleId = child.attributes[\"w:val\"] ?? child.attributes.val;\n if (styleId) return styleId;\n }\n return undefined;\n}\n\nfunction readTableLook(node: XmlElementNode): TableLook | undefined {\n const tblLookNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"tblLook\",\n );\n if (!tblLookNode) {\n return undefined;\n }\n\n const tableLook: TableLook = {};\n const val = tblLookNode.attributes[\"w:val\"] ?? tblLookNode.attributes.val;\n if (val) {\n tableLook.val = val;\n }\n for (const [attribute, key] of [\n [\"w:firstRow\", \"firstRow\"],\n [\"w:lastRow\", \"lastRow\"],\n [\"w:firstColumn\", \"firstColumn\"],\n [\"w:lastColumn\", \"lastColumn\"],\n [\"w:noHBand\", \"noHBand\"],\n [\"w:noVBand\", \"noVBand\"],\n ] as const) {\n const fallback = attribute.replace(\"w:\", \"\");\n const raw = tblLookNode.attributes[attribute] ?? tblLookNode.attributes[fallback];\n if (raw !== undefined) {\n tableLook[key] = raw !== \"0\" && raw !== \"false\" && raw !== \"off\";\n }\n }\n\n return Object.keys(tableLook).length > 0 ? tableLook : undefined;\n}\n\nfunction readTableGridColumns(node: XmlElementNode): number[] {\n return node.children\n .filter((child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"gridCol\")\n .map((child) => {\n const raw = child.attributes[\"w:w\"] ?? child.attributes.w ?? \"0\";\n const value = Number.parseInt(raw, 10);\n return Number.isFinite(value) && value > 0 ? value : 0;\n });\n}\n\n/**\n * Check if a table's raw XML contains content that cannot safely round-trip\n * through the parsed table path yet. This includes:\n * - Revision markup (tracked changes inside cells)\n * - Field syntax and smart tags that still lack a safe table-local live model\n * - Grid geometry tags that the table serializer does not reconstruct yet\n *\n * Tables matching this check stay opaque until the respective features\n * are implemented in the table editing path.\n */\nfunction tableRequiresOpaquePreservation(rawXml: string): boolean {\n // Safe table-local content now includes hyperlinks, bookmarks, comments,\n // nested tables, floating images, VML preview atoms, and bounded field\n // families already owned by the current field slice. Risky table-local\n // semantics still fail closed to preserve-only.\n if (/<w:(ins|del|rPrChange|pPrChange|tblPrChange|trPrChange|tcPrChange|sectPrChange|cellIns|cellDel|cellMerge|smartTag|tblCellSpacing)\\b/.test(rawXml)) {\n return true;\n }\n\n const simpleInstructions = [...rawXml.matchAll(/\\bw:instr=\"([^\"]*)\"/g)].map((match) => match[1] ?? \"\");\n const complexInstructions = extractComplexFieldInstructions(rawXml);\n for (const instruction of [...simpleInstructions, ...complexInstructions]) {\n const classification = classifyFieldInstruction(instruction);\n if (!isSafeMainStoryTableFieldFamily(classification.family)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction isSafeMainStoryTableFieldFamily(family: string): boolean {\n return (\n family === \"REF\" ||\n family === \"PAGEREF\" ||\n family === \"NOTEREF\" ||\n family === \"TOC\" ||\n family === \"PAGE\" ||\n family === \"NUMPAGES\"\n );\n}\n\nfunction extractComplexFieldInstructions(rawXml: string): string[] {\n const tokenPattern =\n /<(?:\\w+:)?fldChar\\b[^>]*?(?:\\w+:)?fldCharType=\"(begin|separate|end)\"[^>]*?(?:\\/>|>[\\s\\S]*?<\\/(?:\\w+:)?fldChar>)|<(?:\\w+:)?instrText\\b[^>]*>([\\s\\S]*?)<\\/(?:\\w+:)?instrText>/gu;\n const instructions: string[] = [];\n let activeInstruction = \"\";\n let capturingInstruction = false;\n\n for (const match of rawXml.matchAll(tokenPattern)) {\n const fldCharType = match[1];\n const instrText = match[2];\n if (fldCharType === \"begin\") {\n activeInstruction = \"\";\n capturingInstruction = true;\n continue;\n }\n if (fldCharType === \"separate\" || fldCharType === \"end\") {\n if (capturingInstruction && activeInstruction.trim().length > 0) {\n instructions.push(activeInstruction);\n }\n activeInstruction = \"\";\n capturingInstruction = false;\n continue;\n }\n if (capturingInstruction && instrText !== undefined) {\n activeInstruction += decodeXmlEntities(instrText);\n }\n }\n\n return instructions;\n}\n\nfunction readTableRowGridPosition(\n node: XmlElementNode,\n local: \"gridBefore\" | \"gridAfter\",\n): number | undefined {\n const positionNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === local,\n );\n if (!positionNode) return undefined;\n const raw = positionNode.attributes[\"w:val\"] ?? positionNode.attributes.val;\n const value = Number.parseInt(raw ?? \"\", 10);\n return Number.isFinite(value) && value > 0 ? value : 0;\n}\n\nfunction readTableRowWidth(\n node: XmlElementNode,\n local: \"wBefore\" | \"wAfter\",\n): TableWidth | undefined {\n const widthNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === local,\n );\n if (!widthNode) return undefined;\n const rawValue = widthNode.attributes[\"w:w\"] ?? widthNode.attributes.w;\n const value = Number.parseInt(rawValue ?? \"\", 10);\n if (!Number.isFinite(value)) {\n return undefined;\n }\n const rawType = (widthNode.attributes[\"w:type\"] ?? widthNode.attributes.type ?? \"dxa\").toLowerCase();\n const type: TableWidth[\"type\"] =\n rawType === \"auto\" ? \"auto\" : rawType === \"pct\" ? \"pct\" : rawType === \"nil\" ? \"nil\" : \"dxa\";\n return { value, type };\n}\n\nfunction readCellGridSpan(node: XmlElementNode): number | undefined {\n const gridSpanNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"gridSpan\",\n );\n if (!gridSpanNode) return undefined;\n const raw = gridSpanNode.attributes[\"w:val\"] ?? gridSpanNode.attributes.val;\n const value = Number.parseInt(raw ?? \"0\", 10);\n return Number.isFinite(value) && value > 1 ? value : undefined;\n}\n\nfunction readCellVerticalMerge(node: XmlElementNode): \"restart\" | \"continue\" | undefined {\n const vMergeNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"vMerge\",\n );\n if (!vMergeNode) return undefined;\n const raw = (vMergeNode.attributes[\"w:val\"] ?? vMergeNode.attributes.val ?? \"continue\").toLowerCase();\n return raw === \"restart\" ? \"restart\" : \"continue\";\n}\n\nfunction readParagraphAlignment(node: XmlElementNode): ParsedParagraphNode[\"alignment\"] {\n const jcNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"jc\",\n );\n if (!jcNode) return undefined;\n const val = (jcNode.attributes[\"w:val\"] ?? jcNode.attributes.val ?? \"\").toLowerCase();\n if (val === \"left\" || val === \"center\" || val === \"right\" || val === \"both\" || val === \"distribute\") {\n return val;\n }\n return undefined;\n}\n\nfunction readParagraphSpacing(node: XmlElementNode): ParagraphSpacing | undefined {\n const spacingNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"spacing\",\n );\n if (!spacingNode) return undefined;\n\n const spacing: ParagraphSpacing = {};\n const before = spacingNode.attributes[\"w:before\"] ?? spacingNode.attributes.before;\n const after = spacingNode.attributes[\"w:after\"] ?? spacingNode.attributes.after;\n const line = spacingNode.attributes[\"w:line\"] ?? spacingNode.attributes.line;\n const lineRule = spacingNode.attributes[\"w:lineRule\"] ?? spacingNode.attributes.lineRule;\n\n if (before !== undefined) {\n const v = Number.parseInt(before, 10);\n if (Number.isFinite(v)) spacing.before = v;\n }\n if (after !== undefined) {\n const v = Number.parseInt(after, 10);\n if (Number.isFinite(v)) spacing.after = v;\n }\n if (line !== undefined) {\n const v = Number.parseInt(line, 10);\n if (Number.isFinite(v)) spacing.line = v;\n }\n if (lineRule !== undefined) {\n const lr = lineRule.toLowerCase();\n if (lr === \"auto\" || lr === \"exact\") {\n spacing.lineRule = lr;\n } else if (lr === \"atleast\") {\n spacing.lineRule = \"atLeast\";\n }\n }\n\n if (\n spacing.before === undefined &&\n spacing.after === undefined &&\n spacing.line === undefined &&\n spacing.lineRule === undefined\n ) {\n return undefined;\n }\n return spacing;\n}\n\nfunction readParagraphIndentation(node: XmlElementNode): ParagraphIndentation | undefined {\n const indNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"ind\",\n );\n if (!indNode) return undefined;\n\n const indentation: ParagraphIndentation = {};\n const left = indNode.attributes[\"w:left\"] ?? indNode.attributes.left;\n const right = indNode.attributes[\"w:right\"] ?? indNode.attributes.right;\n const firstLine = indNode.attributes[\"w:firstLine\"] ?? indNode.attributes.firstLine;\n const hanging = indNode.attributes[\"w:hanging\"] ?? indNode.attributes.hanging;\n\n if (left !== undefined) {\n const v = Number.parseInt(left, 10);\n if (Number.isFinite(v)) indentation.left = v;\n }\n if (right !== undefined) {\n const v = Number.parseInt(right, 10);\n if (Number.isFinite(v)) indentation.right = v;\n }\n if (firstLine !== undefined) {\n const v = Number.parseInt(firstLine, 10);\n if (Number.isFinite(v)) indentation.firstLine = v;\n }\n if (hanging !== undefined) {\n const v = Number.parseInt(hanging, 10);\n if (Number.isFinite(v)) indentation.hanging = v;\n }\n\n if (\n indentation.left === undefined &&\n indentation.right === undefined &&\n indentation.firstLine === undefined &&\n indentation.hanging === undefined\n ) {\n return undefined;\n }\n return indentation;\n}\n\nfunction readParagraphTabStops(node: XmlElementNode): TabStop[] | undefined {\n const tabsNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"tabs\",\n );\n if (!tabsNode) return undefined;\n\n const tabStops: TabStop[] = [];\n for (const child of tabsNode.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tab\") continue;\n const pos = child.attributes[\"w:pos\"] ?? child.attributes.pos;\n const val = (child.attributes[\"w:val\"] ?? child.attributes.val ?? \"left\").toLowerCase();\n const leader = (child.attributes[\"w:leader\"] ?? child.attributes.leader ?? \"none\").toLowerCase();\n\n if (pos === undefined) continue;\n const position = Number.parseInt(pos, 10);\n if (!Number.isFinite(position)) continue;\n\n const align = ([\"left\", \"center\", \"right\", \"decimal\", \"bar\", \"clear\"] as const).includes(\n val as \"left\" | \"center\" | \"right\" | \"decimal\" | \"bar\" | \"clear\",\n )\n ? (val as TabStop[\"align\"])\n : \"left\";\n\n const leaderValue =\n leader === \"none\" ||\n leader === \"dot\" ||\n leader === \"hyphen\" ||\n leader === \"underscore\" ||\n leader === \"heavy\"\n ? (leader as Exclude<TabStop[\"leader\"], \"middleDot\">)\n : leader === \"middledot\"\n ? \"middleDot\"\n : undefined;\n\n tabStops.push({\n position,\n align,\n ...(leaderValue && leaderValue !== \"none\" ? { leader: leaderValue } : {}),\n });\n }\n\n return tabStops.length > 0 ? tabStops : undefined;\n}\n\nfunction readOnOffParagraphProperty(node: XmlElementNode, name: string): boolean | undefined {\n const propNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === name,\n );\n if (!propNode) return undefined;\n const val = (propNode.attributes[\"w:val\"] ?? propNode.attributes.val ?? \"true\").toLowerCase();\n return val !== \"false\" && val !== \"0\" && val !== \"off\" ? true : undefined;\n}\n\nfunction readOptionalOnOffParagraphProperty(\n node: XmlElementNode,\n name: string,\n): boolean | undefined {\n const propNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === name,\n );\n if (!propNode) return undefined;\n const val = (propNode.attributes[\"w:val\"] ?? propNode.attributes.val ?? \"true\").toLowerCase();\n return val !== \"false\" && val !== \"0\" && val !== \"off\";\n}\n\nfunction readParagraphOutlineLevel(node: XmlElementNode): number | undefined {\n const propNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"outlineLvl\",\n );\n if (!propNode) return undefined;\n const val = propNode.attributes[\"w:val\"] ?? propNode.attributes.val;\n if (val === undefined) return undefined;\n const level = Number.parseInt(val, 10);\n return Number.isFinite(level) ? level : undefined;\n}\n\nfunction readParagraphBorders(node: XmlElementNode): ParagraphBorders | undefined {\n const borderContainer = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"pBdr\",\n );\n if (!borderContainer) {\n return undefined;\n }\n\n const borders: ParagraphBorders = {};\n for (const [name, key] of [\n [\"top\", \"top\"],\n [\"left\", \"left\"],\n [\"bottom\", \"bottom\"],\n [\"right\", \"right\"],\n [\"bar\", \"bar\"],\n [\"between\", \"between\"],\n ] as const) {\n const borderNode = borderContainer.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === name,\n );\n if (borderNode) {\n const border = readBorder(borderNode);\n if (border) {\n borders[key] = border;\n }\n }\n }\n\n return Object.keys(borders).length > 0 ? borders : undefined;\n}\n\nfunction readParagraphShading(node: XmlElementNode): ParagraphShading | undefined {\n const shadingNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"shd\",\n );\n if (!shadingNode) {\n return undefined;\n }\n\n const shading: ParagraphShading = {};\n const fill = shadingNode.attributes[\"w:fill\"] ?? shadingNode.attributes.fill;\n const color = shadingNode.attributes[\"w:color\"] ?? shadingNode.attributes.color;\n const val = shadingNode.attributes[\"w:val\"] ?? shadingNode.attributes.val;\n if (fill) shading.fill = fill;\n if (color) shading.color = color;\n if (val) shading.val = val;\n return Object.keys(shading).length > 0 ? shading : undefined;\n}\n\nfunction readParagraphCnfStyle(node: XmlElementNode): string | undefined {\n const cnfStyleNode = node.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"cnfStyle\",\n );\n return cnfStyleNode?.attributes[\"w:val\"] ?? cnfStyleNode?.attributes.val;\n}\n\nfunction readBorder(node: XmlElementNode): ParagraphBorders[keyof ParagraphBorders] {\n const border: NonNullable<ParagraphBorders[keyof ParagraphBorders]> = {};\n const value = node.attributes[\"w:val\"] ?? node.attributes.val;\n const size = node.attributes[\"w:sz\"] ?? node.attributes.sz;\n const space = node.attributes[\"w:space\"] ?? node.attributes.space;\n const color = node.attributes[\"w:color\"] ?? node.attributes.color;\n if (value) border.value = value;\n if (size !== undefined) {\n const parsedSize = Number.parseInt(size, 10);\n if (Number.isFinite(parsedSize)) border.size = parsedSize;\n }\n if (space !== undefined) {\n const parsedSpace = Number.parseInt(space, 10);\n if (Number.isFinite(parsedSpace)) border.space = parsedSpace;\n }\n if (color) border.color = color;\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction readParagraphStyleId(node: XmlElementNode): string | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"pStyle\") {\n continue;\n }\n\n const styleId = child.attributes[\"w:val\"] ?? child.attributes.val;\n if (styleId) {\n return styleId;\n }\n }\n\n return undefined;\n}\n\nfunction readParagraphNumbering(\n node: XmlElementNode,\n): ParsedParagraphNode[\"numbering\"] | undefined {\n const numberingProperties = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"numPr\",\n );\n if (!numberingProperties) {\n return undefined;\n }\n\n const levelNode = numberingProperties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"ilvl\",\n );\n const instanceNode = numberingProperties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"numId\",\n );\n const rawLevel = levelNode?.attributes[\"w:val\"] ?? levelNode?.attributes.val;\n const rawInstanceId = instanceNode?.attributes[\"w:val\"] ?? instanceNode?.attributes.val;\n if (!rawInstanceId || rawLevel === undefined || !/^-?\\d+$/.test(rawLevel)) {\n return undefined;\n }\n\n return {\n numberingInstanceId: toCanonicalNumberingInstanceId(rawInstanceId),\n level: Number.parseInt(rawLevel, 10),\n };\n}\n\nfunction parseRun(\n node: XmlElementNode,\n sourceXml: string,\n relationships: readonly OpcRelationship[],\n mediaParts: ReadonlyMap<string, InlineMediaPart>,\n sourcePartPath: string,\n): ParsedInlineNode[] {\n const marksResult = readRunMarks(node, sourceXml);\n if (!marksResult.supported) {\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n\n const marks = marksResult.marks;\n const result: ParsedInlineNode[] = [];\n let encounteredUnsupportedChild = false;\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"rPr\":\n break;\n case \"t\": {\n const text = child.children\n .filter((entry): entry is XmlTextNode => entry.type === \"text\")\n .map((entry) => entry.text)\n .join(\"\");\n result.push({\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n });\n break;\n }\n case \"tab\":\n result.push({ type: \"tab\" });\n break;\n case \"sym\": {\n const symbol = parseSymbolNode(child, marks);\n if (!symbol) {\n encounteredUnsupportedChild = true;\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n }\n result.push(symbol);\n break;\n }\n case \"br\":\n if (isColumnBreak(child)) {\n result.push({ type: \"column_break\" });\n } else if (isSimpleLineBreak(child)) {\n result.push({ type: \"hard_break\" });\n } else {\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n }\n break;\n case \"drawing\": {\n const drawingXml = sourceXml.slice(child.start, child.end);\n\n // Try complex content (charts / SmartArt) first\n try {\n const complexContent = parseComplexContentXml(\n drawingXml,\n relationships,\n mediaParts,\n sourcePartPath,\n );\n if (complexContent) {\n result.push(complexContent);\n break;\n }\n } catch {\n // Fall through to shape / image parsing\n }\n\n // Try shape / WordArt parsing\n try {\n const shapeResult = parseShapeXml(drawingXml);\n if (shapeResult) {\n result.push(shapeResult);\n break;\n }\n } catch {\n // Fall through to image parsing\n }\n\n const parsedMedia = parseInlineMediaXml(\n drawingXml,\n relationships,\n mediaParts,\n sourcePartPath,\n );\n if (parsedMedia.length === 0) {\n encounteredUnsupportedChild = true;\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n });\n break;\n }\n\n const semanticChildren = node.children.filter(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) !== \"rPr\",\n );\n const placementXml =\n semanticChildren.length === 1\n ? sourceXml.slice(node.start, node.end)\n : sourceXml.slice(child.start, child.end);\n\n result.push(\n ...parsedMedia.map((media) => ({\n type: \"image\" as const,\n mediaId: media.mediaId,\n relationshipId: media.relationshipId,\n packagePartName: media.packagePartName,\n contentType: media.contentType,\n filename: media.filename,\n ...(media.altText ? { altText: media.altText } : {}),\n ...(media.widthEmu !== undefined ? { widthEmu: media.widthEmu } : {}),\n ...(media.heightEmu !== undefined ? { heightEmu: media.heightEmu } : {}),\n placementXml,\n ...(media.display ? { display: media.display } : {}),\n ...(media.floating ? { floating: media.floating } : {}),\n })),\n );\n break;\n }\n case \"pict\": {\n const pictXml = sourceXml.slice(child.start, child.end);\n try {\n const vmlResult = parseVmlXml(pictXml);\n if (vmlResult) {\n // Use the full run XML as rawXml so the export serializer can emit\n // the complete <w:r>...<w:pict>...</w:pict></w:r> wrapper\n result.push({\n ...vmlResult,\n rawXml: sourceXml.slice(node.start, node.end),\n });\n break;\n }\n } catch {\n // Fall through to opaque\n }\n encounteredUnsupportedChild = true;\n result.push({\n type: \"opaque_inline\",\n rawXml: pictXml,\n });\n break;\n }\n case \"commentReference\":\n break;\n case \"footnoteReference\": {\n const noteId = child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n result.push({\n type: \"footnote_ref\",\n noteId,\n noteKind: \"footnote\",\n });\n }\n break;\n }\n case \"endnoteReference\": {\n const noteId = child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n result.push({\n type: \"footnote_ref\",\n noteId,\n noteKind: \"endnote\",\n });\n }\n break;\n }\n case \"lastRenderedPageBreak\":\n case \"proofErr\":\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n default:\n encounteredUnsupportedChild = true;\n result.push({\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(child.start, child.end),\n });\n break;\n }\n }\n\n if (encounteredUnsupportedChild && result.every((child) => child.type === \"opaque_inline\")) {\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n\n return result;\n}\n\nfunction parseRevisionContainer(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n): ParsedInlineNode[] {\n const result: ParsedInlineNode[] = [];\n const allowsDeletedText = localName(node.name) === \"del\";\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"r\": {\n const run = parseRunContentOnly(child, sourceXml, {\n allowDeletedText: allowsDeletedText,\n preserveUnsupportedReviewMarkup: true,\n });\n if (!run.supported) {\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n result.push(...run.nodes);\n break;\n }\n case \"hyperlink\": {\n const hyperlink = parseHyperlink(child, sourceXml, relationshipMap, {\n allowDeletedText: allowsDeletedText,\n preserveUnsupportedReviewMarkup: true,\n });\n if (hyperlink.type === \"opaque_inline\") {\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n result.push(hyperlink);\n break;\n }\n case \"commentRangeStart\":\n case \"commentRangeEnd\":\n case \"bookmarkStart\":\n case \"bookmarkEnd\":\n case \"proofErr\":\n case \"lastRenderedPageBreak\":\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n case \"permStart\":\n result.push(parsePermStartNode(child, sourceXml));\n break;\n case \"permEnd\":\n result.push(parsePermEndNode(child, sourceXml));\n break;\n default:\n return [\n {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n },\n ];\n }\n }\n\n return result;\n}\n\nfunction parseHyperlink(\n node: XmlElementNode,\n sourceXml: string,\n relationshipMap: Map<string, OpcRelationship>,\n options: {\n allowDeletedText?: boolean;\n preserveUnsupportedReviewMarkup?: boolean;\n } = {},\n): ParsedHyperlinkNode | ParsedOpaqueInlineNode {\n const relationshipId = node.attributes[\"r:id\"] ?? node.attributes.id;\n const anchor = node.attributes[\"w:anchor\"] ?? node.attributes.anchor;\n let href: string | undefined;\n\n if (relationshipId) {\n const relationship = relationshipMap.get(relationshipId);\n if (\n relationship &&\n relationship.type === HYPERLINK_RELATIONSHIP_TYPE &&\n relationship.targetMode === \"external\"\n ) {\n href = relationship.target;\n }\n } else if (anchor) {\n href = `#${anchor}`;\n }\n\n if (!href) {\n return {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n const children: Array<ParsedTextNode | ParsedBreakNode | ParsedColumnBreakNode | ParsedTabNode | ParsedSymbolNode> = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) !== \"r\") {\n return {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n const run = parseRunContentOnly(child, sourceXml, {\n allowDeletedText: options.allowDeletedText,\n preserveUnsupportedReviewMarkup: options.preserveUnsupportedReviewMarkup,\n });\n if (!run.supported) {\n return {\n type: \"opaque_inline\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n }\n\n children.push(...run.nodes);\n }\n\n return {\n type: \"hyperlink\",\n href,\n children,\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parseRunContentOnly(\n node: XmlElementNode,\n _sourceXml: string,\n options: {\n allowDeletedText?: boolean;\n preserveUnsupportedReviewMarkup?: boolean;\n } = {},\n): RunParseResult {\n const marksResult = readRunMarks(node, _sourceXml);\n if (!marksResult.supported) {\n return { nodes: [], supported: false };\n }\n\n const marks = marksResult.marks;\n const nodes: Array<ParsedTextNode | ParsedBreakNode | ParsedColumnBreakNode | ParsedTabNode | ParsedSymbolNode> = [];\n\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n switch (localName(child.name)) {\n case \"rPr\":\n break;\n case \"t\": {\n const text = child.children\n .filter((entry): entry is XmlTextNode => entry.type === \"text\")\n .map((entry) => entry.text)\n .join(\"\");\n nodes.push({\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n });\n break;\n }\n case \"delText\":\n case \"delInstrText\":\n if (!options.allowDeletedText) {\n return { nodes: [], supported: false };\n }\n nodes.push({\n type: \"text\",\n text: child.children\n .filter((entry): entry is XmlTextNode => entry.type === \"text\")\n .map((entry) => entry.text)\n .join(\"\"),\n ...(marks.length > 0 ? { marks } : {}),\n });\n break;\n case \"tab\":\n nodes.push({ type: \"tab\" });\n break;\n case \"sym\": {\n const symbol = parseSymbolNode(child, marks);\n if (!symbol) {\n return { nodes: [], supported: false };\n }\n nodes.push(symbol);\n break;\n }\n case \"br\":\n if (isColumnBreak(child)) {\n nodes.push({ type: \"column_break\" });\n break;\n }\n if (!isSimpleLineBreak(child)) {\n return { nodes: [], supported: false };\n }\n nodes.push({ type: \"hard_break\" });\n break;\n case \"commentReference\":\n case \"lastRenderedPageBreak\":\n case \"proofErr\":\n if (options.preserveUnsupportedReviewMarkup) {\n return { nodes: [], supported: false };\n }\n break;\n default:\n return { nodes: [], supported: false };\n }\n }\n\n return { nodes, supported: true };\n}\n\nfunction readRunMarks(node: XmlElementNode, sourceXml: string): MarksParseResult {\n const properties = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"rPr\",\n );\n\n if (!properties) {\n return { marks: [], supported: true };\n }\n\n if (\n properties.children.some(\n (child) =>\n child.type === \"element\" &&\n DISALLOWED_RUN_PROPERTY_NAMES.has(localName(child.name)),\n )\n ) {\n return {\n marks: [],\n supported: false,\n };\n }\n\n const marks: TextMark[] = [];\n if (hasOnOffProperty(properties, \"b\")) {\n marks.push({ type: \"bold\" });\n }\n if (hasOnOffProperty(properties, \"i\")) {\n marks.push({ type: \"italic\" });\n }\n if (hasUnderlineProperty(properties)) {\n marks.push({ type: \"underline\" });\n }\n if (hasOnOffProperty(properties, \"strike\")) {\n marks.push({ type: \"strikethrough\" });\n }\n if (hasOnOffProperty(properties, \"dstrike\")) {\n marks.push({ type: \"doubleStrikethrough\" });\n }\n if (hasOnOffProperty(properties, \"vanish\")) {\n marks.push({ type: \"vanish\" });\n }\n\n const langMark = readRunLang(properties);\n if (langMark) {\n marks.push(langMark);\n }\n\n const backgroundColorMark = readRunBackgroundColor(properties);\n if (backgroundColorMark) {\n marks.push(backgroundColorMark);\n }\n\n const highlightMark = readRunHighlight(properties);\n if (highlightMark) {\n marks.push(highlightMark);\n }\n\n const charSpacingMark = readNumericRunMark(properties, \"spacing\", \"charSpacing\");\n if (charSpacingMark) {\n marks.push(charSpacingMark);\n }\n\n const kerningMark = readNumericRunMark(properties, \"kern\", \"kerning\");\n if (kerningMark) {\n marks.push(kerningMark);\n }\n\n const positionMark = readNumericRunMark(properties, \"position\", \"position\");\n if (positionMark) {\n marks.push(positionMark);\n }\n\n if (hasOnOffProperty(properties, \"emboss\")) {\n marks.push({ type: \"emboss\" });\n }\n if (hasOnOffProperty(properties, \"imprint\")) {\n marks.push({ type: \"imprint\" });\n }\n if (hasOnOffProperty(properties, \"shadow\")) {\n marks.push({ type: \"shadow\" });\n }\n\n const textFillMark = readRunTextFill(properties, sourceXml);\n if (textFillMark) {\n marks.push(textFillMark);\n }\n\n // Font family\n const rFontsNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"rFonts\",\n );\n if (rFontsNode) {\n const family = rFontsNode.attributes[\"w:ascii\"] ?? rFontsNode.attributes[\"w:hAnsi\"] ?? rFontsNode.attributes.ascii ?? rFontsNode.attributes.hAnsi;\n if (family) {\n marks.push({ type: \"fontFamily\", val: family });\n }\n }\n\n // Font size (half-points)\n const szNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"sz\",\n );\n if (szNode) {\n const szVal = szNode.attributes[\"w:val\"] ?? szNode.attributes.val;\n if (szVal) {\n const size = Number.parseInt(szVal, 10);\n if (Number.isFinite(size) && size > 0) {\n marks.push({ type: \"fontSize\", val: size });\n }\n }\n }\n\n // Text color\n const colorNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"color\",\n );\n if (colorNode) {\n const colorVal = colorNode.attributes[\"w:val\"] ?? colorNode.attributes.val;\n if (colorVal && colorVal !== \"auto\") {\n marks.push({ type: \"textColor\", color: colorVal });\n }\n }\n\n // Small caps\n if (hasOnOffProperty(properties, \"smallCaps\")) {\n marks.push({ type: \"smallCaps\" });\n }\n\n // All caps\n if (hasOnOffProperty(properties, \"caps\")) {\n marks.push({ type: \"allCaps\" });\n }\n\n return {\n marks,\n supported: true,\n };\n}\n\nfunction readRunLang(properties: XmlElementNode): TextMark | undefined {\n const langNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"lang\",\n );\n if (!langNode) return undefined;\n const val =\n langNode.attributes[\"w:val\"] ??\n langNode.attributes.val ??\n langNode.attributes[\"w:bidi\"] ??\n langNode.attributes.bidi;\n if (!val) return undefined;\n return { type: \"lang\", val };\n}\n\nfunction readRunBackgroundColor(properties: XmlElementNode): TextMark | undefined {\n const shadingNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"shd\",\n );\n if (!shadingNode) {\n return undefined;\n }\n\n const fill = shadingNode.attributes[\"w:fill\"] ?? shadingNode.attributes.fill;\n if (!fill || fill === \"auto\") {\n return undefined;\n }\n\n return { type: \"backgroundColor\", color: fill };\n}\n\nfunction readRunHighlight(properties: XmlElementNode): TextMark | undefined {\n const highlightNode = properties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"highlight\",\n );\n if (!highlightNode) {\n return undefined;\n }\n\n const highlightValue = highlightNode.attributes[\"w:val\"] ?? highlightNode.attributes.val;\n const resolvedHighlight = resolveHighlightColor(highlightValue);\n if (!resolvedHighlight) {\n return undefined;\n }\n\n return {\n type: \"highlight\",\n color: resolvedHighlight.color,\n val: resolvedHighlight.val,\n };\n}\n\nfunction readNumericRunMark(\n properties: XmlElementNode,\n elementName: \"spacing\" | \"kern\" | \"position\",\n markType: \"charSpacing\" | \"kerning\" | \"position\",\n): TextMark | undefined {\n const propertyNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === elementName,\n );\n if (!propertyNode) {\n return undefined;\n }\n const rawValue = propertyNode.attributes[\"w:val\"] ?? propertyNode.attributes.val;\n if (rawValue === undefined) {\n return undefined;\n }\n const value = Number.parseInt(rawValue, 10);\n if (!Number.isFinite(value)) {\n return undefined;\n }\n return { type: markType, val: value };\n}\n\nfunction readRunTextFill(properties: XmlElementNode, sourceXml: string): TextMark | undefined {\n const textFillNode = properties.children.find(\n (child): child is XmlElementNode => child.type === \"element\" && localName(child.name) === \"textFill\",\n );\n if (!textFillNode) {\n return undefined;\n }\n return {\n type: \"textFill\",\n xml: sourceXml.slice(textFillNode.start, textFillNode.end),\n };\n}\n\nfunction parseSymbolNode(\n node: XmlElementNode,\n marks: TextMark[],\n): ParsedSymbolNode | undefined {\n const char = node.attributes[\"w:char\"] ?? node.attributes.char;\n if (!char) {\n return undefined;\n }\n const font = node.attributes[\"w:font\"] ?? node.attributes.font;\n return {\n type: \"symbol\",\n char,\n ...(font ? { font } : {}),\n ...(marks.length > 0 ? { marks } : {}),\n };\n}\n\nfunction supportsParagraphProperties(node: XmlElementNode): boolean {\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"pPrChange\") {\n return false;\n }\n\n if (name === \"rPr\") {\n if (\n child.children.some(\n (entry) =>\n entry.type === \"element\" &&\n DISALLOWED_PARAGRAPH_PROPERTY_NAMES.has(localName(entry.name)),\n )\n ) {\n return false;\n }\n }\n }\n\n return true;\n}\n\nconst DISALLOWED_RUN_PROPERTY_NAMES = new Set([\"rPrChange\"]);\nconst DISALLOWED_PARAGRAPH_PROPERTY_NAMES = new Set([\"pPrChange\", \"rPrChange\"]);\n\nfunction hasOnOffProperty(properties: XmlElementNode, propertyName: string): boolean {\n const property = properties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === propertyName,\n );\n if (!property) {\n return false;\n }\n\n const value = (property.attributes[\"w:val\"] ?? property.attributes.val ?? \"true\").toLowerCase();\n return value !== \"false\" && value !== \"0\" && value !== \"off\";\n}\n\nfunction hasUnderlineProperty(properties: XmlElementNode): boolean {\n const property = properties.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === \"u\",\n );\n if (!property) {\n return false;\n }\n\n const value = (property.attributes[\"w:val\"] ?? property.attributes.val ?? \"single\").toLowerCase();\n return value !== \"none\";\n}\n\nfunction isSimpleLineBreak(node: XmlElementNode): boolean {\n const value = (node.attributes[\"w:type\"] ?? node.attributes.type ?? \"textWrapping\").toLowerCase();\n return value === \"textwrapping\" || value === \"line\";\n}\n\nfunction isColumnBreak(node: XmlElementNode): boolean {\n const value = (node.attributes[\"w:type\"] ?? node.attributes.type ?? \"\").toLowerCase();\n return value === \"column\";\n}\n\nfunction findChildElement(node: XmlElementNode, childLocalName: string): XmlElementNode {\n const child = node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n\n if (!child) {\n throw new Error(`Expected <${childLocalName}> element in main document XML.`);\n }\n\n return child;\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction readOptionalAttribute(node: XmlElementNode, name: string): string | undefined {\n return node.attributes[`w:${name}`]\n ?? node.attributes[`r:${name}`]\n ?? node.attributes[name];\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: end >= 0 ? end + 3 : xml.length,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n const currentChar = xml[cursor];\n if (currentChar !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start: cursor,\n end,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing closing >.\");\n }\n\n const name = xml.slice(cursor + 2, end).trim();\n const current = stack.pop();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n current.end = end + 1;\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start: cursor,\n end: tagEnd + 1,\n };\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element in main document XML.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n if (cursor >= tagBody.length) {\n break;\n }\n\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const key = tagBody.slice(keyStart, cursor);\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n if (tagBody[cursor] !== \"=\") {\n attributes[key] = \"\";\n continue;\n }\n cursor += 1;\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) {\n throw new Error(`Malformed XML attribute ${key}.`);\n }\n cursor += 1;\n\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) {\n cursor += 1;\n }\n const rawValue = tagBody.slice(valueStart, cursor);\n attributes[key] = decodeXmlEntities(rawValue);\n cursor += 1;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n\n while (cursor < xml.length) {\n const current = xml[cursor];\n if (quote) {\n if (current === quote) {\n quote = null;\n }\n cursor += 1;\n continue;\n }\n\n if (current === `\"` || current === `'`) {\n quote = current;\n cursor += 1;\n continue;\n }\n\n if (current === \">\") {\n return cursor;\n }\n\n cursor += 1;\n }\n\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return `\"`;\n case \"apos\":\n return \"'\";\n default:\n if (entity.startsWith(\"#x\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n }\n if (entity.startsWith(\"#\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n }\n return match;\n }\n });\n}\n\n// ---- Section properties parsing ----\n\nfunction parseSectionBreakElement(\n node: XmlElementNode,\n sourceXml: string,\n): ParsedSectionBreakNode {\n const props = parseSectionPropertiesFromElement(node);\n return {\n type: \"section_break\",\n sectionPropertiesXml: sourceXml.slice(node.start, node.end),\n sectionProperties: props,\n };\n}\n\nfunction readSectionPropertiesFromPPr(\n pPrNode: XmlElementNode,\n): SectionProperties | undefined {\n for (const child of pPrNode.children) {\n if (child.type === \"element\" && localName(child.name) === \"sectPr\") {\n return parseSectionPropertiesFromElement(child);\n }\n }\n return undefined;\n}\n\nfunction readSectionPropertiesXmlFromPPr(\n pPrNode: XmlElementNode,\n sourceXml: string,\n): string | undefined {\n for (const child of pPrNode.children) {\n if (child.type === \"element\" && localName(child.name) === \"sectPr\") {\n return sourceXml.slice(child.start, child.end);\n }\n }\n return undefined;\n}\n\nexport function parseSectionPropertiesFromElement(\n node: XmlElementNode,\n): SectionProperties {\n const props: SectionProperties = {};\n\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n switch (name) {\n case \"pgSz\": {\n const w = safeParseInt(child.attributes[\"w:w\"]);\n const h = safeParseInt(child.attributes[\"w:h\"]);\n if (w !== undefined && h !== undefined) {\n const pageSize: PageSize = { width: w, height: h };\n const orient = child.attributes[\"w:orient\"];\n if (orient === \"landscape\" || orient === \"portrait\") {\n pageSize.orientation = orient;\n }\n props.pageSize = pageSize;\n }\n break;\n }\n case \"pgMar\": {\n const top = safeParseInt(child.attributes[\"w:top\"]);\n const right = safeParseInt(child.attributes[\"w:right\"]);\n const bottom = safeParseInt(child.attributes[\"w:bottom\"]);\n const left = safeParseInt(child.attributes[\"w:left\"]);\n if (top !== undefined && right !== undefined && bottom !== undefined && left !== undefined) {\n const margins: PageMargins = { top, right, bottom, left };\n const header = safeParseInt(child.attributes[\"w:header\"]);\n const footer = safeParseInt(child.attributes[\"w:footer\"]);\n const gutter = safeParseInt(child.attributes[\"w:gutter\"]);\n if (header !== undefined) margins.header = header;\n if (footer !== undefined) margins.footer = footer;\n if (gutter !== undefined) margins.gutter = gutter;\n props.pageMargins = margins;\n }\n break;\n }\n case \"cols\": {\n const columns: ColumnProperties = {};\n const num = safeParseInt(child.attributes[\"w:num\"]);\n const space = safeParseInt(child.attributes[\"w:space\"]);\n const equalWidth = child.attributes[\"w:equalWidth\"];\n const sep = child.attributes[\"w:sep\"];\n if (num !== undefined) columns.count = num;\n if (space !== undefined) columns.space = space;\n if (equalWidth !== undefined) columns.equalWidth = equalWidth !== \"0\" && equalWidth !== \"false\";\n if (sep === \"1\" || sep === \"true\") columns.separator = true;\n const colDefs: Array<{ width: number; space?: number }> = [];\n for (const colChild of child.children) {\n if (colChild.type === \"element\" && localName(colChild.name) === \"col\") {\n const colW = safeParseInt(colChild.attributes[\"w:w\"]);\n const colSpace = safeParseInt(colChild.attributes[\"w:space\"]);\n if (colW !== undefined) {\n colDefs.push(colSpace !== undefined ? { width: colW, space: colSpace } : { width: colW });\n }\n }\n }\n if (colDefs.length > 0) columns.columns = colDefs;\n if (Object.keys(columns).length > 0) props.columns = columns;\n break;\n }\n case \"pgNumType\": {\n const numbering: PageNumbering = {};\n const fmt = child.attributes[\"w:fmt\"];\n const start = safeParseInt(child.attributes[\"w:start\"]);\n const chapStyle = child.attributes[\"w:chapStyle\"];\n const chapSep = child.attributes[\"w:chapSep\"];\n if (fmt) numbering.format = fmt;\n if (start !== undefined) numbering.start = start;\n if (chapStyle) numbering.chapStyle = chapStyle;\n if (chapSep) numbering.chapSep = chapSep;\n if (Object.keys(numbering).length > 0) props.pageNumbering = numbering;\n break;\n }\n case \"lnNumType\": {\n const lineNumbering: SectionLineNumbering = {};\n const countBy = safeParseInt(child.attributes[\"w:countBy\"]);\n const start = safeParseInt(child.attributes[\"w:start\"]);\n const distance = safeParseInt(child.attributes[\"w:distance\"]);\n const restart = child.attributes[\"w:restart\"];\n if (countBy !== undefined) lineNumbering.countBy = countBy;\n if (start !== undefined) lineNumbering.start = start;\n if (distance !== undefined) lineNumbering.distance = distance;\n if (\n restart === \"newPage\" ||\n restart === \"newSection\" ||\n restart === \"continuous\"\n ) {\n lineNumbering.restart = restart;\n }\n if (Object.keys(lineNumbering).length > 0) {\n props.lineNumbering = lineNumbering;\n }\n break;\n }\n case \"pgBorders\": {\n const pageBorders: SectionPageBorders = {};\n const offsetFrom = child.attributes[\"w:offsetFrom\"];\n const display = child.attributes[\"w:display\"];\n const zOrder = child.attributes[\"w:zOrder\"];\n if (offsetFrom === \"page\" || offsetFrom === \"text\") {\n pageBorders.offsetFrom = offsetFrom;\n }\n if (\n display === \"allPages\" ||\n display === \"firstPage\" ||\n display === \"notFirstPage\"\n ) {\n pageBorders.display = display;\n }\n if (zOrder === \"front\" || zOrder === \"back\") {\n pageBorders.zOrder = zOrder;\n }\n for (const borderChild of child.children) {\n if (borderChild.type !== \"element\") continue;\n const borderName = localName(borderChild.name);\n const border = parseBorderSpec(borderChild);\n if (!border) continue;\n if (\n borderName === \"top\" ||\n borderName === \"left\" ||\n borderName === \"bottom\" ||\n borderName === \"right\"\n ) {\n pageBorders[borderName] = border;\n }\n }\n if (Object.keys(pageBorders).length > 0) {\n props.pageBorders = pageBorders;\n }\n break;\n }\n case \"docGrid\": {\n const documentGrid: SectionDocumentGrid = {};\n const type = child.attributes[\"w:type\"];\n const linePitch = safeParseInt(child.attributes[\"w:linePitch\"]);\n const charSpace = safeParseInt(child.attributes[\"w:charSpace\"]);\n if (\n type === \"default\" ||\n type === \"lines\" ||\n type === \"linesAndChars\" ||\n type === \"snapToChars\"\n ) {\n documentGrid.type = type;\n }\n if (linePitch !== undefined) documentGrid.linePitch = linePitch;\n if (charSpace !== undefined) documentGrid.charSpace = charSpace;\n if (Object.keys(documentGrid).length > 0) {\n props.documentGrid = documentGrid;\n }\n break;\n }\n case \"headerReference\": {\n const variant = child.attributes[\"w:type\"] as HeaderFooterVariant | undefined;\n const rId = child.attributes[\"r:id\"];\n if (variant && rId) {\n if (!props.headerReferences) props.headerReferences = [];\n props.headerReferences.push({ variant, relationshipId: rId });\n }\n break;\n }\n case \"footerReference\": {\n const variant = child.attributes[\"w:type\"] as HeaderFooterVariant | undefined;\n const rId = child.attributes[\"r:id\"];\n if (variant && rId) {\n if (!props.footerReferences) props.footerReferences = [];\n props.footerReferences.push({ variant, relationshipId: rId });\n }\n break;\n }\n case \"type\": {\n const val = child.attributes[\"w:val\"];\n if (val === \"continuous\" || val === \"nextPage\" || val === \"evenPage\" || val === \"oddPage\" || val === \"nextColumn\") {\n props.sectionType = val;\n }\n break;\n }\n case \"titlePg\": {\n const val = child.attributes[\"w:val\"];\n props.titlePage = val !== \"false\" && val !== \"0\";\n break;\n }\n }\n }\n\n return props;\n}\n\nfunction safeParseInt(value: string | undefined): number | undefined {\n if (value === undefined) return undefined;\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? n : undefined;\n}\n\nfunction parseBorderSpec(node: XmlElementNode): BorderSpec | undefined {\n const border: BorderSpec = {};\n const value = node.attributes[\"w:val\"];\n const size = safeParseInt(node.attributes[\"w:sz\"]);\n const space = safeParseInt(node.attributes[\"w:space\"]);\n const color = node.attributes[\"w:color\"];\n\n if (value) border.value = value;\n if (size !== undefined) border.size = size;\n if (space !== undefined) border.space = space;\n if (color) border.color = color;\n\n return Object.keys(border).length > 0 ? border : undefined;\n}\n\nfunction parsePermStartNode(\n node: XmlElementNode,\n sourceXml: string,\n): ParsedPermStartInlineNode {\n const rangeId = node.attributes[\"w:id\"] ?? node.attributes.id ?? \"\";\n const edGrp = node.attributes[\"w:edGrp\"] ?? node.attributes.edGrp;\n const ed = node.attributes[\"w:ed\"] ?? node.attributes.ed;\n return {\n type: \"perm_start\",\n rangeId,\n ...(edGrp ? { editorGroup: edGrp } : {}),\n ...(ed ? { editor: ed } : {}),\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n\nfunction parsePermEndNode(\n node: XmlElementNode,\n sourceXml: string,\n): ParsedPermEndInlineNode {\n return {\n type: \"perm_end\",\n rangeId: node.attributes[\"w:id\"] ?? node.attributes.id ?? \"\",\n rawXml: sourceXml.slice(node.start, node.end),\n };\n}\n","import type {\n AltChunkNode,\n BlockNode,\n CustomXmlNode,\n DiagnosticStore,\n DocumentRootNode,\n FieldRegistry,\n InlineNode,\n MediaCatalog,\n OpaqueBlockNode,\n OpaqueFragmentRecord,\n OpaqueInlineNode,\n ParagraphNode,\n PreservationStore,\n SectionBreakNode,\n TableCellNode,\n TableNode,\n TableRowNode,\n TextMark,\n TextNode,\n SdtNode,\n} from \"../../model/canonical-document.ts\";\nimport type {\n ParsedAltChunkNode,\n ParsedBlockNode,\n ParsedCustomXmlNode,\n ParsedHyperlinkNode,\n ParsedInlineNode,\n ParsedImageNode,\n ParsedMainDocument,\n ParsedParagraphNode,\n ParsedSectionBreakNode,\n ParsedSdtNode,\n ParsedTableBlockNode,\n ParsedTableCellNode,\n ParsedTableRowNode,\n} from \"../ooxml/parse-main-document.ts\";\nimport { classifyFieldInstruction, buildFieldRegistry } from \"../ooxml/parse-fields.ts\";\n\nexport interface NormalizedTextDocument {\n content: DocumentRootNode;\n media: MediaCatalog;\n preservation: PreservationStore;\n diagnostics: DiagnosticStore;\n finalSectionProperties?: ParsedMainDocument[\"finalSectionProperties\"];\n /** Package-backed field registry built during normalization. */\n fieldRegistry?: FieldRegistry;\n}\n\ninterface NormalizationState {\n nextFragmentIndex: number;\n nextWarningIndex: number;\n nextDiagnosticIndex: number;\n cursor: number;\n media: MediaCatalog;\n preservation: PreservationStore;\n diagnostics: DiagnosticStore;\n}\n\nexport function normalizeParsedTextDocument(\n document: ParsedMainDocument,\n packagePartName = \"/word/document.xml\",\n options?: { styles?: import(\"../../model/canonical-document.ts\").StylesCatalog },\n): NormalizedTextDocument {\n const state: NormalizationState = {\n nextFragmentIndex: 1,\n nextWarningIndex: 1,\n nextDiagnosticIndex: 1,\n cursor: 0,\n media: {\n items: {},\n },\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [],\n },\n };\n\n const children: BlockNode[] = [];\n let previousParagraph = false;\n\n for (const block of document.blocks) {\n const normalizedBlocks = normalizeBlocks(block, state, packagePartName);\n for (const normalizedBlock of normalizedBlocks) {\n if (previousParagraph && normalizedBlock.type === \"paragraph\") {\n state.cursor += 1;\n }\n children.push(normalizedBlock);\n previousParagraph = normalizedBlock.type === \"paragraph\";\n }\n }\n\n const content: DocumentRootNode = { type: \"doc\", children };\n\n // Build the field registry from normalized content.\n // When styles are available, the registry includes full TOC heading resolution.\n // Without styles, it still catalogs all field instances for the supported/preserve-only partition.\n const styles = options?.styles ?? { paragraphs: {}, characters: {}, tables: {} };\n const fieldRegistry = buildFieldRegistry({ content, styles });\n const hasFields = fieldRegistry.supported.length > 0 || fieldRegistry.preserveOnly.length > 0;\n\n return {\n content,\n media: state.media,\n preservation: state.preservation,\n diagnostics: state.diagnostics,\n ...(document.finalSectionProperties !== undefined\n ? { finalSectionProperties: document.finalSectionProperties }\n : {}),\n ...(hasFields ? { fieldRegistry } : {}),\n };\n}\n\nfunction normalizeBlocks(\n block: ParsedBlockNode,\n state: NormalizationState,\n packagePartName: string,\n): BlockNode[] {\n if (block.type === \"opaque_block\") {\n const opaque = recordOpaqueFragment(\"opaque_block\", block.rawXml, state, packagePartName);\n state.cursor += 1;\n return [\n {\n type: \"opaque_block\",\n fragmentId: opaque.fragmentId,\n warningId: opaque.warningId,\n },\n ];\n }\n\n if (block.type === \"table\") {\n return [normalizeTable(block, state, packagePartName)];\n }\n\n if (block.type === \"sdt\") {\n return [normalizeSdt(block, state, packagePartName)];\n }\n\n if (block.type === \"custom_xml\") {\n return [normalizeCustomXml(block, state, packagePartName)];\n }\n\n if (block.type === \"alt_chunk\") {\n return [normalizeAltChunk(block, state)];\n }\n\n if (block.type === \"section_break\") {\n return [normalizeSectionBreak(block)];\n }\n\n const normalizedParagraph = normalizeParagraph(block, state, packagePartName);\n return block.sectionProperties\n ? [normalizedParagraph, normalizeInlineSectionBreak(block)]\n : [normalizedParagraph];\n}\n\nfunction normalizeParagraph(\n paragraph: ParsedParagraphNode,\n state: NormalizationState,\n packagePartName: string,\n): ParagraphNode {\n const children = normalizeInlineChildren(paragraph.children, state, packagePartName);\n return {\n type: \"paragraph\",\n ...(paragraph.styleId ? { styleId: paragraph.styleId } : {}),\n ...(paragraph.numbering ? { numbering: paragraph.numbering } : {}),\n ...(paragraph.alignment ? { alignment: paragraph.alignment } : {}),\n ...(paragraph.spacing ? { spacing: paragraph.spacing } : {}),\n ...(paragraph.contextualSpacing !== undefined\n ? { contextualSpacing: paragraph.contextualSpacing }\n : {}),\n ...(paragraph.indentation ? { indentation: paragraph.indentation } : {}),\n ...(paragraph.tabStops && paragraph.tabStops.length > 0 ? { tabStops: paragraph.tabStops } : {}),\n ...(paragraph.keepNext ? { keepNext: paragraph.keepNext } : {}),\n ...(paragraph.keepLines ? { keepLines: paragraph.keepLines } : {}),\n ...(paragraph.outlineLevel !== undefined ? { outlineLevel: paragraph.outlineLevel } : {}),\n ...(paragraph.pageBreakBefore ? { pageBreakBefore: paragraph.pageBreakBefore } : {}),\n ...(paragraph.bidi ? { bidi: paragraph.bidi } : {}),\n ...(paragraph.borders ? { borders: paragraph.borders } : {}),\n ...(paragraph.shading ? { shading: paragraph.shading } : {}),\n children,\n };\n}\n\nfunction normalizeTable(\n table: ParsedTableBlockNode,\n state: NormalizationState,\n packagePartName: string,\n): TableNode {\n const rows = table.rows.map((row) => normalizeTableRow(row, state, packagePartName));\n state.cursor += 1;\n return {\n type: \"table\",\n ...(table.styleId ? { styleId: table.styleId } : {}),\n ...(table.propertiesXml ? { propertiesXml: table.propertiesXml } : {}),\n gridColumns: table.gridColumns,\n rows,\n };\n}\n\nfunction normalizeTableRow(\n row: ParsedTableRowNode,\n state: NormalizationState,\n packagePartName: string,\n): TableRowNode {\n const cells = row.cells.map((cell) => normalizeTableCell(cell, state, packagePartName));\n return {\n type: \"table_row\",\n ...(row.propertiesXml ? { propertiesXml: row.propertiesXml } : {}),\n ...(row.gridBefore !== undefined ? { gridBefore: row.gridBefore } : {}),\n ...(row.widthBefore ? { widthBefore: row.widthBefore } : {}),\n ...(row.gridAfter !== undefined ? { gridAfter: row.gridAfter } : {}),\n ...(row.widthAfter ? { widthAfter: row.widthAfter } : {}),\n cells,\n };\n}\n\nfunction normalizeTableCell(\n cell: ParsedTableCellNode,\n state: NormalizationState,\n packagePartName: string,\n): TableCellNode {\n const children: BlockNode[] = [];\n for (const block of cell.children) {\n children.push(...normalizeBlocks(block, state, packagePartName));\n }\n // Ensure at least one child (OOXML requires at least one <w:p> per cell)\n if (children.length === 0) {\n children.push({ type: \"paragraph\", children: [] });\n }\n return {\n type: \"table_cell\",\n ...(cell.propertiesXml ? { propertiesXml: cell.propertiesXml } : {}),\n ...(cell.gridSpan ? { gridSpan: cell.gridSpan } : {}),\n ...(cell.verticalMerge ? { verticalMerge: cell.verticalMerge } : {}),\n children,\n };\n}\n\nfunction normalizeSdt(\n block: ParsedSdtNode,\n state: NormalizationState,\n packagePartName: string,\n): SdtNode {\n return {\n type: \"sdt\",\n properties: { ...block.properties },\n children: block.children.flatMap((child) => normalizeBlocks(child, state, packagePartName)),\n };\n}\n\nfunction normalizeCustomXml(\n block: ParsedCustomXmlNode,\n state: NormalizationState,\n packagePartName: string,\n): CustomXmlNode {\n return {\n type: \"custom_xml\",\n ...(block.uri ? { uri: block.uri } : {}),\n ...(block.element ? { element: block.element } : {}),\n children: block.children.flatMap((child) => normalizeBlocks(child, state, packagePartName)),\n };\n}\n\nfunction normalizeSectionBreak(block: ParsedSectionBreakNode): SectionBreakNode {\n return {\n type: \"section_break\",\n sectionPropertiesXml: block.sectionPropertiesXml,\n sectionProperties: block.sectionProperties,\n };\n}\n\nfunction normalizeInlineSectionBreak(\n paragraph: ParsedParagraphNode,\n): SectionBreakNode {\n return {\n type: \"section_break\",\n ...(paragraph.sectionPropertiesXml\n ? { sectionPropertiesXml: paragraph.sectionPropertiesXml }\n : {}),\n sectionProperties: paragraph.sectionProperties!,\n };\n}\n\nfunction normalizeAltChunk(\n block: ParsedAltChunkNode,\n state: NormalizationState,\n): AltChunkNode {\n state.cursor += 1;\n return {\n type: \"alt_chunk\",\n relationshipId: block.relationshipId,\n };\n}\n\nfunction normalizeInlineChildren(\n nodes: ParsedInlineNode[],\n state: NormalizationState,\n packagePartName: string,\n): InlineNode[] {\n const normalized: InlineNode[] = [];\n\n for (const node of nodes) {\n switch (node.type) {\n case \"text\": {\n if (node.text.length === 0) {\n continue;\n }\n\n const previous = normalized[normalized.length - 1];\n if (previous?.type === \"text\" && sameMarks(previous.marks, node.marks)) {\n previous.text += node.text;\n } else {\n normalized.push({\n type: \"text\",\n text: node.text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n }\n state.cursor += node.text.length;\n break;\n }\n case \"tab\":\n normalized.push({ type: \"tab\" });\n state.cursor += 1;\n break;\n case \"hard_break\":\n normalized.push({ type: \"hard_break\" });\n state.cursor += 1;\n break;\n case \"image\":\n normalized.push(normalizeImageNode(node, state));\n state.cursor += 1;\n break;\n case \"hyperlink\":\n normalized.push(normalizeHyperlink(node));\n state.cursor += measureHyperlink(node);\n break;\n case \"opaque_inline\": {\n const opaque = recordOpaqueFragment(\"opaque_inline\", node.rawXml, state, packagePartName);\n normalized.push(opaque as OpaqueInlineNode);\n state.cursor += 1;\n break;\n }\n case \"symbol\":\n normalized.push({\n type: \"symbol\",\n char: node.char,\n font: node.font,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n state.cursor += 1;\n break;\n case \"column_break\":\n normalized.push({ type: \"column_break\" });\n state.cursor += 1;\n break;\n case \"chart_preview\":\n normalized.push({\n type: \"chart_preview\",\n ...(node.previewMediaId ? { previewMediaId: node.previewMediaId } : {}),\n rawXml: node.rawXml,\n });\n state.cursor += 1;\n break;\n case \"smartart_preview\":\n normalized.push({\n type: \"smartart_preview\",\n ...(node.previewMediaId ? { previewMediaId: node.previewMediaId } : {}),\n rawXml: node.rawXml,\n });\n state.cursor += 1;\n break;\n case \"shape\":\n normalized.push({\n type: \"shape\",\n ...(node.text ? { text: node.text } : {}),\n ...(node.geometry ? { geometry: node.geometry } : {}),\n ...(node.isTextBox ? { isTextBox: true } : {}),\n rawXml: node.rawXml,\n });\n state.cursor += 1;\n break;\n case \"wordart\":\n normalized.push({\n type: \"wordart\",\n text: node.text,\n ...(node.geometry ? { geometry: node.geometry } : {}),\n rawXml: node.rawXml,\n });\n state.cursor += 1;\n break;\n case \"vml_shape\":\n normalized.push({\n type: \"vml_shape\",\n ...(node.text ? { text: node.text } : {}),\n ...(node.shapeType ? { shapeType: node.shapeType } : {}),\n rawXml: node.rawXml,\n });\n state.cursor += 1;\n break;\n case \"bookmark_start\":\n normalized.push({\n type: \"bookmark_start\",\n bookmarkId: node.bookmarkId,\n name: node.name,\n });\n break;\n case \"bookmark_end\":\n normalized.push({\n type: \"bookmark_end\",\n bookmarkId: node.bookmarkId,\n });\n break;\n case \"footnote_ref\":\n normalized.push({\n type: \"footnote_ref\",\n noteId: node.noteId,\n noteKind: node.noteKind,\n });\n state.cursor += 1;\n break;\n case \"field\": {\n const classification = classifyFieldInstruction(node.instruction);\n const cursorBeforeField = state.cursor;\n const fieldChildren = node.children\n ? normalizeInlineChildren(node.children, state, packagePartName)\n : normalizeFieldContentXml(node.contentXml ?? \"\");\n state.cursor = cursorBeforeField;\n normalized.push({\n type: \"field\",\n fieldType: node.fieldType,\n instruction: node.instruction,\n children: fieldChildren,\n fieldFamily: classification.family,\n ...(classification.target ? { fieldTarget: classification.target } : {}),\n refreshStatus: classification.supported ? \"stale\" : \"preserve-only\",\n });\n state.cursor += fieldChildren.length > 0 ? fieldChildren.length : 1;\n break;\n }\n }\n }\n\n return normalized;\n}\n\nfunction normalizeImageNode(\n node: ParsedImageNode,\n state: NormalizationState,\n): InlineNode {\n const existingMediaItem = state.media.items[node.mediaId];\n if (!existingMediaItem) {\n const packagePartName =\n typeof node.packagePartName === \"string\" && node.packagePartName.length > 0\n ? node.packagePartName\n : `/${node.mediaId.slice(\"media:\".length)}`;\n const filename =\n typeof node.filename === \"string\" && node.filename.length > 0\n ? node.filename\n : packagePartName.slice(packagePartName.lastIndexOf(\"/\") + 1) || \"image.bin\";\n state.media.items[node.mediaId] = {\n mediaId: node.mediaId,\n contentType: node.contentType ?? \"application/octet-stream\",\n filename,\n packagePartName,\n ...(node.relationshipId ? { relationshipId: node.relationshipId } : {}),\n ...(node.altText ? { altText: node.altText } : {}),\n ...(node.widthEmu !== undefined ? { widthEmu: node.widthEmu } : {}),\n ...(node.heightEmu !== undefined ? { heightEmu: node.heightEmu } : {}),\n };\n } else if (\n node.widthEmu !== undefined ||\n node.heightEmu !== undefined\n ) {\n state.media.items[node.mediaId] = {\n ...existingMediaItem,\n ...(node.widthEmu !== undefined ? { widthEmu: node.widthEmu } : {}),\n ...(node.heightEmu !== undefined ? { heightEmu: node.heightEmu } : {}),\n };\n }\n\n return {\n type: \"image\",\n mediaId: node.mediaId,\n ...(node.altText ? { altText: node.altText } : {}),\n ...(node.placementXml ? { placementXml: node.placementXml } : {}),\n ...(node.display ? { display: node.display } : {}),\n ...(node.floating ? { floating: node.floating } : {}),\n };\n}\n\nfunction normalizeHyperlink(node: ParsedHyperlinkNode): {\n type: \"hyperlink\";\n href: string;\n children: Array<TextNode | { type: \"hard_break\" } | { type: \"tab\" }>;\n} {\n const children: Array<TextNode | { type: \"hard_break\" } | { type: \"tab\" }> = [];\n\n for (const child of node.children) {\n switch (child.type) {\n case \"text\": {\n if (child.text.length === 0) {\n continue;\n }\n const previous = children[children.length - 1];\n if (previous?.type === \"text\" && sameMarks(previous.marks, child.marks)) {\n previous.text += child.text;\n } else {\n children.push({\n type: \"text\",\n text: child.text,\n ...(child.marks && child.marks.length > 0 ? { marks: child.marks } : {}),\n });\n }\n break;\n }\n case \"tab\":\n children.push({ type: \"tab\" });\n break;\n case \"hard_break\":\n children.push({ type: \"hard_break\" });\n break;\n }\n }\n\n return {\n type: \"hyperlink\",\n href: node.href,\n children,\n };\n}\n\nfunction measureHyperlink(node: ParsedHyperlinkNode): number {\n return node.children.reduce<number>((size, child) => {\n if (child.type === \"text\") {\n return size + child.text.length;\n }\n return size + 1;\n }, 0);\n}\n\nfunction sameMarks(left: TextMark[] | undefined, right: TextMark[] | undefined): boolean {\n const leftMarks = normalizeMarks(left);\n const rightMarks = normalizeMarks(right);\n return leftMarks.length === rightMarks.length && leftMarks.every((mark, index) => mark === rightMarks[index]);\n}\n\nfunction normalizeMarks(marks: TextMark[] | undefined): string[] {\n return [...(marks ?? []).map(serializeMark)].sort();\n}\n\nfunction serializeMark(mark: TextMark): string {\n return JSON.stringify(\n Object.fromEntries(\n Object.entries(mark).sort(([left], [right]) => left.localeCompare(right)),\n ),\n );\n}\n\nfunction recordOpaqueFragment(\n nodeType: \"opaque_inline\" | \"opaque_block\",\n rawXml: string,\n state: NormalizationState,\n packagePartName: string,\n): { type: \"opaque_inline\" | \"opaque_block\"; fragmentId: string; warningId: string } {\n const fragmentId = `fragment:import-${state.nextFragmentIndex}`;\n state.nextFragmentIndex += 1;\n const warningId = `warning:import-${state.nextWarningIndex}`;\n state.nextWarningIndex += 1;\n const diagnosticId = `diagnostic:import-${state.nextDiagnosticIndex}`;\n state.nextDiagnosticIndex += 1;\n\n const rangeStart = state.cursor;\n const rangeEnd = state.cursor + 1;\n\n const record: OpaqueFragmentRecord = {\n fragmentId,\n payloadKind: \"xml-subtree\",\n payloadReference: rawXml,\n featureClass: \"preserve-only\",\n lastKnownRange: {\n from: rangeStart,\n to: rangeEnd,\n },\n warningId,\n packagePartName,\n };\n\n state.preservation.opaqueFragments[fragmentId] = record;\n state.diagnostics.warnings.push({\n diagnosticId,\n warningId,\n source: \"import\",\n message:\n nodeType === \"opaque_inline\"\n ? \"Unsupported inline OOXML was preserved as an opaque placeholder.\"\n : \"Unsupported block OOXML was preserved as an opaque placeholder.\",\n });\n\n return {\n type: nodeType,\n fragmentId,\n warningId,\n };\n}\n\n/**\n * Extract text content from field contentXml to populate the field's children\n * array. This enables cross-reference and TOC content to be visible in the\n * canonical model and surface projection.\n */\nfunction normalizeFieldContentXml(contentXml: string | undefined): InlineNode[] {\n if (!contentXml || contentXml.trim().length === 0) {\n return [];\n }\n\n // Extract text from <w:t> elements within the content runs\n const textPattern = /<w:t\\b[^>]*>([\\s\\S]*?)<\\/w:t>/g;\n const children: InlineNode[] = [];\n\n for (const match of contentXml.matchAll(textPattern)) {\n const text = match[1]\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n if (text.length > 0) {\n children.push({ type: \"text\", text });\n }\n }\n\n return children;\n}\n","import type { EditorError } from \"../../api/public-types.ts\";\n\nexport const CORRUPT_PACKAGE_REASONS = [\n \"zip-structure\",\n \"content-types-missing\",\n \"main-document-missing\",\n \"broken-relationship-graph\",\n \"malformed-xml\",\n \"unsupported-compression\",\n \"unreadable-package\",\n] as const;\n\nexport type CorruptPackageReason = (typeof CORRUPT_PACKAGE_REASONS)[number];\n\nexport interface CorruptPackageIssue {\n reason: CorruptPackageReason;\n message: string;\n partPath?: string;\n relationshipSourcePath?: string;\n relationshipId?: string;\n targetPartPath?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface CorruptPackageErrorDetails extends Record<string, unknown> {\n stage: \"package\";\n reason: CorruptPackageReason;\n diagnosticsToken: string;\n partPath?: string;\n relationshipSourcePath?: string;\n relationshipId?: string;\n targetPartPath?: string;\n}\n\nexport function createCorruptPackageError(\n issue: CorruptPackageIssue,\n): EditorError {\n return {\n errorId: `error:package_corrupt:${createCorruptPackageDiagnosticsToken(issue)}`,\n code: \"package_corrupt\",\n message: issue.message,\n isFatal: true,\n source: \"import\",\n details: {\n stage: \"package\",\n reason: issue.reason,\n diagnosticsToken: createCorruptPackageDiagnosticsToken(issue),\n ...(issue.partPath ? { partPath: issue.partPath } : {}),\n ...(issue.relationshipSourcePath\n ? { relationshipSourcePath: issue.relationshipSourcePath }\n : {}),\n ...(issue.relationshipId ? { relationshipId: issue.relationshipId } : {}),\n ...(issue.targetPartPath ? { targetPartPath: issue.targetPartPath } : {}),\n ...(issue.details ?? {}),\n } satisfies CorruptPackageErrorDetails,\n };\n}\n\nexport function createMissingPartIssue(partPath: string): CorruptPackageIssue {\n return {\n reason:\n partPath === \"/[Content_Types].xml\"\n ? \"content-types-missing\"\n : partPath === \"/word/document.xml\"\n ? \"main-document-missing\"\n : \"unreadable-package\",\n message: `DOCX package is missing required part ${partPath}.`,\n partPath,\n };\n}\n\nexport function createBrokenRelationshipIssue(input: {\n relationshipSourcePath: string | null;\n relationshipId: string;\n targetPartPath: string;\n}): CorruptPackageIssue {\n return {\n reason: \"broken-relationship-graph\",\n message:\n input.relationshipSourcePath === null\n ? `DOCX package relationship ${input.relationshipId} points to missing part ${input.targetPartPath}.`\n : `DOCX part ${input.relationshipSourcePath} has unresolved relationship ${input.relationshipId} targeting ${input.targetPartPath}.`,\n relationshipSourcePath: input.relationshipSourcePath ?? undefined,\n relationshipId: input.relationshipId,\n targetPartPath: input.targetPartPath,\n };\n}\n\nexport function classifyCorruptPackageError(error: unknown): CorruptPackageIssue {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"DOCX package could not be read safely.\";\n const normalized = message.toLowerCase();\n\n if (\n normalized.includes(\"end of central directory\") ||\n normalized.includes(\"zip archive\") ||\n normalized.includes(\"central directory signature\") ||\n normalized.includes(\"local file header signature\")\n ) {\n return {\n reason: \"zip-structure\",\n message,\n };\n }\n\n if (normalized.includes(\"compression\")) {\n return {\n reason: \"unsupported-compression\",\n message,\n };\n }\n\n if (normalized.includes(\"relationship\")) {\n return {\n reason: \"broken-relationship-graph\",\n message,\n };\n }\n\n if (normalized.includes(\"/[content_types].xml\")) {\n return createMissingPartIssue(\"/[Content_Types].xml\");\n }\n\n if (normalized.includes(\"/word/document.xml\")) {\n return createMissingPartIssue(\"/word/document.xml\");\n }\n\n if (normalized.includes(\"xml\")) {\n return {\n reason: \"malformed-xml\",\n message,\n };\n }\n\n return {\n reason: \"unreadable-package\",\n message,\n };\n}\n\nexport function createCorruptPackageDiagnosticsToken(\n issue: CorruptPackageIssue,\n): string {\n const fields = [\n issue.reason,\n issue.message,\n issue.partPath ?? \"\",\n issue.relationshipSourcePath ?? \"\",\n issue.relationshipId ?? \"\",\n issue.targetPartPath ?? \"\",\n ];\n\n let hash = 2166136261;\n for (const field of fields) {\n for (let index = 0; index < field.length; index += 1) {\n hash ^= field.charCodeAt(index);\n hash = Math.imul(hash, 16777619) >>> 0;\n }\n }\n\n return `pkg-${hash.toString(16).padStart(8, \"0\")}`;\n}\n","import type { OpcPackage } from \"../opc/package-reader.ts\";\nimport type { OpcPackagePart, OpcRelationship } from \"../ooxml/part-manifest.ts\";\n\nexport function reattachPreservedParts(\n sourcePackage: OpcPackage,\n workingParts: Map<string, OpcPackagePart>,\n packageRelationships: OpcRelationship[],\n ownedPaths: ReadonlySet<string>,\n): void {\n for (const [path, sourcePart] of sourcePackage.parts.entries()) {\n if (ownedPaths.has(path) || sourcePart.surfaceKind !== \"content\") {\n continue;\n }\n\n if (!workingParts.has(path)) {\n workingParts.set(path, clonePart(sourcePart));\n continue;\n }\n\n const currentPart = workingParts.get(path);\n if (!currentPart) {\n continue;\n }\n\n currentPart.contentType = sourcePart.contentType;\n currentPart.relationships = sourcePart.relationships.map(cloneRelationship);\n currentPart.relationshipsPartPath = sourcePart.relationshipsPartPath;\n currentPart.compression = sourcePart.compression;\n currentPart.bytes = new Uint8Array(sourcePart.bytes);\n currentPart.crc32 = sourcePart.crc32;\n }\n\n const knownPackageRelationshipIds = new Set(packageRelationships.map((relationship) => relationship.id));\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (knownPackageRelationshipIds.has(relationship.id)) {\n continue;\n }\n\n packageRelationships.push(cloneRelationship(relationship));\n knownPackageRelationshipIds.add(relationship.id);\n }\n}\n\nfunction clonePart(part: OpcPackagePart): OpcPackagePart {\n return {\n ...part,\n relationships: part.relationships.map(cloneRelationship),\n bytes: new Uint8Array(part.bytes),\n };\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n","import {\n CONTENT_TYPES_PATH,\n PACKAGE_RELATIONSHIPS_PATH,\n OpcCompressionMethod,\n OpcPackagePart,\n OpcRelationship,\n comparePartPaths,\n getRelationshipsPartPath,\n normalizePartPath,\n resolveRelationshipTarget,\n} from \"../ooxml/part-manifest.ts\";\nimport type { OpcPackage } from \"../opc/package-reader.ts\";\nimport { writeOpcPackage } from \"../opc/package-writer.ts\";\nimport { reattachPreservedParts } from \"./reattach-preserved-parts.ts\";\n\nexport interface ExportPartReplacement {\n path: string;\n bytes: Uint8Array;\n contentType: string;\n relationships?: OpcRelationship[];\n compression?: OpcCompressionMethod;\n}\n\nexport interface ExportSessionSnapshot {\n manifest: OpcPackage[\"manifest\"];\n parts: Map<string, OpcPackagePart>;\n}\n\nexport class ExportSession {\n private readonly ownedPaths: Set<string>;\n private readonly workingParts: Map<string, OpcPackagePart>;\n private readonly packageRelationships: OpcRelationship[];\n\n public constructor(private readonly sourcePackage: OpcPackage, ownedOutputPaths: Iterable<string>) {\n this.ownedPaths = new Set(\n [...ownedOutputPaths].map((path) => {\n const normalized = normalizePartPath(path);\n if (normalized === CONTENT_TYPES_PATH || normalized.endsWith(\".rels\") || normalized === PACKAGE_RELATIONSHIPS_PATH) {\n throw new Error(`ExportSession cannot directly own reserved OPC manifest path ${normalized}.`);\n }\n\n return normalized;\n }),\n );\n this.workingParts = cloneParts(sourcePackage.parts);\n this.packageRelationships = sourcePackage.manifest.packageRelationships.map(cloneRelationship);\n }\n\n public replaceOwnedPart(replacement: ExportPartReplacement): void {\n const normalizedPath = normalizePartPath(replacement.path);\n if (!this.ownedPaths.has(normalizedPath)) {\n throw new Error(`Attempted to rewrite non-owned OPC path ${normalizedPath}.`);\n }\n\n const existing = this.workingParts.get(normalizedPath);\n const nextPart: OpcPackagePart = {\n path: normalizedPath,\n surfaceKind: \"content\",\n contentType: replacement.contentType,\n relationshipsPartPath: getRelationshipsPartPath(normalizedPath),\n relationships: (replacement.relationships ?? existing?.relationships ?? []).map(cloneRelationship),\n compression: replacement.compression ?? existing?.compression ?? \"deflate\",\n bytes: new Uint8Array(replacement.bytes),\n crc32: 0,\n };\n\n this.workingParts.set(normalizedPath, nextPart);\n }\n\n public withOwnedPart(replacement: ExportPartReplacement): ExportSession {\n this.replaceOwnedPart(replacement);\n return this;\n }\n\n public ensurePackageRelationship(input: {\n type: string;\n target: string;\n targetMode?: OpcRelationship[\"targetMode\"];\n preferredId?: string;\n }): void {\n const targetMode = input.targetMode ?? \"internal\";\n const normalizedTarget =\n targetMode === \"internal\" ? normalizePartPath(input.target) : input.target;\n const existing = this.packageRelationships.find((relationship) => {\n if (relationship.type !== input.type || relationship.targetMode !== targetMode) {\n return false;\n }\n\n return targetMode === \"internal\"\n ? resolveRelationshipTarget(null, relationship) === normalizedTarget\n : relationship.target === normalizedTarget;\n });\n if (existing) {\n return;\n }\n\n const relationshipId = createUniqueRelationshipId(\n new Set(this.packageRelationships.map((relationship) => relationship.id)),\n input.preferredId ?? \"rIdPackage1\",\n );\n this.packageRelationships.push({\n id: relationshipId,\n type: input.type,\n target:\n targetMode === \"internal\"\n ? toPackageRelationshipTarget(normalizedTarget)\n : normalizedTarget,\n targetMode,\n });\n }\n\n public toPackage(): OpcPackage {\n reattachPreservedParts(\n this.sourcePackage,\n this.workingParts,\n this.packageRelationships,\n this.ownedPaths,\n );\n const parts = pruneReservedManifestParts(this.workingParts);\n const manifest = buildManifest(parts, this.packageRelationships, this.sourcePackage.manifest.contentTypes);\n return {\n manifest,\n parts,\n sourceByteLength: this.sourcePackage.sourceByteLength,\n };\n }\n\n public serialize(): Uint8Array {\n return writeOpcPackage(this.toPackage());\n }\n}\n\nexport function createExportSession(\n sourcePackage: OpcPackage,\n ownedOutputPaths: Iterable<string>,\n): ExportSession {\n return new ExportSession(sourcePackage, ownedOutputPaths);\n}\n\nfunction cloneParts(parts: Map<string, OpcPackagePart>): Map<string, OpcPackagePart> {\n return new Map(\n [...parts.entries()].map(([path, part]) => [\n path,\n {\n ...part,\n relationships: part.relationships.map(cloneRelationship),\n bytes: new Uint8Array(part.bytes),\n },\n ]),\n );\n}\n\nfunction pruneReservedManifestParts(parts: Map<string, OpcPackagePart>): Map<string, OpcPackagePart> {\n return new Map(\n [...parts.entries()].filter(([path]) => path !== CONTENT_TYPES_PATH && path !== PACKAGE_RELATIONSHIPS_PATH && !path.includes(\"/_rels/\")),\n );\n}\n\nfunction buildManifest(\n parts: Map<string, OpcPackagePart>,\n packageRelationships: OpcRelationship[],\n contentTypesSeed: OpcPackage[\"manifest\"][\"contentTypes\"],\n): OpcPackage[\"manifest\"] {\n const partsList = [...parts.values()].sort((left, right) => comparePartPaths(left.path, right.path));\n\n const overrides = { ...contentTypesSeed.overrides };\n for (const key of Object.keys(overrides)) {\n if (!parts.has(normalizePartPath(key))) {\n delete overrides[key];\n }\n }\n\n for (const part of partsList) {\n if (!part.contentType) {\n throw new Error(`Cannot export part without content type: ${part.path}`);\n }\n\n overrides[part.path] = part.contentType;\n }\n\n return {\n contentTypes: {\n defaults: { ...contentTypesSeed.defaults },\n overrides,\n },\n packageRelationships: packageRelationships.map(cloneRelationship),\n parts: partsList.map((part) => ({\n path: part.path,\n surfaceKind: part.surfaceKind,\n contentType: part.contentType,\n relationshipsPartPath: part.relationshipsPartPath,\n relationships: part.relationships.map(cloneRelationship),\n compression: part.compression,\n byteLength: part.bytes.byteLength,\n })),\n };\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nfunction createUniqueRelationshipId(existingIds: ReadonlySet<string>, preferredId: string): string {\n if (!existingIds.has(preferredId)) {\n return preferredId;\n }\n\n let nextIndex = 2;\n while (existingIds.has(`${preferredId}-${nextIndex}`)) {\n nextIndex += 1;\n }\n\n return `${preferredId}-${nextIndex}`;\n}\n\nfunction toPackageRelationshipTarget(partPath: string): string {\n return normalizePartPath(partPath).slice(1);\n}\n\nexport { buildManifest };\n","import type {\n DocRange,\n OpaqueFragmentRecord,\n PreservationStore,\n PreservedPackagePart,\n} from \"../model/canonical-document.ts\";\n\nexport interface OpaqueFragmentDescriptor {\n featureKey:\n | \"sections\"\n | \"tables\"\n | \"headers-footers\"\n | \"fields\"\n | \"content-controls\"\n | \"custom-xml\"\n | \"alt-chunk\"\n | \"embedded-objects\"\n | \"alternate-content\"\n | \"unknown-ooxml\";\n label: string;\n detail: string;\n}\n\nexport function createPreservationStore(\n seed?: Partial<PreservationStore>,\n): PreservationStore {\n return {\n opaqueFragments: { ...(seed?.opaqueFragments ?? {}) },\n packageParts: { ...(seed?.packageParts ?? {}) },\n };\n}\n\nexport function getOpaqueFragment(\n store: PreservationStore,\n fragmentId: string,\n): OpaqueFragmentRecord | undefined {\n return normalizeOpaqueFragmentMap(store)[fragmentId];\n}\n\nexport function listOpaqueFragments(\n store: PreservationStore,\n): OpaqueFragmentRecord[] {\n return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {\n return (\n left.lastKnownRange.from - right.lastKnownRange.from ||\n left.fragmentId.localeCompare(right.fragmentId)\n );\n });\n}\n\nexport function listPreservedPackageParts(\n store: PreservationStore,\n): PreservedPackagePart[] {\n return Object.values(normalizePackagePartMap(store)).sort((left, right) =>\n left.packagePartName.localeCompare(right.packagePartName),\n );\n}\n\nexport function findOpaqueFragmentsIntersectingRange(\n store: PreservationStore,\n range: DocRange,\n): OpaqueFragmentRecord[] {\n return listOpaqueFragments(store).filter((fragment) =>\n rangesIntersect(fragment.lastKnownRange, range),\n );\n}\n\nexport function describeOpaqueFragment(\n fragment: OpaqueFragmentRecord,\n): OpaqueFragmentDescriptor {\n const xml = fragment.payloadReference;\n const detail = createDetail(fragment);\n\n if (/\\b(?:w:)?sectPr\\b/u.test(xml)) {\n return {\n featureKey: \"sections\",\n label: \"Section properties\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?tbl\\b/u.test(xml)) {\n return {\n featureKey: \"tables\",\n label: \"Preserved table structure\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?hdr\\b|\\b(?:w:)?ftr\\b/u.test(xml)) {\n return {\n featureKey: \"headers-footers\",\n label: \"Header or footer content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?fldSimple\\b|\\b(?:w:)?fldChar\\b|\\b(?:w:)?instrText\\b/u.test(xml)) {\n return {\n featureKey: \"fields\",\n label: \"Word field content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?sdt\\b/u.test(xml)) {\n return {\n featureKey: \"content-controls\",\n label: \"Content control\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?customXml\\b/u.test(xml)) {\n return {\n featureKey: \"custom-xml\",\n label: \"Custom XML wrapper\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?altChunk\\b/u.test(xml)) {\n return {\n featureKey: \"alt-chunk\",\n label: \"Alternate content import\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?object\\b|\\b(?:o:)?OLEObject\\b/u.test(xml)) {\n return {\n featureKey: \"embedded-objects\",\n label: \"Embedded object\",\n detail,\n };\n }\n\n if (/\\b(?:mc:)?AlternateContent\\b/u.test(xml)) {\n return {\n featureKey: \"alternate-content\",\n label: \"Markup compatibility block\",\n detail,\n };\n }\n\n return {\n featureKey: \"unknown-ooxml\",\n label: \"Unsupported OOXML fragment\",\n detail,\n };\n}\n\nfunction createDetail(fragment: OpaqueFragmentRecord): string {\n const detail = [\n `Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,\n fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,\n fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return detail.length > 0\n ? detail\n : \"Preserved whole-unit to keep unsupported OOXML intact.\";\n}\n\nfunction rangesIntersect(left: DocRange, right: DocRange): boolean {\n return left.from < right.to && right.from < left.to;\n}\n\nfunction normalizeOpaqueFragmentMap(\n store: PreservationStore,\n): Record<string, OpaqueFragmentRecord> {\n return store && typeof store === \"object\" && store.opaqueFragments && typeof store.opaqueFragments === \"object\"\n ? (store.opaqueFragments as Record<string, OpaqueFragmentRecord>)\n : {};\n}\n\nfunction normalizePackagePartMap(\n store: PreservationStore,\n): Record<string, PreservedPackagePart> {\n return store && typeof store === \"object\" && store.packageParts && typeof store.packageParts === \"object\"\n ? (store.packageParts as Record<string, PreservedPackagePart>)\n : {};\n}\n","import type { OpaqueFragmentRecord, PreservationStore } from \"../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"../io/ooxml/part-manifest.ts\";\n\nexport function retainRelationshipsForFragment(\n fragment: OpaqueFragmentRecord | undefined,\n relationships: OpcRelationship[],\n existingRelationshipMap: Map<string, OpcRelationship>,\n retainedRelationshipIds: Set<string>,\n): void {\n if (!fragment || fragment.payloadKind !== \"xml-subtree\") {\n return;\n }\n\n for (const relationshipId of extractReferencedRelationshipIds(fragment.payloadReference)) {\n if (retainedRelationshipIds.has(relationshipId)) {\n continue;\n }\n\n const relationship = existingRelationshipMap.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n relationships.push({ ...relationship });\n retainedRelationshipIds.add(relationshipId);\n }\n}\n\nexport function retainRelationshipsForStore(\n store: PreservationStore,\n relationships: OpcRelationship[],\n existingRelationshipMap: Map<string, OpcRelationship>,\n retainedRelationshipIds: Set<string>,\n): void {\n for (const fragment of Object.values(store.opaqueFragments)) {\n retainRelationshipsForFragment(\n fragment,\n relationships,\n existingRelationshipMap,\n retainedRelationshipIds,\n );\n }\n}\n\nexport function extractReferencedRelationshipIds(xml: string): Set<string> {\n const relationshipIds = new Set<string>();\n const relationshipPattern = /\\br:id=([\"'])([^\"']+)\\1/gu;\n\n for (const match of xml.matchAll(relationshipPattern)) {\n const relationshipId = match[2];\n if (relationshipId) {\n relationshipIds.add(relationshipId);\n }\n }\n\n return relationshipIds;\n}\n","import type { NumberingCatalog } from \"../../model/canonical-document.ts\";\n\nexport const DOCX_NULL_NUMBERING_INSTANCE_ID = \"num:0\";\nexport const DOCX_NULL_ABSTRACT_NUMBERING_ID = \"abstract-num:__docx-import-null__\";\n\nexport function createSyntheticDocxNullNumberingCatalog(): Pick<\n NumberingCatalog,\n \"abstractDefinitions\" | \"instances\"\n> {\n return {\n abstractDefinitions: {\n [DOCX_NULL_ABSTRACT_NUMBERING_ID]: {\n abstractNumberingId: DOCX_NULL_ABSTRACT_NUMBERING_ID,\n levels: Array.from({ length: 9 }, (_unused, level) => ({\n level,\n format: \"none\",\n text: \"\",\n })),\n },\n },\n instances: {\n [DOCX_NULL_NUMBERING_INSTANCE_ID]: {\n numberingInstanceId: DOCX_NULL_NUMBERING_INSTANCE_ID,\n abstractNumberingId: DOCX_NULL_ABSTRACT_NUMBERING_ID,\n overrides: [],\n },\n },\n };\n}\n\nexport function isSyntheticDocxNullAbstractDefinition(\n definition: NumberingCatalog[\"abstractDefinitions\"][string],\n): boolean {\n return definition.abstractNumberingId === DOCX_NULL_ABSTRACT_NUMBERING_ID;\n}\n\nexport function isSyntheticDocxNullNumberingInstance(\n instance: NumberingCatalog[\"instances\"][string],\n): boolean {\n return (\n instance.numberingInstanceId === DOCX_NULL_NUMBERING_INSTANCE_ID &&\n instance.abstractNumberingId === DOCX_NULL_ABSTRACT_NUMBERING_ID\n );\n}\n","import type { NumberingCatalog, ParagraphNode } from \"../../model/canonical-document.ts\";\nimport {\n isSyntheticDocxNullAbstractDefinition,\n isSyntheticDocxNullNumberingInstance,\n} from \"../ooxml/numbering-sentinels.ts\";\n\nexport const WORD_NUMBERING_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\";\n\nexport function serializeNumberingXml(catalog: NumberingCatalog): string {\n const abstractDefinitions = Object.values(catalog.abstractDefinitions)\n .filter((definition) => !isSyntheticDocxNullAbstractDefinition(definition))\n .sort((left, right) =>\n compareSerializedIds(left.abstractNumberingId, right.abstractNumberingId),\n );\n const instances = Object.values(catalog.instances)\n .filter((instance) => !isSyntheticDocxNullNumberingInstance(instance))\n .sort((left, right) =>\n compareSerializedIds(left.numberingInstanceId, right.numberingInstanceId),\n );\n\n const body = [\n ...abstractDefinitions.map((definition) => serializeAbstractDefinition(definition)),\n ...instances.map((instance) => serializeInstance(instance)),\n ].join(\"\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">${body}</w:numbering>`,\n ].join(\"\\n\");\n}\n\nexport function hasSerializableNumberingEntries(catalog: NumberingCatalog): boolean {\n return (\n Object.values(catalog.abstractDefinitions).some(\n (definition) => !isSyntheticDocxNullAbstractDefinition(definition),\n ) ||\n Object.values(catalog.instances).some(\n (instance) => !isSyntheticDocxNullNumberingInstance(instance),\n )\n );\n}\n\nexport function serializeParagraphNumberingProperties(\n numbering: ParagraphNode[\"numbering\"],\n): string {\n if (!numbering) {\n return \"\";\n }\n\n return `<w:numPr><w:ilvl w:val=\"${numbering.level}\"/><w:numId w:val=\"${escapeAttribute(\n stripCanonicalPrefix(numbering.numberingInstanceId, \"num:\"),\n )}\"/></w:numPr>`;\n}\n\nfunction serializeAbstractDefinition(definition: NumberingCatalog[\"abstractDefinitions\"][string]): string {\n const abstractNumId = escapeAttribute(\n stripCanonicalPrefix(definition.abstractNumberingId, \"abstract-num:\"),\n );\n const levels = [...definition.levels]\n .sort((left, right) => left.level - right.level)\n .map((level) => serializeLevel(level))\n .join(\"\");\n\n return `<w:abstractNum w:abstractNumId=\"${abstractNumId}\">${levels}</w:abstractNum>`;\n}\n\nfunction serializeLevel(level: NumberingCatalog[\"abstractDefinitions\"][string][\"levels\"][number]): string {\n const start = level.startAt !== undefined ? `<w:start w:val=\"${level.startAt}\"/>` : \"\";\n const paragraphStyle = level.paragraphStyleId\n ? `<w:pStyle w:val=\"${escapeAttribute(level.paragraphStyleId)}\"/>`\n : \"\";\n const isLegal = level.isLegalNumbering ? \"<w:isLgl/>\" : \"\";\n const suffix = level.suffix ? `<w:suff w:val=\"${escapeAttribute(level.suffix)}\"/>` : \"\";\n\n return `<w:lvl w:ilvl=\"${level.level}\">${start}<w:numFmt w:val=\"${escapeAttribute(\n level.format,\n )}\"/><w:lvlText w:val=\"${escapeAttribute(level.text)}\"/>${paragraphStyle}${isLegal}${suffix}</w:lvl>`;\n}\n\nfunction serializeInstance(instance: NumberingCatalog[\"instances\"][string]): string {\n const numId = escapeAttribute(stripCanonicalPrefix(instance.numberingInstanceId, \"num:\"));\n const abstractNumId = escapeAttribute(\n stripCanonicalPrefix(instance.abstractNumberingId, \"abstract-num:\"),\n );\n const overrides = [...instance.overrides]\n .sort((left, right) => left.level - right.level)\n .map((override) => serializeOverride(override))\n .join(\"\");\n\n return `<w:num w:numId=\"${numId}\"><w:abstractNumId w:val=\"${abstractNumId}\"/>${overrides}</w:num>`;\n}\n\nfunction serializeOverride(override: NumberingCatalog[\"instances\"][string][\"overrides\"][number]): string {\n const startOverride =\n override.startAt !== undefined ? `<w:startOverride w:val=\"${override.startAt}\"/>` : \"\";\n return `<w:lvlOverride w:ilvl=\"${override.level}\">${startOverride}</w:lvlOverride>`;\n}\n\nfunction compareSerializedIds(left: string, right: string): number {\n return stripKnownPrefix(left).localeCompare(stripKnownPrefix(right), \"en\", { numeric: true });\n}\n\nfunction stripKnownPrefix(value: string): string {\n return value.replace(/^abstract-num:|^num:/, \"\");\n}\n\nfunction stripCanonicalPrefix(value: string, prefix: \"abstract-num:\" | \"num:\"): string {\n return value.startsWith(prefix) ? value.slice(prefix.length) : value;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n","import type {\n AltChunkNode,\n BorderSpec,\n CustomXmlNode,\n DocumentRootNode,\n InlineNode,\n MediaCatalog,\n ParagraphNode,\n PreservationStore,\n SdtNode,\n SectionProperties,\n TableNode,\n TableCellNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"../ooxml/part-manifest.ts\";\nimport type { RevisionParagraphBoundary } from \"../ooxml/revision-boundaries.ts\";\nimport { getOpaqueFragment } from \"../../preservation/store.ts\";\nimport { retainRelationshipsForFragment } from \"../../preservation/relationship-retention.ts\";\nimport { serializeParagraphNumberingProperties } from \"./serialize-numbering.ts\";\n\nconst HYPERLINK_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\n\nexport interface SerializedMainDocument {\n documentXml: string;\n relationships: OpcRelationship[];\n paragraphBoundaries: RevisionParagraphBoundary[];\n}\n\nexport interface SerializeMainDocumentOptions {\n documentAttributes?: Record<string, string>;\n media?: MediaCatalog;\n finalSectionProperties?: SectionProperties;\n}\n\ninterface SerializationState {\n nextHyperlinkRelationshipIndex: number;\n relationships: OpcRelationship[];\n existingRelationshipMap: Map<string, OpcRelationship>;\n retainedRelationshipIds: Set<string>;\n media: MediaCatalog;\n preservation: PreservationStore;\n}\n\ninterface InlineSerializationResult {\n xml: string;\n cursor: number;\n boundaries: Map<number, number>;\n}\n\ninterface ParagraphSerializationResult {\n xml: string;\n nextCursor: number;\n boundary: RevisionParagraphBoundary;\n}\n\nexport function serializeMainDocument(\n content: DocumentRootNode,\n preservation: PreservationStore = { opaqueFragments: {}, packageParts: {} },\n existingRelationships: readonly OpcRelationship[] = [],\n options: SerializeMainDocumentOptions = {},\n): SerializedMainDocument {\n const nextRelationshipIndex =\n existingRelationships.reduce((maxIndex, relationship) => {\n const match = /^rIdHyperlink(\\d+)$/.exec(relationship.id);\n return match ? Math.max(maxIndex, Number.parseInt(match[1] ?? \"0\", 10)) : maxIndex;\n }, 0) + 1;\n const state: SerializationState = {\n nextHyperlinkRelationshipIndex: nextRelationshipIndex,\n relationships: existingRelationships.filter(\n (relationship) => relationship.type !== HYPERLINK_RELATIONSHIP_TYPE,\n ).map(cloneRelationship),\n existingRelationshipMap: new Map(\n existingRelationships.map((relationship) => [relationship.id, cloneRelationship(relationship)]),\n ),\n retainedRelationshipIds: new Set(\n existingRelationships\n .filter((relationship) => relationship.type !== HYPERLINK_RELATIONSHIP_TYPE)\n .map((relationship) => relationship.id),\n ),\n media: options.media ?? { items: {} },\n preservation,\n };\n const documentOpen = `<w:document${serializeDocumentAttributes(options.documentAttributes, content)}>`;\n const prefix = [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n documentOpen,\n ` <w:body>`,\n ].join(\"\\n\");\n const suffix = `</w:body>\\n</w:document>`;\n const bodyPieces: string[] = [];\n const paragraphBoundaries: RevisionParagraphBoundary[] = [];\n let bodyLength = 0;\n let sectionPropertiesXml = options.finalSectionProperties\n ? serializeSectionPropertiesXml(options.finalSectionProperties)\n : \"<w:sectPr/>\";\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const block of content.children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n\n paragraphIndex += 1;\n const serializedParagraph = serializeParagraph(\n block,\n state,\n cursor,\n paragraphIndex,\n );\n const paragraphOffset = prefix.length + bodyLength;\n bodyPieces.push(serializedParagraph.xml);\n bodyLength += serializedParagraph.xml.length;\n paragraphBoundaries.push(\n offsetParagraphBoundary(serializedParagraph.boundary, paragraphOffset),\n );\n cursor = serializedParagraph.nextCursor;\n previousWasParagraph = true;\n continue;\n }\n\n if (block.type === \"table\") {\n const tableXml = serializeTableNode(block, state);\n bodyPieces.push(tableXml);\n bodyLength += tableXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"sdt\") {\n const sdtXml = serializeSdtNode(block, state);\n bodyPieces.push(sdtXml);\n bodyLength += sdtXml.length;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n const customXml = serializeCustomXmlNode(block, state);\n bodyPieces.push(customXml);\n bodyLength += customXml.length;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"alt_chunk\") {\n const altChunkXml = serializeAltChunkNode(block);\n bodyPieces.push(altChunkXml);\n bodyLength += altChunkXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"section_break\") {\n // Inline section breaks must be emitted as a paragraph with <w:sectPr>\n // in its <w:pPr> element (OOXML compliance). The body-level <w:sectPr>\n // is reserved for the final section only.\n let inlineSectPr: string;\n if (block.sectionPropertiesXml ?? block.propertiesXml) {\n inlineSectPr = block.sectionPropertiesXml ?? block.propertiesXml!;\n } else if (block.sectionProperties) {\n inlineSectPr = serializeSectionPropertiesXml(block.sectionProperties);\n } else {\n inlineSectPr = \"<w:sectPr/>\";\n }\n const sectionParagraphXml = `<w:p><w:pPr>${inlineSectPr}</w:pPr></w:p>`;\n bodyPieces.push(sectionParagraphXml);\n bodyLength += sectionParagraphXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n const blockXml = serializeOpaqueBlock(block, state);\n if (looksLikeSectionPropertiesXml(blockXml)) {\n sectionPropertiesXml = blockXml;\n } else {\n bodyPieces.push(blockXml);\n bodyLength += blockXml.length;\n }\n cursor += 1;\n previousWasParagraph = false;\n }\n\n const bodyXml = bodyPieces.join(\"\");\n const documentXml = `${prefix}${bodyXml || \"<w:p><w:r><w:t></w:t></w:r></w:p>\"}${sectionPropertiesXml}${suffix}`;\n\n return {\n documentXml,\n relationships: state.relationships,\n paragraphBoundaries,\n };\n}\n\nfunction serializeOpaqueBlock(\n block: Extract<DocumentRootNode[\"children\"][number], { type: \"opaque_block\" }>,\n state: SerializationState,\n): string {\n return lookupOpaqueXml(block.fragmentId, state);\n}\n\nfunction serializeTableNode(\n table: TableNode,\n state: SerializationState,\n): string {\n const propertiesXml = table.propertiesXml ?? buildTablePropertiesXml(table);\n const gridXml =\n table.gridColumns.length > 0\n ? `<w:tblGrid>${table.gridColumns\n .map((width) => `<w:gridCol w:w=\"${width}\"/>`)\n .join(\"\")}</w:tblGrid>`\n : \"\";\n const rowsXml = table.rows\n .map((row) => {\n const rowPropertiesXml = row.propertiesXml ?? buildTableRowPropertiesXml(row);\n const cellsXml = row.cells\n .map((cell) => serializeTableCellNode(cell, state))\n .join(\"\");\n return `<w:tr>${rowPropertiesXml}${cellsXml}</w:tr>`;\n })\n .join(\"\");\n return `<w:tbl>${propertiesXml}${gridXml}${rowsXml}</w:tbl>`;\n}\n\nfunction serializeTableCellNode(\n cell: TableCellNode,\n state: SerializationState,\n): string {\n const propertiesXml = cell.propertiesXml ?? buildCellPropertiesXml(cell);\n const blocksXml = cell.children\n .map((child) => serializeBlockNode(child, state))\n .join(\"\");\n return `<w:tc>${propertiesXml}${blocksXml || \"<w:p/>\"}</w:tc>`;\n}\n\nfunction serializeBlockNode(\n block: DocumentRootNode[\"children\"][number],\n state: SerializationState,\n): string {\n switch (block.type) {\n case \"paragraph\":\n return serializeTableCellParagraph(block, state);\n case \"table\":\n return serializeTableNode(block, state);\n case \"sdt\":\n return serializeSdtNode(block, state);\n case \"custom_xml\":\n return serializeCustomXmlNode(block, state);\n case \"alt_chunk\":\n return serializeAltChunkNode(block);\n case \"opaque_block\":\n return lookupOpaqueXml(block.fragmentId, state);\n case \"section_break\":\n if (block.sectionPropertiesXml ?? block.propertiesXml) {\n return block.sectionPropertiesXml ?? block.propertiesXml!;\n }\n if (block.sectionProperties) return serializeSectionPropertiesXml(block.sectionProperties);\n return \"<w:sectPr/>\";\n }\n}\n\nfunction buildCellPropertiesXml(cell: TableCellNode): string {\n const children: string[] = [];\n if (cell.gridSpan && cell.gridSpan > 1) {\n children.push(`<w:gridSpan w:val=\"${cell.gridSpan}\"/>`);\n }\n if (cell.verticalMerge) {\n children.push(\n cell.verticalMerge === \"restart\"\n ? `<w:vMerge w:val=\"restart\"/>`\n : `<w:vMerge/>`,\n );\n }\n return children.length > 0 ? `<w:tcPr>${children.join(\"\")}</w:tcPr>` : \"\";\n}\n\nfunction buildTableRowPropertiesXml(row: TableNode[\"rows\"][number]): string {\n const children: string[] = [];\n if (row.gridBefore !== undefined) {\n children.push(`<w:gridBefore w:val=\"${row.gridBefore}\"/>`);\n }\n if (row.widthBefore) {\n children.push(`<w:wBefore w:w=\"${row.widthBefore.value}\" w:type=\"${row.widthBefore.type}\"/>`);\n }\n if (row.gridAfter !== undefined) {\n children.push(`<w:gridAfter w:val=\"${row.gridAfter}\"/>`);\n }\n if (row.widthAfter) {\n children.push(`<w:wAfter w:w=\"${row.widthAfter.value}\" w:type=\"${row.widthAfter.type}\"/>`);\n }\n if (children.length === 0) {\n return \"\";\n }\n return `<w:trPr>${children.join(\"\")}</w:trPr>`;\n}\n\nfunction serializeSdtNode(\n block: SdtNode,\n state: SerializationState,\n): string {\n const propertiesXml = block.properties.propertiesXml ?? buildSdtPropertiesXml(block);\n const childrenXml = block.children.map((child) => serializeBlockNode(child, state)).join(\"\") || \"<w:p/>\";\n return `<w:sdt>${propertiesXml}<w:sdtContent>${childrenXml}</w:sdtContent></w:sdt>`;\n}\n\nfunction serializeCustomXmlNode(\n block: CustomXmlNode,\n state: SerializationState,\n): string {\n const attrs: string[] = [];\n if (block.uri) {\n attrs.push(`w:uri=\"${escapeAttribute(block.uri)}\"`);\n }\n if (block.element) {\n attrs.push(`w:element=\"${escapeAttribute(block.element)}\"`);\n }\n const attrXml = attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\";\n const childrenXml = block.children.map((child) => serializeBlockNode(child, state)).join(\"\");\n return `<w:customXml${attrXml}>${childrenXml || \"<w:p/>\"}</w:customXml>`;\n}\n\nfunction serializeAltChunkNode(\n block: AltChunkNode,\n): string {\n return `<w:altChunk r:id=\"${escapeAttribute(block.relationshipId)}\"/>`;\n}\n\nfunction buildSdtPropertiesXml(block: SdtNode): string {\n const children: string[] = [];\n if (block.properties.alias) {\n children.push(`<w:alias w:val=\"${escapeAttribute(block.properties.alias)}\"/>`);\n }\n if (block.properties.tag) {\n children.push(`<w:tag w:val=\"${escapeAttribute(block.properties.tag)}\"/>`);\n }\n if (block.properties.lock) {\n children.push(`<w:lock w:val=\"${escapeAttribute(block.properties.lock)}\"/>`);\n }\n if (block.properties.showingPlcHdr) {\n children.push(`<w:showingPlcHdr/>`);\n }\n if (block.properties.checkbox) {\n const cb = block.properties.checkbox;\n const cbParts: string[] = [];\n cbParts.push(`<w14:checked w14:val=\"${cb.checked ? \"1\" : \"0\"}\"/>`);\n if (cb.checkedChar) cbParts.push(`<w14:checkedState w14:val=\"${escapeAttribute(cb.checkedChar)}\"/>`);\n if (cb.uncheckedChar) cbParts.push(`<w14:uncheckedState w14:val=\"${escapeAttribute(cb.uncheckedChar)}\"/>`);\n children.push(`<w14:checkbox>${cbParts.join(\"\")}</w14:checkbox>`);\n } else if (block.properties.datePicker) {\n const dp = block.properties.datePicker;\n const dateAttrs = dp.fullDate ? ` w:fullDate=\"${escapeAttribute(dp.fullDate)}\"` : \"\";\n const dpParts: string[] = [];\n if (dp.dateFormat) dpParts.push(`<w:dateFormat w:val=\"${escapeAttribute(dp.dateFormat)}\"/>`);\n if (dp.lid) dpParts.push(`<w:lid w:val=\"${escapeAttribute(dp.lid)}\"/>`);\n children.push(dpParts.length > 0 ? `<w:date${dateAttrs}>${dpParts.join(\"\")}</w:date>` : `<w:date${dateAttrs}/>`);\n } else if (block.properties.dropdownList) {\n const items = block.properties.dropdownList.map((item) => {\n const dt = item.displayText ? ` w:displayText=\"${escapeAttribute(item.displayText)}\"` : \"\";\n return `<w:listItem${dt} w:value=\"${escapeAttribute(item.value)}\"/>`;\n }).join(\"\");\n children.push(`<w:dropDownList>${items}</w:dropDownList>`);\n } else if (block.properties.comboBox) {\n const items = block.properties.comboBox.map((item) => {\n const dt = item.displayText ? ` w:displayText=\"${escapeAttribute(item.displayText)}\"` : \"\";\n return `<w:listItem${dt} w:value=\"${escapeAttribute(item.value)}\"/>`;\n }).join(\"\");\n children.push(`<w:comboBox>${items}</w:comboBox>`);\n } else if (block.properties.sdtType === \"plainText\") {\n children.push(`<w:text/>`);\n } else if (block.properties.sdtType === \"richText\") {\n children.push(`<w:richText/>`);\n } else if (block.properties.sdtType) {\n children.push(`<w:${block.properties.sdtType}/>`);\n }\n return children.length > 0 ? `<w:sdtPr>${children.join(\"\")}</w:sdtPr>` : \"<w:sdtPr/>\";\n}\n\nfunction serializeTableCellParagraph(\n paragraph: ParagraphNode,\n state: SerializationState,\n): string {\n let xml = \"<w:p>\";\n const paragraphPropertiesXml = buildParagraphPropertiesXml(paragraph);\n if (paragraphPropertiesXml.length > 0) {\n xml += paragraphPropertiesXml;\n }\n const childrenXml = paragraph.children.map((child) => serializeTableInlineNode(child, state)).join(\"\");\n xml += childrenXml || \"<w:r><w:t></w:t></w:r>\";\n xml += \"</w:p>\";\n return xml;\n}\n\nfunction serializeTableInlineNode(\n node: InlineNode,\n state: SerializationState,\n): string {\n switch (node.type) {\n case \"text\": {\n const marks = node.marks;\n const properties = serializeRunPropertiesFromMarks(marks);\n const preserve = requiresPreservedSpace(node.text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(node.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"column_break\":\n return \"<w:r><w:br w:type=\\\"column\\\"/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n case \"symbol\": {\n const properties = serializeRunPropertiesFromMarks(node.marks);\n const fontAttribute = node.font ? ` w:font=\"${escapeAttribute(node.font)}\"` : \"\";\n return `<w:r>${properties}<w:sym${fontAttribute} w:char=\"${escapeAttribute(node.char)}\"/></w:r>`;\n }\n case \"image\":\n return serializeImageNode(node, state);\n case \"opaque_inline\":\n return lookupOpaqueXml(node.fragmentId, state);\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n return wrapInlineRawXml(node.rawXml);\n case \"hyperlink\": {\n const hyperlinkOpen = node.href.startsWith(\"#\")\n ? `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">`\n : (() => {\n const relationshipId = `rIdHyperlink${state.nextHyperlinkRelationshipIndex}`;\n state.nextHyperlinkRelationshipIndex += 1;\n state.relationships.push({\n id: relationshipId,\n type: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n target: node.href,\n targetMode: \"external\",\n });\n state.retainedRelationshipIds.add(relationshipId);\n return `<w:hyperlink r:id=\"${relationshipId}\">`;\n })();\n const childrenXml = node.children.map((child) => serializeTableInlineNode(child, state)).join(\"\");\n return `${hyperlinkOpen}${childrenXml}</w:hyperlink>`;\n }\n case \"field\": {\n if (node.children && node.children.length > 0) {\n const childrenXml = node.children\n .map((child) => serializeTableInlineNode(child, state))\n .join(\"\");\n if (node.fieldType === \"complex\") {\n return (\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\"> ${escapeXml(node.instruction)} </w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n childrenXml +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`\n );\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">${childrenXml}</w:fldSimple>`;\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n }\n case \"bookmark_start\":\n return (\n `<w:bookmarkStart w:id=\"${escapeAttribute(node.bookmarkId)}\"` +\n ` w:name=\"${escapeAttribute(node.name)}\"/>`\n );\n case \"bookmark_end\":\n return `<w:bookmarkEnd w:id=\"${escapeAttribute(node.bookmarkId)}\"/>`;\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n const styleVal =\n node.noteKind === \"footnote\"\n ? \"FootnoteReference\"\n : \"EndnoteReference\";\n return `<w:r><w:rPr><w:rStyle w:val=\"${styleVal}\"/></w:rPr>${refElement}</w:r>`;\n }\n default:\n return \"\";\n }\n}\n\nfunction buildParagraphPropertiesXml(paragraph: ParagraphNode): string {\n const children: string[] = [];\n\n if (paragraph.styleId) {\n children.push(`<w:pStyle w:val=\"${escapeAttribute(paragraph.styleId)}\"/>`);\n }\n if (paragraph.keepNext) {\n children.push(\"<w:keepNext/>\");\n }\n if (paragraph.keepLines) {\n children.push(\"<w:keepLines/>\");\n }\n if (paragraph.pageBreakBefore) {\n children.push(\"<w:pageBreakBefore/>\");\n }\n if (paragraph.widowControl) {\n children.push(\"<w:widowControl/>\");\n }\n if (paragraph.outlineLevel !== undefined) {\n children.push(`<w:outlineLvl w:val=\"${paragraph.outlineLevel}\"/>`);\n }\n if (paragraph.numbering) {\n children.push(serializeParagraphNumberingProperties(paragraph.numbering));\n }\n if (paragraph.spacing) {\n const s = paragraph.spacing;\n const attrs: string[] = [];\n if (s.before !== undefined) attrs.push(`w:before=\"${s.before}\"`);\n if (s.after !== undefined) attrs.push(`w:after=\"${s.after}\"`);\n if (s.line !== undefined) attrs.push(`w:line=\"${s.line}\"`);\n if (s.lineRule !== undefined) attrs.push(`w:lineRule=\"${s.lineRule}\"`);\n if (attrs.length > 0) children.push(`<w:spacing ${attrs.join(\" \")}/>`);\n }\n if (paragraph.contextualSpacing !== undefined) {\n children.push(\n paragraph.contextualSpacing\n ? \"<w:contextualSpacing/>\"\n : `<w:contextualSpacing w:val=\"0\"/>`,\n );\n }\n if (paragraph.indentation) {\n const ind = paragraph.indentation;\n const attrs: string[] = [];\n if (ind.left !== undefined) attrs.push(`w:left=\"${ind.left}\"`);\n if (ind.right !== undefined) attrs.push(`w:right=\"${ind.right}\"`);\n if (ind.firstLine !== undefined) attrs.push(`w:firstLine=\"${ind.firstLine}\"`);\n if (ind.hanging !== undefined) attrs.push(`w:hanging=\"${ind.hanging}\"`);\n if (attrs.length > 0) children.push(`<w:ind ${attrs.join(\" \")}/>`);\n }\n if (paragraph.alignment) {\n children.push(`<w:jc w:val=\"${paragraph.alignment}\"/>`);\n }\n if (paragraph.borders) {\n const bordersXml = serializeParagraphBorders(paragraph.borders);\n if (bordersXml) {\n children.push(bordersXml);\n }\n }\n if (paragraph.shading) {\n const shadingXml = serializeParagraphShading(paragraph.shading);\n if (shadingXml) {\n children.push(shadingXml);\n }\n }\n if (paragraph.bidi) {\n children.push(\"<w:bidi/>\");\n }\n if (paragraph.suppressLineNumbers) {\n children.push(\"<w:suppressLineNumbers/>\");\n }\n if (paragraph.cnfStyle) {\n children.push(`<w:cnfStyle w:val=\"${escapeAttribute(paragraph.cnfStyle)}\"/>`);\n }\n if (paragraph.tabStops && paragraph.tabStops.length > 0) {\n const tabsXml = paragraph.tabStops.map((tab) => {\n const leaderAttr = tab.leader ? ` w:leader=\"${tab.leader}\"` : \"\";\n return `<w:tab w:val=\"${tab.align}\" w:pos=\"${tab.position}\"${leaderAttr}/>`;\n }).join(\"\");\n children.push(`<w:tabs>${tabsXml}</w:tabs>`);\n }\n\n if (children.length === 0) return \"\";\n return `<w:pPr>${children.join(\"\")}</w:pPr>`;\n}\n\nfunction buildTablePropertiesXml(table: TableNode): string {\n const children: string[] = [];\n if (table.styleId) {\n children.push(`<w:tblStyle w:val=\"${escapeAttribute(table.styleId)}\"/>`);\n }\n if (table.tblLook) {\n const attrs: string[] = [];\n if (table.tblLook.val) {\n attrs.push(`w:val=\"${escapeAttribute(table.tblLook.val)}\"`);\n }\n for (const [key, attr] of [\n [\"firstRow\", \"w:firstRow\"],\n [\"lastRow\", \"w:lastRow\"],\n [\"firstColumn\", \"w:firstColumn\"],\n [\"lastColumn\", \"w:lastColumn\"],\n [\"noHBand\", \"w:noHBand\"],\n [\"noVBand\", \"w:noVBand\"],\n ] as const) {\n const value = table.tblLook[key];\n if (value !== undefined) {\n attrs.push(`${attr}=\"${value ? \"1\" : \"0\"}\"`);\n }\n }\n if (attrs.length > 0) {\n children.push(`<w:tblLook ${attrs.join(\" \")}/>`);\n }\n }\n return children.length > 0 ? `<w:tblPr>${children.join(\"\")}</w:tblPr>` : \"\";\n}\n\nfunction serializeParagraphBorders(borders: ParagraphNode[\"borders\"]): string {\n if (!borders) {\n return \"\";\n }\n const parts: string[] = [];\n for (const [name, border] of [\n [\"top\", borders.top],\n [\"left\", borders.left],\n [\"bottom\", borders.bottom],\n [\"right\", borders.right],\n [\"bar\", borders.bar],\n [\"between\", borders.between],\n ] as const) {\n const xml = serializeBorder(name, border);\n if (xml) {\n parts.push(xml);\n }\n }\n return parts.length > 0 ? `<w:pBdr>${parts.join(\"\")}</w:pBdr>` : \"\";\n}\n\nfunction serializeBorder(name: string, border: BorderSpec | undefined): string {\n if (!border) {\n return \"\";\n }\n const attrs: string[] = [];\n if (border.value) attrs.push(`w:val=\"${escapeAttribute(border.value)}\"`);\n if (border.size !== undefined) attrs.push(`w:sz=\"${border.size}\"`);\n if (border.space !== undefined) attrs.push(`w:space=\"${border.space}\"`);\n if (border.color) attrs.push(`w:color=\"${escapeAttribute(border.color)}\"`);\n return attrs.length > 0 ? `<w:${name} ${attrs.join(\" \")}/>` : \"\";\n}\n\nfunction serializeParagraphShading(shading: ParagraphNode[\"shading\"]): string {\n if (!shading) {\n return \"\";\n }\n const attrs: string[] = [];\n if (shading.val) attrs.push(`w:val=\"${escapeAttribute(shading.val)}\"`);\n if (shading.color) attrs.push(`w:color=\"${escapeAttribute(shading.color)}\"`);\n if (shading.fill) attrs.push(`w:fill=\"${escapeAttribute(shading.fill)}\"`);\n return attrs.length > 0 ? `<w:shd ${attrs.join(\" \")}/>` : \"\";\n}\n\nfunction serializeRunPropertiesFromMarks(marks: TextMark[] | undefined): string {\n return serializeRunProperties(marks);\n}\n\nfunction serializeParagraph(\n paragraph: ParagraphNode,\n state: SerializationState,\n cursor: number,\n paragraphIndex: number,\n): ParagraphSerializationResult {\n let xml = \"<w:p>\";\n const boundaries = new Map<number, number>();\n const paragraphStart = 0;\n const paragraphStartTagEnd = xml.length;\n boundaries.set(cursor, paragraphStartTagEnd);\n\n let paragraphPropertiesStart: number | undefined;\n let paragraphPropertiesEnd: number | undefined;\n\n const paragraphPropertiesXml = buildParagraphPropertiesXml(paragraph);\n if (paragraphPropertiesXml.length > 0) {\n paragraphPropertiesStart = xml.length;\n xml += paragraphPropertiesXml;\n paragraphPropertiesEnd = xml.length;\n }\n\n const children = serializeParagraphChildren(paragraph.children, state, cursor, xml.length);\n xml += children.xml;\n const contentEmpty = children.xml.length === 0;\n if (contentEmpty) {\n xml += \"<w:r><w:t></w:t></w:r>\";\n }\n const paragraphEndTagStart = xml.length;\n xml += \"</w:p>\";\n\n if (!children.boundaries.has(children.cursor)) {\n children.boundaries.set(children.cursor, paragraphEndTagStart);\n }\n\n return {\n xml,\n nextCursor: children.cursor,\n boundary: {\n paragraphIndex,\n start: cursor,\n end: children.cursor,\n boundaries: children.boundaries,\n paragraphStart,\n paragraphStartTagEnd,\n paragraphEndTagStart,\n paragraphEnd: xml.length,\n ...(paragraphPropertiesStart !== undefined\n ? { paragraphPropertiesStart }\n : {}),\n ...(paragraphPropertiesEnd !== undefined ? { paragraphPropertiesEnd } : {}),\n },\n };\n}\n\nfunction serializeParagraphChildren(\n children: InlineNode[],\n state: SerializationState,\n cursor: number,\n xmlOffset: number,\n): InlineSerializationResult {\n const pieces: string[] = [];\n const boundaries = new Map<number, number>();\n let nextCursor = cursor;\n let nextOffset = xmlOffset;\n boundaries.set(nextCursor, nextOffset);\n\n for (const child of children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n pieces.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n\n return {\n xml: pieces.join(\"\"),\n cursor: nextCursor,\n boundaries,\n };\n}\n\ntype RunPiece =\n | { kind: \"text\"; text: string; marks?: TextMark[] }\n | { kind: \"tab\" }\n | { kind: \"hard_break\" };\n\nfunction serializeRunPiece(piece: RunPiece): string {\n switch (piece.kind) {\n case \"text\":\n return serializeText(piece.text);\n case \"tab\":\n return \"<w:tab/>\";\n case \"hard_break\":\n return \"<w:br/>\";\n }\n}\n\nfunction serializeText(text: string): string {\n const preserve = requiresPreservedSpace(text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:t${preserve}>${escapeXml(text)}</w:t>`;\n}\n\nfunction serializeInlineNode(\n node: InlineNode,\n state: SerializationState,\n cursor: number,\n xmlOffset: number,\n): InlineSerializationResult {\n switch (node.type) {\n case \"text\": {\n const xml = serializeRun({\n kind: \"text\",\n text: node.text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + Array.from(node.text).length, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + Array.from(node.text).length,\n boundaries,\n };\n }\n case \"tab\": {\n const xml = serializeRun({ kind: \"tab\" });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"column_break\": {\n const xml = `<w:r><w:br w:type=\"column\"/></w:r>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"hard_break\": {\n const xml = serializeRun({ kind: \"hard_break\" });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"symbol\": {\n const xml = serializeTableInlineNode(node, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"image\": {\n const xml = serializeImageNode(node, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"opaque_inline\": {\n const xml = lookupOpaqueXml(node.fragmentId, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\": {\n // Reattach original XML unchanged for lossless round-trip.\n const xml = wrapInlineRawXml(node.rawXml);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"hyperlink\": {\n const hyperlinkOpen = node.href.startsWith(\"#\")\n ? `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">`\n : (() => {\n const relationshipId = `rIdHyperlink${state.nextHyperlinkRelationshipIndex}`;\n state.nextHyperlinkRelationshipIndex += 1;\n state.relationships.push({\n id: relationshipId,\n type: HYPERLINK_RELATIONSHIP_TYPE,\n target: node.href,\n targetMode: \"external\",\n });\n state.retainedRelationshipIds.add(relationshipId);\n return `<w:hyperlink r:id=\"${relationshipId}\">`;\n })();\n const hyperlinkClose = \"</w:hyperlink>\";\n const boundaries = new Map<number, number>();\n let nextCursor = cursor;\n let nextOffset = xmlOffset + hyperlinkOpen.length;\n boundaries.set(cursor, nextOffset);\n const children: string[] = [];\n\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n\n boundaries.set(nextCursor, nextOffset);\n return {\n xml: `${hyperlinkOpen}${children.join(\"\")}${hyperlinkClose}`,\n cursor: nextCursor,\n boundaries,\n };\n }\n case \"field\": {\n if (node.children && node.children.length > 0) {\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n let nextCursor = cursor;\n let nextOffset = xmlOffset;\n\n if (node.fieldType === \"complex\") {\n const beginXml =\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\"> ${escapeXml(node.instruction)} </w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>`;\n nextOffset += beginXml.length;\n\n const children: string[] = [beginXml];\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n const endXml = `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`;\n children.push(endXml);\n nextOffset += endXml.length;\n boundaries.set(nextCursor, nextOffset);\n return { xml: children.join(\"\"), cursor: nextCursor, boundaries };\n }\n\n // Simple field with children\n const openXml = `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">`;\n nextOffset += openXml.length;\n const children: string[] = [openXml];\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n children.push(\"</w:fldSimple>\");\n nextOffset += \"</w:fldSimple>\".length;\n boundaries.set(nextCursor, nextOffset);\n return { xml: children.join(\"\"), cursor: nextCursor, boundaries };\n }\n\n const xml = `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"bookmark_start\": {\n const xml =\n `<w:bookmarkStart w:id=\"${escapeAttribute(node.bookmarkId)}\"` +\n ` w:name=\"${escapeAttribute(node.name)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor, xmlOffset + xml.length);\n return { xml, cursor, boundaries };\n }\n case \"bookmark_end\": {\n const xml = `<w:bookmarkEnd w:id=\"${escapeAttribute(node.bookmarkId)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor, xmlOffset + xml.length);\n return { xml, cursor, boundaries };\n }\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n const styleVal =\n node.noteKind === \"footnote\"\n ? \"FootnoteReference\"\n : \"EndnoteReference\";\n const xml = `<w:r><w:rPr><w:rStyle w:val=\"${styleVal}\"/></w:rPr>${refElement}</w:r>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n default: {\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n return { xml: \"\", cursor, boundaries };\n }\n }\n}\n\nfunction serializeImageNode(\n node: Extract<InlineNode, { type: \"image\" }>,\n state: SerializationState,\n): string {\n const placementXml = typeof node.placementXml === \"string\" ? node.placementXml.trim() : \"\";\n if (placementXml.length > 0) {\n return placementXml.startsWith(\"<w:r\") ? placementXml : `<w:r>${placementXml}</w:r>`;\n }\n\n const mediaItem = state.media.items[node.mediaId];\n if (mediaItem?.relationshipId && state.existingRelationshipMap.has(mediaItem.relationshipId)) {\n const altText = node.altText ?? mediaItem.altText ?? mediaItem.filename;\n return `<w:r><w:drawing><wp:inline xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"><wp:extent cx=\"9525\" cy=\"9525\"/><wp:docPr id=\"1\" name=\"${escapeAttribute(mediaItem.filename)}\" descr=\"${escapeAttribute(altText ?? \"\")}\"/><wp:cNvGraphicFramePr/><a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic><pic:nvPicPr><pic:cNvPr id=\"0\" name=\"${escapeAttribute(mediaItem.filename)}\"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"${escapeAttribute(mediaItem.relationshipId)}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"9525\" cy=\"9525\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>`;\n }\n\n return serializeRun({\n kind: \"text\",\n text: node.altText ?? \"[Image]\",\n });\n}\n\nfunction serializeRun(piece: RunPiece): string {\n const marks = piece.kind === \"text\" ? piece.marks : undefined;\n const properties = serializeRunProperties(marks);\n const content = serializeRunPiece(piece);\n return `<w:r>${properties}${content}</w:r>`;\n}\n\nfunction serializeRunProperties(marks: TextMark[] | undefined): string {\n if (!marks || marks.length === 0) {\n return \"\";\n }\n\n const markParts: string[] = [];\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n markParts.push(\"<w:b/>\");\n break;\n case \"italic\":\n markParts.push(\"<w:i/>\");\n break;\n case \"underline\":\n markParts.push(`<w:u w:val=\"single\"/>`);\n break;\n case \"strikethrough\":\n markParts.push(\"<w:strike/>\");\n break;\n case \"doubleStrikethrough\":\n markParts.push(\"<w:dstrike/>\");\n break;\n case \"vanish\":\n markParts.push(\"<w:vanish/>\");\n break;\n case \"lang\":\n markParts.push(`<w:lang w:val=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"highlight\":\n markParts.push(`<w:highlight w:val=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"backgroundColor\":\n markParts.push(\n `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${escapeAttribute(mark.color)}\"/>`,\n );\n break;\n case \"charSpacing\":\n markParts.push(`<w:spacing w:val=\"${mark.val}\"/>`);\n break;\n case \"kerning\":\n markParts.push(`<w:kern w:val=\"${mark.val}\"/>`);\n break;\n case \"emboss\":\n markParts.push(\"<w:emboss/>\");\n break;\n case \"imprint\":\n markParts.push(\"<w:imprint/>\");\n break;\n case \"shadow\":\n markParts.push(\"<w:shadow/>\");\n break;\n case \"position\":\n markParts.push(`<w:position w:val=\"${mark.val}\"/>`);\n break;\n case \"textFill\":\n markParts.push(mark.xml);\n break;\n case \"fontFamily\":\n markParts.push(`<w:rFonts w:ascii=\"${escapeAttribute(mark.val)}\" w:hAnsi=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"fontSize\":\n markParts.push(`<w:sz w:val=\"${mark.val}\"/>`);\n break;\n case \"textColor\":\n markParts.push(`<w:color w:val=\"${escapeAttribute(mark.color)}\"/>`);\n break;\n case \"smallCaps\":\n markParts.push(\"<w:smallCaps/>\");\n break;\n case \"allCaps\":\n markParts.push(\"<w:caps/>\");\n break;\n }\n }\n\n const children = markParts.join(\"\");\n return children.length > 0 ? `<w:rPr>${children}</w:rPr>` : \"\";\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return /^\\s/.test(text) || /\\s$/.test(text) || text.includes(\" \");\n}\n\nfunction lookupOpaqueXml(fragmentId: string, state: SerializationState): string {\n const fragment = getOpaqueFragment(state.preservation, fragmentId);\n if (!fragment || fragment.payloadKind !== \"xml-subtree\") {\n throw new Error(`Missing preserved OOXML fragment ${fragmentId} during serialization.`);\n }\n\n retainRelationshipsForFragment(\n fragment,\n state.relationships,\n state.existingRelationshipMap,\n state.retainedRelationshipIds,\n );\n return fragment.payloadReference;\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nfunction looksLikeSectionPropertiesXml(xml: string): boolean {\n return /^<[^>]*:?sectPr(?:\\s|>|\\/)/.test(xml.trim());\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeXml(value).replace(/\"/g, \""\");\n}\n\nfunction offsetParagraphBoundary(\n boundary: RevisionParagraphBoundary,\n offset: number,\n): RevisionParagraphBoundary {\n return {\n ...boundary,\n boundaries: new Map(\n [...boundary.boundaries.entries()].map(([position, index]) => [\n position,\n index + offset,\n ]),\n ),\n paragraphStart: boundary.paragraphStart + offset,\n paragraphStartTagEnd: boundary.paragraphStartTagEnd + offset,\n paragraphEndTagStart: boundary.paragraphEndTagStart + offset,\n paragraphEnd: boundary.paragraphEnd + offset,\n ...(boundary.paragraphPropertiesStart !== undefined\n ? { paragraphPropertiesStart: boundary.paragraphPropertiesStart + offset }\n : {}),\n ...(boundary.paragraphPropertiesEnd !== undefined\n ? { paragraphPropertiesEnd: boundary.paragraphPropertiesEnd + offset }\n : {}),\n ...(boundary.paragraphRunPropertiesStart !== undefined\n ? { paragraphRunPropertiesStart: boundary.paragraphRunPropertiesStart + offset }\n : {}),\n ...(boundary.paragraphRunPropertiesEnd !== undefined\n ? { paragraphRunPropertiesEnd: boundary.paragraphRunPropertiesEnd + offset }\n : {}),\n };\n}\n\nfunction serializeDocumentAttributes(\n attributes: Record<string, string> | undefined,\n content?: DocumentRootNode,\n): string {\n const merged = {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:w\": \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\n ...(content && documentNeedsW14Namespace(content)\n ? { \"xmlns:w14\": \"http://schemas.microsoft.com/office/word/2010/wordml\" }\n : {}),\n ...(attributes ?? {}),\n };\n\n return Object.entries(merged)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nexport function serializeSectionPropertiesXml(props: SectionProperties): string {\n const children: string[] = [];\n\n // Header references\n if (props.headerReferences) {\n for (const ref of props.headerReferences) {\n children.push(`<w:headerReference w:type=\"${escapeAttribute(ref.variant)}\" r:id=\"${escapeAttribute(ref.relationshipId)}\"/>`);\n }\n }\n\n // Footer references\n if (props.footerReferences) {\n for (const ref of props.footerReferences) {\n children.push(`<w:footerReference w:type=\"${escapeAttribute(ref.variant)}\" r:id=\"${escapeAttribute(ref.relationshipId)}\"/>`);\n }\n }\n\n // Section type\n if (props.sectionType) {\n children.push(`<w:type w:val=\"${escapeAttribute(props.sectionType)}\"/>`);\n }\n\n // Page size\n if (props.pageSize) {\n let pgSz = `<w:pgSz w:w=\"${props.pageSize.width}\" w:h=\"${props.pageSize.height}\"`;\n if (props.pageSize.orientation) {\n pgSz += ` w:orient=\"${props.pageSize.orientation}\"`;\n }\n pgSz += \"/>\";\n children.push(pgSz);\n }\n\n // Page margins\n if (props.pageMargins) {\n let pgMar = `<w:pgMar w:top=\"${props.pageMargins.top}\" w:right=\"${props.pageMargins.right}\" w:bottom=\"${props.pageMargins.bottom}\" w:left=\"${props.pageMargins.left}\"`;\n if (props.pageMargins.header !== undefined) pgMar += ` w:header=\"${props.pageMargins.header}\"`;\n if (props.pageMargins.footer !== undefined) pgMar += ` w:footer=\"${props.pageMargins.footer}\"`;\n if (props.pageMargins.gutter !== undefined) pgMar += ` w:gutter=\"${props.pageMargins.gutter}\"`;\n pgMar += \"/>\";\n children.push(pgMar);\n }\n\n // Columns\n if (props.columns) {\n let cols = \"<w:cols\";\n if (props.columns.count !== undefined) cols += ` w:num=\"${props.columns.count}\"`;\n if (props.columns.space !== undefined) cols += ` w:space=\"${props.columns.space}\"`;\n if (props.columns.equalWidth !== undefined) cols += ` w:equalWidth=\"${props.columns.equalWidth ? \"1\" : \"0\"}\"`;\n if (props.columns.separator) cols += ` w:sep=\"1\"`;\n if (props.columns.columns && props.columns.columns.length > 0) {\n cols += \">\";\n for (const col of props.columns.columns) {\n let colXml = `<w:col w:w=\"${col.width}\"`;\n if (col.space !== undefined) colXml += ` w:space=\"${col.space}\"`;\n colXml += \"/>\";\n cols += colXml;\n }\n cols += \"</w:cols>\";\n } else {\n cols += \"/>\";\n }\n children.push(cols);\n }\n\n // Page numbering\n if (props.pageNumbering) {\n let pgNum = \"<w:pgNumType\";\n if (props.pageNumbering.format) pgNum += ` w:fmt=\"${escapeAttribute(props.pageNumbering.format)}\"`;\n if (props.pageNumbering.start !== undefined) pgNum += ` w:start=\"${props.pageNumbering.start}\"`;\n if (props.pageNumbering.chapStyle) pgNum += ` w:chapStyle=\"${escapeAttribute(props.pageNumbering.chapStyle)}\"`;\n if (props.pageNumbering.chapSep) pgNum += ` w:chapSep=\"${escapeAttribute(props.pageNumbering.chapSep)}\"`;\n pgNum += \"/>\";\n children.push(pgNum);\n }\n\n if (props.lineNumbering) {\n let lineNumbering = \"<w:lnNumType\";\n if (props.lineNumbering.countBy !== undefined) {\n lineNumbering += ` w:countBy=\"${props.lineNumbering.countBy}\"`;\n }\n if (props.lineNumbering.start !== undefined) {\n lineNumbering += ` w:start=\"${props.lineNumbering.start}\"`;\n }\n if (props.lineNumbering.distance !== undefined) {\n lineNumbering += ` w:distance=\"${props.lineNumbering.distance}\"`;\n }\n if (props.lineNumbering.restart) {\n lineNumbering += ` w:restart=\"${escapeAttribute(props.lineNumbering.restart)}\"`;\n }\n lineNumbering += \"/>\";\n children.push(lineNumbering);\n }\n\n if (props.pageBorders) {\n const attrs: string[] = [];\n if (props.pageBorders.offsetFrom) {\n attrs.push(`w:offsetFrom=\"${escapeAttribute(props.pageBorders.offsetFrom)}\"`);\n }\n if (props.pageBorders.display) {\n attrs.push(`w:display=\"${escapeAttribute(props.pageBorders.display)}\"`);\n }\n if (props.pageBorders.zOrder) {\n attrs.push(`w:zOrder=\"${escapeAttribute(props.pageBorders.zOrder)}\"`);\n }\n const borderXml = [\n serializeBorder(\"top\", props.pageBorders.top),\n serializeBorder(\"left\", props.pageBorders.left),\n serializeBorder(\"bottom\", props.pageBorders.bottom),\n serializeBorder(\"right\", props.pageBorders.right),\n ].filter((entry) => entry.length > 0);\n if (attrs.length > 0 || borderXml.length > 0) {\n children.push(\n `<w:pgBorders${attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\"}>${borderXml.join(\"\")}</w:pgBorders>`,\n );\n }\n }\n\n // Title page\n if (props.titlePage) {\n children.push(\"<w:titlePg/>\");\n }\n\n if (props.documentGrid) {\n const attrs: string[] = [];\n if (props.documentGrid.type) {\n attrs.push(`w:type=\"${escapeAttribute(props.documentGrid.type)}\"`);\n }\n if (props.documentGrid.linePitch !== undefined) {\n attrs.push(`w:linePitch=\"${props.documentGrid.linePitch}\"`);\n }\n if (props.documentGrid.charSpace !== undefined) {\n attrs.push(`w:charSpace=\"${props.documentGrid.charSpace}\"`);\n }\n if (attrs.length > 0) {\n children.push(`<w:docGrid ${attrs.join(\" \")}/>`);\n }\n }\n\n if (children.length === 0) {\n return \"<w:sectPr/>\";\n }\n\n return `<w:sectPr>${children.join(\"\")}</w:sectPr>`;\n}\n\nfunction wrapInlineRawXml(rawXml: string): string {\n const trimmed = rawXml.trimStart();\n return trimmed.startsWith(\"<w:r\") ? rawXml : `<w:r>${rawXml}</w:r>`;\n}\n\nfunction documentNeedsW14Namespace(content: DocumentRootNode): boolean {\n const blockQueue = [...content.children];\n while (blockQueue.length > 0) {\n const block = blockQueue.shift();\n if (!block) {\n continue;\n }\n if (block.type === \"paragraph\") {\n for (const child of block.children) {\n if (\n (child.type === \"text\" || child.type === \"symbol\") &&\n child.marks?.some((mark) => mark.type === \"textFill\")\n ) {\n return true;\n }\n }\n continue;\n }\n if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n blockQueue.push(...cell.children);\n }\n }\n }\n }\n return false;\n}\n","import {\n createNodeAnchor,\n createRangeAnchor,\n mapAnchor,\n normalizeRange,\n type Assoc,\n type BoundaryAssoc,\n type DocRange,\n type EditorAnchorProjection,\n type TransactionMapping,\n} from \"../../core/selection/mapping.ts\";\nimport type { RevisionStoryTargetRecord } from \"../../model/canonical-document.ts\";\n\nexport type RevisionAnchor = EditorAnchorProjection;\n\nexport type SupportedRevisionKind = \"insertion\" | \"deletion\" | \"property-change\";\nexport type PreserveOnlyRevisionKind = \"formatting\" | \"move\";\nexport type RevisionKind = SupportedRevisionKind | PreserveOnlyRevisionKind;\n\nexport type RevisionStatus = \"active\" | \"accepted\" | \"rejected\" | \"detached\";\nexport type RevisionActionability = \"actionable\" | \"preserve-only\";\nexport type RevisionAnchorState = \"active\" | \"detached\";\n\nexport interface PropertyChangeData {\n xmlTag: \"pPrChange\" | \"sectPrChange\" | \"tblPrChange\" | \"rPrChange\";\n beforeXml: string;\n}\n\nexport interface MoveData {\n moveId: string;\n direction: \"from\" | \"to\";\n linkedRevisionId?: string;\n}\n\nexport interface RevisionMetadataEnvelope {\n source: \"runtime\" | \"import\";\n storyTarget?: RevisionStoryTargetRecord;\n preserveOnlyReason?: string;\n importedRevisionForm?:\n | \"run-insertion\"\n | \"run-deletion\"\n | \"paragraph-insertion\"\n | \"paragraph-deletion\";\n originalRevisionType?: string;\n ooxmlRevisionId?: string;\n propertyChangeData?: PropertyChangeData;\n moveData?: MoveData;\n}\n\nexport type PropertyChangeRevision = RevisionRecord & {\n kind: \"property-change\";\n metadata: RevisionMetadataEnvelope & { propertyChangeData: PropertyChangeData };\n};\n\nexport type MoveRevision = RevisionRecord & {\n kind: \"move\";\n metadata: RevisionMetadataEnvelope & { moveData: MoveData };\n};\n\nexport interface RevisionRecord {\n revisionId: string;\n kind: RevisionKind;\n anchor: RevisionAnchor;\n authorId: string;\n createdAt: string;\n status: RevisionStatus;\n warningIds: string[];\n metadata: RevisionMetadataEnvelope;\n}\n\nexport interface RevisionAnchorSummary {\n anchor: RevisionAnchor;\n state: RevisionAnchorState;\n range: DocRange;\n}\n\nexport function createRevisionRangeAnchor(\n from: number,\n to = from,\n assoc?: BoundaryAssoc,\n): RevisionAnchor {\n return createRangeAnchor(from, to, assoc);\n}\n\nexport function createRevisionNodeAnchor(at: number, assoc?: Assoc): RevisionAnchor {\n return createNodeAnchor(at, assoc);\n}\n\nexport function remapRevisionAnchor(\n anchor: RevisionAnchor,\n mapping: TransactionMapping,\n): RevisionAnchor {\n return mapAnchor(anchor, mapping);\n}\n\nexport function isDetachedRevisionAnchor(anchor: RevisionAnchor): boolean {\n return anchor.kind === \"detached\";\n}\n\nexport function summarizeRevisionAnchor(anchor: RevisionAnchor): RevisionAnchorSummary {\n if (anchor.kind === \"range\") {\n return {\n anchor,\n state: \"active\",\n range: normalizeRange(anchor.range),\n };\n }\n\n if (anchor.kind === \"node\") {\n return {\n anchor,\n state: \"active\",\n range: {\n from: anchor.at,\n to: anchor.at,\n },\n };\n }\n\n return {\n anchor,\n state: \"detached\",\n range: normalizeRange(anchor.lastKnownRange),\n };\n}\n\nexport function getRevisionActionability(\n revision:\n | RevisionKind\n | Pick<RevisionRecord, \"kind\" | \"metadata\">,\n): RevisionActionability {\n if (\n typeof revision !== \"string\" &&\n typeof revision.metadata.preserveOnlyReason === \"string\" &&\n revision.metadata.preserveOnlyReason.length > 0\n ) {\n return \"preserve-only\";\n }\n\n const kind = typeof revision === \"string\" ? revision : revision.kind;\n switch (kind) {\n case \"insertion\":\n case \"deletion\":\n case \"property-change\":\n return \"actionable\";\n case \"formatting\":\n case \"move\":\n return \"preserve-only\";\n }\n}\n\nexport function isRevisionActionable(\n record: Pick<RevisionRecord, \"kind\" | \"metadata\" | \"status\">,\n): boolean {\n return getRevisionActionability(record) === \"actionable\" && record.status === \"active\";\n}\n\nexport function describeRevisionKind(kind: RevisionKind): string {\n switch (kind) {\n case \"insertion\":\n return \"Insertion\";\n case \"deletion\":\n return \"Deletion\";\n case \"formatting\":\n return \"Formatting change\";\n case \"move\":\n return \"Move\";\n case \"property-change\":\n return \"Property change\";\n }\n}\n","import type { TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport {\n describeRevisionKind,\n getRevisionActionability,\n isDetachedRevisionAnchor,\n isRevisionActionable,\n remapRevisionAnchor,\n summarizeRevisionAnchor,\n type RevisionActionability,\n type RevisionKind,\n type RevisionMetadataEnvelope,\n type RevisionRecord,\n type RevisionStatus,\n} from \"./revision-types.ts\";\n\nexport type { RevisionRecord, RevisionKind, RevisionStatus } from \"./revision-types.ts\";\n\nexport interface RevisionStore {\n version: \"revision-store/1\";\n revisions: Record<string, RevisionRecord>;\n}\n\nexport interface CreateRevisionRecordParams {\n revisionId: string;\n kind: RevisionKind;\n anchor: RevisionRecord[\"anchor\"];\n authorId: string;\n createdAt: string;\n status?: Exclude<RevisionStatus, \"detached\">;\n warningIds?: string[];\n metadata?: Partial<RevisionMetadataEnvelope>;\n}\n\nexport interface RevisionSidebarEntry {\n revisionId: string;\n kind: RevisionKind;\n label: string;\n status: RevisionStatus;\n actionability: RevisionActionability;\n anchorLabel: string;\n createdAt: string;\n authorId: string;\n warningCount: number;\n canAccept: boolean;\n canReject: boolean;\n preserveOnlyReason?: string;\n linkedMoveRevisionId?: string;\n moveDirection?: \"from\" | \"to\";\n}\n\nexport interface RevisionSidebarProjection {\n totalCount: number;\n activeRevisionIds: string[];\n acceptedRevisionIds: string[];\n rejectedRevisionIds: string[];\n detachedRevisionIds: string[];\n actionableRevisionIds: string[];\n preserveOnlyRevisionIds: string[];\n revisions: RevisionSidebarEntry[];\n}\n\nexport function createRevisionStore(\n revisions: Record<string, RevisionRecord> = {},\n): RevisionStore {\n return {\n version: \"revision-store/1\",\n revisions,\n };\n}\n\nexport function createRevisionRecord(\n params: CreateRevisionRecordParams,\n): RevisionRecord {\n return normalizeRevisionRecord({\n revisionId: params.revisionId,\n kind: params.kind,\n anchor: params.anchor,\n authorId: params.authorId,\n createdAt: params.createdAt,\n status: params.status ?? \"active\",\n warningIds: [...(params.warningIds ?? [])],\n metadata: {\n source: params.metadata?.source ?? \"runtime\",\n storyTarget: params.metadata?.storyTarget,\n preserveOnlyReason:\n params.metadata?.preserveOnlyReason ??\n (getRevisionActionability(params.kind) === \"preserve-only\"\n ? \"Imported preserve-only revision.\"\n : undefined),\n importedRevisionForm: params.metadata?.importedRevisionForm,\n originalRevisionType: params.metadata?.originalRevisionType,\n ooxmlRevisionId: params.metadata?.ooxmlRevisionId,\n propertyChangeData: params.metadata?.propertyChangeData,\n moveData: params.metadata?.moveData,\n },\n });\n}\n\nexport function upsertRevisionRecord(\n store: RevisionStore,\n revision: RevisionRecord,\n): RevisionStore {\n return {\n ...store,\n revisions: {\n ...store.revisions,\n [revision.revisionId]: normalizeRevisionRecord(revision),\n },\n };\n}\n\nexport function setRevisionStatus(\n store: RevisionStore,\n revisionId: string,\n status: Exclude<RevisionStatus, \"detached\">,\n): RevisionStore {\n const existing = store.revisions[revisionId];\n if (!existing) {\n return store;\n }\n\n if (existing.status === \"detached\") {\n return store;\n }\n\n if (\n (status === \"accepted\" || status === \"rejected\") &&\n getRevisionActionability(existing) !== \"actionable\"\n ) {\n return store;\n }\n\n return upsertRevisionRecord(store, {\n ...existing,\n status,\n });\n}\n\nexport function setRevisionWarnings(\n store: RevisionStore,\n revisionId: string,\n warningIds: string[],\n): RevisionStore {\n const existing = store.revisions[revisionId];\n if (!existing) {\n return store;\n }\n\n return upsertRevisionRecord(store, {\n ...existing,\n warningIds: [...warningIds],\n });\n}\n\nexport function remapRevisionStore(\n store: RevisionStore,\n mapping: TransactionMapping,\n): RevisionStore {\n return createRevisionStore(\n Object.fromEntries(\n Object.entries(store.revisions).map(([revisionId, revision]) => {\n const anchor = remapRevisionAnchor(revision.anchor, mapping);\n const status =\n anchor.kind === \"detached\"\n ? \"detached\"\n : revision.status === \"accepted\" || revision.status === \"rejected\"\n ? revision.status\n : \"active\";\n\n return [\n revisionId,\n normalizeRevisionRecord({\n ...revision,\n anchor,\n status,\n }),\n ];\n }),\n ),\n );\n}\n\nexport function createRevisionSidebarProjection(\n store: RevisionStore,\n): RevisionSidebarProjection {\n const revisions = Object.values(store.revisions)\n .map(toSidebarEntry)\n .sort(compareRevisionEntries);\n\n return {\n totalCount: revisions.length,\n activeRevisionIds: revisions\n .filter((revision) => revision.status === \"active\")\n .map((revision) => revision.revisionId),\n acceptedRevisionIds: revisions\n .filter((revision) => revision.status === \"accepted\")\n .map((revision) => revision.revisionId),\n rejectedRevisionIds: revisions\n .filter((revision) => revision.status === \"rejected\")\n .map((revision) => revision.revisionId),\n detachedRevisionIds: revisions\n .filter((revision) => revision.status === \"detached\")\n .map((revision) => revision.revisionId),\n actionableRevisionIds: revisions\n .filter((revision) => revision.actionability === \"actionable\")\n .map((revision) => revision.revisionId),\n preserveOnlyRevisionIds: revisions\n .filter((revision) => revision.actionability === \"preserve-only\")\n .map((revision) => revision.revisionId),\n revisions,\n };\n}\n\nfunction toSidebarEntry(revision: RevisionRecord): RevisionSidebarEntry {\n const anchorSummary = summarizeRevisionAnchor(revision.anchor);\n const actionability = getRevisionActionability(revision);\n\n const moveData = revision.metadata.moveData;\n\n return {\n revisionId: revision.revisionId,\n kind: revision.kind,\n label: describeRevisionKind(revision.kind),\n status: revision.status,\n actionability,\n anchorLabel:\n anchorSummary.state === \"detached\"\n ? `Detached ${anchorSummary.range.from}-${anchorSummary.range.to}`\n : `Range ${anchorSummary.range.from}-${anchorSummary.range.to}`,\n createdAt: revision.createdAt,\n authorId: revision.authorId,\n warningCount: revision.warningIds.length,\n canAccept: isRevisionActionable(revision),\n canReject: isRevisionActionable(revision),\n preserveOnlyReason: revision.metadata.preserveOnlyReason,\n linkedMoveRevisionId: moveData?.linkedRevisionId,\n moveDirection: moveData?.direction,\n };\n}\n\nfunction normalizeRevisionRecord(revision: RevisionRecord): RevisionRecord {\n const actionability = getRevisionActionability(revision);\n\n if (isDetachedRevisionAnchor(revision.anchor)) {\n return {\n ...revision,\n status: \"detached\",\n metadata: {\n ...revision.metadata,\n preserveOnlyReason:\n revision.metadata.preserveOnlyReason ??\n (actionability === \"preserve-only\"\n ? \"Imported preserve-only revision.\"\n : undefined),\n },\n };\n }\n\n if (actionability === \"preserve-only\" && revision.status !== \"detached\") {\n return {\n ...revision,\n status: revision.status === \"accepted\" || revision.status === \"rejected\" ? \"active\" : revision.status,\n metadata: {\n ...revision.metadata,\n preserveOnlyReason:\n revision.metadata.preserveOnlyReason ?? \"Imported preserve-only revision.\",\n },\n };\n }\n\n return revision;\n}\n\nfunction compareRevisionEntries(\n left: RevisionSidebarEntry,\n right: RevisionSidebarEntry,\n): number {\n const statusDelta = priorityForStatus(left.status) - priorityForStatus(right.status);\n if (statusDelta !== 0) {\n return statusDelta;\n }\n\n const actionabilityDelta =\n priorityForActionability(left.actionability) - priorityForActionability(right.actionability);\n if (actionabilityDelta !== 0) {\n return actionabilityDelta;\n }\n\n return left.createdAt.localeCompare(right.createdAt);\n}\n\nfunction priorityForStatus(status: RevisionStatus): number {\n switch (status) {\n case \"active\":\n return 0;\n case \"detached\":\n return 1;\n case \"accepted\":\n return 2;\n case \"rejected\":\n return 3;\n }\n}\n\nfunction priorityForActionability(actionability: RevisionActionability): number {\n switch (actionability) {\n case \"actionable\":\n return 0;\n case \"preserve-only\":\n return 1;\n }\n}\n","export interface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n openingTagEnd: number;\n closingTagStart: number;\n}\n\nexport interface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\nexport type XmlNode = XmlElementNode | XmlTextNode;\n\nexport interface RevisionParagraphBoundary {\n paragraphIndex: number;\n start: number;\n end: number;\n boundaries: Map<number, number>;\n paragraphStart: number;\n paragraphStartTagEnd: number;\n paragraphEndTagStart: number;\n paragraphEnd: number;\n paragraphPropertiesStart?: number;\n paragraphPropertiesEnd?: number;\n paragraphRunPropertiesStart?: number;\n paragraphRunPropertiesEnd?: number;\n}\n\nexport function mapRevisionBoundaries(\n documentXml: string,\n): RevisionParagraphBoundary[] {\n const root = parseXmlWithPositions(documentXml);\n const documentElement = findRequiredChildElement(root, \"document\");\n const bodyElement = findRequiredChildElement(documentElement, \"body\");\n const paragraphs: RevisionParagraphBoundary[] = [];\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) !== \"p\") {\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (previousWasParagraph) {\n cursor += 1;\n }\n paragraphIndex += 1;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, child.openingTagEnd);\n\n const paragraphProperties = findChildElement(child, \"pPr\");\n const paragraphRunProperties = paragraphProperties\n ? findChildElement(paragraphProperties, \"rPr\")\n : undefined;\n\n walkStoryNodesForBoundaries(\n child.children,\n boundaries,\n () => cursor,\n (next) => {\n cursor = next;\n },\n );\n\n boundaries.set(cursor, child.closingTagStart);\n paragraphs.push({\n paragraphIndex,\n start: Math.min(...boundaries.keys()),\n end: Math.max(...boundaries.keys()),\n boundaries,\n paragraphStart: child.start,\n paragraphStartTagEnd: child.openingTagEnd,\n paragraphEndTagStart: child.closingTagStart,\n paragraphEnd: child.end,\n ...(paragraphProperties\n ? {\n paragraphPropertiesStart: paragraphProperties.start,\n paragraphPropertiesEnd: paragraphProperties.end,\n }\n : {}),\n ...(paragraphRunProperties\n ? {\n paragraphRunPropertiesStart: paragraphRunProperties.start,\n paragraphRunPropertiesEnd: paragraphRunProperties.end,\n }\n : {}),\n });\n previousWasParagraph = true;\n }\n\n return paragraphs;\n}\n\nfunction walkStoryNodesForBoundaries(\n nodes: XmlNode[],\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const node of nodes) {\n walkStoryNodeForBoundaries(node, boundaries, getCursor, setCursor);\n }\n}\n\nfunction walkStoryNodeForBoundaries(\n node: XmlNode,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"pPr\":\n return;\n case \"r\":\n boundaries.set(getCursor(), node.start);\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n boundaries.set(getCursor(), node.end);\n return;\n case \"ins\":\n case \"del\":\n case \"moveFrom\":\n case \"moveTo\":\n case \"hyperlink\":\n case \"smartTag\":\n case \"sdtContent\":\n case \"customXml\":\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n return;\n case \"t\":\n case \"delText\":\n case \"instrText\":\n case \"delInstrText\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n if (text.length === 0) {\n return;\n }\n\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n setCursor(getCursor() + text.length);\n boundaries.set(getCursor(), node.end);\n return;\n }\n case \"tab\":\n case \"br\":\n case \"cr\":\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n setCursor(getCursor() + 1);\n boundaries.set(getCursor(), node.end);\n return;\n default:\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n }\n}\n\nexport function parseXmlWithPositions(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n openingTagEnd: 0,\n closingTagStart: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: textEnd,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start: cursor,\n end,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n throw new Error(\"Malformed XML: unterminated closing tag.\");\n }\n\n const node = stack.pop();\n if (!node || stack.length === 0) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n\n node.closingTagStart = cursor;\n node.end = tagEnd + 1;\n cursor = tagEnd + 1;\n continue;\n }\n\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n throw new Error(\"Malformed XML: unterminated opening tag.\");\n }\n\n const rawTag = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(rawTag);\n const normalizedTag = selfClosing ? rawTag.replace(/\\/\\s*$/, \"\") : rawTag;\n const parts = normalizedTag.trim().split(/\\s+/, 1);\n const name = parts[0];\n if (!name) {\n throw new Error(\"Malformed XML: empty tag name.\");\n }\n\n const attributes = parseAttributes(normalizedTag.slice(name.length));\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start: cursor,\n end: selfClosing ? tagEnd + 1 : xml.length,\n openingTagEnd: tagEnd + 1,\n closingTagStart: tagEnd + 1,\n };\n\n stack[stack.length - 1]?.children.push(node);\n cursor = tagEnd + 1;\n\n if (!selfClosing) {\n stack.push(node);\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nexport function findRequiredChildElement(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode {\n const child = findChildElement(node, childLocalName);\n if (!child) {\n throw new Error(`Expected <${childLocalName}> element.`);\n }\n\n return child;\n}\n\nexport function findChildElement(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nexport function localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction parseAttributes(source: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attributePattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n\n for (const match of source.matchAll(attributePattern)) {\n const key = match[1];\n if (!key) {\n continue;\n }\n\n const rawValue = match[3] ?? match[4] ?? \"\";\n attributes[key] = decodeXmlEntities(rawValue);\n }\n\n return attributes;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n","import { createDetachedAnchor } from \"../../core/selection/mapping.ts\";\nimport {\n createRevisionRecord,\n type RevisionRecord,\n} from \"../../review/store/revision-store.ts\";\nimport {\n createRevisionRangeAnchor,\n type MoveData,\n type PropertyChangeData,\n type RevisionKind,\n} from \"../../review/store/revision-types.ts\";\nimport {\n findChildElement,\n findRequiredChildElement,\n localName,\n mapRevisionBoundaries,\n parseXmlWithPositions,\n type RevisionParagraphBoundary,\n type XmlElementNode,\n type XmlNode,\n} from \"./revision-boundaries.ts\";\n\nexport interface PreservedRevisionMarkup {\n revisionId: string;\n rawXml: string;\n xmlStart: number;\n xmlEnd: number;\n originalRevisionType: string;\n paragraphIndex?: number;\n containerXmlStart?: number;\n containerXmlEnd?: number;\n beforeContainerXml?: string;\n}\n\nexport interface RevisionImportDiagnostic {\n revisionId: string;\n code:\n | \"preserve_only_move_revision\"\n | \"preserve_only_formatting_revision\"\n | \"nested_revision_preserve_only\"\n | \"shallow_nested_revision_promoted\"\n | \"linked_move_pair\"\n | \"unlinked_move_revision\"\n | \"ambiguous_revision_anchor\"\n | \"table_structural_revision_preserve_only\"\n | \"table_property_revision_parsed\";\n message: string;\n featureClass: \"preserve-only\" | \"supported\" | \"informational\";\n}\n\nexport interface ParsedRevisionsResult {\n revisions: RevisionRecord[];\n preservedMarkup: PreservedRevisionMarkup[];\n diagnostics: RevisionImportDiagnostic[];\n boundaries: RevisionParagraphBoundary[];\n}\n\ninterface ParseState {\n documentXml: string;\n boundaries: RevisionParagraphBoundary[];\n revisions: RevisionRecord[];\n preservedMarkup: PreservedRevisionMarkup[];\n diagnostics: RevisionImportDiagnostic[];\n nextGeneratedIndex: number;\n}\n\ninterface RevisionMetadata {\n revisionId: string;\n ooxmlRevisionId?: string;\n authorId: string;\n createdAt: string;\n}\n\nconst SUPPORTED_CONTAINER_TYPES = new Set([\"ins\", \"del\"]);\nconst PRESERVE_ONLY_CONTAINER_TYPES = new Set([\"moveFrom\", \"moveTo\"]);\nconst PROPERTY_CHANGE_REVISION_TYPES = new Set([\"rPrChange\", \"pPrChange\"]);\nconst STRUCTURAL_TABLE_REVISION_TYPES = new Set([\"cellIns\", \"cellDel\", \"cellMerge\"]);\n\nexport function parseRevisionsFromDocumentXml(\n documentXml: string,\n): ParsedRevisionsResult {\n const root = parseXmlWithPositions(documentXml);\n const documentElement = findRequiredChildElement(root, \"document\");\n const bodyElement = findRequiredChildElement(documentElement, \"body\");\n const boundaries = mapRevisionBoundaries(documentXml);\n const state: ParseState = {\n documentXml,\n boundaries,\n revisions: [],\n preservedMarkup: [],\n diagnostics: [],\n nextGeneratedIndex: 1,\n };\n\n let paragraphIndex = -1;\n let cursor = 0;\n let previousWasParagraph = false;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const childType = localName(child.name);\n\n if (childType !== \"p\") {\n if (childType === \"tbl\") {\n parseTblPropertyRevisions(child, cursor, state);\n } else if (childType === \"sectPr\") {\n parseSectPrRevisions(child, cursor, state);\n }\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (previousWasParagraph) {\n cursor += 1;\n }\n paragraphIndex += 1;\n const paragraphBoundary = boundaries[paragraphIndex];\n if (!paragraphBoundary) {\n continue;\n }\n\n parseParagraphMarkRevisions(child, paragraphBoundary, state);\n walkParagraphContent(child.children, paragraphIndex, state, () => cursor, (next) => {\n cursor = next;\n });\n previousWasParagraph = true;\n }\n\n linkMoveRevisionPairs(state);\n\n return {\n revisions: state.revisions,\n preservedMarkup: state.preservedMarkup.sort((left, right) => left.xmlStart - right.xmlStart),\n diagnostics: state.diagnostics,\n boundaries,\n };\n}\n\nfunction parseParagraphMarkRevisions(\n paragraph: XmlElementNode,\n boundary: RevisionParagraphBoundary,\n state: ParseState,\n): void {\n const paragraphProperties = findChildElement(paragraph, \"pPr\");\n const paragraphRunProperties = paragraphProperties\n ? findChildElement(paragraphProperties, \"rPr\")\n : undefined;\n\n if (!paragraphProperties) {\n return;\n }\n\n const paragraphRange =\n boundary.start === boundary.end\n ? createRevisionRangeAnchor(boundary.end, boundary.end)\n : createRevisionRangeAnchor(boundary.start, boundary.end);\n\n for (const child of paragraphProperties.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const type = localName(child.name);\n if (type === \"pPrChange\") {\n const metadata = readRevisionMetadata(child, state, \"property-change\");\n const innerPPr = findChildElement(child, \"pPr\");\n const beforeXml = innerPPr ? state.documentXml.slice(innerPPr.start, innerPPr.end) : \"\";\n const propertyChangeData: PropertyChangeData = {\n xmlTag: \"pPrChange\",\n beforeXml,\n };\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"property-change\",\n anchor: paragraphRange,\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: \"pPrChange\",\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n propertyChangeData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(child.start, child.end),\n xmlStart: child.start,\n xmlEnd: child.end,\n originalRevisionType: \"pPrChange\",\n containerXmlStart: paragraphProperties.start,\n containerXmlEnd: paragraphProperties.end,\n beforeContainerXml: beforeXml,\n });\n }\n }\n\n if (!paragraphRunProperties) {\n return;\n }\n\n for (const child of paragraphRunProperties.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const type = localName(child.name);\n if (!SUPPORTED_CONTAINER_TYPES.has(type)) {\n continue;\n }\n\n const metadata = readRevisionMetadata(child, state, type);\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: type === \"ins\" ? \"insertion\" : \"deletion\",\n anchor: createRevisionRangeAnchor(boundary.end, boundary.end),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n importedRevisionForm:\n type === \"ins\" ? \"paragraph-insertion\" : \"paragraph-deletion\",\n originalRevisionType: `paragraph-${type}`,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(child.start, child.end),\n xmlStart: child.start,\n xmlEnd: child.end,\n originalRevisionType: `paragraph-${type}`,\n paragraphIndex: boundary.paragraphIndex,\n });\n }\n}\n\nfunction walkParagraphContent(\n nodes: XmlNode[],\n paragraphIndex: number,\n state: ParseState,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const node of nodes) {\n walkContentNode(node, paragraphIndex, state, getCursor, setCursor);\n }\n}\n\nfunction walkContentNode(\n node: XmlNode,\n paragraphIndex: number,\n state: ParseState,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n const type = localName(node.name);\n if (type === \"pPr\") {\n return;\n }\n\n if (type === \"r\") {\n parseRunFormattingRevisions(node, paragraphIndex, state, getCursor());\n for (const child of node.children) {\n walkContentNode(child, paragraphIndex, state, getCursor, setCursor);\n }\n return;\n }\n\n if (SUPPORTED_CONTAINER_TYPES.has(type) || PRESERVE_ONLY_CONTAINER_TYPES.has(type)) {\n const start = getCursor();\n const length = measureStoryLength(node);\n const end = start + length;\n const hasNestedRevision = containsNestedRevision(node);\n const metadata = readRevisionMetadata(\n node,\n state,\n type === \"moveFrom\" || type === \"moveTo\" ? \"move\" : type,\n );\n\n if (hasNestedRevision) {\n const nestedKind = type === \"ins\" ? \"insertion\" : type === \"del\" ? \"deletion\" : \"move\";\n const isShallowNesting = isShallowPropertyChangeNesting(node);\n\n if (isShallowNesting && SUPPORTED_CONTAINER_TYPES.has(type)) {\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: nestedKind as \"insertion\" | \"deletion\",\n anchor:\n length > 0\n ? createRevisionRangeAnchor(start, end)\n : createDetachedAnchor({ from: start, to: end }, \"importAmbiguity\"),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n importedRevisionForm:\n type === \"ins\" ? \"run-insertion\" : \"run-deletion\",\n originalRevisionType: type,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(node.start, node.end),\n xmlStart: node.start,\n xmlEnd: node.end,\n originalRevisionType: type,\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"shallow_nested_revision_promoted\",\n message: \"Shallow nested revision (property changes inside ins/del) promoted to supported rendering.\",\n featureClass: \"supported\",\n });\n parseNestedPropertyChangeRevisions(node, paragraphIndex, state, start);\n advanceCursor(node, setCursor, getCursor);\n return;\n }\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: nestedKind,\n anchor:\n length > 0\n ? createRevisionRangeAnchor(start, end)\n : createDetachedAnchor({ from: start, to: end }, \"importAmbiguity\"),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: type,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n preserveOnlyReason: \"Nested revision markup remains preserve-only.\",\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(node.start, node.end),\n xmlStart: node.start,\n xmlEnd: node.end,\n originalRevisionType: type,\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"nested_revision_preserve_only\",\n message: \"Nested revision markup remains preserve-only and is exported unchanged.\",\n featureClass: \"preserve-only\",\n });\n advanceCursor(node, setCursor, getCursor);\n return;\n }\n\n if (type === \"moveFrom\" || type === \"moveTo\") {\n const moveData: MoveData = {\n moveId: metadata.ooxmlRevisionId ?? `generated-${metadata.revisionId}`,\n direction: type === \"moveFrom\" ? \"from\" : \"to\",\n };\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"move\",\n anchor:\n length > 0\n ? createRevisionRangeAnchor(start, end)\n : createDetachedAnchor({ from: start, to: end }, \"importAmbiguity\"),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: type,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n preserveOnlyReason: \"Imported preserve-only revision.\",\n moveData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(node.start, node.end),\n xmlStart: node.start,\n xmlEnd: node.end,\n originalRevisionType: type,\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"preserve_only_move_revision\",\n message: \"Move revision parsed as preserve-only. Content is preserved for round-trip; linking resolved in post-parse step.\",\n featureClass: \"preserve-only\",\n });\n advanceCursor(node, setCursor, getCursor);\n return;\n }\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: type === \"ins\" ? \"insertion\" : \"deletion\",\n anchor: createRevisionRangeAnchor(start, end),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n importedRevisionForm:\n type === \"ins\" ? \"run-insertion\" : \"run-deletion\",\n originalRevisionType: type,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(node.start, node.end),\n xmlStart: node.start,\n xmlEnd: node.end,\n originalRevisionType: type,\n });\n advanceCursor(node, setCursor, getCursor);\n return;\n }\n\n switch (type) {\n case \"t\":\n case \"delText\":\n case \"instrText\":\n case \"delInstrText\": {\n const text = node.children\n .filter((child): child is XmlElementNode[\"children\"][number] & { type: \"text\" } => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n setCursor(getCursor() + text.length);\n return;\n }\n case \"tab\":\n case \"br\":\n case \"cr\":\n setCursor(getCursor() + 1);\n return;\n default:\n for (const child of node.children) {\n walkContentNode(child, paragraphIndex, state, getCursor, setCursor);\n }\n }\n}\n\nfunction parseRunFormattingRevisions(\n run: XmlElementNode,\n _paragraphIndex: number,\n state: ParseState,\n runStart: number,\n): void {\n const runProperties = findChildElement(run, \"rPr\");\n if (!runProperties) {\n return;\n }\n\n const runLength = measureStoryLength(run);\n const anchor =\n runLength > 0\n ? createRevisionRangeAnchor(runStart, runStart + runLength)\n : createDetachedAnchor({ from: runStart, to: runStart }, \"importAmbiguity\");\n\n for (const child of runProperties.children) {\n if (child.type !== \"element\" || !PROPERTY_CHANGE_REVISION_TYPES.has(localName(child.name))) {\n continue;\n }\n\n const childLocalName = localName(child.name) as \"rPrChange\" | \"pPrChange\";\n const metadata = readRevisionMetadata(child, state, \"property-change\");\n const innerRPr = findChildElement(child, \"rPr\");\n const beforeXml = innerRPr ? state.documentXml.slice(innerRPr.start, innerRPr.end) : \"\";\n const propertyChangeData: PropertyChangeData = {\n xmlTag: childLocalName === \"rPrChange\" ? \"rPrChange\" : \"pPrChange\",\n beforeXml,\n };\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"property-change\",\n anchor,\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: childLocalName,\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n propertyChangeData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(child.start, child.end),\n xmlStart: child.start,\n xmlEnd: child.end,\n originalRevisionType: childLocalName,\n containerXmlStart: runProperties.start,\n containerXmlEnd: runProperties.end,\n beforeContainerXml: beforeXml,\n });\n }\n}\n\nfunction parseTblPropertyRevisions(\n table: XmlElementNode,\n position: number,\n state: ParseState,\n): void {\n const tblPr = findChildElement(table, \"tblPr\");\n if (tblPr) {\n const tblPrChange = findChildElement(tblPr, \"tblPrChange\");\n if (tblPrChange) {\n const metadata = readRevisionMetadata(tblPrChange, state, \"property-change\");\n const innerTblPr = findChildElement(tblPrChange, \"tblPr\");\n const beforeXml = innerTblPr ? state.documentXml.slice(innerTblPr.start, innerTblPr.end) : \"\";\n const propertyChangeData: PropertyChangeData = { xmlTag: \"tblPrChange\", beforeXml };\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"property-change\",\n anchor: createRevisionRangeAnchor(position, position),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: \"tblPrChange\",\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n propertyChangeData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(tblPrChange.start, tblPrChange.end),\n xmlStart: tblPrChange.start,\n xmlEnd: tblPrChange.end,\n originalRevisionType: \"tblPrChange\",\n containerXmlStart: tblPr.start,\n containerXmlEnd: tblPr.end,\n beforeContainerXml: beforeXml,\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"table_property_revision_parsed\",\n message: \"Table property change (tblPrChange) parsed as actionable property-change revision.\",\n featureClass: \"supported\",\n });\n }\n }\n\n parseTableRowAndCellRevisions(table, position, state);\n}\n\nfunction parseTableRowAndCellRevisions(\n table: XmlElementNode,\n position: number,\n state: ParseState,\n): void {\n for (const child of table.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tr\") {\n continue;\n }\n\n const trPr = findChildElement(child, \"trPr\");\n if (trPr) {\n const trPrChange = findChildElement(trPr, \"trPrChange\");\n if (trPrChange) {\n const metadata = readRevisionMetadata(trPrChange, state, \"property-change\");\n const innerTrPr = findChildElement(trPrChange, \"trPr\");\n const beforeXml = innerTrPr ? state.documentXml.slice(innerTrPr.start, innerTrPr.end) : \"\";\n const propertyChangeData: PropertyChangeData = { xmlTag: \"tblPrChange\", beforeXml };\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"property-change\",\n anchor: createRevisionRangeAnchor(position, position),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: \"trPrChange\",\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n propertyChangeData,\n preserveOnlyReason: \"Row property changes remain preserve-only for export safety.\",\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(trPrChange.start, trPrChange.end),\n xmlStart: trPrChange.start,\n xmlEnd: trPrChange.end,\n originalRevisionType: \"trPrChange\",\n containerXmlStart: trPr.start,\n containerXmlEnd: trPr.end,\n beforeContainerXml: beforeXml,\n });\n }\n }\n\n for (const tcNode of child.children) {\n if (tcNode.type !== \"element\" || localName(tcNode.name) !== \"tc\") {\n continue;\n }\n\n const tcPr = findChildElement(tcNode, \"tcPr\");\n if (!tcPr) {\n continue;\n }\n\n const tcPrChange = findChildElement(tcPr, \"tcPrChange\");\n if (tcPrChange) {\n const metadata = readRevisionMetadata(tcPrChange, state, \"property-change\");\n const innerTcPr = findChildElement(tcPrChange, \"tcPr\");\n const beforeXml = innerTcPr ? state.documentXml.slice(innerTcPr.start, innerTcPr.end) : \"\";\n const propertyChangeData: PropertyChangeData = { xmlTag: \"tblPrChange\", beforeXml };\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"property-change\",\n anchor: createRevisionRangeAnchor(position, position),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: \"tcPrChange\",\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n propertyChangeData,\n preserveOnlyReason: \"Cell property changes remain preserve-only for export safety.\",\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(tcPrChange.start, tcPrChange.end),\n xmlStart: tcPrChange.start,\n xmlEnd: tcPrChange.end,\n originalRevisionType: \"tcPrChange\",\n containerXmlStart: tcPr.start,\n containerXmlEnd: tcPr.end,\n beforeContainerXml: beforeXml,\n });\n }\n\n for (const tcChild of tcPr.children) {\n if (tcChild.type !== \"element\") {\n continue;\n }\n\n const tcChildName = localName(tcChild.name);\n if (STRUCTURAL_TABLE_REVISION_TYPES.has(tcChildName)) {\n const metadata = readRevisionMetadata(tcChild, state, tcChildName);\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(tcChild.start, tcChild.end),\n xmlStart: tcChild.start,\n xmlEnd: tcChild.end,\n originalRevisionType: tcChildName,\n });\n state.diagnostics.push({\n revisionId: metadata.revisionId,\n code: \"table_structural_revision_preserve_only\",\n message: `Structural table revision (${tcChildName}) remains preserve-only; topology-altering changes cannot be safely applied.`,\n featureClass: \"preserve-only\",\n });\n }\n }\n }\n }\n}\n\nfunction parseSectPrRevisions(\n sectPr: XmlElementNode,\n position: number,\n state: ParseState,\n): void {\n const sectPrChange = findChildElement(sectPr, \"sectPrChange\");\n if (!sectPrChange) {\n return;\n }\n\n const metadata = readRevisionMetadata(sectPrChange, state, \"property-change\");\n const innerSectPr = findChildElement(sectPrChange, \"sectPr\");\n const beforeXml = innerSectPr ? state.documentXml.slice(innerSectPr.start, innerSectPr.end) : \"\";\n const propertyChangeData: PropertyChangeData = { xmlTag: \"sectPrChange\", beforeXml };\n\n state.revisions.push(\n createRevisionRecord({\n revisionId: metadata.revisionId,\n kind: \"property-change\",\n anchor: createRevisionRangeAnchor(position, position),\n authorId: metadata.authorId,\n createdAt: metadata.createdAt,\n metadata: {\n source: \"import\",\n originalRevisionType: \"sectPrChange\",\n ooxmlRevisionId: metadata.ooxmlRevisionId,\n propertyChangeData,\n },\n }),\n );\n state.preservedMarkup.push({\n revisionId: metadata.revisionId,\n rawXml: state.documentXml.slice(sectPrChange.start, sectPrChange.end),\n xmlStart: sectPrChange.start,\n xmlEnd: sectPrChange.end,\n originalRevisionType: \"sectPrChange\",\n containerXmlStart: sectPr.start,\n containerXmlEnd: sectPr.end,\n beforeContainerXml: beforeXml,\n });\n}\n\nfunction readRevisionMetadata(\n node: XmlElementNode,\n state: ParseState,\n prefix: string,\n): RevisionMetadata {\n const rawId = node.attributes[\"w:id\"] ?? node.attributes.id;\n const ooxmlRevisionId = rawId ? rawId : undefined;\n const revisionId = rawId\n ? `revision:${sanitizeRevisionToken(prefix)}-${sanitizeRevisionToken(rawId)}`\n : `revision:${sanitizeRevisionToken(prefix)}-generated-${state.nextGeneratedIndex++}`;\n const authorId =\n node.attributes[\"w:author\"] ??\n node.attributes.author ??\n \"word:unknown-author\";\n const createdAt =\n normalizeImportedTimestamp(\n node.attributes[\"w:date\"] ?? node.attributes.date,\n ) ??\n \"1970-01-01T00:00:00.000Z\";\n\n return {\n revisionId,\n ooxmlRevisionId,\n authorId,\n createdAt,\n };\n}\n\nfunction normalizeImportedTimestamp(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = new Date(value);\n if (Number.isNaN(parsed.valueOf())) {\n return undefined;\n }\n\n return parsed.toISOString();\n}\n\nfunction sanitizeRevisionToken(value: string): string {\n const sanitized = value.replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n return sanitized.length > 0 ? sanitized : \"unknown\";\n}\n\nfunction linkMoveRevisionPairs(state: ParseState): void {\n const moveRevisions = state.revisions.filter(\n (r) => r.kind === \"move\" && r.metadata.moveData,\n );\n\n const byMoveId = new Map<string, typeof moveRevisions>();\n for (const revision of moveRevisions) {\n const moveId = revision.metadata.moveData!.moveId;\n const group = byMoveId.get(moveId) ?? [];\n group.push(revision);\n byMoveId.set(moveId, group);\n }\n\n for (const [moveId, group] of byMoveId) {\n const fromRevision = group.find(\n (r) => r.metadata.moveData!.direction === \"from\",\n );\n const toRevision = group.find(\n (r) => r.metadata.moveData!.direction === \"to\",\n );\n\n if (fromRevision && toRevision) {\n fromRevision.metadata.moveData!.linkedRevisionId = toRevision.revisionId;\n toRevision.metadata.moveData!.linkedRevisionId = fromRevision.revisionId;\n\n state.diagnostics.push({\n revisionId: fromRevision.revisionId,\n code: \"linked_move_pair\",\n message: `Move-from revision linked to move-to revision ${toRevision.revisionId} via moveId ${moveId}.`,\n featureClass: \"informational\",\n });\n state.diagnostics.push({\n revisionId: toRevision.revisionId,\n code: \"linked_move_pair\",\n message: `Move-to revision linked to move-from revision ${fromRevision.revisionId} via moveId ${moveId}.`,\n featureClass: \"informational\",\n });\n } else {\n for (const revision of group) {\n state.diagnostics.push({\n revisionId: revision.revisionId,\n code: \"unlinked_move_revision\",\n message: `Move revision has no matching counterpart for moveId ${moveId}. Remains preserve-only.`,\n featureClass: \"preserve-only\",\n });\n }\n }\n }\n}\n\nfunction isShallowPropertyChangeNesting(node: XmlElementNode): boolean {\n for (const child of node.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (SUPPORTED_CONTAINER_TYPES.has(name) || PRESERVE_ONLY_CONTAINER_TYPES.has(name)) {\n return false;\n }\n\n if (name === \"r\") {\n const runProperties = findChildElement(child, \"rPr\");\n if (runProperties) {\n for (const rpChild of runProperties.children) {\n if (rpChild.type !== \"element\") {\n continue;\n }\n\n const rpChildName = localName(rpChild.name);\n if (\n SUPPORTED_CONTAINER_TYPES.has(rpChildName) ||\n PRESERVE_ONLY_CONTAINER_TYPES.has(rpChildName)\n ) {\n return false;\n }\n }\n }\n continue;\n }\n\n if (!isShallowPropertyChangeNesting(child)) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction parseNestedPropertyChangeRevisions(\n container: XmlElementNode,\n paragraphIndex: number,\n state: ParseState,\n containerStart: number,\n): void {\n for (const child of container.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) === \"r\") {\n parseRunFormattingRevisions(child, paragraphIndex, state, containerStart);\n }\n }\n}\n\nfunction containsNestedRevision(node: XmlElementNode): boolean {\n return node.children.some(\n (child) =>\n child.type === \"element\" &&\n (SUPPORTED_CONTAINER_TYPES.has(localName(child.name)) ||\n PRESERVE_ONLY_CONTAINER_TYPES.has(localName(child.name)) ||\n PROPERTY_CHANGE_REVISION_TYPES.has(localName(child.name)) ||\n containsNestedRevision(child)),\n );\n}\n\nfunction advanceCursor(\n node: XmlElementNode,\n setCursor: (next: number) => void,\n getCursor: () => number,\n): void {\n setCursor(getCursor() + measureStoryLength(node));\n}\n\nfunction measureStoryLength(node: XmlNode): number {\n if (node.type !== \"element\") {\n return 0;\n }\n\n switch (localName(node.name)) {\n case \"t\":\n case \"delText\":\n case \"instrText\":\n case \"delInstrText\":\n return node.children\n .filter((child): child is XmlElementNode[\"children\"][number] & { type: \"text\" } => child.type === \"text\")\n .map((child) => child.text.length)\n .reduce((total, length) => total + length, 0);\n case \"tab\":\n case \"br\":\n case \"cr\":\n return 1;\n case \"pPr\":\n case \"rPr\":\n case \"rPrChange\":\n case \"pPrChange\":\n return 0;\n default:\n return node.children.reduce((total, child) => total + measureStoryLength(child), 0);\n }\n}\n","import {\n createNodeAnchor,\n createRangeAnchor,\n mapAnchor,\n normalizeRange,\n type Assoc,\n type BoundaryAssoc,\n type DocRange,\n type EditorAnchorProjection,\n type TransactionMapping,\n} from \"../../core/selection/mapping.ts\";\n\nexport type CommentAnchor = EditorAnchorProjection;\nexport type CommentAnchorState = \"active\" | \"detached\";\n\nexport interface CommentAnchorSummary {\n anchor: CommentAnchor;\n state: CommentAnchorState;\n range: DocRange;\n}\n\nexport function createCommentRangeAnchor(\n from: number,\n to = from,\n assoc?: BoundaryAssoc,\n): CommentAnchor {\n return createRangeAnchor(from, to, assoc);\n}\n\nexport function createCommentNodeAnchor(at: number, assoc?: Assoc): CommentAnchor {\n return createNodeAnchor(at, assoc);\n}\n\nexport function remapCommentAnchor(\n anchor: CommentAnchor,\n mapping: TransactionMapping,\n): CommentAnchor {\n return mapAnchor(anchor, mapping);\n}\n\nexport function isDetachedCommentAnchor(anchor: CommentAnchor): boolean {\n return anchor.kind === \"detached\";\n}\n\nexport function summarizeCommentAnchor(anchor: CommentAnchor): CommentAnchorSummary {\n if (anchor.kind === \"range\") {\n return {\n anchor,\n state: \"active\",\n range: normalizeRange(anchor.range),\n };\n }\n\n if (anchor.kind === \"node\") {\n return {\n anchor,\n state: \"active\",\n range: {\n from: anchor.at,\n to: anchor.at,\n },\n };\n }\n\n return {\n anchor,\n state: \"detached\",\n range: normalizeRange(anchor.lastKnownRange),\n };\n}\n","import { createDetachedAnchor } from \"../../core/selection/mapping.ts\";\nimport type {\n CommentEntry,\n CommentEntryMetadata,\n CommentThread,\n CommentThreadMetadata,\n} from \"./comment-store.ts\";\nimport { createCommentRangeAnchor } from \"./comment-anchors.ts\";\n\nexport interface ImportedCommentEntryInput {\n entryId?: string;\n authorId?: string;\n body: string;\n createdAt?: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface ImportedCommentThreadInput {\n commentId: string;\n body: string;\n createdBy?: string;\n createdAt?: string;\n range?:\n | {\n from: number;\n to: number;\n }\n | undefined;\n warningIds?: string[];\n entries?: CommentEntry[];\n status?: CommentThread[\"status\"];\n resolution?: CommentThread[\"resolution\"];\n metadata?: CommentThreadMetadata;\n}\n\nexport function createImportedCommentThread(\n input: ImportedCommentThreadInput,\n): CommentThread {\n const createdAt = input.createdAt ?? \"1970-01-01T00:00:00.000Z\";\n const createdBy = input.createdBy ?? \"unknown\";\n const entries =\n input.entries && input.entries.length > 0\n ? input.entries\n : [\n {\n entryId: `${input.commentId}-entry-1`,\n authorId: createdBy,\n body: input.body,\n createdAt,\n },\n ];\n const status =\n input.status ??\n (input.range ? \"open\" : \"detached\");\n\n return {\n commentId: input.commentId,\n anchor:\n status === \"detached\"\n ? createDetachedAnchor(input.range ?? { from: 0, to: 0 }, \"importAmbiguity\")\n : input.range\n ? createCommentRangeAnchor(input.range.from, input.range.to)\n : createDetachedAnchor({ from: 0, to: 0 }, \"importAmbiguity\"),\n status,\n entries,\n createdBy,\n createdAt,\n resolution: input.resolution,\n warningIds: [...(input.warningIds ?? [])],\n metadata: input.metadata,\n };\n}\n\nexport function createImportedCommentReply(\n commentId: string,\n input: ImportedCommentEntryInput,\n) {\n return {\n entryId: input.entryId ?? `${commentId}-entry-reply`,\n authorId: input.authorId ?? \"unknown\",\n body: input.body,\n createdAt: input.createdAt ?? \"1970-01-01T00:00:00.000Z\",\n };\n}\n\nexport function updateCommentThreadBody(\n thread: CommentThread,\n body: string,\n): CommentThread {\n const firstEntry = thread.entries[0];\n if (!firstEntry) {\n return thread;\n }\n\n return {\n ...thread,\n entries: [\n {\n ...firstEntry,\n body,\n },\n ...thread.entries.slice(1),\n ],\n };\n}\n\nexport function getCommentThreadBody(thread: CommentThread): string {\n return thread.entries.map((entry) => entry.body).join(\"\\n\");\n}\n","import type { CommentThread } from \"../../review/store/comment-store.ts\";\nimport { createImportedCommentThread } from \"../../review/store/comment-thread.ts\";\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nexport interface ParsedCommentsInput {\n commentsXml: string;\n commentsExtendedXml?: string;\n commentsIdsXml?: string;\n peopleXml?: string;\n}\n\nexport interface ImportedCommentDefinition {\n commentId: string;\n authorId?: string;\n createdAt?: string;\n body: string;\n rawXml: string;\n order: number;\n initials?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n isDone?: boolean;\n}\n\ninterface CommentAnchorBounds {\n start?: number;\n end?: number;\n startParagraphIndex?: number;\n endParagraphIndex?: number;\n referenceAt?: number;\n referenceParagraphIndex?: number;\n}\n\ninterface CommentExtensionRecord {\n paraId: string;\n parentParaId?: string;\n isDone?: boolean;\n}\n\nexport interface CommentImportDiagnostic {\n commentId: string;\n code:\n | \"missing_comment_definition\"\n | \"missing_anchor_reference\"\n | \"multi_paragraph_anchor_preserve_only\"\n | \"opaque_anchor_preserve_only\"\n | \"preserve_only_revision_overlap\";\n message: string;\n featureClass: \"preserve-only\";\n detachedReason?: \"incomplete-markers\" | \"multi-paragraph\" | \"opaque-region\" | \"revision-overlap\";\n actionabilityNote?: string;\n}\n\nexport interface ParsedCommentsResult {\n threads: CommentThread[];\n diagnostics: CommentImportDiagnostic[];\n definitions: ImportedCommentDefinition[];\n sourceRootTag?: string;\n sourceExtendedRootTag?: string;\n sourceIdsRootTag?: string;\n sourcePeopleRootTag?: string;\n peopleAuthors: string[];\n}\n\nexport function parseCommentsFromOoxml(\n documentXml: string,\n input: string | ParsedCommentsInput,\n): ParsedCommentsResult {\n const parts = normalizeInput(input);\n const commentExtensions = parseCommentExtensions(parts.commentsExtendedXml);\n const durableIds = parseCommentDurableIds(parts.commentsIdsXml);\n const peopleAuthors = parsePeopleAuthors(parts.peopleXml);\n const definitions = parseCommentDefinitions(parts.commentsXml, commentExtensions, durableIds);\n const definitionsById = new Map(definitions.map((definition) => [definition.commentId, definition]));\n const definitionsByParaId = new Map(\n definitions\n .filter((definition) => typeof definition.paraId === \"string\")\n .map((definition) => [definition.paraId!, definition]),\n );\n const anchors = parseCommentAnchors(documentXml);\n const diagnostics: CommentImportDiagnostic[] = [];\n const threadDefinitions = groupThreadDefinitions(definitions, definitionsByParaId);\n const threads: CommentThread[] = [];\n\n for (const [rootCommentId, groupedDefinitions] of threadDefinitions) {\n const rootDefinition = groupedDefinitions[0];\n if (!rootDefinition) {\n continue;\n }\n\n const anchor = anchors.get(rootCommentId);\n const start = anchor?.start ?? anchor?.referenceAt;\n const end = anchor?.end ?? anchor?.referenceAt;\n const startParagraphIndex = anchor?.startParagraphIndex ?? anchor?.referenceParagraphIndex;\n const endParagraphIndex = anchor?.endParagraphIndex ?? anchor?.referenceParagraphIndex;\n const entries = groupedDefinitions.map((definition, index) => ({\n entryId: `${rootCommentId}-entry-${index + 1}`,\n authorId: definition.authorId ?? \"unknown\",\n body: definition.body,\n createdAt: definition.createdAt ?? \"1970-01-01T00:00:00.000Z\",\n metadata: {\n ooxmlCommentId: definition.commentId,\n paraId: definition.paraId,\n parentParaId: definition.parentParaId,\n durableId: definition.durableId,\n initials: definition.initials,\n },\n }));\n const createdBy = rootDefinition.authorId ?? entries[0]?.authorId ?? \"unknown\";\n const createdAt = rootDefinition.createdAt ?? entries[0]?.createdAt ?? \"1970-01-01T00:00:00.000Z\";\n const lastEntry = entries.length > 0 ? entries[entries.length - 1] : undefined;\n const resolution =\n rootDefinition.isDone\n ? {\n resolvedAt: lastEntry?.createdAt ?? createdAt,\n resolvedBy: lastEntry?.authorId ?? createdBy,\n }\n : undefined;\n const detachedRange = anchor ? toDetachedRange(anchor) : { from: 0, to: 0 };\n\n if (\n start === undefined ||\n end === undefined ||\n startParagraphIndex === undefined ||\n endParagraphIndex === undefined\n ) {\n diagnostics.push({\n commentId: rootCommentId,\n code: \"missing_anchor_reference\",\n message: \"Comment anchor markers are incomplete (missing start, end, or reference). Thread is visible but detached and not actionable.\",\n featureClass: \"preserve-only\",\n detachedReason: \"incomplete-markers\",\n actionabilityNote: \"Re-anchoring requires the host to supply a valid range. The comment body and thread are preserved for display.\",\n });\n threads.push(\n createImportedCommentThread({\n commentId: rootCommentId,\n body: rootDefinition.body,\n createdBy,\n createdAt,\n range: detachedRange,\n entries,\n status: \"detached\",\n resolution,\n metadata: {\n source: \"import\",\n rootOoxmlCommentId: rootDefinition.commentId,\n rootParaId: rootDefinition.paraId,\n },\n }),\n );\n continue;\n }\n\n if (startParagraphIndex !== endParagraphIndex) {\n diagnostics.push({\n commentId: rootCommentId,\n code: \"multi_paragraph_anchor_preserve_only\",\n message:\n \"Comment anchor spans multiple paragraphs. Thread is visible but detached; cross-paragraph anchoring is not yet supported for live editing.\",\n featureClass: \"preserve-only\",\n detachedReason: \"multi-paragraph\",\n actionabilityNote: \"The comment thread and body are preserved. Operators see the thread in the sidebar but cannot navigate to an inline highlight.\",\n });\n threads.push(\n createImportedCommentThread({\n commentId: rootCommentId,\n body: rootDefinition.body,\n createdBy,\n createdAt,\n range: detachedRange,\n entries,\n status: \"detached\",\n resolution,\n metadata: {\n source: \"import\",\n rootOoxmlCommentId: rootDefinition.commentId,\n rootParaId: rootDefinition.paraId,\n },\n }),\n );\n continue;\n }\n\n threads.push(\n createImportedCommentThread({\n commentId: rootCommentId,\n body: rootDefinition.body,\n createdBy,\n createdAt,\n range: {\n from: Math.min(start, end),\n to: Math.max(start, end),\n },\n entries,\n status: resolution ? \"resolved\" : \"open\",\n resolution,\n metadata: {\n source: \"import\",\n rootOoxmlCommentId: rootDefinition.commentId,\n rootParaId: rootDefinition.paraId,\n },\n }),\n );\n }\n\n for (const commentId of anchors.keys()) {\n if (definitionsById.has(commentId)) {\n continue;\n }\n\n diagnostics.push({\n commentId,\n code: \"missing_comment_definition\",\n message: \"Document anchor markers reference a comment id missing from comments.xml.\",\n featureClass: \"preserve-only\",\n });\n }\n\n threads.sort(compareThreadsByAnchor);\n\n return {\n threads,\n diagnostics,\n definitions,\n sourceRootTag: extractRootTag(parts.commentsXml, \"comments\"),\n sourceExtendedRootTag: extractRootTag(parts.commentsExtendedXml, \"commentsEx\"),\n sourceIdsRootTag: extractRootTag(parts.commentsIdsXml, \"commentsIds\"),\n sourcePeopleRootTag: extractRootTag(parts.peopleXml, \"people\"),\n peopleAuthors,\n };\n}\n\nfunction normalizeInput(input: string | ParsedCommentsInput): ParsedCommentsInput {\n return typeof input === \"string\"\n ? {\n commentsXml: input,\n }\n : input;\n}\n\nfunction groupThreadDefinitions(\n definitions: ImportedCommentDefinition[],\n definitionsByParaId: Map<string, ImportedCommentDefinition>,\n): Map<string, ImportedCommentDefinition[]> {\n const grouped = new Map<string, ImportedCommentDefinition[]>();\n\n for (const definition of definitions) {\n const rootCommentId = resolveRootCommentId(definition, definitionsByParaId);\n const group = grouped.get(rootCommentId);\n if (group) {\n group.push(definition);\n } else {\n grouped.set(rootCommentId, [definition]);\n }\n }\n\n for (const group of grouped.values()) {\n group.sort((left, right) => left.order - right.order);\n const rootIndex = group.findIndex((definition) => !definition.parentParaId);\n if (rootIndex > 0) {\n const [rootDefinition] = group.splice(rootIndex, 1);\n if (rootDefinition) {\n group.unshift(rootDefinition);\n }\n }\n }\n\n return new Map(\n [...grouped.entries()].sort(([leftId], [rightId]) => leftId.localeCompare(rightId)),\n );\n}\n\nfunction resolveRootCommentId(\n definition: ImportedCommentDefinition,\n definitionsByParaId: Map<string, ImportedCommentDefinition>,\n): string {\n const visited = new Set<string>();\n let current: ImportedCommentDefinition | undefined = definition;\n\n while (current?.parentParaId) {\n if (visited.has(current.parentParaId)) {\n break;\n }\n visited.add(current.parentParaId);\n const parent = definitionsByParaId.get(current.parentParaId);\n if (!parent) {\n break;\n }\n current = parent;\n }\n\n return current?.commentId ?? definition.commentId;\n}\n\nfunction parseCommentDefinitions(\n commentsXml: string,\n extensions: Map<string, CommentExtensionRecord>,\n durableIds: Map<string, string>,\n): ImportedCommentDefinition[] {\n if (commentsXml.trim().length === 0) {\n return [];\n }\n\n const root = parseXml(commentsXml);\n const commentsElement = findChildElement(root, \"comments\");\n const definitions: ImportedCommentDefinition[] = [];\n let order = 0;\n\n for (const child of commentsElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"comment\") {\n continue;\n }\n\n const commentId = child.attributes[\"w:id\"] ?? child.attributes.id;\n if (!commentId) {\n continue;\n }\n\n const authorId = child.attributes[\"w:author\"] ?? child.attributes.author;\n const createdAt = normalizeImportedTimestamp(\n child.attributes[\"w:date\"] ?? child.attributes.date,\n );\n const initials = child.attributes[\"w:initials\"] ?? child.attributes.initials;\n const paragraphNodes = child.children.filter(\n (node): node is XmlElementNode => node.type === \"element\" && localName(node.name) === \"p\",\n );\n const body = paragraphNodes\n .map(extractParagraphText)\n .join(\"\\n\");\n const paraId = paragraphNodes[0]?.attributes[\"w14:paraId\"] ?? paragraphNodes[0]?.attributes.paraId;\n const extension = paraId ? extensions.get(paraId) : undefined;\n\n definitions.push({\n commentId,\n authorId,\n createdAt,\n body,\n rawXml: commentsXml.slice(child.start, child.end),\n order,\n initials,\n paraId,\n parentParaId: extension?.parentParaId,\n durableId: paraId ? durableIds.get(paraId) : undefined,\n isDone: extension?.isDone,\n });\n order += 1;\n }\n\n return definitions;\n}\n\nfunction normalizeImportedTimestamp(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n const parsed = new Date(value);\n if (Number.isNaN(parsed.valueOf())) {\n return undefined;\n }\n\n return parsed.toISOString();\n}\n\nfunction parseCommentExtensions(xml: string | undefined): Map<string, CommentExtensionRecord> {\n if (!xml || xml.trim().length === 0) {\n return new Map();\n }\n\n const root = parseXml(xml);\n const commentsElement = findChildElement(root, \"commentsEx\");\n const extensions = new Map<string, CommentExtensionRecord>();\n\n for (const child of commentsElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"commentEx\") {\n continue;\n }\n\n const paraId = child.attributes[\"w15:paraId\"] ?? child.attributes.paraId;\n if (!paraId) {\n continue;\n }\n\n const parentParaId = child.attributes[\"w15:paraIdParent\"] ?? child.attributes.paraIdParent;\n const doneValue = child.attributes[\"w15:done\"] ?? child.attributes.done;\n extensions.set(paraId, {\n paraId,\n parentParaId,\n isDone:\n typeof doneValue === \"string\"\n ? doneValue.toLowerCase() === \"true\" || doneValue === \"1\"\n : undefined,\n });\n }\n\n return extensions;\n}\n\nfunction parseCommentDurableIds(xml: string | undefined): Map<string, string> {\n if (!xml || xml.trim().length === 0) {\n return new Map();\n }\n\n const root = parseXml(xml);\n const commentsIdsElement = findChildElement(root, \"commentsIds\");\n const durableIds = new Map<string, string>();\n\n for (const child of commentsIdsElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"commentId\") {\n continue;\n }\n\n const paraId = child.attributes[\"w16cid:paraId\"] ?? child.attributes.paraId;\n const durableId = child.attributes[\"w16cid:durableId\"] ?? child.attributes.durableId;\n if (paraId && durableId) {\n durableIds.set(paraId, durableId);\n }\n }\n\n return durableIds;\n}\n\nfunction parsePeopleAuthors(xml: string | undefined): string[] {\n if (!xml || xml.trim().length === 0) {\n return [];\n }\n\n const root = parseXml(xml);\n const peopleElement = findChildElement(root, \"people\");\n const authors = new Set<string>();\n\n for (const child of peopleElement.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"person\") {\n continue;\n }\n\n const author = child.attributes[\"w15:author\"] ?? child.attributes.author;\n if (author) {\n authors.add(author);\n }\n }\n\n return [...authors].sort((left, right) => left.localeCompare(right));\n}\n\nfunction extractRootTag(xml: string | undefined, localTagName: string): string | undefined {\n if (!xml) {\n return undefined;\n }\n\n const pattern = new RegExp(`<[^>]*:?${localTagName}\\\\b[^>]*>`, \"u\");\n return pattern.exec(xml)?.[0];\n}\n\nfunction parseCommentAnchors(documentXml: string): Map<string, CommentAnchorBounds> {\n const root = parseXml(documentXml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const anchors = new Map<string, CommentAnchorBounds>();\n walkCommentAnchorBlocks(bodyElement.children, anchors, 0, -1, true);\n\n return anchors;\n}\n\nfunction walkCommentAnchorBlocks(\n nodes: readonly XmlNode[],\n anchors: Map<string, CommentAnchorBounds>,\n cursor: number,\n paragraphIndex: number,\n useSurfaceParagraphSeparators: boolean,\n): {\n cursor: number;\n paragraphIndex: number;\n} {\n let nextCursor = cursor;\n let nextParagraphIndex = paragraphIndex;\n let elementIndex = -1;\n\n for (const node of nodes) {\n if (node.type !== \"element\") {\n continue;\n }\n elementIndex += 1;\n\n const name = localName(node.name);\n if (name === \"p\") {\n if (useSurfaceParagraphSeparators && elementIndex > 0) {\n nextCursor += 1;\n }\n nextParagraphIndex += 1;\n walkParagraph(node, nextParagraphIndex, anchors, () => nextCursor, (next) => {\n nextCursor = next;\n });\n continue;\n }\n\n if (name === \"tbl\") {\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tr\") {\n continue;\n }\n for (const rowChild of child.children) {\n if (rowChild.type !== \"element\" || localName(rowChild.name) !== \"tc\") {\n continue;\n }\n const result = walkCommentAnchorBlocks(\n rowChild.children,\n anchors,\n nextCursor,\n nextParagraphIndex,\n false,\n );\n nextCursor = result.cursor;\n nextParagraphIndex = result.paragraphIndex;\n }\n }\n continue;\n }\n\n if (name === \"sdt\") {\n const sdtContent = findChildElement(node, \"sdtContent\");\n const result = walkCommentAnchorBlocks(\n sdtContent.children,\n anchors,\n nextCursor,\n nextParagraphIndex,\n false,\n );\n nextCursor = result.cursor;\n nextParagraphIndex = result.paragraphIndex;\n continue;\n }\n\n if (name === \"customXml\") {\n nextCursor += 1;\n continue;\n }\n\n nextCursor += 0;\n }\n\n return {\n cursor: nextCursor,\n paragraphIndex: nextParagraphIndex,\n };\n}\n\nfunction walkParagraph(\n paragraph: XmlElementNode,\n paragraphIndex: number,\n anchors: Map<string, CommentAnchorBounds>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const child of paragraph.children) {\n walkInlineNode(child, paragraphIndex, anchors, getCursor, setCursor);\n }\n}\n\nfunction walkInlineNode(\n node: XmlNode,\n paragraphIndex: number,\n anchors: Map<string, CommentAnchorBounds>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"commentRangeStart\": {\n const commentId = node.attributes[\"w:id\"] ?? node.attributes.id;\n if (commentId) {\n const bounds = ensureCommentAnchor(anchors, commentId);\n bounds.start = getCursor();\n bounds.startParagraphIndex = paragraphIndex;\n }\n return;\n }\n case \"commentRangeEnd\": {\n const commentId = node.attributes[\"w:id\"] ?? node.attributes.id;\n if (commentId) {\n const bounds = ensureCommentAnchor(anchors, commentId);\n bounds.end = getCursor();\n bounds.endParagraphIndex = paragraphIndex;\n }\n return;\n }\n case \"commentReference\": {\n const commentId = node.attributes[\"w:id\"] ?? node.attributes.id;\n if (commentId) {\n const bounds = ensureCommentAnchor(anchors, commentId);\n bounds.referenceAt = getCursor();\n bounds.referenceParagraphIndex = paragraphIndex;\n }\n return;\n }\n case \"t\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n setCursor(getCursor() + Array.from(text).length);\n return;\n }\n case \"tab\":\n case \"br\":\n setCursor(getCursor() + 1);\n return;\n default:\n for (const child of node.children) {\n walkInlineNode(child, paragraphIndex, anchors, getCursor, setCursor);\n }\n }\n}\n\nfunction ensureCommentAnchor(\n anchors: Map<string, CommentAnchorBounds>,\n commentId: string,\n): CommentAnchorBounds {\n const existing = anchors.get(commentId);\n if (existing) {\n return existing;\n }\n\n const next: CommentAnchorBounds = {};\n anchors.set(commentId, next);\n return next;\n}\n\nfunction extractParagraphText(paragraph: XmlElementNode): string {\n let text = \"\";\n\n for (const child of paragraph.children) {\n text += extractNodeText(child);\n }\n\n return text;\n}\n\nfunction extractNodeText(node: XmlNode): string {\n if (node.type === \"text\") {\n return node.text;\n }\n\n switch (localName(node.name)) {\n case \"t\":\n return node.children.map(extractNodeText).join(\"\");\n case \"tab\":\n return \"\\t\";\n case \"br\":\n return \"\\n\";\n default:\n return node.children.map(extractNodeText).join(\"\");\n }\n}\n\nfunction compareThreadsByAnchor(left: CommentThread, right: CommentThread): number {\n const leftStart =\n left.anchor.kind === \"range\" ? left.anchor.range.from : Number.MAX_SAFE_INTEGER;\n const rightStart =\n right.anchor.kind === \"range\" ? right.anchor.range.from : Number.MAX_SAFE_INTEGER;\n\n if (leftStart !== rightStart) {\n return leftStart - rightStart;\n }\n\n return left.commentId.localeCompare(right.commentId);\n}\n\nfunction toDetachedRange(anchor: CommentAnchorBounds): { from: number; to: number } | undefined {\n const positions = [anchor.start, anchor.end, anchor.referenceAt].filter(\n (value): value is number => typeof value === \"number\",\n );\n if (positions.length === 0) {\n return undefined;\n }\n return {\n from: Math.min(...positions),\n to: Math.max(...positions),\n };\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"#document\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n const tokenPattern =\n /<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>|<!DOCTYPE[\\s\\S]*?>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<[^>]+>|[^<]+/gu;\n\n for (const match of xml.matchAll(tokenPattern)) {\n const token = match[0] ?? \"\";\n const start = match.index ?? 0;\n const end = start + token.length;\n\n if (token.startsWith(\"<?\") || token.startsWith(\"<!DOCTYPE\") || token.startsWith(\"<!--\")) {\n continue;\n }\n\n if (token.startsWith(\"<![CDATA[\")) {\n const text = token.slice(9, -3);\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n continue;\n }\n\n if (token.startsWith(\"</\")) {\n const node = stack.pop();\n if (!node) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n node.end = end;\n continue;\n }\n\n if (token.startsWith(\"<\")) {\n const selfClosing = /\\/>$/.test(token);\n const tagBody = token.slice(1, token.length - (selfClosing ? 2 : 1)).trim();\n const { name, attributes } = parseTag(tagBody);\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start,\n end,\n };\n stack[stack.length - 1]?.children.push(node);\n if (!selfClosing) {\n stack.push(node);\n }\n continue;\n }\n\n const text = decodeXmlText(token);\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed tag.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n const whitespaceIndex = tagBody.search(/\\s/u);\n const name = whitespaceIndex === -1 ? tagBody : tagBody.slice(0, whitespaceIndex);\n const rawAttributes = whitespaceIndex === -1 ? \"\" : tagBody.slice(whitespaceIndex + 1);\n const attributes: Record<string, string> = {};\n const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n\n for (const match of rawAttributes.matchAll(pattern)) {\n const key = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (key) {\n attributes[key] = decodeXmlText(value);\n }\n }\n\n return { name, attributes };\n}\n\nfunction findChildElement(node: XmlElementNode, name: string): XmlElementNode {\n const match = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === name,\n );\n\n if (!match) {\n throw new Error(`Expected XML element ${name}.`);\n }\n\n return match;\n}\n\nfunction localName(name: string): string {\n const index = name.indexOf(\":\");\n return index === -1 ? name : name.slice(index + 1);\n}\n\nfunction decodeXmlText(text: string): string {\n return text.replace(\n /&(?:#x([0-9A-Fa-f]+)|#([0-9]+)|([A-Za-z]+));/gu,\n (_, hex, dec, named) => {\n if (hex) {\n return String.fromCodePoint(Number.parseInt(hex, 16));\n }\n if (dec) {\n return String.fromCodePoint(Number.parseInt(dec, 10));\n }\n\n switch (named) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return \"\\\"\";\n case \"apos\":\n return \"'\";\n default:\n return `&${named};`;\n }\n },\n );\n}\n","import type { CommentEntry, CommentThread } from \"../../review/store/comment-store.ts\";\nimport type { RevisionParagraphBoundary } from \"../ooxml/revision-boundaries.ts\";\nimport type { ImportedCommentDefinition } from \"../ooxml/parse-comments.ts\";\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\ninterface ParagraphBoundaryMap {\n paragraphIndex: number;\n start: number;\n end: number;\n boundaries: Map<number, number>;\n}\n\ninterface SerializableCommentEntry {\n thread: CommentThread;\n entry: CommentEntry;\n exportCommentId: string;\n paraId: string;\n durableId?: string;\n isRoot: boolean;\n}\n\nexport interface SerializedCommentsResult {\n commentsXml: string;\n serializedCommentIds: string[];\n commentsExtendedXml?: string;\n commentsIdsXml?: string;\n peopleXml?: string;\n}\n\nexport interface SerializeMergedCommentsXmlOptions {\n preservedDefinitions?: readonly ImportedCommentDefinition[];\n sourceRootTag?: string;\n sourceExtendedRootTag?: string;\n sourceIdsRootTag?: string;\n sourcePeopleRootTag?: string;\n peopleAuthors?: readonly string[];\n exportCommentIds?: ReadonlyMap<string, string>;\n}\n\nexport interface SerializeCommentAnchorsOptions {\n exportCommentIds?: ReadonlyMap<string, string>;\n}\n\nexport interface SerializedCommentDocumentResult {\n documentXml: string;\n serializedCommentIds: string[];\n skippedCommentIds: string[];\n}\n\nconst DEFAULT_COMMENTS_ROOT_TAG =\n `<w:comments xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"w14\">`;\nconst DEFAULT_COMMENTS_EXTENDED_ROOT_TAG =\n `<w15:commentsEx xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\">`;\nconst DEFAULT_COMMENTS_IDS_ROOT_TAG =\n `<w16cid:commentsIds xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\">`;\nconst DEFAULT_PEOPLE_ROOT_TAG =\n `<w15:people xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\">`;\n\nexport function serializeCommentsXml(\n threads: readonly CommentThread[],\n options: {\n exportCommentIds?: ReadonlyMap<string, string>;\n } = {},\n): SerializedCommentsResult {\n return serializeMergedCommentsXml(threads, {\n exportCommentIds: options.exportCommentIds,\n });\n}\n\nexport function serializeMergedCommentsXml(\n threads: readonly CommentThread[],\n options: SerializeMergedCommentsXmlOptions = {},\n): SerializedCommentsResult {\n const serializableThreads = threads.filter((thread) => thread.entries.length > 0);\n const preservedDefinitions = (options.preservedDefinitions ?? [])\n .slice()\n .sort((left, right) => left.order - right.order);\n const runtimeThreadById = new Map(\n serializableThreads.map((thread) => [thread.commentId, thread]),\n );\n const exportCommentIds =\n options.exportCommentIds ??\n createCommentExportIdMap(serializableThreads, preservedDefinitions);\n const serializableEntries = createSerializableEntries(\n serializableThreads,\n preservedDefinitions,\n exportCommentIds,\n );\n const serializedEntryByOoxmlId = new Map(\n serializableEntries.map((entry) => [entry.exportCommentId, entry]),\n );\n const emittedThreadIds = new Set<string>();\n const mergedComments: string[] = [];\n\n for (const definition of preservedDefinitions) {\n const ownedThread = runtimeThreadById.get(definition.commentId);\n if (ownedThread) {\n if (emittedThreadIds.has(ownedThread.commentId)) {\n continue;\n }\n mergedComments.push(\n ...serializeThreadEntries(\n serializableEntries.filter((entry) => entry.thread.commentId === ownedThread.commentId),\n ),\n );\n emittedThreadIds.add(ownedThread.commentId);\n continue;\n }\n\n if (serializedEntryByOoxmlId.has(definition.commentId)) {\n continue;\n }\n\n mergedComments.push(definition.rawXml);\n }\n\n for (const thread of serializableThreads) {\n if (emittedThreadIds.has(thread.commentId)) {\n continue;\n }\n\n mergedComments.push(\n ...serializeThreadEntries(\n serializableEntries.filter((entry) => entry.thread.commentId === thread.commentId),\n ),\n );\n emittedThreadIds.add(thread.commentId);\n }\n\n const mergedExtendedEntries = [\n ...serializePreservedCommentExtensions(\n preservedDefinitions.filter((definition) => !serializedEntryByOoxmlId.has(definition.commentId)),\n ),\n ...serializableEntries\n .map((entry) => serializeCommentExtension(entry))\n .filter((xml): xml is string => Boolean(xml)),\n ];\n const mergedDurableIds = [\n ...serializePreservedCommentIds(\n preservedDefinitions.filter((definition) => !serializedEntryByOoxmlId.has(definition.commentId)),\n ),\n ...serializableEntries\n .map((entry) => serializeCommentDurableId(entry))\n .filter((xml): xml is string => Boolean(xml)),\n ];\n const peopleAuthors = new Set([\n ...(options.peopleAuthors ?? []),\n ...preservedDefinitions\n .map((definition) => definition.authorId)\n .filter((authorId): authorId is string => typeof authorId === \"string\" && authorId.length > 0),\n ...serializableEntries\n .map((entry) => entry.entry.authorId)\n .filter((authorId): authorId is string => typeof authorId === \"string\" && authorId.length > 0),\n ]);\n\n return {\n commentsXml: [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n normalizeCommentsRootTag(options.sourceRootTag ?? DEFAULT_COMMENTS_ROOT_TAG),\n ...mergedComments,\n `</w:comments>`,\n ].join(\"\\n\"),\n serializedCommentIds: serializableThreads.map((thread) => thread.commentId),\n commentsExtendedXml:\n mergedExtendedEntries.length > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourceExtendedRootTag ?? DEFAULT_COMMENTS_EXTENDED_ROOT_TAG,\n ...mergedExtendedEntries,\n `</w15:commentsEx>`,\n ].join(\"\\n\")\n : undefined,\n commentsIdsXml:\n mergedDurableIds.length > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourceIdsRootTag ?? DEFAULT_COMMENTS_IDS_ROOT_TAG,\n ...mergedDurableIds,\n `</w16cid:commentsIds>`,\n ].join(\"\\n\")\n : undefined,\n peopleXml:\n peopleAuthors.size > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourcePeopleRootTag ?? DEFAULT_PEOPLE_ROOT_TAG,\n ...[...peopleAuthors]\n .sort((left, right) => left.localeCompare(right))\n .map(\n (authorId) =>\n `<w15:person w15:author=\"${escapeAttribute(authorId)}\" />`,\n ),\n `</w15:people>`,\n ].join(\"\\n\")\n : undefined,\n };\n}\n\nfunction normalizeCommentsRootTag(rootTag: string): string {\n let normalized = rootTag;\n if (!/\\bxmlns:w14=/u.test(normalized)) {\n normalized = normalized.replace(\n />$/u,\n ` xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\">`,\n );\n }\n if (!/\\bxmlns:mc=/u.test(normalized)) {\n normalized = normalized.replace(\n />$/u,\n ` xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">`,\n );\n }\n if (!/\\bmc:Ignorable=/u.test(normalized)) {\n normalized = normalized.replace(/>$/u, ` mc:Ignorable=\"w14\">`);\n } else if (!/\\bmc:Ignorable=\"[^\"]*\\bw14\\b/u.test(normalized)) {\n normalized = normalized.replace(\n /\\bmc:Ignorable=\"([^\"]*)\"/u,\n (_match, value: string) =>\n `mc:Ignorable=\"${`${value} w14`.trim().replace(/\\s+/gu, \" \")}\"`,\n );\n }\n return normalized;\n}\n\nexport function serializeCommentAnchorsIntoDocumentXml(\n documentXml: string,\n threads: readonly CommentThread[],\n paragraphs: readonly Pick<\n RevisionParagraphBoundary,\n \"paragraphIndex\" | \"start\" | \"end\" | \"boundaries\"\n >[] = mapParagraphBoundaries(documentXml),\n options: SerializeCommentAnchorsOptions = {},\n): SerializedCommentDocumentResult {\n const insertions = new Map<number, string[]>();\n const serializedCommentIds: string[] = [];\n const skippedCommentIds: string[] = [];\n const exportCommentIds =\n options.exportCommentIds ?? createCommentExportIdMap(threads);\n\n for (const thread of threads) {\n const { anchor } = thread;\n if (anchor.kind !== \"range\") {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const paragraph = paragraphs.find(\n (candidate) =>\n anchor.range.from >= candidate.start &&\n anchor.range.to <= candidate.end,\n );\n\n if (!paragraph) {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const startIndex = paragraph.boundaries.get(anchor.range.from);\n const endIndex = paragraph.boundaries.get(anchor.range.to);\n\n if (startIndex === undefined || endIndex === undefined) {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const exportCommentId = exportCommentIds.get(thread.commentId) ?? thread.commentId;\n pushInsertion(\n insertions,\n startIndex,\n `<w:commentRangeStart w:id=\"${escapeAttribute(exportCommentId)}\"/>`,\n );\n pushInsertion(\n insertions,\n endIndex,\n `<w:commentRangeEnd w:id=\"${escapeAttribute(exportCommentId)}\"/>`,\n );\n pushInsertion(\n insertions,\n endIndex,\n `<w:r><w:commentReference w:id=\"${escapeAttribute(exportCommentId)}\"/></w:r>`,\n );\n serializedCommentIds.push(thread.commentId);\n }\n\n const sortedInsertions = [...insertions.entries()].sort((left, right) => left[0] - right[0]);\n let cursor = 0;\n let output = \"\";\n\n for (const [index, snippets] of sortedInsertions) {\n output += documentXml.slice(cursor, index);\n output += snippets.join(\"\");\n cursor = index;\n }\n\n output += documentXml.slice(cursor);\n\n return {\n documentXml: output,\n serializedCommentIds,\n skippedCommentIds,\n };\n}\n\nexport function createCommentExportIdMap(\n threads: readonly CommentThread[],\n preservedDefinitions: readonly ImportedCommentDefinition[] = [],\n): ReadonlyMap<string, string> {\n const exportIds = new Map<string, string>();\n const reservedNumericIds = new Set<number>();\n\n for (const definition of preservedDefinitions) {\n const numericId = parseOoxmlNumericId(definition.commentId);\n if (numericId !== undefined) {\n reservedNumericIds.add(numericId);\n }\n }\n\n for (const thread of threads) {\n const rootEntry = getRootEntry(thread);\n const preferredValue =\n thread.metadata?.rootOoxmlCommentId ??\n rootEntry?.metadata?.ooxmlCommentId ??\n thread.commentId;\n const numericId = parseOoxmlNumericId(preferredValue);\n if (numericId !== undefined && !reservedNumericIds.has(numericId)) {\n exportIds.set(thread.commentId, String(numericId));\n reservedNumericIds.add(numericId);\n }\n }\n\n let nextGeneratedId =\n reservedNumericIds.size > 0 ? Math.max(...reservedNumericIds) + 1 : 1;\n\n for (const thread of threads) {\n if (exportIds.has(thread.commentId)) {\n continue;\n }\n\n while (reservedNumericIds.has(nextGeneratedId)) {\n nextGeneratedId += 1;\n }\n\n exportIds.set(thread.commentId, String(nextGeneratedId));\n reservedNumericIds.add(nextGeneratedId);\n nextGeneratedId += 1;\n }\n\n return exportIds;\n}\n\nfunction createSerializableEntries(\n threads: readonly CommentThread[],\n preservedDefinitions: readonly ImportedCommentDefinition[],\n exportCommentIds: ReadonlyMap<string, string>,\n): SerializableCommentEntry[] {\n const entries: SerializableCommentEntry[] = [];\n const reservedNumericIds = new Set<number>();\n\n for (const definition of preservedDefinitions) {\n const numericId = parseOoxmlNumericId(definition.commentId);\n if (numericId !== undefined) {\n reservedNumericIds.add(numericId);\n }\n }\n\n for (const thread of threads) {\n const rootEntry = getRootEntry(thread);\n if (!rootEntry) {\n continue;\n }\n\n const rootExportCommentId = exportCommentIds.get(thread.commentId) ?? thread.commentId;\n const rootNumericId = parseOoxmlNumericId(rootExportCommentId);\n if (rootNumericId !== undefined) {\n reservedNumericIds.add(rootNumericId);\n }\n\n const rootParaId =\n rootEntry.metadata?.paraId ??\n thread.metadata?.rootParaId ??\n generateParaId(thread.commentId, 0);\n const rootDurableId =\n rootEntry.metadata?.durableId ??\n createDurableId(rootEntry, rootExportCommentId, 0);\n\n entries.push({\n thread,\n entry: rootEntry,\n exportCommentId: rootExportCommentId,\n paraId: rootParaId,\n durableId: rootDurableId,\n isRoot: true,\n });\n\n for (let index = 1; index < thread.entries.length; index += 1) {\n const entry = thread.entries[index];\n if (!entry) {\n continue;\n }\n\n const preferredCommentId = entry.metadata?.ooxmlCommentId;\n let exportCommentId: string | undefined;\n const preferredNumericId = preferredCommentId\n ? parseOoxmlNumericId(preferredCommentId)\n : undefined;\n if (\n preferredNumericId !== undefined &&\n !reservedNumericIds.has(preferredNumericId)\n ) {\n exportCommentId = String(preferredNumericId);\n reservedNumericIds.add(preferredNumericId);\n } else {\n let nextGeneratedId =\n reservedNumericIds.size > 0 ? Math.max(...reservedNumericIds) + 1 : 1;\n while (reservedNumericIds.has(nextGeneratedId)) {\n nextGeneratedId += 1;\n }\n exportCommentId = String(nextGeneratedId);\n reservedNumericIds.add(nextGeneratedId);\n }\n\n entries.push({\n thread,\n entry,\n exportCommentId,\n paraId: entry.metadata?.paraId ?? generateParaId(thread.commentId, index),\n durableId:\n entry.metadata?.durableId ??\n createDurableId(entry, exportCommentId, index),\n isRoot: false,\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeThreadEntries(entries: readonly SerializableCommentEntry[]): string[] {\n return entries.map((entry) => serializeCommentEntry(entry));\n}\n\nfunction serializeCommentEntry(entry: SerializableCommentEntry): string {\n const author = escapeAttribute(entry.entry.authorId);\n const createdAt = escapeAttribute(entry.entry.createdAt);\n const initials = entry.entry.metadata?.initials;\n const paragraphXml = serializeCommentParagraphs(entry.entry.body, entry.paraId);\n\n return `<w:comment w:id=\"${escapeAttribute(entry.exportCommentId)}\"${initials ? ` w:initials=\"${escapeAttribute(initials)}\"` : \"\"} w:author=\"${author}\" w:date=\"${createdAt}\">${paragraphXml}</w:comment>`;\n}\n\nfunction serializeCommentParagraphs(body: string, paraId: string): string {\n const paragraphs = body.length > 0 ? body.split(\"\\n\") : [\"\"];\n const textId = deriveTextIdFromParaId(paraId);\n return paragraphs\n .map((paragraph, index) => {\n const attributes =\n index === 0\n ? ` w14:paraId=\"${escapeAttribute(paraId)}\" w14:textId=\"${escapeAttribute(textId)}\"`\n : \"\";\n return `<w:p${attributes}><w:r>${serializeText(paragraph)}</w:r></w:p>`;\n })\n .join(\"\");\n}\n\nfunction serializePreservedCommentExtensions(\n definitions: readonly ImportedCommentDefinition[],\n): string[] {\n return definitions\n .map((definition) =>\n definition.paraId\n ? serializePreservedCommentExtension(definition)\n : undefined,\n )\n .filter((xml): xml is string => Boolean(xml));\n}\n\nfunction serializePreservedCommentExtension(\n definition: ImportedCommentDefinition,\n): string {\n const doneValue = definition.isDone ? \"true\" : \"false\";\n return `<w15:commentEx w15:paraId=\"${escapeAttribute(definition.paraId!)}\"${definition.parentParaId ? ` w15:paraIdParent=\"${escapeAttribute(definition.parentParaId)}\"` : \"\"} w15:done=\"${doneValue}\" />`;\n}\n\nfunction serializeCommentExtension(\n entry: SerializableCommentEntry,\n): string | undefined {\n return `<w15:commentEx w15:paraId=\"${escapeAttribute(entry.paraId)}\"${entry.isRoot ? \"\" : ` w15:paraIdParent=\"${escapeAttribute(findRootParaId(entry.thread, entry.paraId))}\"`} w15:done=\"${entry.isRoot && entry.thread.status === \"resolved\" ? \"true\" : \"false\"}\" />`;\n}\n\nfunction serializePreservedCommentIds(\n definitions: readonly ImportedCommentDefinition[],\n): string[] {\n return definitions\n .map((definition) =>\n definition.paraId && definition.durableId\n ? `<w16cid:commentId w16cid:paraId=\"${escapeAttribute(definition.paraId)}\" w16cid:durableId=\"${escapeAttribute(definition.durableId)}\" />`\n : undefined,\n )\n .filter((xml): xml is string => Boolean(xml));\n}\n\nfunction serializeCommentDurableId(\n entry: SerializableCommentEntry,\n): string | undefined {\n if (!entry.durableId) {\n return undefined;\n }\n\n return `<w16cid:commentId w16cid:paraId=\"${escapeAttribute(entry.paraId)}\" w16cid:durableId=\"${escapeAttribute(entry.durableId)}\" />`;\n}\n\nfunction getRootEntry(thread: CommentThread): CommentEntry | undefined {\n return thread.entries[0];\n}\n\nfunction findRootParaId(thread: CommentThread, fallback: string): string {\n return (\n thread.entries[0]?.metadata?.paraId ??\n thread.metadata?.rootParaId ??\n fallback\n );\n}\n\nfunction generateParaId(seed: string, index: number): string {\n const normalized = `${seed}:${index}`;\n let hash = 0;\n\n for (let cursor = 0; cursor < normalized.length; cursor += 1) {\n hash = (hash * 31 + normalized.charCodeAt(cursor)) >>> 0;\n }\n\n return hash.toString(16).toUpperCase().padStart(8, \"0\").slice(-8);\n}\n\nfunction createDurableId(\n entry: CommentEntry,\n exportCommentId: string,\n index: number,\n): string {\n const seed = `${entry.entryId}:${exportCommentId}:${index}`;\n let hash = 0n;\n\n for (let cursor = 0; cursor < seed.length; cursor += 1) {\n hash = (hash * 131n + BigInt(seed.charCodeAt(cursor))) & 0xffffffffffffffffn;\n }\n\n return hash.toString(16).toUpperCase().padStart(16, \"0\").slice(-16);\n}\n\nfunction deriveTextIdFromParaId(paraId: string): string {\n return paraId.slice(-8).padStart(8, \"0\");\n}\n\nfunction parseOoxmlNumericId(value: string): number | undefined {\n if (!/^-?\\d+$/u.test(value)) {\n return undefined;\n }\n\n const numericId = Number.parseInt(value, 10);\n return Number.isFinite(numericId) ? numericId : undefined;\n}\n\nexport function mapParagraphBoundaries(documentXml: string): ParagraphBoundaryMap[] {\n const root = parseXml(documentXml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const paragraphs: ParagraphBoundaryMap[] = [];\n walkBlockNodesForParagraphBoundaries(\n bodyElement.children,\n documentXml,\n paragraphs,\n 0,\n -1,\n true,\n );\n\n return paragraphs;\n}\n\nfunction walkBlockNodesForParagraphBoundaries(\n nodes: readonly XmlNode[],\n documentXml: string,\n paragraphs: ParagraphBoundaryMap[],\n globalCursor: number,\n paragraphIndex: number,\n useSurfaceParagraphSeparators: boolean,\n): {\n globalCursor: number;\n paragraphIndex: number;\n} {\n let nextCursor = globalCursor;\n let nextParagraphIndex = paragraphIndex;\n let elementIndex = -1;\n\n for (const node of nodes) {\n if (node.type !== \"element\") {\n continue;\n }\n elementIndex += 1;\n\n const name = localName(node.name);\n if (name === \"p\") {\n if (useSurfaceParagraphSeparators && elementIndex > 0) {\n nextCursor += 1;\n }\n nextParagraphIndex += 1;\n const boundaries = new Map<number, number>();\n boundaries.set(nextCursor, node.start + openingTagLength(documentXml, node.start));\n\n walkParagraphForBoundaries(\n node,\n documentXml,\n boundaries,\n () => nextCursor,\n (next) => {\n nextCursor = next;\n },\n );\n\n if (!boundaries.has(nextCursor)) {\n boundaries.set(nextCursor, node.end - 4);\n }\n paragraphs.push({\n paragraphIndex: nextParagraphIndex,\n start: Math.min(...boundaries.keys()),\n end: Math.max(...boundaries.keys()),\n boundaries,\n });\n continue;\n }\n\n if (name === \"tbl\") {\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tr\") {\n continue;\n }\n for (const rowChild of child.children) {\n if (rowChild.type !== \"element\" || localName(rowChild.name) !== \"tc\") {\n continue;\n }\n const result = walkBlockNodesForParagraphBoundaries(\n rowChild.children,\n documentXml,\n paragraphs,\n nextCursor,\n nextParagraphIndex,\n false,\n );\n nextCursor = result.globalCursor;\n nextParagraphIndex = result.paragraphIndex;\n }\n }\n continue;\n }\n\n if (name === \"sdt\") {\n const sdtContent = findChildElement(node, \"sdtContent\");\n const result = walkBlockNodesForParagraphBoundaries(\n sdtContent.children,\n documentXml,\n paragraphs,\n nextCursor,\n nextParagraphIndex,\n false,\n );\n nextCursor = result.globalCursor;\n nextParagraphIndex = result.paragraphIndex;\n continue;\n }\n\n if (name === \"customXml\") {\n nextCursor += 1;\n continue;\n }\n\n nextCursor += 0;\n }\n\n return {\n globalCursor: nextCursor,\n paragraphIndex: nextParagraphIndex,\n };\n}\n\nfunction walkParagraphForBoundaries(\n paragraph: XmlElementNode,\n sourceXml: string,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const child of paragraph.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n}\n\nfunction walkInlineNodeForBoundaries(\n node: XmlNode,\n sourceXml: string,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"r\": {\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n\n for (const child of node.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n\n boundaries.set(getCursor(), node.end);\n return;\n }\n case \"t\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n setCursor(getCursor() + Array.from(text).length);\n return;\n }\n case \"tab\":\n case \"br\": {\n const startCursor = getCursor();\n boundaries.set(startCursor, node.start);\n const nextCursor = startCursor + 1;\n boundaries.set(nextCursor, node.end);\n setCursor(nextCursor);\n return;\n }\n default:\n for (const child of node.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n }\n}\n\nfunction pushInsertion(\n insertions: Map<number, string[]>,\n index: number,\n xml: string,\n): void {\n const bucket = insertions.get(index);\n if (bucket) {\n bucket.push(xml);\n return;\n }\n\n insertions.set(index, [xml]);\n}\n\nfunction serializeText(text: string): string {\n const preserve = requiresPreservedSpace(text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:t${preserve}>${escapeXml(text)}</w:t>`;\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return /^\\s/u.test(text) || /\\s$/u.test(text) || /\\s{2,}/u.test(text);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeXml(value).replace(/\"/g, \""\");\n}\n\nfunction openingTagLength(xml: string, start: number): number {\n const end = xml.indexOf(\">\", start);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing tag close.\");\n }\n\n return end - start + 1;\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"#document\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n const tokenPattern =\n /<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>|<!DOCTYPE[\\s\\S]*?>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<[^>]+>|[^<]+/gu;\n\n for (const match of xml.matchAll(tokenPattern)) {\n const token = match[0] ?? \"\";\n const start = match.index ?? 0;\n const end = start + token.length;\n\n if (token.startsWith(\"<?\") || token.startsWith(\"<!DOCTYPE\") || token.startsWith(\"<!--\")) {\n continue;\n }\n\n if (token.startsWith(\"<![CDATA[\")) {\n const text = token.slice(9, -3);\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n continue;\n }\n\n if (token.startsWith(\"</\")) {\n const node = stack.pop();\n if (!node) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n node.end = end;\n continue;\n }\n\n if (token.startsWith(\"<\")) {\n const selfClosing = /\\/>$/.test(token);\n const tagBody = token.slice(1, token.length - (selfClosing ? 2 : 1)).trim();\n const { name, attributes } = parseTag(tagBody);\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start,\n end,\n };\n stack[stack.length - 1]?.children.push(node);\n if (!selfClosing) {\n stack.push(node);\n }\n continue;\n }\n\n const text = decodeXmlText(token);\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed tag.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n const whitespaceIndex = tagBody.search(/\\s/u);\n const name = whitespaceIndex === -1 ? tagBody : tagBody.slice(0, whitespaceIndex);\n const rawAttributes = whitespaceIndex === -1 ? \"\" : tagBody.slice(whitespaceIndex + 1);\n const attributes: Record<string, string> = {};\n const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n\n for (const match of rawAttributes.matchAll(pattern)) {\n const key = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (key) {\n attributes[key] = decodeXmlText(value);\n }\n }\n\n return { name, attributes };\n}\n\nfunction findChildElement(node: XmlElementNode, name: string): XmlElementNode {\n const match = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === name,\n );\n\n if (!match) {\n throw new Error(`Expected XML element ${name}.`);\n }\n\n return match;\n}\n\nfunction localName(name: string): string {\n const index = name.indexOf(\":\");\n return index === -1 ? name : name.slice(index + 1);\n}\n\nfunction decodeXmlText(text: string): string {\n return text.replace(\n /&(?:#x([0-9A-Fa-f]+)|#([0-9]+)|([A-Za-z]+));/gu,\n (_, hex, dec, named) => {\n if (hex) {\n return String.fromCodePoint(Number.parseInt(hex, 16));\n }\n if (dec) {\n return String.fromCodePoint(Number.parseInt(dec, 10));\n }\n\n switch (named) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return \"\\\"\";\n case \"apos\":\n return \"'\";\n default:\n return `&${named};`;\n }\n },\n );\n}\n","import type {\n DocumentRootNode,\n HyperlinkNode,\n InlineNode,\n ParagraphNode,\n TextNode,\n} from \"../../model/canonical-document.ts\";\nimport type { CommentThread } from \"../../review/store/comment-store.ts\";\nimport type { RevisionRecord } from \"../../review/store/revision-types.ts\";\n\nexport function splitDocumentAtReviewBoundaries(\n content: DocumentRootNode,\n comments: readonly CommentThread[],\n revisions: readonly RevisionRecord[],\n): DocumentRootNode {\n const splitPositions = collectSplitPositions(comments, revisions);\n if (splitPositions.size === 0) {\n return content;\n }\n\n return {\n type: \"doc\",\n children: splitBlockNodes(content.children, splitPositions, 0, true).children,\n };\n}\n\nfunction collectSplitPositions(\n comments: readonly CommentThread[],\n revisions: readonly RevisionRecord[],\n): Set<number> {\n const positions = new Set<number>();\n\n for (const thread of comments) {\n if (thread.anchor.kind !== \"range\") {\n continue;\n }\n\n positions.add(thread.anchor.range.from);\n positions.add(thread.anchor.range.to);\n }\n\n for (const revision of revisions) {\n if (revision.status !== \"active\" || revision.anchor.kind !== \"range\") {\n continue;\n }\n\n if (\n revision.metadata.importedRevisionForm === \"paragraph-insertion\" ||\n revision.metadata.importedRevisionForm === \"paragraph-deletion\"\n ) {\n continue;\n }\n\n positions.add(revision.anchor.range.from);\n positions.add(revision.anchor.range.to);\n }\n\n return positions;\n}\n\nfunction splitParagraph(\n paragraph: ParagraphNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { paragraph: ParagraphNode; cursor: number } {\n const children: InlineNode[] = [];\n let nextCursor = cursor;\n\n for (const child of paragraph.children) {\n if (child.type === \"text\") {\n const split = splitTextNode(child, splitPositions, nextCursor);\n children.push(...split.children);\n nextCursor = split.cursor;\n continue;\n }\n\n if (child.type === \"hyperlink\") {\n const split = splitHyperlinkNode(child, splitPositions, nextCursor);\n children.push(...split.children);\n nextCursor = split.cursor;\n continue;\n }\n\n children.push(child);\n nextCursor += measureInlineNodeForReviewBoundaries(child);\n }\n\n return {\n paragraph: {\n ...paragraph,\n children,\n },\n cursor: nextCursor,\n };\n}\n\nfunction splitBlockNodes(\n blocks: readonly DocumentRootNode[\"children\"][number][],\n splitPositions: ReadonlySet<number>,\n cursor: number,\n useSurfaceParagraphSeparators: boolean,\n): {\n children: DocumentRootNode[\"children\"];\n cursor: number;\n} {\n const children: DocumentRootNode[\"children\"] = [];\n let nextCursor = cursor;\n for (const [index, block] of blocks.entries()) {\n if (block.type === \"paragraph\") {\n if (useSurfaceParagraphSeparators && index > 0) {\n nextCursor += 1;\n }\n const next = splitParagraph(block, splitPositions, nextCursor);\n children.push(next.paragraph);\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"table\") {\n const next = splitTableAtReviewBoundaries(block, splitPositions, nextCursor);\n children.push(next.table);\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"sdt\") {\n const next = splitBlockNodes(block.children, splitPositions, nextCursor, false);\n children.push({\n ...block,\n children: next.children,\n });\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n children.push(block);\n nextCursor += 1;\n continue;\n }\n\n children.push(block);\n nextCursor += 1;\n }\n\n return {\n children,\n cursor: nextCursor,\n };\n}\n\nfunction splitTableAtReviewBoundaries(\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): {\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>;\n cursor: number;\n} {\n let nextCursor = cursor;\n const rows = table.rows.map((row) => ({\n ...row,\n cells: row.cells.map((cell) => {\n const next = splitBlockNodes(cell.children, splitPositions, nextCursor, false);\n nextCursor = next.cursor;\n return {\n ...cell,\n children: next.children,\n };\n }),\n }));\n\n return {\n table: {\n ...table,\n rows,\n },\n cursor: nextCursor,\n };\n}\n\nfunction advanceCursorThroughTable(\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>,\n cursor: number,\n): number {\n let nextCursor = cursor;\n for (const row of table.rows) {\n for (const cell of row.cells) {\n nextCursor = measureBlockNodesForReviewBoundaries(cell.children, nextCursor, false);\n }\n }\n return nextCursor;\n}\n\nfunction measureBlockNodesForReviewBoundaries(\n blocks: readonly DocumentRootNode[\"children\"][number][],\n cursor: number,\n useSurfaceParagraphSeparators: boolean,\n): number {\n let nextCursor = cursor;\n for (const [index, block] of blocks.entries()) {\n if (block.type === \"paragraph\") {\n if (useSurfaceParagraphSeparators && index > 0) {\n nextCursor += 1;\n }\n nextCursor += block.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n continue;\n }\n\n if (block.type === \"table\") {\n nextCursor = advanceCursorThroughTable(block, nextCursor);\n continue;\n }\n\n if (block.type === \"sdt\") {\n nextCursor = measureBlockNodesForReviewBoundaries(\n block.children,\n nextCursor,\n false,\n );\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n nextCursor += 1;\n continue;\n }\n\n nextCursor += 1;\n }\n\n return nextCursor;\n}\n\nfunction splitHyperlinkNode(\n node: HyperlinkNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { children: HyperlinkNode[]; cursor: number } {\n let nextCursor = cursor;\n const groups: Array<HyperlinkNode[\"children\"]> = [[]];\n\n for (const child of node.children) {\n if (child.type === \"text\") {\n const split = splitTextNode(child, splitPositions, nextCursor);\n for (const piece of split.children) {\n groups[groups.length - 1]?.push(piece);\n nextCursor += Array.from(piece.text).length;\n if (splitPositions.has(nextCursor)) {\n groups.push([]);\n }\n }\n continue;\n }\n\n groups[groups.length - 1]?.push(child);\n nextCursor += measureInlineNodeForReviewBoundaries(child);\n if (splitPositions.has(nextCursor)) {\n groups.push([]);\n }\n }\n\n const hyperlinks = groups\n .filter((children) => children.length > 0)\n .map((children) => ({\n type: \"hyperlink\" as const,\n href: node.href,\n children,\n }));\n\n return {\n children: hyperlinks.length > 0 ? hyperlinks : [node],\n cursor: nextCursor,\n };\n}\n\nfunction splitTextNode(\n node: TextNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { children: TextNode[]; cursor: number } {\n const codepoints = Array.from(node.text);\n if (codepoints.length === 0) {\n return { children: [], cursor };\n }\n\n const boundaries = new Set<number>([0, codepoints.length]);\n for (let index = 1; index < codepoints.length; index += 1) {\n if (splitPositions.has(cursor + index)) {\n boundaries.add(index);\n }\n }\n\n const ordered = [...boundaries].sort((left, right) => left - right);\n const children: TextNode[] = [];\n\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const start = ordered[index] ?? 0;\n const end = ordered[index + 1] ?? codepoints.length;\n const text = codepoints.slice(start, end).join(\"\");\n if (text.length === 0) {\n continue;\n }\n\n children.push({\n type: \"text\",\n text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n }\n\n return {\n children: children.length > 0 ? children : [node],\n cursor: cursor + codepoints.length,\n };\n}\n\nfunction measureInlineNodeForReviewBoundaries(node: InlineNode): number {\n switch (node.type) {\n case \"text\":\n return Array.from(node.text).length;\n case \"bookmark_start\":\n case \"bookmark_end\":\n return 0;\n case \"hyperlink\":\n return node.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n case \"field\": {\n const childWidth = node.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n return childWidth > 0 ? childWidth : 1;\n }\n case \"tab\":\n case \"hard_break\":\n case \"column_break\":\n case \"footnote_ref\":\n case \"image\":\n case \"opaque_inline\":\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n case \"symbol\":\n return 1;\n default:\n return 1;\n }\n}\n","import type { RevisionRecord } from \"../../review/store/revision-types.ts\";\nimport {\n mapRevisionBoundaries,\n type RevisionParagraphBoundary,\n} from \"../ooxml/revision-boundaries.ts\";\n\ninterface XmlReplacement {\n start: number;\n end: number;\n replacement: string;\n}\n\nexport interface SerializedRuntimeRevisionsResult {\n documentXml: string;\n serializedRevisionIds: string[];\n skippedRevisionIds: string[];\n}\n\nexport function serializeRuntimeRevisionsIntoDocumentXml(\n documentXml: string,\n revisions: readonly RevisionRecord[],\n boundaries: readonly RevisionParagraphBoundary[] = mapRevisionBoundaries(documentXml),\n): SerializedRuntimeRevisionsResult {\n const replacements: XmlReplacement[] = [];\n const serializedRevisionIds: string[] = [];\n const skippedRevisionIds: string[] = [];\n const paragraphMarkers = new Map<\n number,\n { boundary: RevisionParagraphBoundary; markers: string[]; revisionIds: string[] }\n >();\n\n for (const revision of revisions) {\n if (revision.status !== \"active\" || revision.anchor.kind !== \"range\") {\n continue;\n }\n\n if (revision.kind !== \"insertion\" && revision.kind !== \"deletion\") {\n continue;\n }\n\n const form = revision.metadata.importedRevisionForm;\n if (form === \"paragraph-insertion\" || form === \"paragraph-deletion\") {\n const paragraphBoundary = findParagraphBoundaryForAnchor(boundaries, revision);\n if (!paragraphBoundary) {\n skippedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n const entry = paragraphMarkers.get(paragraphBoundary.paragraphIndex) ?? {\n boundary: paragraphBoundary,\n markers: [],\n revisionIds: [],\n };\n entry.markers.push(createParagraphRevisionMarker(revision));\n entry.revisionIds.push(revision.revisionId);\n paragraphMarkers.set(paragraphBoundary.paragraphIndex, entry);\n serializedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n const rangeReplacement = createRangeRevisionReplacement(documentXml, boundaries, revision);\n if (!rangeReplacement) {\n skippedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n replacements.push(rangeReplacement);\n serializedRevisionIds.push(revision.revisionId);\n }\n\n for (const { boundary, markers, revisionIds } of paragraphMarkers.values()) {\n const paragraphInsertion = createParagraphRevisionInsertion(\n documentXml,\n boundary,\n markers,\n );\n if (!paragraphInsertion) {\n skippedRevisionIds.push(...revisionIds);\n continue;\n }\n\n replacements.push(paragraphInsertion);\n }\n\n return {\n documentXml: applyReplacements(documentXml, replacements),\n serializedRevisionIds,\n skippedRevisionIds,\n };\n}\n\nfunction createRangeRevisionReplacement(\n documentXml: string,\n boundaries: readonly RevisionParagraphBoundary[],\n revision: RevisionRecord,\n): XmlReplacement | undefined {\n const { anchor } = revision;\n if (anchor.kind !== \"range\") {\n return undefined;\n }\n const paragraphBoundary = findParagraphBoundaryForRange(boundaries, anchor.range.from, anchor.range.to);\n if (!paragraphBoundary) {\n return undefined;\n }\n\n const startIndex = paragraphBoundary.boundaries.get(anchor.range.from);\n const endIndex = paragraphBoundary.boundaries.get(anchor.range.to);\n if (startIndex === undefined || endIndex === undefined || endIndex < startIndex) {\n return undefined;\n }\n\n const xml = documentXml.slice(startIndex, endIndex);\n const attributes = serializeRevisionAttributes(revision);\n return {\n start: startIndex,\n end: endIndex,\n replacement:\n revision.kind === \"insertion\"\n ? `<w:ins${attributes}>${xml}</w:ins>`\n : `<w:del${attributes}>${convertRunsToDeletedContent(xml)}</w:del>`,\n };\n}\n\nfunction createParagraphRevisionMarker(revision: RevisionRecord): string {\n const markerName = revision.kind === \"insertion\" ? \"w:ins\" : \"w:del\";\n return `<${markerName}${serializeRevisionAttributes(revision)}/>`;\n}\n\nfunction createParagraphRevisionInsertion(\n documentXml: string,\n paragraphBoundary: RevisionParagraphBoundary,\n markers: readonly string[],\n): XmlReplacement | undefined {\n const paragraphXml = documentXml.slice(\n paragraphBoundary.paragraphStart,\n paragraphBoundary.paragraphEnd,\n );\n const markerXml = markers.join(\"\");\n const paragraphRunPropertiesInsertionIndex = findClosingTagInsertionIndex(\n documentXml,\n paragraphBoundary.paragraphRunPropertiesStart,\n paragraphBoundary.paragraphRunPropertiesEnd,\n \"w:rPr\",\n );\n if (paragraphRunPropertiesInsertionIndex !== undefined) {\n return {\n start: paragraphRunPropertiesInsertionIndex,\n end: paragraphRunPropertiesInsertionIndex,\n replacement: markerXml,\n };\n }\n\n const paragraphPropertiesInsertionIndex = findClosingTagInsertionIndex(\n documentXml,\n paragraphBoundary.paragraphPropertiesStart,\n paragraphBoundary.paragraphPropertiesEnd,\n \"w:pPr\",\n );\n if (paragraphPropertiesInsertionIndex !== undefined) {\n return {\n start: paragraphPropertiesInsertionIndex,\n end: paragraphPropertiesInsertionIndex,\n replacement: `<w:rPr>${markerXml}</w:rPr>`,\n };\n }\n\n if (!/<w:p[\\s>]/u.test(paragraphXml)) {\n return undefined;\n }\n\n return {\n start: paragraphBoundary.paragraphStartTagEnd,\n end: paragraphBoundary.paragraphStartTagEnd,\n replacement: `<w:pPr><w:rPr>${markerXml}</w:rPr></w:pPr>`,\n };\n}\n\nfunction findParagraphBoundaryForRange(\n boundaries: readonly RevisionParagraphBoundary[],\n from: number,\n to: number,\n): RevisionParagraphBoundary | undefined {\n return boundaries.find(\n (boundary) => from >= boundary.start && to <= boundary.end,\n );\n}\n\nfunction findParagraphBoundaryForAnchor(\n boundaries: readonly RevisionParagraphBoundary[],\n revision: RevisionRecord,\n): RevisionParagraphBoundary | undefined {\n const anchor = revision.anchor.kind === \"range\" ? revision.anchor.range.from : undefined;\n if (anchor === undefined) {\n return undefined;\n }\n\n return boundaries.find(\n (boundary) =>\n boundary.end === anchor ||\n (anchor >= boundary.start && anchor <= boundary.end),\n );\n}\n\nfunction serializeRevisionAttributes(revision: RevisionRecord): string {\n const attributes = {\n \"w:id\": revision.metadata.ooxmlRevisionId ?? sanitizeRevisionId(revision.revisionId),\n \"w:author\": revision.authorId,\n \"w:date\": revision.createdAt,\n };\n\n return Object.entries(attributes)\n .filter(([, value]) => value && value.length > 0)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction findClosingTagInsertionIndex(\n documentXml: string,\n start: number | undefined,\n end: number | undefined,\n tagName: string,\n): number | undefined {\n if (start === undefined || end === undefined) {\n return undefined;\n }\n\n const closingTag = `</${tagName}>`;\n const closingIndex = documentXml.lastIndexOf(closingTag, end);\n if (closingIndex < start) {\n return undefined;\n }\n\n return closingIndex;\n}\n\nfunction sanitizeRevisionId(revisionId: string): string {\n const numericTail = /(\\d+)$/.exec(revisionId)?.[1];\n return numericTail ?? revisionId.replace(/[^A-Za-z0-9._-]/g, \"-\");\n}\n\nfunction convertRunsToDeletedContent(xml: string): string {\n return xml\n .replace(/<(\\/?)w:t\\b/g, \"<$1w:delText\")\n .replace(/<(\\/?)w:instrText\\b/g, \"<$1w:delInstrText\");\n}\n\nfunction applyReplacements(documentXml: string, replacements: readonly XmlReplacement[]): string {\n const sorted = replacements\n .slice()\n .sort((left, right) => right.start - left.start || right.end - left.end);\n let output = documentXml;\n\n for (const replacement of sorted) {\n output =\n output.slice(0, replacement.start) +\n replacement.replacement +\n output.slice(replacement.end);\n }\n\n return output;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n","import type { TransactionMapping } from \"../../core/selection/mapping.ts\";\nimport {\n isDetachedCommentAnchor,\n remapCommentAnchor,\n summarizeCommentAnchor,\n type CommentAnchor,\n} from \"./comment-anchors.ts\";\n\nexport interface CommentEntry {\n entryId: string;\n authorId: string;\n body: string;\n createdAt: string;\n metadata?: CommentEntryMetadata;\n}\n\nexport interface CommentEntryMetadata {\n ooxmlCommentId?: string;\n paraId?: string;\n parentParaId?: string;\n durableId?: string;\n initials?: string;\n}\n\nexport interface CommentResolution {\n resolvedAt: string;\n resolvedBy: string;\n}\n\nexport type CommentThreadStatus = \"open\" | \"resolved\" | \"detached\";\n\nexport interface CommentThread {\n commentId: string;\n anchor: CommentAnchor;\n status: CommentThreadStatus;\n entries: CommentEntry[];\n createdBy: string;\n createdAt: string;\n resolution?: CommentResolution;\n warningIds: string[];\n metadata?: CommentThreadMetadata;\n}\n\nexport interface CommentThreadMetadata {\n source?: \"runtime\" | \"import\";\n rootOoxmlCommentId?: string;\n rootParaId?: string;\n}\n\nexport interface CommentStore {\n version: \"comment-store/1\";\n threads: Record<string, CommentThread>;\n}\n\nexport interface CreateCommentThreadParams {\n commentId: string;\n anchor: CommentAnchor;\n createdBy: string;\n createdAt: string;\n body: string;\n entryId?: string;\n warningIds?: string[];\n}\n\nexport interface AppendCommentEntryParams {\n commentId: string;\n entry: CommentEntry;\n}\n\nexport interface ResolveCommentThreadParams {\n commentId: string;\n resolvedAt: string;\n resolvedBy: string;\n}\n\nexport interface CommentSidebarThread {\n commentId: string;\n status: CommentThreadStatus;\n excerpt: string;\n entryCount: number;\n createdAt: string;\n createdBy: string;\n warningCount: number;\n anchorLabel: string;\n isActive: boolean;\n resolvedAt?: string;\n resolvedBy?: string;\n}\n\nexport interface CommentSidebarProjection {\n totalCount: number;\n openCommentIds: string[];\n resolvedCommentIds: string[];\n detachedCommentIds: string[];\n threads: CommentSidebarThread[];\n}\n\nexport function createCommentStore(\n threads: Record<string, CommentThread> = {},\n): CommentStore {\n return {\n version: \"comment-store/1\",\n threads,\n };\n}\n\nexport function createCommentThread(\n params: CreateCommentThreadParams,\n): CommentThread {\n return {\n commentId: params.commentId,\n anchor: params.anchor,\n status: isDetachedCommentAnchor(params.anchor) ? \"detached\" : \"open\",\n entries: [\n {\n entryId: params.entryId ?? `${params.commentId}-entry-1`,\n authorId: params.createdBy,\n body: params.body,\n createdAt: params.createdAt,\n },\n ],\n createdBy: params.createdBy,\n createdAt: params.createdAt,\n warningIds: [...(params.warningIds ?? [])],\n };\n}\n\nexport function upsertCommentThread(\n store: CommentStore,\n thread: CommentThread,\n): CommentStore {\n return {\n ...store,\n threads: {\n ...store.threads,\n [thread.commentId]: normalizeThread(thread),\n },\n };\n}\n\nexport function appendCommentEntry(\n store: CommentStore,\n params: AppendCommentEntryParams,\n): CommentStore {\n const existing = store.threads[params.commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n entries: [...existing.entries, params.entry],\n });\n}\n\nexport function resolveCommentThread(\n store: CommentStore,\n params: ResolveCommentThreadParams,\n): CommentStore {\n const existing = store.threads[params.commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n status: existing.status === \"detached\" ? \"detached\" : \"resolved\",\n resolution: {\n resolvedAt: params.resolvedAt,\n resolvedBy: params.resolvedBy,\n },\n });\n}\n\nexport function reopenCommentThread(\n store: CommentStore,\n commentId: string,\n): CommentStore {\n const existing = store.threads[commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n status: isDetachedCommentAnchor(existing.anchor) ? \"detached\" : \"open\",\n resolution: undefined,\n });\n}\n\nexport function setCommentThreadWarnings(\n store: CommentStore,\n commentId: string,\n warningIds: string[],\n): CommentStore {\n const existing = store.threads[commentId];\n if (!existing) {\n return store;\n }\n\n return upsertCommentThread(store, {\n ...existing,\n warningIds: [...warningIds],\n });\n}\n\nexport function remapCommentStore(\n store: CommentStore,\n mapping: TransactionMapping,\n): CommentStore {\n return createCommentStore(\n Object.fromEntries(\n Object.entries(store.threads).map(([commentId, thread]) => {\n const anchor = remapCommentAnchor(thread.anchor, mapping);\n const nextStatus =\n anchor.kind === \"detached\"\n ? \"detached\"\n : thread.status === \"resolved\"\n ? \"resolved\"\n : \"open\";\n\n return [\n commentId,\n normalizeThread({\n ...thread,\n anchor,\n status: nextStatus,\n }),\n ];\n }),\n ),\n );\n}\n\nexport function createCommentSidebarProjection(\n store: CommentStore,\n activeCommentId?: string,\n): CommentSidebarProjection {\n const threads = Object.values(store.threads)\n .map((thread) => toSidebarThread(thread, activeCommentId))\n .sort(compareSidebarThreads);\n\n return {\n totalCount: threads.length,\n openCommentIds: threads\n .filter((thread) => thread.status === \"open\")\n .map((thread) => thread.commentId),\n resolvedCommentIds: threads\n .filter((thread) => thread.status === \"resolved\")\n .map((thread) => thread.commentId),\n detachedCommentIds: threads\n .filter((thread) => thread.status === \"detached\")\n .map((thread) => thread.commentId),\n threads,\n };\n}\n\nfunction toSidebarThread(\n thread: CommentThread,\n activeCommentId?: string,\n): CommentSidebarThread {\n const firstEntry = thread.entries[0];\n const anchorSummary = summarizeCommentAnchor(thread.anchor);\n\n return {\n commentId: thread.commentId,\n status: thread.status,\n excerpt: firstEntry ? summarizeBody(firstEntry.body) : \"Empty thread\",\n entryCount: thread.entries.length,\n createdAt: thread.createdAt,\n createdBy: thread.createdBy,\n warningCount: thread.warningIds.length,\n anchorLabel:\n anchorSummary.state === \"detached\"\n ? `Detached ${anchorSummary.range.from}-${anchorSummary.range.to}`\n : `Range ${anchorSummary.range.from}-${anchorSummary.range.to}`,\n isActive: activeCommentId === thread.commentId,\n resolvedAt: thread.resolution?.resolvedAt,\n resolvedBy: thread.resolution?.resolvedBy,\n };\n}\n\nfunction normalizeThread(thread: CommentThread): CommentThread {\n if (isDetachedCommentAnchor(thread.anchor)) {\n return {\n ...thread,\n status: \"detached\",\n };\n }\n\n if (thread.status === \"detached\") {\n return {\n ...thread,\n status: thread.resolution ? \"resolved\" : \"open\",\n };\n }\n\n return thread;\n}\n\nfunction compareSidebarThreads(\n left: CommentSidebarThread,\n right: CommentSidebarThread,\n): number {\n const statusDelta = priorityForStatus(left.status) - priorityForStatus(right.status);\n if (statusDelta !== 0) {\n return statusDelta;\n }\n\n return left.createdAt.localeCompare(right.createdAt);\n}\n\nfunction priorityForStatus(status: CommentThreadStatus): number {\n switch (status) {\n case \"open\":\n return 0;\n case \"detached\":\n return 1;\n case \"resolved\":\n return 2;\n }\n}\n\nfunction summarizeBody(body: string): string {\n const collapsed = body.replace(/\\s+/g, \" \").trim();\n if (!collapsed) {\n return \"Empty thread\";\n }\n\n return collapsed.length > 80 ? `${collapsed.slice(0, 77)}...` : collapsed;\n}\n","import {\n normalizeCommentThreadRecord,\n type CommentThreadRecord,\n} from \"../../core/state/editor-state.ts\";\nimport {\n createCommentStore,\n type CommentStore,\n type CommentThread,\n} from \"./comment-store.ts\";\n\nexport function createCommentStoreFromRuntimeComments(\n comments: Record<string, CommentThreadRecord>,\n): CommentStore {\n const threads = Object.fromEntries(\n Object.values(comments).map((comment) => [\n comment.commentId,\n toCommentThread(comment),\n ]),\n );\n\n return createCommentStore(threads);\n}\n\nfunction toCommentThread(comment: CommentThreadRecord): CommentThread {\n const normalized = normalizeCommentThreadRecord(comment);\n\n return {\n commentId: normalized.commentId,\n anchor: normalized.anchor,\n status:\n normalized.anchor.kind === \"detached\"\n ? \"detached\"\n : normalized.status === \"resolved\"\n ? \"resolved\"\n : \"open\",\n entries: normalized.entries ?? [],\n createdBy: normalized.createdBy ?? normalized.authorId ?? \"unknown\",\n createdAt: normalized.createdAt,\n resolution: normalized.resolution,\n warningIds: [...(normalized.warningIds ?? [])],\n metadata: normalized.metadata,\n };\n}\n","import { createRangeAnchor } from \"../core/selection/mapping.ts\";\nimport type {\n CanonicalDocumentEnvelope,\n CompatibilityFeatureEntry,\n CompatibilityReport,\n EditorError,\n EditorWarning,\n} from \"../core/state/editor-state.ts\";\nimport type {\n BlockNode,\n DocumentRootNode,\n InlineNode,\n ParagraphNode,\n} from \"../model/canonical-document.ts\";\nimport {\n describeOpaqueFragment,\n listOpaqueFragments,\n listPreservedPackageParts,\n} from \"../preservation/store.ts\";\n\nexport interface BuildCompatibilityReportInput {\n document: CanonicalDocumentEnvelope;\n warnings?: readonly EditorWarning[];\n fatalError?: EditorError;\n generatedAt: string;\n}\n\nexport function buildCompatibilityReport(\n input: BuildCompatibilityReportInput,\n): CompatibilityReport {\n const content = normalizeDocumentRoot(input.document.content);\n const contentFeatures = collectContentFeatures(content);\n if (hasSupportedRuntimeComments(input.document.review.comments)) {\n contentFeatures.push(\n supportedEntry(\n \"comments-single-paragraph\",\n \"Single-paragraph review comments stay mappable through runtime selections.\",\n ),\n );\n }\n const featureEntries: CompatibilityFeatureEntry[] = [\n ...contentFeatures,\n ...collectPreservationFeatures(input.document),\n ];\n const warnings = dedupeWarnings([\n ...(input.warnings ?? []),\n ...collectDiagnosticWarnings(input.document),\n ]);\n const errors = dedupeErrors([\n ...collectDiagnosticErrors(input.document),\n ...(input.fatalError ? [input.fatalError] : []),\n ]);\n\n return {\n reportVersion: \"compatibility-report/1\",\n generatedAt: input.generatedAt,\n blockExport:\n featureEntries.some((entry) => entry.featureClass === \"unsupported-fatal\") ||\n errors.some((error) => error.isFatal),\n featureEntries,\n warnings,\n errors,\n };\n}\n\nfunction hasSupportedRuntimeComments(\n comments: CanonicalDocumentEnvelope[\"review\"][\"comments\"],\n): boolean {\n return Object.values(comments).some((comment) => comment.anchor.kind !== \"detached\");\n}\n\nfunction normalizeDocumentRoot(content: unknown): DocumentRootNode {\n if (content && typeof content === \"object\" && (content as { type?: string }).type === \"doc\") {\n return content as DocumentRootNode;\n }\n\n if (Array.isArray(content)) {\n return {\n type: \"doc\",\n children: content.filter(\n (value): value is DocumentRootNode[\"children\"][number] =>\n Boolean(value) &&\n typeof value === \"object\" &&\n ((value as { type?: string }).type === \"paragraph\" ||\n (value as { type?: string }).type === \"opaque_block\"),\n ),\n };\n }\n\n return {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n };\n}\n\nfunction collectContentFeatures(\n content: DocumentRootNode,\n): CompatibilityFeatureEntry[] {\n const flags = {\n paragraphs: false,\n runs: false,\n whitespace: false,\n headings: false,\n lists: false,\n hyperlinks: false,\n images: false,\n tables: false,\n sections: false,\n contentControls: false,\n };\n\n for (let index = 0; index < content.children.length; index += 1) {\n measureBlock(content.children[index], flags);\n }\n\n const entries: CompatibilityFeatureEntry[] = [];\n if (flags.paragraphs) {\n entries.push(supportedEntry(\"paragraphs\", \"Paragraph structure is editable and round-trippable.\"));\n }\n if (flags.runs) {\n entries.push(supportedEntry(\"runs\", \"Runs and inline text are editable through runtime commands.\"));\n }\n if (flags.whitespace) {\n entries.push(supportedEntry(\"whitespace\", \"Whitespace-sensitive text units stay explicit in the runtime model.\"));\n }\n if (flags.headings) {\n entries.push(supportedEntry(\"headings\", \"Heading styles remain attached to paragraph structure.\"));\n }\n if (flags.lists) {\n entries.push(supportedEntry(\"lists\", \"Numbering metadata stays attached to paragraph blocks.\"));\n }\n if (flags.hyperlinks) {\n entries.push(supportedEntry(\"hyperlinks\", \"Hyperlink relationships are preserved and re-serialized.\"));\n }\n if (flags.images) {\n entries.push(supportedEntry(\"inline-images\", \"Inline image placements stay attached to preserved media parts.\"));\n }\n if (flags.tables) {\n entries.push(\n supportedEntry(\n \"tables\",\n \"Structured tables keep cell topology and common visual properties through runtime editing and export.\",\n ),\n );\n }\n if (flags.sections) {\n entries.push(\n supportedEntry(\n \"sections\",\n \"Section boundaries and page-layout properties remain structured and export-safe.\",\n ),\n );\n }\n if (flags.contentControls) {\n entries.push(\n supportedEntry(\n \"content-controls\",\n \"Common content controls render through structured SDT state and round-trip without flattening to opaque placeholders.\",\n ),\n );\n }\n return entries;\n}\n\nfunction measureBlock(\n block: BlockNode,\n flags: {\n paragraphs: boolean;\n runs: boolean;\n whitespace: boolean;\n headings: boolean;\n lists: boolean;\n hyperlinks: boolean;\n images: boolean;\n tables: boolean;\n sections: boolean;\n contentControls: boolean;\n },\n): number {\n switch (block.type) {\n case \"paragraph\":\n flags.paragraphs = true;\n if (block.styleId?.toLowerCase().startsWith(\"heading\")) {\n flags.headings = true;\n }\n if (block.numbering) {\n flags.lists = true;\n }\n return measureParagraph(block, flags);\n case \"table\":\n flags.tables = true;\n return block.rows.reduce(\n (size, row) =>\n size +\n row.cells.reduce(\n (cellSize, cell) =>\n cellSize + cell.children.reduce((childSize, child) => childSize + measureBlock(child, flags), 0),\n 0,\n ),\n 0,\n );\n case \"sdt\":\n flags.contentControls = true;\n return block.children.reduce((size, child) => size + measureBlock(child, flags), 0);\n case \"custom_xml\":\n return block.children.reduce((size, child) => size + measureBlock(child, flags), 0);\n case \"section_break\":\n flags.sections = true;\n return 1;\n default:\n return 0;\n }\n}\n\nfunction measureParagraph(\n paragraph: ParagraphNode,\n flags: {\n paragraphs: boolean;\n runs: boolean;\n whitespace: boolean;\n hyperlinks: boolean;\n images: boolean;\n tables: boolean;\n sections: boolean;\n contentControls: boolean;\n },\n): number {\n let size = 0;\n const children = Array.isArray(paragraph.children) ? paragraph.children : [];\n\n for (const child of children) {\n size += measureInlineNode(child, flags);\n }\n\n return size;\n}\n\nfunction measureInlineNode(\n node: InlineNode,\n flags: {\n paragraphs: boolean;\n runs: boolean;\n whitespace: boolean;\n hyperlinks: boolean;\n images: boolean;\n tables: boolean;\n sections: boolean;\n contentControls: boolean;\n },\n): number {\n switch (node.type) {\n case \"text\":\n flags.runs = flags.runs || node.text.length > 0;\n flags.whitespace =\n flags.whitespace ||\n /^\\s/u.test(node.text) ||\n /\\s$/u.test(node.text) ||\n node.text.includes(\" \");\n return Array.from(node.text).length;\n case \"tab\":\n case \"hard_break\":\n flags.runs = true;\n flags.whitespace = true;\n return 1;\n case \"hyperlink\":\n flags.runs = true;\n flags.hyperlinks = true;\n return node.children.reduce((size, child) => size + measureInlineNode(child, flags), 0);\n case \"image\":\n flags.images = true;\n flags.runs = true;\n return 1;\n case \"opaque_inline\":\n flags.runs = true;\n return 1;\n case \"column_break\":\n case \"symbol\":\n case \"field\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n case \"footnote_ref\":\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n default:\n flags.runs = true;\n return 1;\n }\n}\n\nfunction collectPreservationFeatures(\n document: CanonicalDocumentEnvelope,\n): CompatibilityFeatureEntry[] {\n const entries: CompatibilityFeatureEntry[] = [];\n const structuredSubPartPaths = collectStructuredSubPartPaths(document);\n\n entries.push(...collectSubPartFeatures(document));\n\n for (const fragment of listOpaqueFragments(document.preservation as never)) {\n const descriptor = describeOpaqueFragment(fragment);\n entries.push({\n featureEntryId: `feature:${fragment.fragmentId}`,\n featureKey: descriptor.featureKey,\n featureClass: \"preserve-only\",\n message: descriptor.label,\n affectedAnchor: createRangeAnchor(\n fragment.lastKnownRange.from,\n fragment.lastKnownRange.to,\n ),\n details: {\n fragmentId: fragment.fragmentId,\n warningId: fragment.warningId,\n detail: descriptor.detail,\n },\n });\n }\n\n for (const packagePart of listPreservedPackageParts(document.preservation as never)) {\n if (structuredSubPartPaths.has(packagePart.packagePartName)) {\n continue;\n }\n\n entries.push({\n featureEntryId: `feature:package:${packagePart.packagePartName}`,\n featureKey: \"unknown-package-parts\",\n featureClass: \"preserve-only\",\n message: `Preserved package part ${packagePart.packagePartName}.`,\n details: {\n packagePartName: packagePart.packagePartName,\n contentType: packagePart.contentType,\n relationshipIds: packagePart.relationshipIds,\n },\n });\n }\n\n return entries;\n}\n\nfunction collectStructuredSubPartPaths(\n document: CanonicalDocumentEnvelope,\n): ReadonlySet<string> {\n const subParts = document.subParts;\n if (!subParts) {\n return new Set<string>();\n }\n\n const paths = new Set<string>();\n\n for (const header of subParts.headers ?? []) {\n paths.add(header.partPath);\n }\n\n for (const footer of subParts.footers ?? []) {\n paths.add(footer.partPath);\n }\n\n if (subParts.footnoteCollection) {\n paths.add(\"/word/footnotes.xml\");\n paths.add(\"/word/endnotes.xml\");\n }\n\n if (subParts.theme) {\n paths.add(\"/word/theme/theme1.xml\");\n }\n\n return paths;\n}\n\nfunction collectSubPartFeatures(\n document: CanonicalDocumentEnvelope,\n): CompatibilityFeatureEntry[] {\n const subParts = document.subParts;\n if (!subParts) {\n return [];\n }\n\n const entries: CompatibilityFeatureEntry[] = collectLossySubPartFeatures(subParts);\n const hasHeaderFooterContent = (subParts.headers?.length ?? 0) > 0 || (subParts.footers?.length ?? 0) > 0;\n const noteCount =\n Object.keys(subParts.footnoteCollection?.footnotes ?? {}).length +\n Object.keys(subParts.footnoteCollection?.endnotes ?? {}).length;\n\n if (hasHeaderFooterContent && !entries.some((entry) => entry.featureKey === \"headers-footers-lossy\")) {\n entries.push({\n featureEntryId: \"feature:subparts:headers-footers\",\n featureKey: \"headers-footers\",\n featureClass: \"supported-roundtrip\",\n message: \"Headers and footers resolve as structured secondary stories with export-safe ownership.\",\n details: {\n headerCount: subParts.headers?.length ?? 0,\n footerCount: subParts.footers?.length ?? 0,\n },\n });\n }\n\n if (noteCount > 0 && !entries.some((entry) => entry.featureKey === \"notes-lossy\")) {\n entries.push({\n featureEntryId: \"feature:subparts:notes\",\n featureKey: \"notes\",\n featureClass: \"supported-roundtrip\",\n message: \"Footnotes and endnotes resolve as structured secondary stories with export-safe ownership.\",\n details: {\n footnoteCount: Object.keys(subParts.footnoteCollection?.footnotes ?? {}).length,\n endnoteCount: Object.keys(subParts.footnoteCollection?.endnotes ?? {}).length,\n },\n });\n }\n\n if (subParts.theme) {\n entries.push({\n featureEntryId: \"feature:subparts:theme\",\n featureKey: \"unknown-package-parts\",\n featureClass: \"preserve-only\",\n message: \"Theme metadata is preserved through structured sub-part ownership.\",\n details: {\n surface: \"theme-subpart\",\n themeName: subParts.theme.name,\n },\n });\n }\n\n return entries;\n}\n\nfunction collectLossySubPartFeatures(\n subParts: NonNullable<CanonicalDocumentEnvelope[\"subParts\"]>,\n): CompatibilityFeatureEntry[] {\n const entries: CompatibilityFeatureEntry[] = [];\n\n const headerFooterLossy = [\n ...(subParts.headers ?? []).flatMap((header) =>\n collectLossyBlocks(header.blocks, `header:${header.partPath}`),\n ),\n ...(subParts.footers ?? []).flatMap((footer) =>\n collectLossyBlocks(footer.blocks, `footer:${footer.partPath}`),\n ),\n ];\n if (headerFooterLossy.length > 0) {\n entries.push({\n featureEntryId: \"feature:subparts:headers-footers-lossy\",\n featureKey: \"headers-footers-lossy\",\n featureClass: \"unsupported-fatal\",\n message: \"Headers or footers contain content the current sub-part serializer cannot re-emit safely.\",\n details: {\n issues: headerFooterLossy,\n },\n });\n }\n\n const noteLossy = [\n ...Object.values(subParts.footnoteCollection?.footnotes ?? {}).flatMap((note) =>\n collectLossyBlocks(note.blocks, `footnote:${note.noteId}`),\n ),\n ...Object.values(subParts.footnoteCollection?.endnotes ?? {}).flatMap((note) =>\n collectLossyBlocks(note.blocks, `endnote:${note.noteId}`),\n ),\n ];\n if (noteLossy.length > 0) {\n entries.push({\n featureEntryId: \"feature:subparts:notes-lossy\",\n featureKey: \"notes-lossy\",\n featureClass: \"unsupported-fatal\",\n message: \"Footnotes or endnotes contain content the current sub-part serializer cannot re-emit safely.\",\n details: {\n issues: noteLossy,\n },\n });\n }\n\n return entries;\n}\n\nfunction collectLossyBlocks(\n blocks: readonly BlockNode[],\n surface: string,\n): string[] {\n const issues: string[] = [];\n\n for (const block of blocks) {\n if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n issues.push(...collectLossyBlocks(cell.children, `${surface}:table-cell`));\n }\n }\n continue;\n }\n\n if (block.type !== \"paragraph\") {\n issues.push(`${surface}:${block.type}`);\n continue;\n }\n\n if (\n block.numbering !== undefined ||\n block.keepNext !== undefined ||\n block.keepLines !== undefined ||\n block.outlineLevel !== undefined ||\n block.pageBreakBefore !== undefined ||\n block.widowControl !== undefined ||\n block.borders !== undefined ||\n block.shading !== undefined ||\n block.bidi !== undefined ||\n block.suppressLineNumbers !== undefined ||\n block.cnfStyle !== undefined\n ) {\n issues.push(`${surface}:paragraph-properties`);\n }\n\n for (const child of block.children) {\n issues.push(...collectLossyInlineContent(child, surface));\n }\n }\n\n return [...new Set(issues)];\n}\n\nfunction collectLossyInlineContent(\n node: InlineNode,\n surface: string,\n): string[] {\n switch (node.type) {\n case \"text\": {\n const allowSecondaryStoryColorMarks =\n surface.startsWith(\"header:\") || surface.startsWith(\"footer:\");\n const unsupportedMarks = (node.marks ?? [])\n .filter(\n (mark) =>\n mark.type !== \"bold\" &&\n mark.type !== \"italic\" &&\n mark.type !== \"underline\" &&\n mark.type !== \"strikethrough\" &&\n mark.type !== \"doubleStrikethrough\" &&\n mark.type !== \"fontFamily\" &&\n mark.type !== \"fontSize\" &&\n mark.type !== \"textColor\" &&\n (!allowSecondaryStoryColorMarks || mark.type !== \"backgroundColor\") &&\n (!allowSecondaryStoryColorMarks || mark.type !== \"highlight\") &&\n mark.type !== \"smallCaps\" &&\n mark.type !== \"allCaps\",\n )\n .map((mark) => `${surface}:mark:${mark.type}`);\n return unsupportedMarks;\n }\n case \"tab\":\n case \"hard_break\":\n case \"footnote_ref\":\n case \"field\":\n case \"bookmark_start\":\n case \"bookmark_end\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n case \"chart_preview\":\n case \"smartart_preview\":\n return [];\n default:\n return [`${surface}:${node.type}`];\n }\n}\n\nfunction collectDiagnosticWarnings(\n document: CanonicalDocumentEnvelope,\n): EditorWarning[] {\n const diagnostics = Array.isArray(document.diagnostics?.warnings)\n ? document.diagnostics.warnings\n : [];\n\n return diagnostics.map((warning) => ({\n warningId: warning.warningId,\n code:\n warning.source === \"validation\" || warning.source === \"export\"\n ? \"export_roundtrip_risk\"\n : warning.source === \"preservation\"\n ? \"unsupported_ooxml_preserved\"\n : \"import_normalized\",\n severity: \"warning\",\n message: warning.message,\n source: warning.source,\n }));\n}\n\nfunction collectDiagnosticErrors(\n document: CanonicalDocumentEnvelope,\n): EditorError[] {\n const diagnostics = Array.isArray(document.diagnostics?.errors)\n ? document.diagnostics.errors\n : [];\n\n return diagnostics.map((error) => ({\n errorId: error.diagnosticId,\n code:\n error.code === \"load_failed\"\n ? \"import_failed\"\n : error.code,\n message: error.message,\n isFatal: error.isFatal,\n source: error.source,\n }));\n}\n\nfunction supportedEntry(\n featureKey: CompatibilityFeatureEntry[\"featureKey\"],\n message: string,\n): CompatibilityFeatureEntry {\n return {\n featureEntryId: `feature:${featureKey}`,\n featureKey,\n featureClass: \"supported-roundtrip\",\n message,\n };\n}\n\nfunction dedupeWarnings(warnings: EditorWarning[]): EditorWarning[] {\n const byId = new Map<string, EditorWarning>();\n\n for (const warning of warnings) {\n byId.set(warning.warningId, warning);\n }\n\n return [...byId.values()];\n}\n\nfunction dedupeErrors(errors: EditorError[]): EditorError[] {\n const byId = new Map<string, EditorError>();\n\n for (const error of errors) {\n byId.set(error.errorId, error);\n }\n\n return [...byId.values()];\n}\n","export const COMPATIBILITY_FEATURE_CLASSES = [\n \"supported-roundtrip\",\n \"preserve-only\",\n \"unsupported-fatal\",\n] as const;\n\nexport type CompatibilityFeatureClass =\n (typeof COMPATIBILITY_FEATURE_CLASSES)[number];\n\nexport const EDITOR_WARNING_CODES = [\n \"unsupported_ooxml_preserved\",\n \"unsupported_ooxml_locked\",\n \"import_normalized\",\n \"export_roundtrip_risk\",\n \"comment_anchor_detached\",\n \"revision_anchor_detached\",\n \"large_document_degraded\",\n \"font_substitution\",\n \"image_missing\",\n] as const;\n\nexport type EditorWarningCode = (typeof EDITOR_WARNING_CODES)[number];\n\nexport const EDITOR_WARNING_SOURCES = [\n \"import\",\n \"runtime\",\n \"review\",\n \"preservation\",\n \"validation\",\n \"export\",\n] as const;\n\nexport type EditorWarningSource = (typeof EDITOR_WARNING_SOURCES)[number];\n\nexport const EDITOR_ERROR_CODES = [\n \"import_failed\",\n \"export_failed\",\n \"package_corrupt\",\n \"validation_failed\",\n \"datastore_failed\",\n \"internal_invariant\",\n] as const;\n\nexport type EditorErrorCode = (typeof EDITOR_ERROR_CODES)[number];\n\nexport const EDITOR_ERROR_SOURCES = [\n \"import\",\n \"runtime\",\n \"validation\",\n \"datastore\",\n \"host\",\n \"export\",\n] as const;\n\nexport type EditorErrorSource = (typeof EDITOR_ERROR_SOURCES)[number];\n\nexport type EditorAnchorProjection =\n | {\n kind: \"range\";\n from: number;\n to: number;\n assoc: {\n start: -1 | 1;\n end: -1 | 1;\n };\n }\n | {\n kind: \"node\";\n at: number;\n assoc: -1 | 1;\n }\n | {\n kind: \"detached\";\n lastKnownRange: {\n from: number;\n to: number;\n };\n reason: \"deleted\" | \"invalidatedByStructureChange\" | \"importAmbiguity\";\n };\n\nexport interface EditorWarning {\n warningId: string;\n code: EditorWarningCode;\n severity: \"info\" | \"warning\";\n message: string;\n source: EditorWarningSource;\n affectedAnchor?: EditorAnchorProjection;\n featureEntryId?: string;\n details?: Record<string, unknown>;\n}\n\nexport interface EditorError {\n errorId: string;\n code: EditorErrorCode;\n message: string;\n isFatal: boolean;\n source: EditorErrorSource;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityFeatureEntry<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> {\n featureEntryId: string;\n featureKey: FeatureKey;\n featureClass: FeatureClass;\n message: string;\n affectedAnchor?: EditorAnchorProjection;\n details?: Record<string, unknown>;\n}\n\nexport interface CompatibilityDiagnostics<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n> {\n featureEntries: readonly CompatibilityFeatureEntry<FeatureKey, FeatureClass>[];\n warnings: readonly EditorWarning[];\n errors: readonly EditorError[];\n}\n\nconst EXPORT_BLOCKING_ERROR_CODES = new Set<EditorErrorCode>([\n \"import_failed\",\n \"export_failed\",\n \"package_corrupt\",\n \"validation_failed\",\n]);\n\nexport function isCompatibilityFeatureClass(\n value: string,\n): value is CompatibilityFeatureClass {\n return COMPATIBILITY_FEATURE_CLASSES.includes(\n value as CompatibilityFeatureClass,\n );\n}\n\nexport function isEditorWarningCode(value: string): value is EditorWarningCode {\n return EDITOR_WARNING_CODES.includes(value as EditorWarningCode);\n}\n\nexport function isEditorErrorCode(value: string): value is EditorErrorCode {\n return EDITOR_ERROR_CODES.includes(value as EditorErrorCode);\n}\n\nexport function createDiagnostics<\n FeatureKey extends string = string,\n FeatureClass extends CompatibilityFeatureClass = CompatibilityFeatureClass,\n>(\n input: Partial<CompatibilityDiagnostics<FeatureKey, FeatureClass>> = {},\n): CompatibilityDiagnostics<FeatureKey, FeatureClass> {\n return {\n featureEntries: freezeArray(input.featureEntries ?? []),\n warnings: freezeArray(input.warnings ?? []),\n errors: freezeArray(input.errors ?? []),\n };\n}\n\nexport function collectWarningIds(warnings: readonly EditorWarning[]): string[] {\n return warnings.map((warning) => warning.warningId);\n}\n\nexport function summarizeFeatureClasses<\n FeatureKey extends string,\n FeatureClass extends CompatibilityFeatureClass,\n>(\n featureEntries: readonly CompatibilityFeatureEntry<FeatureKey, FeatureClass>[],\n): Record<CompatibilityFeatureClass, number> {\n return featureEntries.reduce<Record<CompatibilityFeatureClass, number>>(\n (counts, entry) => {\n counts[entry.featureClass] += 1;\n return counts;\n },\n {\n \"supported-roundtrip\": 0,\n \"preserve-only\": 0,\n \"unsupported-fatal\": 0,\n },\n );\n}\n\nexport function diagnosticsBlockExport<\n FeatureKey extends string,\n FeatureClass extends CompatibilityFeatureClass,\n>(\n diagnostics: CompatibilityDiagnostics<FeatureKey, FeatureClass>,\n explicitBlockExport = false,\n): boolean {\n if (explicitBlockExport) {\n return true;\n }\n\n return (\n diagnostics.featureEntries.some(\n (entry) => entry.featureClass === \"unsupported-fatal\",\n ) ||\n diagnostics.errors.some(\n (error) => error.isFatal || EXPORT_BLOCKING_ERROR_CODES.has(error.code),\n )\n );\n}\n\nfunction freezeArray<Value>(items: readonly Value[]): readonly Value[] {\n return Object.freeze([...items]);\n}\n","import type {\n CompatibilityFeatureEntry,\n EditorError,\n} from \"../api/public-types.ts\";\nimport {\n createCorruptPackageError,\n createCorruptPackageDiagnosticsToken,\n type CorruptPackageIssue,\n} from \"../io/opc/corrupt-package.ts\";\nimport {\n createDiagnostics,\n diagnosticsBlockExport,\n type CompatibilityDiagnostics,\n} from \"./diagnostics.ts\";\n\nexport const IMPORT_FAILURE_STAGES = [\"package\", \"validation\"] as const;\n\nexport type ImportFailureStage = (typeof IMPORT_FAILURE_STAGES)[number];\n\nexport interface ImportDiagnosticsResult {\n mode: \"read-only-diagnostics\";\n readOnly: true;\n blockExport: true;\n fatalError: EditorError;\n diagnostics: CompatibilityDiagnostics;\n featureEntry: CompatibilityFeatureEntry;\n}\n\nexport function createPackageImportDiagnostics(input: {\n issue: CorruptPackageIssue;\n}): ImportDiagnosticsResult {\n const fatalError = createCorruptPackageError(input.issue);\n const featureEntry = {\n featureEntryId: `feature:${fatalError.errorId}`,\n featureKey: \"malformed-package\",\n featureClass: \"unsupported-fatal\",\n message: input.issue.message,\n details: {\n stage: \"package\",\n reason: input.issue.reason,\n diagnosticsToken: createCorruptPackageDiagnosticsToken(input.issue),\n },\n } satisfies CompatibilityFeatureEntry;\n\n const diagnostics = createDiagnostics({\n featureEntries: [featureEntry],\n warnings: [],\n errors: [fatalError],\n });\n\n return createReadOnlyDiagnosticsResult(featureEntry, diagnostics, fatalError);\n}\n\nexport function createValidationImportDiagnostics(input: {\n message: string;\n source?: EditorError[\"source\"];\n details?: Record<string, unknown>;\n}): ImportDiagnosticsResult {\n const diagnosticsToken = createImportDiagnosticsToken(\"validation\", input.message);\n const fatalError: EditorError = {\n errorId: `error:validation_failed:${diagnosticsToken}`,\n code: \"validation_failed\",\n message: input.message,\n isFatal: true,\n source: input.source ?? \"validation\",\n details: {\n stage: \"validation\",\n diagnosticsToken,\n ...(input.details ?? {}),\n },\n };\n const featureEntry = {\n featureEntryId: `feature:${fatalError.errorId}`,\n featureKey: \"openxml-validation\",\n featureClass: \"unsupported-fatal\",\n message: input.message,\n details: {\n stage: \"validation\",\n diagnosticsToken,\n },\n } satisfies CompatibilityFeatureEntry;\n const diagnostics = createDiagnostics({\n featureEntries: [featureEntry],\n warnings: [],\n errors: [fatalError],\n });\n\n return createReadOnlyDiagnosticsResult(featureEntry, diagnostics, fatalError);\n}\n\nexport function getImportFailureStage(error: Pick<EditorError, \"code\" | \"details\">): ImportFailureStage {\n if (error.code === \"package_corrupt\") {\n return \"package\";\n }\n\n const stage = error.details?.stage;\n return stage === \"package\" ? \"package\" : \"validation\";\n}\n\nfunction createReadOnlyDiagnosticsResult(\n featureEntry: CompatibilityFeatureEntry,\n diagnostics: CompatibilityDiagnostics,\n fatalError: EditorError,\n): ImportDiagnosticsResult {\n if (!diagnosticsBlockExport(diagnostics, true)) {\n throw new Error(\"Import diagnostics must conservatively block export.\");\n }\n\n return {\n mode: \"read-only-diagnostics\",\n readOnly: true,\n blockExport: true,\n fatalError,\n diagnostics,\n featureEntry,\n };\n}\n\nfunction createImportDiagnosticsToken(stage: ImportFailureStage, message: string): string {\n let hash = 2166136261;\n const text = `${stage}:${message}`;\n for (let index = 0; index < text.length; index += 1) {\n hash ^= text.charCodeAt(index);\n hash = Math.imul(hash, 16777619) >>> 0;\n }\n\n return `${stage}-${hash.toString(16).padStart(8, \"0\")}`;\n}\n","import type {\n CompatibilityReport,\n EditorWarning,\n ExportDocxOptions,\n ExportResult,\n PersistedEditorSnapshot,\n RuntimeRenderSnapshot,\n} from \"../api/public-types.ts\";\nimport { createCanonicalDocumentId } from \"../core/state/editor-state.ts\";\nimport type { ImportDiagnosticsResult } from \"../validation/import-diagnostics.ts\";\n\nexport interface ReadOnlyDiagnosticsRuntime {\n getRenderSnapshot(): RuntimeRenderSnapshot;\n getPersistedSnapshot(): PersistedEditorSnapshot;\n getCompatibilityReport(): CompatibilityReport;\n getWarnings(): EditorWarning[];\n dispatch(command: { type: string }): never;\n undo(): never;\n redo(): never;\n exportDocx(options?: ExportDocxOptions): Promise<ExportResult>;\n}\n\nexport function createReadOnlyDiagnosticsRuntime(input: {\n documentId: string;\n sourceLabel?: string;\n editorBuild: string;\n generatedAt: string;\n diagnostics: ImportDiagnosticsResult;\n}): ReadOnlyDiagnosticsRuntime {\n const persistedSnapshot = createDiagnosticsSnapshot(input);\n const renderSnapshot = createDiagnosticsRenderSnapshot(input, persistedSnapshot);\n\n return {\n getRenderSnapshot() {\n return renderSnapshot;\n },\n getPersistedSnapshot() {\n return persistedSnapshot;\n },\n getCompatibilityReport() {\n return persistedSnapshot.compatibility;\n },\n getWarnings() {\n return persistedSnapshot.warningLog;\n },\n dispatch(command) {\n throw createReadOnlyDiagnosticsModeError(command.type);\n },\n undo() {\n throw createReadOnlyDiagnosticsModeError(\"history.undo\");\n },\n redo() {\n throw createReadOnlyDiagnosticsModeError(\"history.redo\");\n },\n async exportDocx(options) {\n void options;\n throw new Error(\n \"DOCX export is blocked in read-only diagnostics mode because the imported package is not safe to rewrite.\",\n );\n },\n };\n}\n\nfunction createDiagnosticsSnapshot(input: {\n documentId: string;\n editorBuild: string;\n generatedAt: string;\n diagnostics: ImportDiagnosticsResult;\n}): PersistedEditorSnapshot {\n const docId = createCanonicalDocumentId(input.documentId);\n const diagnosticId = `diagnostic:${sanitizeDiagnosticsToken(input.documentId)}`;\n\n return {\n snapshotVersion: \"persisted-editor-snapshot/2\",\n schemaVersion: \"cds/1.0.0\",\n documentId: input.documentId,\n docId,\n createdAt: input.generatedAt,\n updatedAt: input.generatedAt,\n savedAt: input.generatedAt,\n editorBuild: input.editorBuild,\n canonicalDocument: {\n schemaVersion: \"cds/1.0.0\",\n docId,\n createdAt: input.generatedAt,\n updatedAt: input.generatedAt,\n metadata: {\n customProperties: {},\n importMode: input.diagnostics.mode,\n },\n styles: {\n paragraphs: {},\n characters: {},\n tables: {},\n },\n numbering: {\n abstractDefinitions: {},\n instances: {},\n },\n media: {\n items: {},\n },\n content: {\n type: \"doc\",\n children: [{ type: \"paragraph\", children: [] }],\n },\n review: {\n comments: {},\n revisions: {},\n },\n preservation: {\n opaqueFragments: {},\n packageParts: {},\n },\n diagnostics: {\n warnings: [],\n errors: [\n {\n diagnosticId,\n code: input.diagnostics.fatalError.code,\n message: input.diagnostics.fatalError.message,\n isFatal: input.diagnostics.fatalError.isFatal,\n source: input.diagnostics.fatalError.source,\n details: input.diagnostics.fatalError.details,\n },\n ],\n },\n },\n compatibility: {\n reportVersion: \"compatibility-report/1\",\n generatedAt: input.generatedAt,\n blockExport: true,\n featureEntries: [...input.diagnostics.diagnostics.featureEntries],\n warnings: [...input.diagnostics.diagnostics.warnings],\n errors: [...input.diagnostics.diagnostics.errors],\n },\n warningLog: [],\n };\n}\n\nfunction createDiagnosticsRenderSnapshot(\n input: {\n documentId: string;\n sourceLabel?: string;\n diagnostics: ImportDiagnosticsResult;\n },\n persistedSnapshot: PersistedEditorSnapshot,\n): RuntimeRenderSnapshot {\n return {\n documentId: input.documentId,\n sessionId: `${input.documentId}-diagnostics`,\n sourceLabel: input.sourceLabel,\n revisionToken: `${input.documentId}:diagnostics`,\n isReady: true,\n isDirty: false,\n readOnly: true,\n selection: collapsedSelection(),\n activeStory: { kind: \"main\" },\n documentStats: {\n storyLength: 0,\n commentCount: 0,\n revisionCount: 0,\n opaqueFragmentCount: 0,\n },\n comments: {\n openCommentIds: [],\n resolvedCommentIds: [],\n detachedCommentIds: [],\n totalCount: 0,\n threads: [],\n },\n trackedChanges: {\n pendingChangeIds: [],\n acceptedChangeIds: [],\n rejectedChangeIds: [],\n detachedChangeIds: [],\n actionableChangeIds: [],\n preserveOnlyChangeIds: [],\n totalCount: 0,\n revisions: [],\n },\n compatibility: {\n blockExport: true,\n blockExportReasons: [persistedSnapshot.compatibility.errors[0]?.message ?? input.diagnostics.featureEntry.message],\n warningCount: persistedSnapshot.compatibility.warnings.length,\n errorCount: persistedSnapshot.compatibility.errors.length,\n featureEntries: [...persistedSnapshot.compatibility.featureEntries],\n },\n warnings: [],\n fatalError: input.diagnostics.fatalError,\n commandState: {\n canUndo: false,\n canRedo: false,\n readOnly: true,\n },\n documentMode: \"viewing\",\n protectionSnapshot: {\n hasDocumentProtection: false,\n enforcementActive: false,\n ranges: [],\n enforcedRangeCount: 0,\n preservedRangeCount: 0,\n },\n };\n}\n\nfunction collapsedSelection(): RuntimeRenderSnapshot[\"selection\"] {\n return {\n anchor: 0,\n head: 0,\n isCollapsed: true,\n activeRange: {\n kind: \"range\",\n from: 0,\n to: 0,\n assoc: {\n start: -1,\n end: 1,\n },\n },\n };\n}\n\nfunction createReadOnlyDiagnosticsModeError(commandType: string): Error {\n const error = new Error(\n `Command ${commandType} is blocked in read-only diagnostics mode.`,\n );\n Object.assign(error, {\n code: \"import_failed\",\n details: {\n mode: \"read-only-diagnostics\",\n commandType,\n },\n });\n return error;\n}\n\nfunction sanitizeDiagnosticsToken(documentId: string): string {\n const collapsed = documentId.replace(/[^A-Za-z0-9._-]/g, \"-\");\n return collapsed.length > 0 ? `read-only-${collapsed}` : \"read-only-diagnostics\";\n}\n","import type {\n BlockNode,\n FootnoteRefNode,\n HeaderFooterVariant,\n InlineNode,\n ParagraphIndentation,\n ParagraphNode,\n ParagraphSpacing,\n TabStop,\n TableCellNode,\n TableNode,\n TableRowNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\nimport { resolveHighlightColor } from \"./highlight-colors.ts\";\nimport { classifyFieldInstruction } from \"./parse-fields.ts\";\nimport { parseShapeXml, parseVmlXml } from \"./parse-shapes.ts\";\n\n// ---- Public types ----\n\nexport interface ParsedHeaderFooterReference {\n variant: HeaderFooterVariant;\n relationshipId: string;\n kind: \"header\" | \"footer\";\n sectionIndex?: number;\n}\n\nexport interface ParsedHeaderFooterDocument {\n blocks: BlockNode[];\n}\n\n// ---- XML node types (inline, no external dep) ----\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nlet currentSourceXml = \"\";\n\n// ---- Public API ----\n\n/**\n * Scan a document body XML for w:headerReference / w:footerReference elements\n * inside w:sectPr and return the relationship references.\n */\nexport function parseHeaderFooterReferences(\n documentXml: string,\n): ParsedHeaderFooterReference[] {\n const root = parseXml(documentXml);\n const documentElement = findChildElementOptional(root, \"document\");\n if (!documentElement) {\n return [];\n }\n\n const bodyElement = findChildElementOptional(documentElement, \"body\");\n if (!bodyElement) {\n return [];\n }\n\n const refs: ParsedHeaderFooterReference[] = [];\n\n // Collect all sectPr elements (can appear in paragraph pPr and at body level)\n collectSectPrReferences(bodyElement, refs);\n\n return refs;\n}\n\n/**\n * Parse a headerN.xml part (<w:hdr> root) into block nodes.\n */\nexport function parseHeaderXml(xml: string): ParsedHeaderFooterDocument {\n return parseHdrFtrXml(xml, \"hdr\");\n}\n\n/**\n * Parse a footerN.xml part (<w:ftr> root) into block nodes.\n */\nexport function parseFooterXml(xml: string): ParsedHeaderFooterDocument {\n return parseHdrFtrXml(xml, \"ftr\");\n}\n\n// ---- Internal helpers ----\n\nfunction collectSectPrReferences(\n element: XmlElementNode,\n refs: ParsedHeaderFooterReference[],\n): void {\n let sectionIndex = 0;\n for (const child of element.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"sectPr\") {\n // Body-level sectPr is the final section\n extractSectPrRefs(child, refs, sectionIndex);\n } else if (name === \"p\") {\n // Check paragraph properties for sectPr (non-final section break)\n const pPr = findChildElementOptional(child, \"pPr\");\n if (pPr) {\n const sectPr = findChildElementOptional(pPr, \"sectPr\");\n if (sectPr) {\n extractSectPrRefs(sectPr, refs, sectionIndex);\n sectionIndex++;\n }\n }\n }\n }\n}\n\nfunction extractSectPrRefs(\n sectPr: XmlElementNode,\n refs: ParsedHeaderFooterReference[],\n sectionIndex: number,\n): void {\n for (const child of sectPr.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"headerReference\" || name === \"footerReference\") {\n const kind: \"header\" | \"footer\" = name === \"headerReference\" ? \"header\" : \"footer\";\n const rawType =\n child.attributes[\"w:type\"] ?? child.attributes.type ?? \"default\";\n const variant = toHeaderFooterVariant(rawType);\n const relationshipId =\n child.attributes[\"r:id\"] ??\n child.attributes[\"r:Id\"] ??\n child.attributes.id ??\n child.attributes.Id ??\n \"\";\n\n if (relationshipId) {\n // Avoid duplicates (multiple sectPr may reference same header)\n const dedupeKey = `${kind}:${variant}:${relationshipId}`;\n const alreadyAdded = refs.some(\n (ref) => `${ref.kind}:${ref.variant}:${ref.relationshipId}` === dedupeKey,\n );\n if (!alreadyAdded) {\n refs.push({ variant, relationshipId, kind, sectionIndex });\n }\n }\n }\n }\n}\n\nfunction toHeaderFooterVariant(raw: string): HeaderFooterVariant {\n if (raw === \"first\") {\n return \"first\";\n }\n if (raw === \"even\") {\n return \"even\";\n }\n return \"default\";\n}\n\nfunction parseHdrFtrXml(\n xml: string,\n rootLocalName: \"hdr\" | \"ftr\",\n): ParsedHeaderFooterDocument {\n const root = parseXml(xml);\n const hdrFtrElement = findChildElementOptional(root, rootLocalName);\n if (!hdrFtrElement) {\n return { blocks: [] };\n }\n\n const blocks: BlockNode[] = [];\n\n for (const child of hdrFtrElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"p\") {\n blocks.push(parseParagraphElement(child));\n } else if (name === \"tbl\") {\n // Simple tables (no revisions, fields, or nested tables) are promoted\n // to supported-roundtrip; structurally risky tables stay opaque.\n if (isSimpleSecondaryStoryTable(child)) {\n blocks.push(parseSimpleTableElement(child));\n } else {\n blocks.push({\n type: \"opaque_block\",\n fragmentId: \"fragment:hdrftr-tbl\",\n warningId: \"warning:hdrftr-opaque-table\",\n rawXml: serializeElementToXml(child),\n });\n }\n } else {\n // Other block-level elements: treat as opaque\n blocks.push({\n type: \"opaque_block\",\n fragmentId: \"fragment:hdrftr-opaque\",\n warningId: \"warning:hdrftr-opaque-block\",\n rawXml: serializeElementToXml(child),\n });\n }\n }\n\n return { blocks };\n}\n\nfunction parseParagraphElement(pElement: XmlElementNode): ParagraphNode {\n let styleId: string | undefined;\n let alignment: ParagraphNode[\"alignment\"];\n let spacing: ParagraphNode[\"spacing\"];\n let indentation: ParagraphNode[\"indentation\"];\n let tabStops: ParagraphNode[\"tabStops\"];\n const children: InlineNode[] = [];\n let activeComplexField: {\n instruction: string;\n children: Array<Extract<InlineNode, { type: \"text\" | \"hard_break\" | \"tab\" }>>;\n mode: \"instruction\" | \"result\";\n } | null = null;\n\n for (const child of pElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"pPr\") {\n const pStyle = findChildElementOptional(child, \"pStyle\");\n styleId = pStyle?.attributes[\"w:val\"] ?? pStyle?.attributes.val;\n const jc = findChildElementOptional(child, \"jc\");\n const jcVal = jc?.attributes[\"w:val\"] ?? jc?.attributes.val;\n if (jcVal === \"left\" || jcVal === \"center\" || jcVal === \"right\" || jcVal === \"both\" || jcVal === \"distribute\") {\n alignment = jcVal;\n }\n spacing = readParagraphSpacing(child);\n indentation = readParagraphIndentation(child);\n tabStops = readParagraphTabStops(child);\n } else if (name === \"r\") {\n activeComplexField = appendRunNodes(child, children, activeComplexField);\n } else if (name === \"hyperlink\") {\n children.push(parseHyperlinkElement(child));\n } else if (name === \"bookmarkStart\" || name === \"bookmarkEnd\") {\n children.push(parseBookmarkElement(child));\n } else if (name === \"fldSimple\") {\n if (activeComplexField && activeComplexField.instruction.trim().length > 0) {\n children.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n });\n activeComplexField = null;\n }\n pushFieldNode(children, child, \"simple\");\n }\n }\n\n if (activeComplexField && activeComplexField.instruction.trim().length > 0) {\n children.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n });\n }\n\n return {\n type: \"paragraph\",\n ...(styleId ? { styleId } : {}),\n ...(alignment ? { alignment } : {}),\n ...(spacing ? { spacing } : {}),\n ...(indentation ? { indentation } : {}),\n ...(tabStops && tabStops.length > 0 ? { tabStops } : {}),\n children,\n };\n}\n\nfunction appendRunNodes(\n rElement: XmlElementNode,\n nodes: InlineNode[],\n activeComplexField: {\n instruction: string;\n children: Array<Extract<InlineNode, { type: \"text\" | \"hard_break\" | \"tab\" }>>;\n mode: \"instruction\" | \"result\";\n } | null,\n): {\n instruction: string;\n children: Array<Extract<InlineNode, { type: \"text\" | \"hard_break\" | \"tab\" }>>;\n mode: \"instruction\" | \"result\";\n} | null {\n const marks: TextMark[] = parseRunProperties(rElement);\n\n for (const child of rElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"fldChar\") {\n const fldType = child.attributes[\"w:fldCharType\"] ?? child.attributes.fldCharType;\n if (fldType === \"begin\") {\n activeComplexField = { instruction: \"\", children: [], mode: \"instruction\" };\n } else if (fldType === \"separate\" && activeComplexField) {\n activeComplexField.mode = \"result\";\n } else if (fldType === \"end\" && activeComplexField) {\n if (activeComplexField.instruction.trim().length > 0) {\n nodes.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n });\n }\n activeComplexField = null;\n }\n continue;\n }\n\n if (name === \"instrText\") {\n if (activeComplexField) {\n activeComplexField.instruction += extractTextContent(child);\n } else {\n pushFieldNode(nodes, child, \"complex\");\n }\n continue;\n }\n\n const inlineNode = parseRunChildNode(child, marks);\n if (!inlineNode) {\n continue;\n }\n\n if (activeComplexField?.mode === \"result\") {\n if (\n inlineNode.type === \"text\" ||\n inlineNode.type === \"hard_break\" ||\n inlineNode.type === \"tab\"\n ) {\n activeComplexField.children.push(inlineNode);\n }\n continue;\n }\n\n nodes.push(inlineNode);\n }\n\n return activeComplexField;\n}\n\nfunction parseRunElement(rElement: XmlElementNode): InlineNode[] {\n const nodes: InlineNode[] = [];\n const marks: TextMark[] = parseRunProperties(rElement);\n\n for (const child of rElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"t\") {\n const text = extractTextContent(child);\n if (text.length > 0) {\n nodes.push({\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n });\n }\n } else if (name === \"br\") {\n nodes.push({ type: \"hard_break\" });\n } else if (name === \"tab\") {\n nodes.push({ type: \"tab\" });\n } else if (name === \"footnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n const ref: FootnoteRefNode = {\n type: \"footnote_ref\",\n noteId,\n noteKind: \"footnote\",\n };\n nodes.push(ref);\n }\n } else if (name === \"endnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n const ref: FootnoteRefNode = {\n type: \"footnote_ref\",\n noteId,\n noteKind: \"endnote\",\n };\n nodes.push(ref);\n }\n } else if (name === \"bookmarkStart\" || name === \"bookmarkEnd\") {\n nodes.push(parseBookmarkElement(child));\n } else if (name === \"instrText\") {\n pushFieldNode(nodes, child, \"complex\");\n } else if (name === \"drawing\") {\n const drawingXml = currentSourceXml.slice(child.start, child.end);\n const shapeResult = parseShapeXml(drawingXml);\n if (shapeResult) {\n nodes.push(shapeResult);\n }\n } else if (name === \"pict\") {\n const pictXml = currentSourceXml.slice(child.start, child.end);\n const vmlResult = parseVmlXml(pictXml);\n if (vmlResult) {\n nodes.push(vmlResult);\n }\n } else if (name === \"AlternateContent\") {\n const drawingNode = findFirstDescendant(child, \"drawing\");\n if (drawingNode) {\n const drawingXml = currentSourceXml.slice(drawingNode.start, drawingNode.end);\n const shapeResult = parseShapeXml(drawingXml);\n if (shapeResult) {\n nodes.push({\n ...shapeResult,\n rawXml: currentSourceXml.slice(child.start, child.end),\n });\n continue;\n }\n }\n const pictNode = findFirstDescendant(child, \"pict\");\n if (pictNode) {\n const pictXml = currentSourceXml.slice(pictNode.start, pictNode.end);\n const vmlResult = parseVmlXml(pictXml);\n if (vmlResult) {\n nodes.push({\n ...vmlResult,\n rawXml: currentSourceXml.slice(child.start, child.end),\n });\n }\n }\n }\n }\n\n return nodes;\n}\n\nfunction parseRunChildNode(\n child: XmlElementNode,\n marks: TextMark[],\n): InlineNode | null {\n const name = localName(child.name);\n\n if (name === \"t\") {\n const text = extractTextContent(child);\n if (text.length > 0) {\n return {\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n };\n }\n return null;\n }\n if (name === \"br\") {\n return { type: \"hard_break\" };\n }\n if (name === \"tab\") {\n return { type: \"tab\" };\n }\n if (name === \"footnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n const ref: FootnoteRefNode = {\n type: \"footnote_ref\",\n noteId,\n noteKind: \"footnote\",\n };\n return ref;\n }\n return null;\n }\n if (name === \"endnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n const ref: FootnoteRefNode = {\n type: \"footnote_ref\",\n noteId,\n noteKind: \"endnote\",\n };\n return ref;\n }\n return null;\n }\n if (name === \"bookmarkStart\" || name === \"bookmarkEnd\") {\n return parseBookmarkElement(child);\n }\n if (name === \"drawing\") {\n const drawingXml = currentSourceXml.slice(child.start, child.end);\n return parseShapeXml(drawingXml);\n }\n if (name === \"pict\") {\n const pictXml = currentSourceXml.slice(child.start, child.end);\n return parseVmlXml(pictXml);\n }\n if (name === \"AlternateContent\") {\n const drawingNode = findFirstDescendant(child, \"drawing\");\n if (drawingNode) {\n const drawingXml = currentSourceXml.slice(drawingNode.start, drawingNode.end);\n const shapeResult = parseShapeXml(drawingXml);\n if (shapeResult) {\n return {\n ...shapeResult,\n rawXml: currentSourceXml.slice(child.start, child.end),\n };\n }\n }\n const pictNode = findFirstDescendant(child, \"pict\");\n if (pictNode) {\n const pictXml = currentSourceXml.slice(pictNode.start, pictNode.end);\n const vmlResult = parseVmlXml(pictXml);\n if (vmlResult) {\n return {\n ...vmlResult,\n rawXml: currentSourceXml.slice(child.start, child.end),\n };\n }\n }\n }\n\n return null;\n}\n\nfunction parseHyperlinkElement(element: XmlElementNode): Extract<InlineNode, { type: \"hyperlink\" }> {\n const href = element.attributes[\"w:anchor\"]\n ? `#${element.attributes[\"w:anchor\"]}`\n : element.attributes[\"r:id\"] ?? \"relationship:unknown\";\n const children: Array<Extract<InlineNode, { type: \"text\" | \"hard_break\" | \"tab\" }>> = [];\n\n for (const child of element.children) {\n if (child.type === \"element\" && localName(child.name) === \"r\") {\n for (const runChild of parseRunElement(child)) {\n if (runChild.type === \"text\" || runChild.type === \"hard_break\" || runChild.type === \"tab\") {\n children.push(runChild);\n }\n }\n }\n }\n\n return {\n type: \"hyperlink\",\n href,\n children,\n };\n}\n\nfunction parseBookmarkElement(\n element: XmlElementNode,\n): Extract<InlineNode, { type: \"bookmark_start\" | \"bookmark_end\" }> {\n const bookmarkId = element.attributes[\"w:id\"] ?? element.attributes.id ?? \"0\";\n if (localName(element.name) === \"bookmarkStart\") {\n return {\n type: \"bookmark_start\",\n bookmarkId,\n name: element.attributes[\"w:name\"] ?? element.attributes.name ?? \"\",\n };\n }\n\n return {\n type: \"bookmark_end\",\n bookmarkId,\n };\n}\n\nfunction pushFieldNode(\n nodes: InlineNode[],\n element: XmlElementNode,\n fieldType: \"simple\" | \"complex\",\n): void {\n const instruction = readFieldInstruction(element);\n if (!instruction) {\n return;\n }\n\n nodes.push({\n type: \"field\",\n fieldType,\n instruction,\n children: [],\n });\n}\n\nfunction readFieldInstruction(element: XmlElementNode): string | undefined {\n const instruction =\n element.attributes[\"w:instr\"] ??\n element.attributes.instr ??\n extractTextContent(element);\n return instruction.trim().length > 0 ? instruction : undefined;\n}\n\nfunction parseRunProperties(rElement: XmlElementNode): TextMark[] {\n const rPr = findChildElementOptional(rElement, \"rPr\");\n if (!rPr) {\n return [];\n }\n\n const marks: TextMark[] = [];\n\n for (const child of rPr.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n const val = child.attributes[\"w:val\"] ?? child.attributes.val ?? \"true\";\n\n switch (name) {\n case \"b\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"bold\" });\n }\n break;\n case \"i\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"italic\" });\n }\n break;\n case \"u\":\n if (val !== \"none\" && val !== \"0\") {\n marks.push({ type: \"underline\" });\n }\n break;\n case \"strike\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"strikethrough\" });\n }\n break;\n case \"dstrike\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"doubleStrikethrough\" });\n }\n break;\n case \"rFonts\": {\n const family =\n child.attributes[\"w:ascii\"] ??\n child.attributes[\"w:hAnsi\"] ??\n child.attributes.ascii ??\n child.attributes.hAnsi;\n if (family) {\n marks.push({ type: \"fontFamily\", val: family });\n }\n break;\n }\n case \"sz\": {\n const szVal = child.attributes[\"w:val\"] ?? child.attributes.val;\n if (szVal) {\n const size = Number.parseInt(szVal, 10);\n if (Number.isFinite(size) && size > 0) {\n marks.push({ type: \"fontSize\", val: size });\n }\n }\n break;\n }\n case \"color\": {\n const colorVal = child.attributes[\"w:val\"] ?? child.attributes.val;\n if (colorVal && colorVal !== \"auto\") {\n marks.push({ type: \"textColor\", color: colorVal });\n }\n break;\n }\n case \"shd\": {\n const fill = child.attributes[\"w:fill\"] ?? child.attributes.fill;\n if (fill && fill !== \"auto\") {\n marks.push({ type: \"backgroundColor\", color: fill });\n }\n break;\n }\n case \"highlight\": {\n const resolvedHighlight = resolveHighlightColor(\n child.attributes[\"w:val\"] ?? child.attributes.val,\n );\n if (resolvedHighlight) {\n marks.push({\n type: \"highlight\",\n color: resolvedHighlight.color,\n val: resolvedHighlight.val,\n });\n }\n break;\n }\n case \"smallCaps\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"smallCaps\" });\n }\n break;\n case \"caps\":\n if (val !== \"0\" && val !== \"false\") {\n marks.push({ type: \"allCaps\" });\n }\n break;\n }\n }\n\n return marks;\n}\n\nfunction readParagraphSpacing(pPr: XmlElementNode): ParagraphSpacing | undefined {\n const spacingNode = findChildElementOptional(pPr, \"spacing\");\n if (!spacingNode) return undefined;\n const result: ParagraphSpacing = {};\n const before = spacingNode.attributes[\"w:before\"] ?? spacingNode.attributes.before;\n if (before) result.before = Number.parseInt(before, 10);\n const after = spacingNode.attributes[\"w:after\"] ?? spacingNode.attributes.after;\n if (after) result.after = Number.parseInt(after, 10);\n const line = spacingNode.attributes[\"w:line\"] ?? spacingNode.attributes.line;\n if (line) result.line = Number.parseInt(line, 10);\n const lineRule = spacingNode.attributes[\"w:lineRule\"] ?? spacingNode.attributes.lineRule;\n if (lineRule === \"auto\" || lineRule === \"exact\" || lineRule === \"atLeast\") {\n result.lineRule = lineRule;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction readParagraphIndentation(pPr: XmlElementNode): ParagraphIndentation | undefined {\n const indNode = findChildElementOptional(pPr, \"ind\");\n if (!indNode) return undefined;\n const result: ParagraphIndentation = {};\n const left = indNode.attributes[\"w:left\"] ?? indNode.attributes.left;\n if (left) result.left = Number.parseInt(left, 10);\n const right = indNode.attributes[\"w:right\"] ?? indNode.attributes.right;\n if (right) result.right = Number.parseInt(right, 10);\n const firstLine = indNode.attributes[\"w:firstLine\"] ?? indNode.attributes.firstLine;\n if (firstLine) result.firstLine = Number.parseInt(firstLine, 10);\n const hanging = indNode.attributes[\"w:hanging\"] ?? indNode.attributes.hanging;\n if (hanging) result.hanging = Number.parseInt(hanging, 10);\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction readParagraphTabStops(pPr: XmlElementNode): TabStop[] | undefined {\n const tabsNode = findChildElementOptional(pPr, \"tabs\");\n if (!tabsNode) return undefined;\n\n const tabStops: TabStop[] = [];\n for (const child of tabsNode.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tab\") continue;\n const pos = child.attributes[\"w:pos\"] ?? child.attributes.pos;\n const val = (child.attributes[\"w:val\"] ?? child.attributes.val ?? \"left\").toLowerCase();\n const leader = (child.attributes[\"w:leader\"] ?? child.attributes.leader ?? \"none\").toLowerCase();\n\n if (pos === undefined) continue;\n const position = Number.parseInt(pos, 10);\n if (!Number.isFinite(position)) continue;\n\n const align = ([\"left\", \"center\", \"right\", \"decimal\", \"bar\", \"clear\"] as const).includes(\n val as \"left\" | \"center\" | \"right\" | \"decimal\" | \"bar\" | \"clear\",\n )\n ? (val as TabStop[\"align\"])\n : \"left\";\n\n const leaderValue =\n leader === \"none\" ||\n leader === \"dot\" ||\n leader === \"hyphen\" ||\n leader === \"underscore\" ||\n leader === \"heavy\"\n ? (leader as Exclude<TabStop[\"leader\"], \"middleDot\">)\n : leader === \"middledot\"\n ? \"middleDot\"\n : undefined;\n\n tabStops.push({\n position,\n align,\n ...(leaderValue && leaderValue !== \"none\" ? { leader: leaderValue } : {}),\n });\n }\n\n return tabStops.length > 0 ? tabStops : undefined;\n}\n\nfunction extractTextContent(tElement: XmlElementNode): string {\n let text = \"\";\n for (const child of tElement.children) {\n if (child.type === \"text\") {\n text += child.text;\n }\n }\n return text;\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction findFirstDescendant(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n for (const child of node.children) {\n if (child.type !== \"element\") continue;\n if (localName(child.name) === childLocalName) {\n return child;\n }\n const nested = findFirstDescendant(child, childLocalName);\n if (nested) {\n return nested;\n }\n }\n return undefined;\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\n// ---- Simple secondary-story table support ----\n\n/**\n * Revision-bearing, field-bearing, or structurally risky elements that\n * disqualify a secondary-story table from supported-roundtrip.\n */\nconst RISKY_TABLE_ELEMENT_NAMES = new Set([\n \"ins\",\n \"del\",\n \"moveFrom\",\n \"moveTo\",\n \"tblPrChange\",\n \"trPrChange\",\n \"tcPrChange\",\n \"rPrChange\",\n \"pPrChange\",\n \"sectPrChange\",\n \"sdt\",\n \"customXml\",\n]);\n\nfunction isSimpleSecondaryStoryTable(tblElement: XmlElementNode): boolean {\n return !containsRiskyElement(tblElement);\n}\n\nfunction containsRiskyElement(element: XmlElementNode): boolean {\n for (const child of element.children) {\n if (child.type !== \"element\") {\n continue;\n }\n const name = localName(child.name);\n if (name === \"fldSimple\" || name === \"instrText\") {\n const instruction =\n child.attributes[\"w:instr\"] ??\n child.attributes.instr ??\n extractTextContent(child);\n const classification = classifyFieldInstruction(instruction);\n if (!isSafeSecondaryStoryFieldFamily(classification.family)) {\n return true;\n }\n continue;\n }\n if (RISKY_TABLE_ELEMENT_NAMES.has(name)) {\n return true;\n }\n if (name === \"fldChar\") {\n continue;\n }\n // Nested tables remain risky\n if (name === \"tbl\") {\n return true;\n }\n if (containsRiskyElement(child)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isSafeSecondaryStoryFieldFamily(family: string): boolean {\n return (\n family === \"REF\" ||\n family === \"PAGEREF\" ||\n family === \"NOTEREF\" ||\n family === \"TOC\" ||\n family === \"PAGE\" ||\n family === \"NUMPAGES\"\n );\n}\n\nfunction parseSimpleTableElement(tblElement: XmlElementNode): TableNode {\n let gridColumns: number[] = [];\n const rows: TableRowNode[] = [];\n let propertiesXml: string | undefined;\n let styleId: string | undefined;\n\n for (const child of tblElement.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n if (name === \"tblPr\") {\n propertiesXml = serializeElementToXml(child);\n const pStyle = findChildElementOptional(child, \"tblStyle\");\n styleId = pStyle?.attributes[\"w:val\"] ?? pStyle?.attributes.val;\n } else if (name === \"tblGrid\") {\n gridColumns = readGridColumns(child);\n } else if (name === \"tr\") {\n rows.push(parseSimpleTableRow(child));\n }\n }\n\n return {\n type: \"table\",\n ...(styleId ? { styleId } : {}),\n ...(propertiesXml ? { propertiesXml } : {}),\n gridColumns,\n rows,\n };\n}\n\nfunction readGridColumns(tblGrid: XmlElementNode): number[] {\n const columns: number[] = [];\n for (const child of tblGrid.children) {\n if (child.type !== \"element\") continue;\n if (localName(child.name) === \"gridCol\") {\n const w = child.attributes[\"w:w\"] ?? child.attributes.w ?? \"0\";\n columns.push(Number.parseInt(w, 10) || 0);\n }\n }\n return columns;\n}\n\nfunction parseSimpleTableRow(trElement: XmlElementNode): TableRowNode {\n const cells: TableCellNode[] = [];\n let propertiesXml: string | undefined;\n\n for (const child of trElement.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n if (name === \"trPr\") {\n propertiesXml = serializeElementToXml(child);\n } else if (name === \"tc\") {\n cells.push(parseSimpleTableCell(child));\n }\n }\n\n return {\n type: \"table_row\",\n ...(propertiesXml ? { propertiesXml } : {}),\n cells,\n };\n}\n\nfunction parseSimpleTableCell(tcElement: XmlElementNode): TableCellNode {\n const children: BlockNode[] = [];\n let propertiesXml: string | undefined;\n let gridSpan: number | undefined;\n let verticalMerge: \"restart\" | \"continue\" | undefined;\n\n for (const child of tcElement.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n if (name === \"tcPr\") {\n propertiesXml = serializeElementToXml(child);\n const gsEl = findChildElementOptional(child, \"gridSpan\");\n const gsVal = gsEl?.attributes[\"w:val\"] ?? gsEl?.attributes.val;\n if (gsVal) gridSpan = Number.parseInt(gsVal, 10) || undefined;\n\n const vmEl = findChildElementOptional(child, \"vMerge\");\n if (vmEl) {\n const vmVal = vmEl.attributes[\"w:val\"] ?? vmEl.attributes.val ?? \"continue\";\n verticalMerge = vmVal === \"restart\" ? \"restart\" : \"continue\";\n }\n } else if (name === \"p\") {\n children.push(parseParagraphElement(child));\n }\n }\n\n return {\n type: \"table_cell\",\n ...(propertiesXml ? { propertiesXml } : {}),\n ...(gridSpan ? { gridSpan } : {}),\n ...(verticalMerge ? { verticalMerge } : {}),\n children: children.length > 0 ? children : [{ type: \"paragraph\", children: [] }],\n };\n}\n\n/**\n * Serialize an XmlElementNode back to XML string for propertiesXml preservation.\n */\nfunction serializeElementToXml(element: XmlElementNode): string {\n const attrs = Object.entries(element.attributes)\n .map(([key, value]) => ` ${key}=\"${escapeXmlAttribute(value)}\"`)\n .join(\"\");\n const children = element.children\n .map((child) => {\n if (child.type === \"text\") {\n return escapeXmlText(child.text);\n }\n return serializeElementToXml(child);\n })\n .join(\"\");\n if (children.length === 0) {\n return `<${element.name}${attrs}/>`;\n }\n return `<${element.name}${attrs}>${children}</${element.name}>`;\n}\n\nfunction escapeXmlAttribute(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeXmlText(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n// ---- Minimal XML parser (same pattern as parse-numbering.ts) ----\n\nfunction parseXml(xml: string): XmlElementNode {\n currentSourceXml = xml;\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: end >= 0 ? end + 3 : xml.length,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.trim().length > 0 || (text.length > 0 && stack.length > 1)) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text, start: cursor, end });\n }\n cursor = end;\n continue;\n }\n\n // Closing tag\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) {\n break;\n }\n const current = stack.pop();\n if (current) {\n current.end = end + 1;\n }\n cursor = end + 1;\n continue;\n }\n\n // Open or self-closing tag\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n break;\n }\n\n const tagContent = xml.slice(cursor + 1, tagEnd);\n const selfClosing = tagContent.endsWith(\"/\");\n const normalized = selfClosing ? tagContent.slice(0, -1).trimEnd() : tagContent;\n\n const spaceIndex = normalized.search(/\\s/);\n const tagName =\n spaceIndex >= 0 ? normalized.slice(0, spaceIndex) : normalized;\n const attrString =\n spaceIndex >= 0 ? normalized.slice(spaceIndex + 1) : \"\";\n const attributes = parseAttributes(attrString);\n\n const element: XmlElementNode = {\n type: \"element\",\n name: tagName,\n attributes,\n children: [],\n start: cursor,\n end: tagEnd + 1,\n };\n\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n return root;\n}\n\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const pattern = /([A-Za-z_:][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n\n for (const match of attrString.matchAll(pattern)) {\n const name = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (name) {\n attrs[name] = decodeXmlEntities(value);\n }\n }\n\n return attrs;\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) =>\n String.fromCodePoint(Number.parseInt(hex, 16)),\n );\n}\n","import type {\n BlockNode,\n FootnoteCollection,\n FootnoteDefinition,\n InlineNode,\n ParagraphIndentation,\n ParagraphNode,\n ParagraphSpacing,\n TableCellNode,\n TableNode,\n TableRowNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\n// ---- XML node types (inline, no external dep) ----\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\n// ---- Special footnote/endnote IDs to skip ----\n\nconst SPECIAL_NOTE_IDS = new Set([\"-1\", \"0\"]);\nconst SPECIAL_NOTE_TYPES = new Set([\"separator\", \"continuationSeparator\"]);\n\n// ---- Public API ----\n\n/**\n * Parse footnotes.xml (<w:footnotes> root) into a FootnoteCollection.\n * Also accepts endnotes.xml (<w:endnotes> root).\n */\nexport function parseFootnotesXml(xml: string): FootnoteCollection {\n const root = parseXml(xml);\n\n const footnotesElement = findChildElementOptional(root, \"footnotes\");\n const endnotesElement = findChildElementOptional(root, \"endnotes\");\n\n const footnotes: Record<string, FootnoteDefinition> = {};\n const endnotes: Record<string, FootnoteDefinition> = {};\n\n if (footnotesElement) {\n for (const child of footnotesElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n if (localName(child.name) !== \"footnote\") {\n continue;\n }\n const definition = parseNoteElement(child, \"footnote\");\n if (definition) {\n footnotes[definition.noteId] = definition;\n }\n }\n }\n\n if (endnotesElement) {\n for (const child of endnotesElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n if (localName(child.name) !== \"endnote\") {\n continue;\n }\n const definition = parseNoteElement(child, \"endnote\");\n if (definition) {\n endnotes[definition.noteId] = definition;\n }\n }\n }\n\n return { footnotes, endnotes };\n}\n\n/**\n * Parse a standalone endnotes.xml (<w:endnotes> root).\n * Merges into the provided collection or creates a new one.\n */\nexport function parseEndnotesXml(\n xml: string,\n existing?: FootnoteCollection,\n): FootnoteCollection {\n const root = parseXml(xml);\n const endnotesElement = findChildElementOptional(root, \"endnotes\");\n const endnotes: Record<string, FootnoteDefinition> = {\n ...(existing?.endnotes ?? {}),\n };\n\n if (endnotesElement) {\n for (const child of endnotesElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n if (localName(child.name) !== \"endnote\") {\n continue;\n }\n const definition = parseNoteElement(child, \"endnote\");\n if (definition) {\n endnotes[definition.noteId] = definition;\n }\n }\n }\n\n return {\n footnotes: existing?.footnotes ?? {},\n endnotes,\n };\n}\n\n// ---- Internal helpers ----\n\nfunction parseNoteElement(\n element: XmlElementNode,\n kind: \"footnote\" | \"endnote\",\n): FootnoteDefinition | undefined {\n const rawId =\n element.attributes[\"w:id\"] ?? element.attributes.id ?? \"\";\n const rawType =\n element.attributes[\"w:type\"] ?? element.attributes.type ?? \"\";\n\n if (!rawId || SPECIAL_NOTE_IDS.has(rawId) || SPECIAL_NOTE_TYPES.has(rawType)) {\n return undefined;\n }\n\n const noteId = rawId;\n const blocks: BlockNode[] = [];\n\n for (const child of element.children) {\n if (child.type !== \"element\") {\n continue;\n }\n const name = localName(child.name);\n if (name === \"p\") {\n blocks.push(parseParagraphElement(child));\n } else if (name === \"tbl\") {\n // Simple tables (no revisions, fields, or nested tables) are promoted\n // to supported-roundtrip; structurally risky tables stay opaque.\n if (isSimpleSecondaryStoryTable(child)) {\n blocks.push(parseSimpleTableElement(child));\n } else {\n blocks.push({\n type: \"opaque_block\",\n fragmentId: `fragment:note-tbl-${noteId}`,\n warningId: `warning:note-opaque-table`,\n rawXml: serializeElementToXml(child),\n });\n }\n } else {\n blocks.push({\n type: \"opaque_block\",\n fragmentId: `fragment:note-opaque-${noteId}`,\n warningId: `warning:note-opaque-block`,\n rawXml: serializeElementToXml(child),\n });\n }\n }\n\n return { noteId, kind, blocks };\n}\n\nfunction parseParagraphElement(pElement: XmlElementNode): ParagraphNode {\n let styleId: string | undefined;\n let alignment: ParagraphNode[\"alignment\"];\n let spacing: ParagraphNode[\"spacing\"];\n let indentation: ParagraphNode[\"indentation\"];\n const children: InlineNode[] = [];\n let activeComplexField: {\n instruction: string;\n children: InlineNode[];\n mode: \"instruction\" | \"result\";\n } | null = null;\n\n for (const child of pElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"pPr\") {\n const pStyle = findChildElementOptional(child, \"pStyle\");\n styleId = pStyle?.attributes[\"w:val\"] ?? pStyle?.attributes.val;\n const jc = findChildElementOptional(child, \"jc\");\n const jcVal = jc?.attributes[\"w:val\"] ?? jc?.attributes.val;\n if (jcVal === \"left\" || jcVal === \"center\" || jcVal === \"right\" || jcVal === \"both\" || jcVal === \"distribute\") {\n alignment = jcVal;\n }\n spacing = readParagraphSpacing(child);\n indentation = readParagraphIndentation(child);\n } else if (name === \"r\") {\n activeComplexField = appendRunNodes(child, children, activeComplexField);\n } else if (name === \"hyperlink\") {\n if (activeComplexField && activeComplexField.instruction.trim().length > 0) {\n children.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n });\n activeComplexField = null;\n }\n children.push(parseHyperlinkElement(child));\n } else if (name === \"bookmarkStart\" || name === \"bookmarkEnd\") {\n const bookmarkNode = parseBookmarkElement(child);\n if (activeComplexField?.mode === \"result\") {\n activeComplexField.children.push(bookmarkNode);\n } else {\n if (activeComplexField && activeComplexField.instruction.trim().length > 0) {\n children.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n });\n activeComplexField = null;\n }\n children.push(bookmarkNode);\n }\n } else if (name === \"fldSimple\") {\n if (activeComplexField && activeComplexField.instruction.trim().length > 0) {\n children.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n });\n activeComplexField = null;\n }\n pushFieldNode(children, child, \"simple\");\n }\n }\n\n if (activeComplexField && activeComplexField.instruction.trim().length > 0) {\n children.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n });\n }\n\n return {\n type: \"paragraph\",\n ...(styleId ? { styleId } : {}),\n ...(alignment ? { alignment } : {}),\n ...(spacing ? { spacing } : {}),\n ...(indentation ? { indentation } : {}),\n children,\n };\n}\n\nfunction appendRunNodes(\n rElement: XmlElementNode,\n nodes: InlineNode[],\n activeComplexField: {\n instruction: string;\n children: InlineNode[];\n mode: \"instruction\" | \"result\";\n } | null,\n): {\n instruction: string;\n children: InlineNode[];\n mode: \"instruction\" | \"result\";\n} | null {\n const marks: TextMark[] = parseRunProperties(rElement);\n\n for (const child of rElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n if (name === \"fldChar\") {\n const fldType = child.attributes[\"w:fldCharType\"] ?? child.attributes.fldCharType;\n if (fldType === \"begin\") {\n activeComplexField = { instruction: \"\", children: [], mode: \"instruction\" };\n } else if (fldType === \"separate\" && activeComplexField) {\n activeComplexField.mode = \"result\";\n } else if (fldType === \"end\" && activeComplexField) {\n if (activeComplexField.instruction.trim().length > 0) {\n nodes.push({\n type: \"field\",\n fieldType: \"complex\",\n instruction: activeComplexField.instruction,\n children: activeComplexField.children,\n });\n }\n activeComplexField = null;\n }\n continue;\n }\n\n if (name === \"instrText\") {\n if (activeComplexField) {\n activeComplexField.instruction += extractTextContent(child);\n } else {\n pushFieldNode(nodes, child, \"complex\");\n }\n continue;\n }\n\n const inlineNode = parseRunChildNode(child, marks);\n if (!inlineNode) {\n continue;\n }\n\n if (activeComplexField?.mode === \"result\") {\n activeComplexField.children.push(inlineNode);\n continue;\n }\n\n nodes.push(inlineNode);\n }\n\n return activeComplexField;\n}\n\nfunction parseRunElement(rElement: XmlElementNode): InlineNode[] {\n const nodes: InlineNode[] = [];\n const marks: TextMark[] = parseRunProperties(rElement);\n\n for (const child of rElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"t\") {\n const text = extractTextContent(child);\n if (text.length > 0) {\n nodes.push({\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n });\n }\n } else if (name === \"br\") {\n nodes.push({ type: \"hard_break\" });\n } else if (name === \"tab\") {\n nodes.push({ type: \"tab\" });\n } else if (name === \"footnoteRef\" || name === \"endnoteRef\") {\n // The in-note reference marker (superscript) - skip, rendered by the host\n } else if (name === \"footnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n nodes.push({ type: \"footnote_ref\", noteId, noteKind: \"footnote\" });\n }\n } else if (name === \"endnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n nodes.push({ type: \"footnote_ref\", noteId, noteKind: \"endnote\" });\n }\n } else if (name === \"bookmarkStart\" || name === \"bookmarkEnd\") {\n nodes.push(parseBookmarkElement(child));\n } else if (name === \"instrText\") {\n pushFieldNode(nodes, child, \"complex\");\n }\n }\n\n return nodes;\n}\n\nfunction parseRunChildNode(\n child: XmlElementNode,\n marks: TextMark[],\n): InlineNode | null {\n const name = localName(child.name);\n\n if (name === \"t\") {\n const text = extractTextContent(child);\n if (text.length > 0) {\n return {\n type: \"text\",\n text,\n ...(marks.length > 0 ? { marks } : {}),\n };\n }\n return null;\n }\n if (name === \"br\") {\n return { type: \"hard_break\" };\n }\n if (name === \"tab\") {\n return { type: \"tab\" };\n }\n if (name === \"footnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n return { type: \"footnote_ref\", noteId, noteKind: \"footnote\" };\n }\n return null;\n }\n if (name === \"endnoteReference\") {\n const noteId =\n child.attributes[\"w:id\"] ?? child.attributes.id ?? \"\";\n if (noteId) {\n return { type: \"footnote_ref\", noteId, noteKind: \"endnote\" };\n }\n return null;\n }\n if (name === \"bookmarkStart\" || name === \"bookmarkEnd\") {\n return parseBookmarkElement(child);\n }\n\n return null;\n}\n\nfunction parseHyperlinkElement(element: XmlElementNode): Extract<InlineNode, { type: \"hyperlink\" }> {\n const href = element.attributes[\"w:anchor\"]\n ? `#${element.attributes[\"w:anchor\"]}`\n : element.attributes[\"r:id\"] ?? \"relationship:unknown\";\n const children: Array<Extract<InlineNode, { type: \"text\" | \"hard_break\" | \"tab\" }>> = [];\n\n for (const child of element.children) {\n if (child.type === \"element\" && localName(child.name) === \"r\") {\n for (const runChild of parseRunElement(child)) {\n if (runChild.type === \"text\" || runChild.type === \"hard_break\" || runChild.type === \"tab\") {\n children.push(runChild);\n }\n }\n }\n }\n\n return {\n type: \"hyperlink\",\n href,\n children,\n };\n}\n\nfunction parseBookmarkElement(\n element: XmlElementNode,\n): Extract<InlineNode, { type: \"bookmark_start\" | \"bookmark_end\" }> {\n const bookmarkId = element.attributes[\"w:id\"] ?? element.attributes.id ?? \"0\";\n if (localName(element.name) === \"bookmarkStart\") {\n return {\n type: \"bookmark_start\",\n bookmarkId,\n name: element.attributes[\"w:name\"] ?? element.attributes.name ?? \"\",\n };\n }\n\n return {\n type: \"bookmark_end\",\n bookmarkId,\n };\n}\n\nfunction pushFieldNode(\n nodes: InlineNode[],\n element: XmlElementNode,\n fieldType: \"simple\" | \"complex\",\n): void {\n const instruction = readFieldInstruction(element);\n if (!instruction) {\n return;\n }\n\n nodes.push({\n type: \"field\",\n fieldType,\n instruction,\n children: [],\n });\n}\n\nfunction readFieldInstruction(element: XmlElementNode): string | undefined {\n const instruction =\n element.attributes[\"w:instr\"] ??\n element.attributes.instr ??\n extractTextContent(element);\n return instruction.trim().length > 0 ? instruction : undefined;\n}\n\nfunction parseRunProperties(rElement: XmlElementNode): TextMark[] {\n const rPr = findChildElementOptional(rElement, \"rPr\");\n if (!rPr) {\n return [];\n }\n\n const marks: TextMark[] = [];\n\n for (const child of rPr.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n const val = child.attributes[\"w:val\"] ?? child.attributes.val ?? \"true\";\n\n switch (name) {\n case \"b\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"bold\" });\n break;\n case \"i\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"italic\" });\n break;\n case \"u\":\n if (val !== \"none\" && val !== \"0\") marks.push({ type: \"underline\" });\n break;\n case \"strike\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"strikethrough\" });\n break;\n case \"dstrike\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"doubleStrikethrough\" });\n break;\n case \"rFonts\": {\n const family =\n child.attributes[\"w:ascii\"] ??\n child.attributes[\"w:hAnsi\"] ??\n child.attributes.ascii ??\n child.attributes.hAnsi;\n if (family) marks.push({ type: \"fontFamily\", val: family });\n break;\n }\n case \"sz\": {\n const szVal = child.attributes[\"w:val\"] ?? child.attributes.val;\n if (szVal) {\n const size = Number.parseInt(szVal, 10);\n if (Number.isFinite(size) && size > 0) marks.push({ type: \"fontSize\", val: size });\n }\n break;\n }\n case \"color\": {\n const colorVal = child.attributes[\"w:val\"] ?? child.attributes.val;\n if (colorVal && colorVal !== \"auto\") marks.push({ type: \"textColor\", color: colorVal });\n break;\n }\n case \"smallCaps\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"smallCaps\" });\n break;\n case \"caps\":\n if (val !== \"0\" && val !== \"false\") marks.push({ type: \"allCaps\" });\n break;\n }\n }\n\n return marks;\n}\n\nfunction readParagraphSpacing(pPr: XmlElementNode): ParagraphSpacing | undefined {\n const spacingNode = findChildElementOptional(pPr, \"spacing\");\n if (!spacingNode) return undefined;\n const result: ParagraphSpacing = {};\n const before = spacingNode.attributes[\"w:before\"] ?? spacingNode.attributes.before;\n if (before) result.before = Number.parseInt(before, 10);\n const after = spacingNode.attributes[\"w:after\"] ?? spacingNode.attributes.after;\n if (after) result.after = Number.parseInt(after, 10);\n const line = spacingNode.attributes[\"w:line\"] ?? spacingNode.attributes.line;\n if (line) result.line = Number.parseInt(line, 10);\n const lineRule = spacingNode.attributes[\"w:lineRule\"] ?? spacingNode.attributes.lineRule;\n if (lineRule === \"auto\" || lineRule === \"exact\" || lineRule === \"atLeast\") {\n result.lineRule = lineRule;\n }\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction readParagraphIndentation(pPr: XmlElementNode): ParagraphIndentation | undefined {\n const indNode = findChildElementOptional(pPr, \"ind\");\n if (!indNode) return undefined;\n const result: ParagraphIndentation = {};\n const left = indNode.attributes[\"w:left\"] ?? indNode.attributes.left;\n if (left) result.left = Number.parseInt(left, 10);\n const right = indNode.attributes[\"w:right\"] ?? indNode.attributes.right;\n if (right) result.right = Number.parseInt(right, 10);\n const firstLine = indNode.attributes[\"w:firstLine\"] ?? indNode.attributes.firstLine;\n if (firstLine) result.firstLine = Number.parseInt(firstLine, 10);\n const hanging = indNode.attributes[\"w:hanging\"] ?? indNode.attributes.hanging;\n if (hanging) result.hanging = Number.parseInt(hanging, 10);\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction extractTextContent(tElement: XmlElementNode): string {\n let text = \"\";\n for (const child of tElement.children) {\n if (child.type === \"text\") {\n text += child.text;\n }\n }\n return text;\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const idx = name.indexOf(\":\");\n return idx >= 0 ? name.slice(idx + 1) : name;\n}\n\n// ---- Simple secondary-story table support ----\n\nconst RISKY_TABLE_ELEMENT_NAMES = new Set([\n \"ins\",\n \"del\",\n \"moveFrom\",\n \"moveTo\",\n \"tblPrChange\",\n \"trPrChange\",\n \"tcPrChange\",\n \"rPrChange\",\n \"pPrChange\",\n \"sectPrChange\",\n \"fldSimple\",\n \"fldChar\",\n \"instrText\",\n \"sdt\",\n \"customXml\",\n]);\n\nfunction isSimpleSecondaryStoryTable(tblElement: XmlElementNode): boolean {\n return !containsRiskyElement(tblElement);\n}\n\nfunction containsRiskyElement(element: XmlElementNode): boolean {\n for (const child of element.children) {\n if (child.type !== \"element\") {\n continue;\n }\n const name = localName(child.name);\n if (RISKY_TABLE_ELEMENT_NAMES.has(name)) {\n return true;\n }\n if (name === \"tbl\") {\n return true;\n }\n if (containsRiskyElement(child)) {\n return true;\n }\n }\n return false;\n}\n\nfunction parseSimpleTableElement(tblElement: XmlElementNode): TableNode {\n let gridColumns: number[] = [];\n const rows: TableRowNode[] = [];\n let propertiesXml: string | undefined;\n let styleId: string | undefined;\n\n for (const child of tblElement.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n if (name === \"tblPr\") {\n propertiesXml = serializeElementToXml(child);\n const pStyle = findChildElementOptional(child, \"tblStyle\");\n styleId = pStyle?.attributes[\"w:val\"] ?? pStyle?.attributes.val;\n } else if (name === \"tblGrid\") {\n gridColumns = readGridColumns(child);\n } else if (name === \"tr\") {\n rows.push(parseSimpleTableRow(child));\n }\n }\n\n return {\n type: \"table\",\n ...(styleId ? { styleId } : {}),\n ...(propertiesXml ? { propertiesXml } : {}),\n gridColumns,\n rows,\n };\n}\n\nfunction readGridColumns(tblGrid: XmlElementNode): number[] {\n const columns: number[] = [];\n for (const child of tblGrid.children) {\n if (child.type !== \"element\") continue;\n if (localName(child.name) === \"gridCol\") {\n const w = child.attributes[\"w:w\"] ?? child.attributes.w ?? \"0\";\n columns.push(Number.parseInt(w, 10) || 0);\n }\n }\n return columns;\n}\n\nfunction parseSimpleTableRow(trElement: XmlElementNode): TableRowNode {\n const cells: TableCellNode[] = [];\n let propertiesXml: string | undefined;\n\n for (const child of trElement.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n if (name === \"trPr\") {\n propertiesXml = serializeElementToXml(child);\n } else if (name === \"tc\") {\n cells.push(parseSimpleTableCell(child));\n }\n }\n\n return {\n type: \"table_row\",\n ...(propertiesXml ? { propertiesXml } : {}),\n cells,\n };\n}\n\nfunction parseSimpleTableCell(tcElement: XmlElementNode): TableCellNode {\n const children: BlockNode[] = [];\n let propertiesXml: string | undefined;\n let gridSpan: number | undefined;\n let verticalMerge: \"restart\" | \"continue\" | undefined;\n\n for (const child of tcElement.children) {\n if (child.type !== \"element\") continue;\n const name = localName(child.name);\n\n if (name === \"tcPr\") {\n propertiesXml = serializeElementToXml(child);\n const gsEl = findChildElementOptional(child, \"gridSpan\");\n const gsVal = gsEl?.attributes[\"w:val\"] ?? gsEl?.attributes.val;\n if (gsVal) gridSpan = Number.parseInt(gsVal, 10) || undefined;\n\n const vmEl = findChildElementOptional(child, \"vMerge\");\n if (vmEl) {\n const vmVal = vmEl.attributes[\"w:val\"] ?? vmEl.attributes.val ?? \"continue\";\n verticalMerge = vmVal === \"restart\" ? \"restart\" : \"continue\";\n }\n } else if (name === \"p\") {\n children.push(parseParagraphElement(child));\n }\n }\n\n return {\n type: \"table_cell\",\n ...(propertiesXml ? { propertiesXml } : {}),\n ...(gridSpan ? { gridSpan } : {}),\n ...(verticalMerge ? { verticalMerge } : {}),\n children: children.length > 0 ? children : [{ type: \"paragraph\", children: [] }],\n };\n}\n\nfunction serializeElementToXml(element: XmlElementNode): string {\n const attrs = Object.entries(element.attributes)\n .map(([key, value]) => ` ${key}=\"${escapeXmlAttribute(value)}\"`)\n .join(\"\");\n const children = element.children\n .map((child) => {\n if (child.type === \"text\") {\n return escapeXmlText(child.text);\n }\n return serializeElementToXml(child);\n })\n .join(\"\");\n if (children.length === 0) {\n return `<${element.name}${attrs}/>`;\n }\n return `<${element.name}${attrs}>${children}</${element.name}>`;\n}\n\nfunction escapeXmlAttribute(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeXmlText(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n// ---- Minimal XML parser (same pattern as parse-numbering.ts) ----\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.trim().length > 0 || (text.length > 0 && stack.length > 1)) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) break;\n stack.pop();\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) break;\n\n const tagContent = xml.slice(cursor + 1, tagEnd);\n const selfClosing = tagContent.endsWith(\"/\");\n const normalized = selfClosing ? tagContent.slice(0, -1).trimEnd() : tagContent;\n\n const spaceIndex = normalized.search(/\\s/);\n const tagName = spaceIndex >= 0 ? normalized.slice(0, spaceIndex) : normalized;\n const attrString = spaceIndex >= 0 ? normalized.slice(spaceIndex + 1) : \"\";\n const attributes = parseAttributes(attrString);\n\n const element: XmlElementNode = {\n type: \"element\",\n name: tagName,\n attributes,\n children: [],\n };\n\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n return root;\n}\n\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const pattern = /([A-Za-z_:][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n for (const match of attrString.matchAll(pattern)) {\n const name = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (name) {\n attrs[name] = decodeXmlEntities(value);\n }\n }\n return attrs;\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) =>\n String.fromCodePoint(Number.parseInt(hex, 16)),\n );\n}\n","import type {\n ThemeColorScheme,\n ThemeDefinition,\n ThemeFontScheme,\n ResolvedTheme,\n} from \"../../model/canonical-document.ts\";\n\n// ---- XML node types (inline, no external dep) ----\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\n// ---- Well-known DrawingML color slot names ----\n\nconst COLOR_SLOTS = [\n \"dk1\",\n \"lt1\",\n \"dk2\",\n \"lt2\",\n \"accent1\",\n \"accent2\",\n \"accent3\",\n \"accent4\",\n \"accent5\",\n \"accent6\",\n \"hlink\",\n \"folHlink\",\n] as const;\n\n// ---- Public API ----\n\n/**\n * Parse a DrawingML theme1.xml part into a ThemeDefinition.\n * Returns an empty ThemeDefinition if the XML is empty or malformed.\n */\nexport function parseThemeXml(xml: string): ThemeDefinition {\n if (!xml.trim()) {\n return {};\n }\n\n const root = parseXml(xml);\n const themeElement = findChildElementOptional(root, \"theme\");\n if (!themeElement) {\n return {};\n }\n\n const themeName =\n themeElement.attributes[\"name\"] ??\n themeElement.attributes[\"a:name\"] ??\n undefined;\n\n const themeElements = findChildElementOptional(themeElement, \"themeElements\");\n if (!themeElements) {\n return { ...(themeName ? { name: themeName } : {}) };\n }\n\n const colorScheme = parseColorScheme(\n findChildElementOptional(themeElements, \"clrScheme\"),\n );\n const fontScheme = parseFontScheme(\n findChildElementOptional(themeElements, \"fontScheme\"),\n );\n\n const result: ThemeDefinition = {};\n if (themeName) {\n result.name = themeName;\n }\n if (colorScheme) {\n result.colorScheme = colorScheme;\n }\n if (fontScheme) {\n result.fontScheme = fontScheme;\n }\n\n return result;\n}\n\n/**\n * Resolve a ThemeDefinition into flattened runtime theme inputs.\n * Maps OOXML theme slot names to CSS-usable color values and font families.\n */\nexport function resolveTheme(theme: ThemeDefinition): ResolvedTheme {\n const colors: Record<string, string> = {};\n\n if (theme.colorScheme?.colors) {\n for (const [slot, value] of Object.entries(theme.colorScheme.colors)) {\n colors[slot] = value;\n }\n }\n\n return {\n colors,\n majorFont: theme.fontScheme?.majorFont,\n minorFont: theme.fontScheme?.minorFont,\n };\n}\n\n/**\n * Resolve a theme color reference (e.g. \"accent1\", \"dk1\") to a CSS color string.\n * Returns undefined if the theme does not contain the requested slot.\n */\nexport function resolveThemeColor(\n theme: ResolvedTheme | undefined,\n colorSlot: string,\n): string | undefined {\n return theme?.colors[colorSlot];\n}\n\n// ---- Internal helpers ----\n\nfunction parseColorScheme(\n element: XmlElementNode | undefined,\n): ThemeColorScheme | undefined {\n if (!element) {\n return undefined;\n }\n\n const schemeName =\n element.attributes[\"name\"] ?? element.attributes[\"a:name\"] ?? \"\";\n const colors: Record<string, string> = {};\n\n for (const slot of COLOR_SLOTS) {\n const slotElement = findChildElementOptional(element, slot);\n if (!slotElement) {\n continue;\n }\n\n const color = extractColorValue(slotElement);\n if (color) {\n colors[slot] = color;\n }\n }\n\n return { name: schemeName, colors };\n}\n\nfunction extractColorValue(slotElement: XmlElementNode): string | undefined {\n for (const child of slotElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n const name = localName(child.name);\n\n if (name === \"srgbClr\") {\n const val = child.attributes[\"val\"] ?? child.attributes[\"a:val\"] ?? \"\";\n if (val) {\n return `#${val.toUpperCase()}`;\n }\n } else if (name === \"sysClr\") {\n // Use lastClr as the resolved color value\n const lastClr =\n child.attributes[\"lastClr\"] ??\n child.attributes[\"a:lastClr\"] ??\n \"\";\n if (lastClr) {\n return `#${lastClr.toUpperCase()}`;\n }\n }\n }\n\n return undefined;\n}\n\nfunction parseFontScheme(\n element: XmlElementNode | undefined,\n): ThemeFontScheme | undefined {\n if (!element) {\n return undefined;\n }\n\n const schemeName =\n element.attributes[\"name\"] ?? element.attributes[\"a:name\"] ?? \"\";\n\n const majorFontElement = findChildElementOptional(element, \"majorFont\");\n const minorFontElement = findChildElementOptional(element, \"minorFont\");\n\n const majorFont = majorFontElement\n ? extractFontTypeface(majorFontElement)\n : undefined;\n const minorFont = minorFontElement\n ? extractFontTypeface(minorFontElement)\n : undefined;\n\n const result: ThemeFontScheme = { name: schemeName };\n if (majorFont) {\n result.majorFont = majorFont;\n }\n if (minorFont) {\n result.minorFont = minorFont;\n }\n\n return result;\n}\n\nfunction extractFontTypeface(\n fontGroupElement: XmlElementNode,\n): string | undefined {\n const latinElement = findChildElementOptional(fontGroupElement, \"latin\");\n if (latinElement) {\n return (\n latinElement.attributes[\"typeface\"] ??\n latinElement.attributes[\"a:typeface\"] ??\n undefined\n );\n }\n return undefined;\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const idx = name.indexOf(\":\");\n return idx >= 0 ? name.slice(idx + 1) : name;\n}\n\n// ---- Minimal XML parser ----\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.trim().length > 0 || (text.length > 0 && stack.length > 1)) {\n stack[stack.length - 1]?.children.push({ type: \"text\", text });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) break;\n stack.pop();\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) break;\n\n const tagContent = xml.slice(cursor + 1, tagEnd);\n const selfClosing = tagContent.endsWith(\"/\");\n const normalized = selfClosing ? tagContent.slice(0, -1).trimEnd() : tagContent;\n\n const spaceIndex = normalized.search(/\\s/);\n const tagName = spaceIndex >= 0 ? normalized.slice(0, spaceIndex) : normalized;\n const attrString = spaceIndex >= 0 ? normalized.slice(spaceIndex + 1) : \"\";\n const attributes = parseAttributes(attrString);\n\n const element: XmlElementNode = {\n type: \"element\",\n name: tagName,\n attributes,\n children: [],\n };\n\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n return root;\n}\n\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const pattern = /([A-Za-z_:][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n for (const match of attrString.matchAll(pattern)) {\n const name = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (name) {\n attrs[name] = decodeXmlEntities(value);\n }\n }\n return attrs;\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCodePoint(Number.parseInt(dec, 10)))\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) =>\n String.fromCodePoint(Number.parseInt(hex, 16)),\n );\n}\n","import type { DocumentSettings } from \"../../model/canonical-document.ts\";\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\nexport function parseSettingsXml(xml: string): DocumentSettings {\n if (!xml.trim()) {\n return {};\n }\n\n const root = parseXml(xml);\n const settingsElement = findChildElementOptional(root, \"settings\");\n if (!settingsElement) {\n return {};\n }\n\n const evenAndOddHeaders = findChildElementOptional(settingsElement, \"evenAndOddHeaders\");\n const zoom = findChildElementOptional(settingsElement, \"zoom\");\n\n return {\n ...(evenAndOddHeaders\n ? {\n evenAndOddHeaders: readOnOffValue(evenAndOddHeaders, true),\n }\n : {}),\n ...(zoom ? readZoomLevel(zoom) : {}),\n };\n}\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const idx = name.indexOf(\":\");\n return idx >= 0 ? name.slice(idx + 1) : name;\n}\n\nfunction readOnOffValue(\n element: XmlElementNode,\n defaultValue: boolean,\n): boolean {\n const value =\n element.attributes[\"w:val\"] ??\n element.attributes.val ??\n (defaultValue ? \"true\" : \"false\");\n return value !== \"0\" && value !== \"false\";\n}\n\nfunction readZoomLevel(\n element: XmlElementNode,\n): Pick<DocumentSettings, \"zoomLevel\"> {\n const rawValue = element.attributes[\"w:val\"] ?? element.attributes.val;\n if (rawValue === \"bestFit\") {\n return { zoomLevel: \"pageWidth\" };\n }\n if (rawValue === \"fullPage\") {\n return { zoomLevel: \"onePage\" };\n }\n\n const rawPercent =\n element.attributes[\"w:percent\"] ??\n element.attributes.percent;\n if (!rawPercent) {\n return {};\n }\n\n const normalizedPercent = rawPercent.trim().replace(/%$/u, \"\");\n const parsed = Number.parseInt(normalizedPercent, 10);\n if (!Number.isFinite(parsed)) {\n return {};\n }\n\n return { zoomLevel: parsed };\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n const nextLt = xml.indexOf(\"<\", cursor);\n if (nextLt < 0) {\n pushText(xml.slice(cursor));\n break;\n }\n\n if (nextLt > cursor) {\n pushText(xml.slice(cursor, nextLt));\n }\n\n if (xml.startsWith(\"</\", nextLt)) {\n const end = xml.indexOf(\">\", nextLt);\n if (end < 0) break;\n if (stack.length > 1) {\n stack.pop();\n }\n cursor = end + 1;\n continue;\n }\n\n const end = xml.indexOf(\">\", nextLt);\n if (end < 0) {\n break;\n }\n\n const rawTag = xml.slice(nextLt + 1, end).trim();\n const selfClosing = rawTag.endsWith(\"/\");\n const tagBody = selfClosing ? rawTag.slice(0, -1).trim() : rawTag;\n const spaceIndex = tagBody.search(/\\s/u);\n const name =\n spaceIndex >= 0 ? tagBody.slice(0, spaceIndex) : tagBody;\n const attrs = spaceIndex >= 0 ? tagBody.slice(spaceIndex + 1) : \"\";\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes: parseAttributes(attrs),\n children: [],\n };\n stack[stack.length - 1]?.children.push(element);\n if (!selfClosing) {\n stack.push(element);\n }\n cursor = end + 1;\n }\n\n return root;\n\n function pushText(raw: string): void {\n const normalized = raw.replace(/\\r\\n?/gu, \"\\n\");\n if (!normalized.trim()) {\n return;\n }\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: normalized,\n });\n }\n}\n\nfunction parseAttributes(raw: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const pattern = /([^\\s=]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n for (const match of raw.matchAll(pattern)) {\n const [, name, , dq, sq] = match;\n attributes[name] = dq ?? sq ?? \"\";\n }\n return attributes;\n}\n","/**\n * Parse styles.xml into the canonical StylesCatalog.\n *\n * Reads paragraph, character, and table style definitions plus latent-style\n * metadata from the package styles part. This makes styles.xml the canonical\n * source of style truth instead of synthesizing display names from referenced\n * styleId values.\n */\n\nimport type {\n CharacterStyleDefinition,\n LatentStyleDefinition,\n ParagraphStyleDefinition,\n StylesCatalog,\n TableStyleDefinition,\n} from \"../../model/canonical-document.ts\";\n\n// ---------------------------------------------------------------------------\n// Inline XML node types (same pattern as parse-numbering.ts)\n// ---------------------------------------------------------------------------\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\n// ---------------------------------------------------------------------------\n// Public interface\n// ---------------------------------------------------------------------------\n\nexport interface ParseStylesResult {\n catalog: StylesCatalog;\n /** True when the catalog was parsed from actual styles.xml content. */\n fromPackage: boolean;\n /** Diagnostic notes for logging/proof. */\n diagnostics: string[];\n}\n\n/**\n * Parse a styles.xml string into a canonical StylesCatalog.\n *\n * Returns `fromPackage: false` when the input is empty or structurally empty,\n * in which case the catalog fields will be empty records.\n */\nexport function parseStylesXml(xml: string): ParseStylesResult {\n const diagnostics: string[] = [];\n\n if (!xml || xml.trim().length === 0) {\n diagnostics.push(\"styles.xml is empty; synthetic fallback will be used\");\n return {\n catalog: { paragraphs: {}, characters: {}, tables: {} },\n fromPackage: false,\n diagnostics,\n };\n }\n\n let root: XmlElementNode;\n try {\n root = parseXml(xml);\n } catch {\n diagnostics.push(\"styles.xml could not be parsed; synthetic fallback will be used\");\n return {\n catalog: { paragraphs: {}, characters: {}, tables: {} },\n fromPackage: false,\n diagnostics,\n };\n }\n\n const stylesElement = findChildElementOptional(root, \"styles\");\n if (!stylesElement) {\n diagnostics.push(\"styles.xml has no <w:styles> root; synthetic fallback will be used\");\n return {\n catalog: { paragraphs: {}, characters: {}, tables: {} },\n fromPackage: false,\n diagnostics,\n };\n }\n\n const paragraphs: Record<string, ParagraphStyleDefinition> = {};\n const characters: Record<string, CharacterStyleDefinition> = {};\n const tables: Record<string, TableStyleDefinition> = {};\n const latentStyles: Record<string, LatentStyleDefinition> = {};\n\n for (const child of stylesElement.children) {\n if (child.type !== \"element\") continue;\n const local = localName(child.name);\n\n if (local === \"style\") {\n const styleType = child.attributes[\"w:type\"] ?? child.attributes.type;\n const styleId = child.attributes[\"w:styleId\"] ?? child.attributes.styleId;\n if (!styleId) continue;\n\n const displayName = readStyleDisplayName(child) ?? styleId;\n const basedOn = readLinkedStyleId(child, \"basedOn\");\n const isDefault = (child.attributes[\"w:default\"] ?? child.attributes.default) === \"1\";\n\n switch (styleType) {\n case \"paragraph\": {\n const nextStyle = readLinkedStyleId(child, \"next\");\n const outlineLevel = readParagraphStyleOutlineLevel(child);\n paragraphs[styleId] = {\n styleId,\n displayName,\n kind: \"paragraph\",\n isDefault,\n ...(basedOn ? { basedOn } : {}),\n ...(nextStyle ? { nextStyle } : {}),\n ...(outlineLevel !== undefined ? { outlineLevel } : {}),\n };\n break;\n }\n case \"character\": {\n characters[styleId] = {\n styleId,\n displayName,\n kind: \"character\",\n isDefault,\n ...(basedOn ? { basedOn } : {}),\n };\n break;\n }\n case \"table\": {\n tables[styleId] = {\n styleId,\n displayName,\n kind: \"table\",\n isDefault,\n ...(basedOn ? { basedOn } : {}),\n };\n break;\n }\n default:\n // numbering/list styles are not part of the canonical catalog\n break;\n }\n } else if (local === \"latentStyles\") {\n readLatentStyles(child, latentStyles);\n }\n }\n\n const hasLatent = Object.keys(latentStyles).length > 0;\n diagnostics.push(\n `parsed ${Object.keys(paragraphs).length} paragraph, ` +\n `${Object.keys(characters).length} character, ` +\n `${Object.keys(tables).length} table styles` +\n (hasLatent ? `, ${Object.keys(latentStyles).length} latent styles` : \"\"),\n );\n\n return {\n catalog: {\n paragraphs,\n characters,\n tables,\n ...(hasLatent ? { latentStyles } : {}),\n },\n fromPackage: true,\n diagnostics,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction readStyleDisplayName(styleNode: XmlElementNode): string | undefined {\n const nameEl = findChildElementOptional(styleNode, \"name\");\n if (!nameEl) return undefined;\n return nameEl.attributes[\"w:val\"] ?? nameEl.attributes.val ?? undefined;\n}\n\nfunction readLinkedStyleId(\n styleNode: XmlElementNode,\n elementLocalName: string,\n): string | undefined {\n const el = findChildElementOptional(styleNode, elementLocalName);\n if (!el) return undefined;\n return el.attributes[\"w:val\"] ?? el.attributes.val ?? undefined;\n}\n\nfunction readParagraphStyleOutlineLevel(\n styleNode: XmlElementNode,\n): number | undefined {\n const paragraphProperties = findChildElementOptional(styleNode, \"pPr\");\n if (!paragraphProperties) {\n return undefined;\n }\n\n const outlineLevel = findChildElementOptional(paragraphProperties, \"outlineLvl\");\n if (!outlineLevel) {\n return undefined;\n }\n\n const rawValue = outlineLevel.attributes[\"w:val\"] ?? outlineLevel.attributes.val;\n const parsed = rawValue !== undefined ? Number.parseInt(rawValue, 10) : Number.NaN;\n return Number.isInteger(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nfunction readLatentStyles(\n latentNode: XmlElementNode,\n out: Record<string, LatentStyleDefinition>,\n): void {\n for (const child of latentNode.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"lsdException\") continue;\n\n const name = child.attributes[\"w:name\"] ?? child.attributes.name;\n if (!name) continue;\n\n const locked = readBoolAttr(child, \"locked\");\n const semiHidden = readBoolAttr(child, \"semiHidden\");\n const unhideWhenUsed = readBoolAttr(child, \"unhideWhenUsed\");\n const qFormat = readBoolAttr(child, \"qFormat\");\n const rawPriority = child.attributes[\"w:uiPriority\"] ?? child.attributes.uiPriority;\n const uiPriority = rawPriority !== undefined ? Number.parseInt(rawPriority, 10) : undefined;\n\n out[name] = {\n name,\n ...(locked !== undefined ? { locked } : {}),\n ...(semiHidden !== undefined ? { semiHidden } : {}),\n ...(unhideWhenUsed !== undefined ? { unhideWhenUsed } : {}),\n ...(qFormat !== undefined ? { qFormat } : {}),\n ...(uiPriority !== undefined && !Number.isNaN(uiPriority) ? { uiPriority } : {}),\n };\n }\n}\n\nfunction readBoolAttr(node: XmlElementNode, attrLocalName: string): boolean | undefined {\n const val = node.attributes[`w:${attrLocalName}`] ?? node.attributes[attrLocalName];\n if (val === undefined) return undefined;\n return val === \"1\" || val === \"true\";\n}\n\n// ---------------------------------------------------------------------------\n// Inline XML parser (same implementation as parse-numbering.ts)\n// ---------------------------------------------------------------------------\n\nfunction findChildElementOptional(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nfunction localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const end = xml.indexOf(\">\", cursor);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing closing >.\");\n }\n\n const name = xml.slice(cursor + 2, end).trim();\n const current = stack.pop();\n if (!current || localName(current.name) !== localName(name)) {\n throw new Error(`Malformed XML: unexpected closing tag </${name}>.`);\n }\n\n cursor = end + 1;\n continue;\n }\n\n const tagEnd = findTagEnd(xml, cursor);\n const tagBody = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(tagBody);\n const { name, attributes } = parseTag(tagBody.replace(/\\/\\s*$/, \"\").trim());\n const element: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n };\n stack[stack.length - 1]?.children.push(element);\n\n if (!selfClosing) {\n stack.push(element);\n }\n\n cursor = tagEnd + 1;\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n let cursor = 0;\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const nameStart = cursor;\n while (cursor < tagBody.length && !/\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const name = tagBody.slice(nameStart, cursor);\n const attributes: Record<string, string> = {};\n\n while (cursor < tagBody.length) {\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n if (cursor >= tagBody.length) {\n break;\n }\n\n const keyStart = cursor;\n while (cursor < tagBody.length && !/[\\s=]/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n const key = tagBody.slice(keyStart, cursor);\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n if (tagBody[cursor] !== \"=\") {\n attributes[key] = \"\";\n continue;\n }\n cursor += 1;\n\n while (cursor < tagBody.length && /\\s/.test(tagBody[cursor] ?? \"\")) {\n cursor += 1;\n }\n\n const quote = tagBody[cursor];\n if (quote !== `\"` && quote !== `'`) {\n throw new Error(`Malformed XML attribute ${key}.`);\n }\n cursor += 1;\n\n const valueStart = cursor;\n while (cursor < tagBody.length && tagBody[cursor] !== quote) {\n cursor += 1;\n }\n const rawValue = tagBody.slice(valueStart, cursor);\n attributes[key] = decodeXmlEntities(rawValue);\n cursor += 1;\n }\n\n return { name, attributes };\n}\n\nfunction findTagEnd(xml: string, start: number): number {\n let cursor = start + 1;\n let quote: string | null = null;\n\n while (cursor < xml.length) {\n const current = xml[cursor];\n if (quote) {\n if (current === quote) {\n quote = null;\n }\n cursor += 1;\n continue;\n }\n\n if (current === `\"` || current === `'`) {\n quote = current;\n cursor += 1;\n continue;\n }\n\n if (current === \">\") {\n return cursor;\n }\n\n cursor += 1;\n }\n\n throw new Error(\"Malformed XML: missing >.\");\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value.replace(/&(#x[0-9a-fA-F]+|#\\d+|amp|lt|gt|quot|apos);/g, (match, entity) => {\n switch (entity) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return `\"`;\n case \"apos\":\n return \"'\";\n default:\n if (entity.startsWith(\"#x\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(2), 16));\n }\n if (entity.startsWith(\"#\")) {\n return String.fromCodePoint(Number.parseInt(entity.slice(1), 10));\n }\n return match;\n }\n });\n}\n","import type {\n BlockNode,\n FooterDocument,\n HeaderDocument,\n InlineNode,\n ParagraphNode,\n TableCellNode,\n TableNode,\n TableRowNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\nexport const WORD_HEADER_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.header+xml\";\nexport const WORD_FOOTER_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\";\n\nconst W_NS = `xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"`;\nconst R_NS = `xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"`;\nconst MC_NS = `xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"`;\nconst O_NS = `xmlns:o=\"urn:schemas-microsoft-com:office:office\"`;\nconst V_NS = `xmlns:v=\"urn:schemas-microsoft-com:vml\"`;\nconst WP_NS = `xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"`;\nconst WPS_NS = `xmlns:wps=\"http://schemas.microsoft.com/office/word/2010/wordprocessingShape\"`;\nconst A_NS = `xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\"`;\nconst W10_NS = `xmlns:w10=\"urn:schemas-microsoft-com:office:word\"`;\nconst W14_NS = `xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\"`;\nconst W15_NS = `xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\"`;\nconst WP14_NS = `xmlns:wp14=\"http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing\"`;\nconst EXTENDED_ROOT_ATTRS = `${MC_NS} ${O_NS} ${V_NS} ${WP_NS} ${WPS_NS} ${A_NS} ${W10_NS} ${W14_NS} ${W15_NS} ${WP14_NS} mc:Ignorable=\"wps wp14 w14 w15\"`;\n\n/**\n * Serialize a HeaderDocument into a headerN.xml string.\n */\nexport function serializeHeaderXml(header: HeaderDocument): string {\n const body = serializeBlocks(header.blocks);\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:hdr ${W_NS} ${R_NS} ${EXTENDED_ROOT_ATTRS}>${body}</w:hdr>`,\n ].join(\"\\n\");\n}\n\n/**\n * Serialize a FooterDocument into a footerN.xml string.\n */\nexport function serializeFooterXml(footer: FooterDocument): string {\n const body = serializeBlocks(footer.blocks);\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:ftr ${W_NS} ${R_NS} ${EXTENDED_ROOT_ATTRS}>${body}</w:ftr>`,\n ].join(\"\\n\");\n}\n\n// ---- Internal serialization ----\n\nfunction serializeBlocks(\n blocks: HeaderDocument[\"blocks\"] | FooterDocument[\"blocks\"],\n): string {\n if (blocks.length === 0) {\n // A valid header/footer must have at least one paragraph\n return `<w:p><w:r><w:t></w:t></w:r></w:p>`;\n }\n\n return blocks\n .map((block) => {\n if (block.type === \"paragraph\") {\n return serializeParagraph(block);\n }\n if (block.type === \"table\") {\n return serializeTable(block);\n }\n if (block.type === \"opaque_block\" && typeof block.rawXml === \"string\") {\n return block.rawXml;\n }\n throw new Error(`Cannot safely serialize ${block.type} content in header/footer sub-parts.`);\n })\n .join(\"\");\n}\n\nfunction serializeParagraph(paragraph: ParagraphNode): string {\n let xml = \"<w:p>\";\n\n const propertiesXml = buildParagraphPropertiesXml(paragraph);\n if (propertiesXml) {\n xml += propertiesXml;\n }\n\n const childrenXml = paragraph.children\n .map((child) => serializeInlineNode(child))\n .join(\"\");\n xml += childrenXml || \"<w:r><w:t></w:t></w:r>\";\n xml += \"</w:p>\";\n\n return xml;\n}\n\nfunction serializeTable(table: TableNode): string {\n let xml = \"<w:tbl>\";\n if (table.propertiesXml) {\n xml += table.propertiesXml;\n }\n if (table.gridColumns.length > 0) {\n xml += \"<w:tblGrid>\";\n for (const width of table.gridColumns) {\n xml += `<w:gridCol w:w=\"${width}\"/>`;\n }\n xml += \"</w:tblGrid>\";\n }\n for (const row of table.rows) {\n xml += serializeTableRow(row);\n }\n xml += \"</w:tbl>\";\n return xml;\n}\n\nfunction serializeTableRow(row: TableRowNode): string {\n let xml = \"<w:tr>\";\n if (row.propertiesXml) {\n xml += wrapPropertiesXml(\"w:trPr\", row.propertiesXml);\n }\n for (const cell of row.cells) {\n xml += serializeTableCell(cell);\n }\n xml += \"</w:tr>\";\n return xml;\n}\n\nfunction serializeTableCell(cell: TableCellNode): string {\n let xml = \"<w:tc>\";\n const propertiesXml = buildTableCellPropertiesXml(cell);\n if (propertiesXml) {\n xml += propertiesXml;\n }\n for (const child of cell.children) {\n if (child.type === \"paragraph\") {\n xml += serializeParagraph(child);\n } else {\n throw new Error(`Cannot safely serialize ${child.type} content in header/footer table cells.`);\n }\n }\n xml += \"</w:tc>\";\n return xml;\n}\n\nfunction buildParagraphPropertiesXml(paragraph: ParagraphNode): string {\n const parts: string[] = [];\n\n if (paragraph.styleId) {\n parts.push(`<w:pStyle w:val=\"${escapeAttribute(paragraph.styleId)}\"/>`);\n }\n if (paragraph.spacing) {\n const s = paragraph.spacing;\n const attrs: string[] = [];\n if (s.before !== undefined) attrs.push(`w:before=\"${s.before}\"`);\n if (s.after !== undefined) attrs.push(`w:after=\"${s.after}\"`);\n if (s.line !== undefined) attrs.push(`w:line=\"${s.line}\"`);\n if (s.lineRule) attrs.push(`w:lineRule=\"${escapeAttribute(s.lineRule)}\"`);\n if (attrs.length > 0) parts.push(`<w:spacing ${attrs.join(\" \")}/>`);\n }\n if (paragraph.indentation) {\n const ind = paragraph.indentation;\n const attrs: string[] = [];\n if (ind.left !== undefined) attrs.push(`w:left=\"${ind.left}\"`);\n if (ind.right !== undefined) attrs.push(`w:right=\"${ind.right}\"`);\n if (ind.firstLine !== undefined) attrs.push(`w:firstLine=\"${ind.firstLine}\"`);\n if (ind.hanging !== undefined) attrs.push(`w:hanging=\"${ind.hanging}\"`);\n if (attrs.length > 0) parts.push(`<w:ind ${attrs.join(\" \")}/>`);\n }\n if (paragraph.alignment) {\n parts.push(`<w:jc w:val=\"${escapeAttribute(paragraph.alignment)}\"/>`);\n }\n if (paragraph.tabStops && paragraph.tabStops.length > 0) {\n const tabsXml = paragraph.tabStops.map((tab) => {\n const leaderAttr = tab.leader ? ` w:leader=\"${escapeAttribute(tab.leader)}\"` : \"\";\n return `<w:tab w:val=\"${tab.align}\" w:pos=\"${tab.position}\"${leaderAttr}/>`;\n }).join(\"\");\n parts.push(`<w:tabs>${tabsXml}</w:tabs>`);\n }\n\n return parts.length > 0 ? `<w:pPr>${parts.join(\"\")}</w:pPr>` : \"\";\n}\n\nfunction serializeInlineNode(node: InlineNode): string {\n switch (node.type) {\n case \"text\": {\n const properties = buildRunPropertiesXml(node.marks);\n const preserve = requiresPreservedSpace(node.text)\n ? ` xml:space=\"preserve\"`\n : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(node.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n return `<w:r><w:rPr><w:rStyle w:val=\"${node.noteKind === \"footnote\" ? \"FootnoteReference\" : \"EndnoteReference\"}\"/></w:rPr>${refElement}</w:r>`;\n }\n case \"bookmark_start\":\n return `<w:bookmarkStart w:id=\"${escapeAttribute(node.bookmarkId)}\" w:name=\"${escapeAttribute(node.name)}\"/>`;\n case \"bookmark_end\":\n return `<w:bookmarkEnd w:id=\"${escapeAttribute(node.bookmarkId)}\"/>`;\n case \"field\":\n if (node.children && node.children.length > 0) {\n const childrenXml = node.children.map((child) => serializeInlineNode(child)).join(\"\");\n if (node.fieldType === \"complex\") {\n return (\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\">${escapeXml(node.instruction)}</w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n childrenXml +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`\n );\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">${childrenXml}</w:fldSimple>`;\n }\n if (node.fieldType === \"simple\") {\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n }\n return `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r><w:r><w:instrText xml:space=\"preserve\">${escapeXml(node.instruction)}</w:instrText></w:r><w:r><w:fldChar w:fldCharType=\"separate\"/></w:r><w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`;\n case \"hyperlink\":\n return serializeHyperlinkNode(node);\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n return wrapInlineRawXml(node.rawXml);\n case \"opaque_inline\":\n throw new Error(`Cannot safely serialize ${node.type} content in header/footer sub-parts.`);\n case \"image\":\n case \"column_break\":\n case \"symbol\":\n default:\n throw new Error(`Cannot safely serialize ${node.type} content in header/footer sub-parts.`);\n }\n}\n\nfunction wrapInlineRawXml(rawXml: string): string {\n const trimmed = rawXml.trimStart();\n return trimmed.startsWith(\"<w:r\") ? rawXml : `<w:r>${rawXml}</w:r>`;\n}\n\nfunction buildRunPropertiesXml(marks: TextMark[] | undefined): string {\n if (!marks || marks.length === 0) {\n return \"\";\n }\n\n const parts: string[] = [];\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n parts.push(\"<w:b/>\");\n break;\n case \"italic\":\n parts.push(\"<w:i/>\");\n break;\n case \"underline\":\n parts.push(\"<w:u w:val=\\\"single\\\"/>\");\n break;\n case \"strikethrough\":\n parts.push(\"<w:strike/>\");\n break;\n case \"doubleStrikethrough\":\n parts.push(\"<w:dstrike/>\");\n break;\n case \"fontFamily\":\n parts.push(`<w:rFonts w:ascii=\"${escapeAttribute(mark.val)}\" w:hAnsi=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"fontSize\":\n parts.push(`<w:sz w:val=\"${mark.val}\"/>`);\n break;\n case \"textColor\":\n parts.push(`<w:color w:val=\"${escapeAttribute(mark.color)}\"/>`);\n break;\n case \"highlight\":\n parts.push(`<w:highlight w:val=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"backgroundColor\":\n parts.push(`<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${escapeAttribute(mark.color)}\"/>`);\n break;\n case \"smallCaps\":\n parts.push(\"<w:smallCaps/>\");\n break;\n case \"allCaps\":\n parts.push(\"<w:caps/>\");\n break;\n default:\n // Marks outside the secondary-story contract are silently dropped\n // to avoid export failure on content the parser extracted safely.\n break;\n }\n }\n\n return parts.length > 0 ? `<w:rPr>${parts.join(\"\")}</w:rPr>` : \"\";\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return (\n text.length > 0 &&\n (text[0] === \" \" || text[text.length - 1] === \" \" || text.includes(\" \"))\n );\n}\n\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\nfunction serializeHyperlinkNode(node: Extract<InlineNode, { type: \"hyperlink\" }>): string {\n const childrenXml = node.children.map((child) => serializeInlineNode(child)).join(\"\");\n if (node.href.startsWith(\"#\")) {\n return `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">${childrenXml}</w:hyperlink>`;\n }\n if (!/^rId[A-Za-z0-9._-]+$/u.test(node.href)) {\n throw new Error(\"Cannot safely serialize URL-backed header/footer hyperlinks without relationship context.\");\n }\n return `<w:hyperlink r:id=\"${escapeAttribute(node.href)}\">${childrenXml}</w:hyperlink>`;\n}\n\nfunction wrapPropertiesXml(tagName: \"w:trPr\" | \"w:tcPr\", xml: string): string {\n const trimmed = xml.trim();\n if (trimmed.startsWith(`<${tagName}`)) {\n return trimmed;\n }\n return `<${tagName}>${trimmed}</${tagName}>`;\n}\n\nfunction extractWrappedChildren(tagName: \"w:tcPr\", xml: string | undefined): string {\n if (!xml) {\n return \"\";\n }\n const trimmed = xml.trim();\n const wrapped = new RegExp(`^<${tagName}\\\\b[^>]*>([\\\\s\\\\S]*)</${tagName}>$`, \"u\").exec(trimmed);\n return wrapped?.[1] ?? trimmed;\n}\n\nfunction buildTableCellPropertiesXml(cell: TableCellNode): string {\n const innerXml = extractWrappedChildren(\"w:tcPr\", cell.propertiesXml)\n .replace(/<w:gridSpan\\b[^>]*\\/>/gu, \"\")\n .replace(/<w:vMerge\\b[^>]*\\/>/gu, \"\")\n .trim();\n const parts: string[] = [];\n if (cell.gridSpan && cell.gridSpan > 1) {\n parts.push(`<w:gridSpan w:val=\"${cell.gridSpan}\"/>`);\n }\n if (cell.verticalMerge) {\n parts.push(\n cell.verticalMerge === \"restart\"\n ? `<w:vMerge w:val=\"restart\"/>`\n : `<w:vMerge/>`,\n );\n }\n if (innerXml.length > 0) {\n parts.push(innerXml);\n }\n return parts.length > 0 ? `<w:tcPr>${parts.join(\"\")}</w:tcPr>` : \"\";\n}\n","import type {\n FootnoteCollection,\n FootnoteDefinition,\n InlineNode,\n ParagraphNode,\n TableCellNode,\n TableNode,\n TableRowNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\n\nexport const WORD_FOOTNOTES_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml\";\nexport const WORD_ENDNOTES_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml\";\n\nconst W_NS = `xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\"`;\nconst R_NS = `xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"`;\n\n/**\n * Serialize the footnotes portion of a FootnoteCollection to footnotes.xml.\n * Includes the required separator and continuation-separator stubs.\n */\nexport function serializeFootnotesXml(collection: FootnoteCollection): string {\n const entries = Object.values(collection.footnotes).sort(compareNoteIds);\n const body = [\n serializeSeparatorStub(\"footnote\", \"-1\", \"separator\"),\n serializeSeparatorStub(\"footnote\", \"0\", \"continuationSeparator\"),\n ...entries.map((entry) => serializeNoteDefinition(\"footnote\", entry)),\n ].join(\"\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:footnotes ${W_NS} ${R_NS}>${body}</w:footnotes>`,\n ].join(\"\\n\");\n}\n\n/**\n * Serialize the endnotes portion of a FootnoteCollection to endnotes.xml.\n * Includes the required separator and continuation-separator stubs.\n */\nexport function serializeEndnotesXml(collection: FootnoteCollection): string {\n const entries = Object.values(collection.endnotes).sort(compareNoteIds);\n const body = [\n serializeSeparatorStub(\"endnote\", \"-1\", \"separator\"),\n serializeSeparatorStub(\"endnote\", \"0\", \"continuationSeparator\"),\n ...entries.map((entry) => serializeNoteDefinition(\"endnote\", entry)),\n ].join(\"\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:endnotes ${W_NS} ${R_NS}>${body}</w:endnotes>`,\n ].join(\"\\n\");\n}\n\n// ---- Internal serialization ----\n\nfunction serializeSeparatorStub(\n kind: \"footnote\" | \"endnote\",\n id: string,\n type: \"separator\" | \"continuationSeparator\",\n): string {\n const tag = kind === \"footnote\" ? \"w:footnote\" : \"w:endnote\";\n return `<${tag} w:type=\"${type}\" w:id=\"${id}\"><w:p/></${tag}>`;\n}\n\nfunction serializeNoteDefinition(\n kind: \"footnote\" | \"endnote\",\n definition: FootnoteDefinition,\n): string {\n const tag = kind === \"footnote\" ? \"w:footnote\" : \"w:endnote\";\n const blocks = definition.blocks\n .map((block) => {\n if (block.type === \"paragraph\") {\n return serializeParagraph(block);\n }\n if (block.type === \"table\") {\n return serializeTable(block);\n }\n if (block.type === \"opaque_block\" && typeof block.rawXml === \"string\") {\n return block.rawXml;\n }\n throw new Error(`Cannot safely serialize ${block.type} content in note sub-parts.`);\n })\n .join(\"\");\n\n const body = blocks || `<w:p><w:r><w:t></w:t></w:r></w:p>`;\n return `<${tag} w:id=\"${escapeAttribute(definition.noteId)}\">${body}</${tag}>`;\n}\n\nfunction serializeParagraph(paragraph: ParagraphNode): string {\n let xml = \"<w:p>\";\n\n const propertiesXml = buildParagraphPropertiesXml(paragraph);\n if (propertiesXml) {\n xml += propertiesXml;\n }\n\n const childrenXml = paragraph.children\n .map((child) => serializeInlineNode(child))\n .join(\"\");\n xml += childrenXml || \"<w:r><w:t></w:t></w:r>\";\n xml += \"</w:p>\";\n\n return xml;\n}\n\nfunction serializeTable(table: TableNode): string {\n let xml = \"<w:tbl>\";\n if (table.propertiesXml) {\n xml += table.propertiesXml;\n }\n if (table.gridColumns.length > 0) {\n xml += \"<w:tblGrid>\";\n for (const width of table.gridColumns) {\n xml += `<w:gridCol w:w=\"${width}\"/>`;\n }\n xml += \"</w:tblGrid>\";\n }\n for (const row of table.rows) {\n xml += serializeTableRow(row);\n }\n xml += \"</w:tbl>\";\n return xml;\n}\n\nfunction serializeTableRow(row: TableRowNode): string {\n let xml = \"<w:tr>\";\n if (row.propertiesXml) {\n xml += wrapPropertiesXml(\"w:trPr\", row.propertiesXml);\n }\n for (const cell of row.cells) {\n xml += serializeTableCell(cell);\n }\n xml += \"</w:tr>\";\n return xml;\n}\n\nfunction serializeTableCell(cell: TableCellNode): string {\n let xml = \"<w:tc>\";\n const propertiesXml = buildTableCellPropertiesXml(cell);\n if (propertiesXml) {\n xml += propertiesXml;\n }\n for (const child of cell.children) {\n if (child.type === \"paragraph\") {\n xml += serializeParagraph(child);\n } else {\n throw new Error(`Cannot safely serialize ${child.type} content in note table cells.`);\n }\n }\n xml += \"</w:tc>\";\n return xml;\n}\n\nfunction buildParagraphPropertiesXml(paragraph: ParagraphNode): string {\n const parts: string[] = [];\n\n if (paragraph.styleId) {\n parts.push(`<w:pStyle w:val=\"${escapeAttribute(paragraph.styleId)}\"/>`);\n }\n if (paragraph.alignment) {\n parts.push(`<w:jc w:val=\"${escapeAttribute(paragraph.alignment)}\"/>`);\n }\n if (paragraph.spacing) {\n const attrs: string[] = [];\n if (paragraph.spacing.before !== undefined) attrs.push(`w:before=\"${paragraph.spacing.before}\"`);\n if (paragraph.spacing.after !== undefined) attrs.push(`w:after=\"${paragraph.spacing.after}\"`);\n if (paragraph.spacing.line !== undefined) attrs.push(`w:line=\"${paragraph.spacing.line}\"`);\n if (paragraph.spacing.lineRule) attrs.push(`w:lineRule=\"${escapeAttribute(paragraph.spacing.lineRule)}\"`);\n if (attrs.length > 0) {\n parts.push(`<w:spacing ${attrs.join(\" \")}/>`);\n }\n }\n if (paragraph.indentation) {\n const attrs: string[] = [];\n if (paragraph.indentation.left !== undefined) attrs.push(`w:left=\"${paragraph.indentation.left}\"`);\n if (paragraph.indentation.right !== undefined) attrs.push(`w:right=\"${paragraph.indentation.right}\"`);\n if (paragraph.indentation.firstLine !== undefined) attrs.push(`w:firstLine=\"${paragraph.indentation.firstLine}\"`);\n if (paragraph.indentation.hanging !== undefined) attrs.push(`w:hanging=\"${paragraph.indentation.hanging}\"`);\n if (attrs.length > 0) {\n parts.push(`<w:ind ${attrs.join(\" \")}/>`);\n }\n }\n\n return parts.length > 0 ? `<w:pPr>${parts.join(\"\")}</w:pPr>` : \"\";\n}\n\nfunction serializeInlineNode(node: InlineNode): string {\n switch (node.type) {\n case \"text\": {\n const properties = buildRunPropertiesXml(node.marks);\n const preserve = requiresPreservedSpace(node.text)\n ? ` xml:space=\"preserve\"`\n : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(node.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n const styleVal =\n node.noteKind === \"footnote\"\n ? \"FootnoteReference\"\n : \"EndnoteReference\";\n return `<w:r><w:rPr><w:rStyle w:val=\"${styleVal}\"/></w:rPr>${refElement}</w:r>`;\n }\n case \"bookmark_start\":\n return `<w:bookmarkStart w:id=\"${escapeAttribute(node.bookmarkId)}\" w:name=\"${escapeAttribute(node.name)}\"/>`;\n case \"bookmark_end\":\n return `<w:bookmarkEnd w:id=\"${escapeAttribute(node.bookmarkId)}\"/>`;\n case \"field\":\n if (node.children && node.children.length > 0) {\n const childrenXml = node.children.map((child) => serializeInlineNode(child)).join(\"\");\n if (node.fieldType === \"complex\") {\n return (\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\">${escapeXml(node.instruction)}</w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n childrenXml +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`\n );\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">${childrenXml}</w:fldSimple>`;\n }\n if (node.fieldType === \"simple\") {\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n }\n return (\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\">${escapeXml(node.instruction)}</w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`\n );\n case \"hyperlink\":\n return serializeHyperlinkNode(node);\n case \"field\":\n if (node.children && node.children.length > 0) {\n const childrenXml = node.children.map((child) => serializeInlineNode(child)).join(\"\");\n if (node.fieldType === \"complex\") {\n return (\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\">${escapeXml(node.instruction)}</w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n childrenXml +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`\n );\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">${childrenXml}</w:fldSimple>`;\n }\n if (node.fieldType === \"simple\") {\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n }\n return (\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\">${escapeXml(node.instruction)}</w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`\n );\n case \"hyperlink\":\n return serializeHyperlinkNode(node);\n case \"opaque_inline\":\n throw new Error(`Cannot safely serialize ${node.type} content in note sub-parts.`);\n default:\n throw new Error(`Cannot safely serialize ${node.type} content in note sub-parts.`);\n }\n}\n\nfunction buildRunPropertiesXml(marks: TextMark[] | undefined): string {\n if (!marks || marks.length === 0) {\n return \"\";\n }\n\n const parts: string[] = [];\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n parts.push(\"<w:b/>\");\n break;\n case \"italic\":\n parts.push(\"<w:i/>\");\n break;\n case \"underline\":\n parts.push(\"<w:u w:val=\\\"single\\\"/>\");\n break;\n case \"strikethrough\":\n parts.push(\"<w:strike/>\");\n break;\n case \"doubleStrikethrough\":\n parts.push(\"<w:dstrike/>\");\n break;\n case \"fontFamily\":\n parts.push(\n `<w:rFonts w:ascii=\"${escapeAttribute(mark.val)}\" w:hAnsi=\"${escapeAttribute(mark.val)}\"/>`,\n );\n break;\n case \"fontSize\":\n parts.push(`<w:sz w:val=\"${mark.val}\"/>`);\n break;\n case \"textColor\":\n parts.push(`<w:color w:val=\"${escapeAttribute(mark.color)}\"/>`);\n break;\n case \"smallCaps\":\n parts.push(\"<w:smallCaps/>\");\n break;\n case \"allCaps\":\n parts.push(\"<w:caps/>\");\n break;\n default:\n throw new Error(`Cannot safely serialize ${mark.type} marks in note sub-parts.`);\n }\n }\n\n return parts.length > 0 ? `<w:rPr>${parts.join(\"\")}</w:rPr>` : \"\";\n}\n\nfunction compareNoteIds(\n left: FootnoteDefinition,\n right: FootnoteDefinition,\n): number {\n return Number.parseInt(left.noteId, 10) - Number.parseInt(right.noteId, 10);\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return (\n text.length > 0 &&\n (text[0] === \" \" || text[text.length - 1] === \" \" || text.includes(\" \"))\n );\n}\n\nfunction escapeXml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\nfunction serializeHyperlinkNode(node: Extract<InlineNode, { type: \"hyperlink\" }>): string {\n const childrenXml = node.children.map((child) => serializeInlineNode(child)).join(\"\");\n if (node.href.startsWith(\"#\")) {\n return `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">${childrenXml}</w:hyperlink>`;\n }\n if (!/^rId[A-Za-z0-9._-]+$/u.test(node.href)) {\n throw new Error(\"Cannot safely serialize URL-backed note hyperlinks without relationship context.\");\n }\n return `<w:hyperlink r:id=\"${escapeAttribute(node.href)}\">${childrenXml}</w:hyperlink>`;\n}\n\nfunction wrapPropertiesXml(tagName: \"w:trPr\" | \"w:tcPr\", xml: string): string {\n const trimmed = xml.trim();\n if (trimmed.startsWith(`<${tagName}`)) {\n return trimmed;\n }\n return `<${tagName}>${trimmed}</${tagName}>`;\n}\n\nfunction extractWrappedChildren(tagName: \"w:tcPr\", xml: string | undefined): string {\n if (!xml) {\n return \"\";\n }\n const trimmed = xml.trim();\n const wrapped = new RegExp(`^<${tagName}\\\\b[^>]*>([\\\\s\\\\S]*)</${tagName}>$`, \"u\").exec(trimmed);\n return wrapped?.[1] ?? trimmed;\n}\n\nfunction buildTableCellPropertiesXml(cell: TableCellNode): string {\n const innerXml = extractWrappedChildren(\"w:tcPr\", cell.propertiesXml)\n .replace(/<w:gridSpan\\b[^>]*\\/>/gu, \"\")\n .replace(/<w:vMerge\\b[^>]*\\/>/gu, \"\")\n .trim();\n const parts: string[] = [];\n if (cell.gridSpan && cell.gridSpan > 1) {\n parts.push(`<w:gridSpan w:val=\"${cell.gridSpan}\"/>`);\n }\n if (cell.verticalMerge) {\n parts.push(\n cell.verticalMerge === \"restart\"\n ? `<w:vMerge w:val=\"restart\"/>`\n : `<w:vMerge/>`,\n );\n }\n if (innerXml.length > 0) {\n parts.push(innerXml);\n }\n return parts.length > 0 ? `<w:tcPr>${parts.join(\"\")}</w:tcPr>` : \"\";\n}\n","import type { PersistedSourcePackage } from \"../model/snapshot.ts\";\nimport { DOCX_MIME_TYPE } from \"./opc/docx-package.ts\";\n\nconst SHA256_INITIAL_STATE = [\n 0x6a09e667,\n 0xbb67ae85,\n 0x3c6ef372,\n 0xa54ff53a,\n 0x510e527f,\n 0x9b05688c,\n 0x1f83d9ab,\n 0x5be0cd19,\n] as const;\n\nconst SHA256_CONSTANTS = [\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\n 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\n 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\n 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\n 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\n 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n] as const;\n\nexport function createPersistedSourcePackage(\n bytes: Uint8Array | ArrayBuffer,\n sourceLabel?: string,\n): PersistedSourcePackage {\n const normalizedBytes = toUint8Array(bytes);\n\n return {\n format: \"docx\",\n storage: \"embedded-base64\",\n mimeType: DOCX_MIME_TYPE,\n sourceLabel:\n typeof sourceLabel === \"string\" && sourceLabel.trim().length > 0\n ? sourceLabel\n : undefined,\n sha256Hex: sha256Hex(normalizedBytes),\n bytesBase64: encodeBytesBase64(normalizedBytes),\n };\n}\n\nexport function decodePersistedSourcePackageBytes(\n sourcePackage: PersistedSourcePackage,\n): Uint8Array {\n return decodeBytesBase64(sourcePackage.bytesBase64);\n}\n\nexport function hasValidPersistedSourcePackageDigest(\n sourcePackage: PersistedSourcePackage,\n bytes: Uint8Array,\n): boolean {\n return sha256Hex(bytes) === sourcePackage.sha256Hex;\n}\n\nexport function encodeBytesBase64(bytes: Uint8Array): string {\n const bufferConstructor = getBufferConstructor();\n if (bufferConstructor) {\n return bufferConstructor.from(bytes).toString(\"base64\");\n }\n\n let binary = \"\";\n for (let offset = 0; offset < bytes.byteLength; offset += 0x8000) {\n const chunk = bytes.subarray(offset, offset + 0x8000);\n for (let index = 0; index < chunk.length; index += 1) {\n binary += String.fromCharCode(chunk[index] ?? 0);\n }\n }\n\n if (typeof btoa !== \"function\") {\n throw new Error(\"Base64 encoding is unavailable in this runtime.\");\n }\n\n return btoa(binary);\n}\n\nexport function decodeBytesBase64(value: string): Uint8Array {\n const bufferConstructor = getBufferConstructor();\n if (bufferConstructor) {\n return new Uint8Array(bufferConstructor.from(value, \"base64\"));\n }\n\n if (typeof atob !== \"function\") {\n throw new Error(\"Base64 decoding is unavailable in this runtime.\");\n }\n\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n}\n\nexport function sha256Hex(bytes: Uint8Array): string {\n const padded = padSha256Message(bytes);\n const state = Array.from(SHA256_INITIAL_STATE, (value) => value >>> 0);\n const schedule = new Uint32Array(64);\n\n for (let chunkOffset = 0; chunkOffset < padded.byteLength; chunkOffset += 64) {\n for (let index = 0; index < 16; index += 1) {\n const wordOffset = chunkOffset + index * 4;\n schedule[index] =\n (((padded[wordOffset] ?? 0) << 24) |\n ((padded[wordOffset + 1] ?? 0) << 16) |\n ((padded[wordOffset + 2] ?? 0) << 8) |\n (padded[wordOffset + 3] ?? 0)) >>>\n 0;\n }\n\n for (let index = 16; index < 64; index += 1) {\n schedule[index] = add32(\n lowerSigma1(schedule[index - 2] ?? 0),\n schedule[index - 7] ?? 0,\n lowerSigma0(schedule[index - 15] ?? 0),\n schedule[index - 16] ?? 0,\n );\n }\n\n let [a, b, c, d, e, f, g, h] = state;\n\n for (let index = 0; index < 64; index += 1) {\n const t1 = add32(\n h,\n upperSigma1(e),\n choose(e, f, g),\n SHA256_CONSTANTS[index] ?? 0,\n schedule[index] ?? 0,\n );\n const t2 = add32(upperSigma0(a), majority(a, b, c));\n\n h = g;\n g = f;\n f = e;\n e = add32(d, t1);\n d = c;\n c = b;\n b = a;\n a = add32(t1, t2);\n }\n\n state[0] = add32(state[0] ?? 0, a);\n state[1] = add32(state[1] ?? 0, b);\n state[2] = add32(state[2] ?? 0, c);\n state[3] = add32(state[3] ?? 0, d);\n state[4] = add32(state[4] ?? 0, e);\n state[5] = add32(state[5] ?? 0, f);\n state[6] = add32(state[6] ?? 0, g);\n state[7] = add32(state[7] ?? 0, h);\n }\n\n return state.map((word) => word.toString(16).padStart(8, \"0\")).join(\"\");\n}\n\nfunction padSha256Message(bytes: Uint8Array): Uint8Array {\n const bitLength = bytes.byteLength * 8;\n const paddedLength = Math.ceil((bytes.byteLength + 9) / 64) * 64;\n const padded = new Uint8Array(paddedLength);\n padded.set(bytes);\n padded[bytes.byteLength] = 0x80;\n\n const lengthOffset = paddedLength - 8;\n for (let index = 0; index < 8; index += 1) {\n const shift = (7 - index) * 8;\n padded[lengthOffset + index] = Math.floor(bitLength / 2 ** shift) & 0xff;\n }\n\n return padded;\n}\n\nfunction rotateRight(value: number, shift: number): number {\n return ((value >>> shift) | (value << (32 - shift))) >>> 0;\n}\n\nfunction add32(...values: number[]): number {\n let total = 0;\n for (const value of values) {\n total = (total + value) >>> 0;\n }\n return total;\n}\n\nfunction choose(x: number, y: number, z: number): number {\n return ((x & y) ^ (~x & z)) >>> 0;\n}\n\nfunction majority(x: number, y: number, z: number): number {\n return ((x & y) ^ (x & z) ^ (y & z)) >>> 0;\n}\n\nfunction upperSigma0(value: number): number {\n return (rotateRight(value, 2) ^ rotateRight(value, 13) ^ rotateRight(value, 22)) >>> 0;\n}\n\nfunction upperSigma1(value: number): number {\n return (rotateRight(value, 6) ^ rotateRight(value, 11) ^ rotateRight(value, 25)) >>> 0;\n}\n\nfunction lowerSigma0(value: number): number {\n return (rotateRight(value, 7) ^ rotateRight(value, 18) ^ (value >>> 3)) >>> 0;\n}\n\nfunction lowerSigma1(value: number): number {\n return (rotateRight(value, 17) ^ rotateRight(value, 19) ^ (value >>> 10)) >>> 0;\n}\n\nfunction toUint8Array(bytes: Uint8Array | ArrayBuffer): Uint8Array {\n return bytes instanceof Uint8Array ? new Uint8Array(bytes) : new Uint8Array(bytes);\n}\n\nfunction getBufferConstructor():\n | {\n from(\n value: Uint8Array | string,\n byteOffsetOrEncoding?: number | string,\n length?: number,\n ): Uint8Array & { toString(encoding: string): string };\n }\n | undefined {\n const maybeBuffer = (globalThis as {\n Buffer?: {\n from(\n value: Uint8Array | string,\n byteOffsetOrEncoding?: number | string,\n length?: number,\n ): Uint8Array & { toString(encoding: string): string };\n };\n }).Buffer;\n\n return maybeBuffer;\n}\n"],"mappings":"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","names":["validateExactObjectKeys","validateExactObjectKeys","decodeXmlEntities","name","parseXml","localName","localName","parseXml","decodeXmlEntities","name","findTagEnd","parseTag","parseXml","findFirstDescendant","localName","findTagEnd","parseTag","parseXml","findFirstDescendant","findFirstChild","localName","findTagEnd","parseTag","parseXml","findChildElement","localName","readOptionalAttribute","findFirstDescendant","findFirstChild","decodeXmlEntities","name","findTagEnd","parseTag","cloneRelationship","HYPERLINK_RELATIONSHIP_TYPE","cloneRelationship","escapeAttribute","escapeXml","boundaries","children","localName","findChildElement","decodeXmlEntities","tagEnd","node","parseAttributes","localName","findChildElement","parseXml","findChildElement","localName","normalizeImportedTimestamp","text","parseTag","escapeAttribute","serializeText","parseXml","findChildElement","localName","requiresPreservedSpace","escapeXml","text","parseTag","decodeXmlText","escapeAttribute","parseXml","findChildElementOptional","localName","readParagraphSpacing","readParagraphIndentation","readParagraphTabStops","findFirstDescendant","decodeXmlEntities","parseAttributes","parseXml","findChildElementOptional","localName","parseParagraphElement","isSimpleSecondaryStoryTable","parseSimpleTableElement","serializeElementToXml","readParagraphSpacing","readParagraphIndentation","appendRunNodes","parseHyperlinkElement","parseBookmarkElement","pushFieldNode","parseRunProperties","extractTextContent","parseRunChildNode","parseRunElement","readFieldInstruction","RISKY_TABLE_ELEMENT_NAMES","containsRiskyElement","readGridColumns","parseSimpleTableRow","parseSimpleTableCell","escapeXmlAttribute","escapeXmlText","decodeXmlEntities","parseAttributes","parseXml","findChildElementOptional","findChildElementOptional","localName","parseXml","decodeXmlEntities","parseAttributes","parseXml","findChildElementOptional","localName","end","parseAttributes","parseXml","findChildElementOptional","localName","decodeXmlEntities","name","findTagEnd","parseTag","serializeParagraph","buildParagraphPropertiesXml","serializeInlineNode","escapeAttribute","requiresPreservedSpace","escapeXml","wrapInlineRawXml","W_NS","R_NS","serializeParagraph","serializeTable","escapeAttribute","buildParagraphPropertiesXml","serializeInlineNode","serializeTableRow","wrapPropertiesXml","serializeTableCell","buildTableCellPropertiesXml","buildRunPropertiesXml","requiresPreservedSpace","escapeXml","serializeHyperlinkNode","extractWrappedChildren","toUint8Array","decodeUtf8","paragraphBoundary","cloneRelationship","escapeXml","escapeXmlAttribute"]}
|