@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/legal/index.ts","../../src/io/ooxml/parse-fields.ts","../../src/legal/bookmarks.ts","../../src/io/ooxml/part-manifest.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/highlight-colors.ts","../../src/io/ooxml/parse-main-document.ts","../../src/legal/cross-references.ts","../../src/legal/defined-terms.ts","../../src/legal/signature-blocks.ts"],"sourcesContent":["export {\n parseBookmarksFromDocumentXml,\n collectBookmarksFromCanonicalDocument,\n assessBookmarkIntegrity,\n isHiddenBookmarkName,\n type BookmarkIntegrityResult,\n type LegalBookmark,\n} from \"./bookmarks.ts\";\n\nexport {\n parseCrossReferencesFromDocumentXml,\n collectCrossReferencesFromCanonicalDocument,\n detectCrossReferencePatterns,\n parseFieldReferenceInstruction,\n type CrossReference,\n type CrossReferencePattern,\n} from \"./cross-references.ts\";\n\nexport {\n collectDefinedTermsFromDocumentXml,\n collectDefinedTermsFromCanonicalDocument,\n buildDefinedTermCatalog,\n type DefinedTerm,\n type DefinedTermOccurrence,\n} from \"./defined-terms.ts\";\n\nexport {\n detectSignatureBlocksFromCanonicalDocument,\n type SignatureBlockCandidate,\n type SignatureBlockReport,\n type SignatureParty,\n} from \"./signature-blocks.ts\";\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","import { extractBookmarksFromBodyXml } from \"../io/ooxml/parse-fields.ts\";\nimport type {\n BookmarkEndNode,\n BookmarkStartNode,\n CanonicalDocument,\n DocumentNode,\n FieldRegistry,\n FieldRegistryEntry,\n} from \"../model/canonical-document.ts\";\n\nexport interface LegalBookmark {\n bookmarkId: string;\n name?: string;\n hidden: boolean;\n source: \"ooxml\" | \"canonical\";\n status: \"paired\" | \"start-only\" | \"end-only\";\n startIndex?: number;\n endIndex?: number;\n}\n\ninterface OpenBookmark {\n bookmarkId: string;\n name?: string;\n hidden: boolean;\n startIndex: number;\n}\n\nexport function parseBookmarksFromDocumentXml(xml: string): LegalBookmark[] {\n const bookmarks = extractBookmarksFromBodyXml(xml);\n const openBookmarks = new Map<string, OpenBookmark[]>();\n const results: LegalBookmark[] = [];\n\n for (let index = 0; index < bookmarks.length; index += 1) {\n const bookmark = bookmarks[index];\n\n if (bookmark.type === \"bookmark_start\") {\n const entry: OpenBookmark = {\n bookmarkId: bookmark.bookmarkId,\n name: bookmark.name,\n hidden: isHiddenBookmarkName(bookmark.name),\n startIndex: index,\n };\n const stack = openBookmarks.get(bookmark.bookmarkId) ?? [];\n stack.push(entry);\n openBookmarks.set(bookmark.bookmarkId, stack);\n continue;\n }\n\n const stack = openBookmarks.get(bookmark.bookmarkId);\n const open = stack?.pop();\n if (stack && stack.length === 0) {\n openBookmarks.delete(bookmark.bookmarkId);\n }\n\n if (open) {\n results.push({\n bookmarkId: bookmark.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"ooxml\",\n status: \"paired\",\n startIndex: open.startIndex,\n endIndex: index,\n });\n continue;\n }\n\n results.push({\n bookmarkId: bookmark.bookmarkId,\n hidden: false,\n source: \"ooxml\",\n status: \"end-only\",\n endIndex: index,\n });\n }\n\n for (const stack of openBookmarks.values()) {\n for (const open of stack) {\n results.push({\n bookmarkId: open.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"ooxml\",\n status: \"start-only\",\n startIndex: open.startIndex,\n });\n }\n }\n\n return results.sort(compareBookmarks);\n}\n\nexport function collectBookmarksFromCanonicalDocument(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): LegalBookmark[] {\n const root = \"content\" in document ? document.content : document;\n const sequence: Array<BookmarkStartNode | BookmarkEndNode> = [];\n\n walkDocument(root, (node) => {\n if (node.type === \"bookmark_start\" || node.type === \"bookmark_end\") {\n sequence.push(node);\n }\n });\n\n const openBookmarks = new Map<string, OpenBookmark[]>();\n const results: LegalBookmark[] = [];\n\n for (let index = 0; index < sequence.length; index += 1) {\n const bookmark = sequence[index];\n\n if (bookmark.type === \"bookmark_start\") {\n const entry: OpenBookmark = {\n bookmarkId: bookmark.bookmarkId,\n name: bookmark.name,\n hidden: isHiddenBookmarkName(bookmark.name),\n startIndex: index,\n };\n const stack = openBookmarks.get(bookmark.bookmarkId) ?? [];\n stack.push(entry);\n openBookmarks.set(bookmark.bookmarkId, stack);\n continue;\n }\n\n const stack = openBookmarks.get(bookmark.bookmarkId);\n const open = stack?.pop();\n if (stack && stack.length === 0) {\n openBookmarks.delete(bookmark.bookmarkId);\n }\n\n if (open) {\n results.push({\n bookmarkId: bookmark.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"canonical\",\n status: \"paired\",\n startIndex: open.startIndex,\n endIndex: index,\n });\n continue;\n }\n\n results.push({\n bookmarkId: bookmark.bookmarkId,\n hidden: false,\n source: \"canonical\",\n status: \"end-only\",\n endIndex: index,\n });\n }\n\n for (const stack of openBookmarks.values()) {\n for (const open of stack) {\n results.push({\n bookmarkId: open.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"canonical\",\n status: \"start-only\",\n startIndex: open.startIndex,\n });\n }\n }\n\n return results.sort(compareBookmarks);\n}\n\nexport function isHiddenBookmarkName(name: string | undefined): boolean {\n return Boolean(name && name.startsWith(\"_\"));\n}\n\nexport interface BookmarkIntegrityResult {\n totalCount: number;\n pairedCount: number;\n startOnlyCount: number;\n endOnlyCount: number;\n hiddenCount: number;\n namedCount: number;\n integrityScore: \"complete\" | \"partial\" | \"degraded\";\n}\n\nexport function assessBookmarkIntegrity(bookmarks: LegalBookmark[]): BookmarkIntegrityResult {\n const pairedCount = bookmarks.filter((b) => b.status === \"paired\").length;\n const startOnlyCount = bookmarks.filter((b) => b.status === \"start-only\").length;\n const endOnlyCount = bookmarks.filter((b) => b.status === \"end-only\").length;\n const hiddenCount = bookmarks.filter((b) => b.hidden).length;\n const namedCount = bookmarks.filter((b) => b.name && !b.hidden).length;\n const totalCount = bookmarks.length;\n const unpairedCount = startOnlyCount + endOnlyCount;\n\n return {\n totalCount,\n pairedCount,\n startOnlyCount,\n endOnlyCount,\n hiddenCount,\n namedCount,\n integrityScore:\n unpairedCount === 0\n ? \"complete\"\n : unpairedCount <= pairedCount\n ? \"partial\"\n : \"degraded\",\n };\n}\n\nfunction compareBookmarks(left: LegalBookmark, right: LegalBookmark): number {\n return (\n (left.startIndex ?? left.endIndex ?? Number.MAX_SAFE_INTEGER) -\n (right.startIndex ?? right.endIndex ?? Number.MAX_SAFE_INTEGER) ||\n left.bookmarkId.localeCompare(right.bookmarkId)\n );\n}\n\n/**\n * Build a lookup map from bookmark name to bookmarkId for the document.\n * Used by the field refresh runtime to resolve REF/PAGEREF/NOTEREF targets.\n */\nexport function buildBookmarkNameMap(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): Map<string, { bookmarkId: string; paragraphIndex: number }> {\n const root = \"content\" in document ? document.content : document;\n const map = new Map<string, { bookmarkId: string; paragraphIndex: number }>();\n let paragraphIndex = -1;\n\n walkDocument(root, (node) => {\n if (node.type === \"paragraph\") {\n paragraphIndex += 1;\n }\n if (node.type === \"bookmark_start\" && node.name) {\n map.set(node.name, { bookmarkId: node.bookmarkId, paragraphIndex });\n }\n });\n\n return map;\n}\n\n/**\n * Resolve field-to-bookmark dependencies from a field registry.\n * Returns a map of bookmark names to the field entries that reference them.\n * This enables the runtime to determine which fields need refresh when\n * a bookmark's content changes.\n */\nexport function resolveBookmarkFieldDependencies(\n registry: FieldRegistry,\n): Map<string, FieldRegistryEntry[]> {\n const deps = new Map<string, FieldRegistryEntry[]>();\n for (const entry of registry.supported) {\n if (!entry.fieldTarget) continue;\n const existing = deps.get(entry.fieldTarget) ?? [];\n existing.push(entry);\n deps.set(entry.fieldTarget, existing);\n }\n return deps;\n}\n\nfunction walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void): void {\n visit(node);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n walkDocument(child, visit);\n }\n }\n\n if (node.type === \"table\") {\n for (const row of node.rows) {\n walkDocument(row, visit);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n walkDocument(cell, visit);\n }\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 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","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 {\n extractComplexFieldsFromBodyXml,\n parseFieldsFromParagraphXml,\n} from \"../io/ooxml/parse-fields.ts\";\nimport { parseMainDocumentXml } from \"../io/ooxml/parse-main-document.ts\";\nimport type {\n CanonicalDocument,\n DocumentNode,\n FieldNode,\n FieldRegistry,\n HyperlinkNode,\n ParagraphNode,\n TocEntry,\n} from \"../model/canonical-document.ts\";\n\nexport interface CrossReferencePattern {\n kind: \"section\" | \"clause\" | \"article\" | \"schedule\" | \"exhibit\" | \"appendix\";\n label: string;\n targetHint: string;\n}\n\nexport interface CrossReference {\n source: \"hyperlink\" | \"field\" | \"w:ref\" | \"text-pattern\";\n kind: \"bookmark\" | \"section\" | \"clause\" | \"article\" | \"schedule\" | \"exhibit\" | \"appendix\";\n target?: string;\n instruction?: string;\n label: string;\n paragraphIndex?: number;\n confidence: \"high\" | \"medium\";\n}\n\ninterface FieldReference {\n kind: \"REF\" | \"PAGEREF\" | \"NOTEREF\";\n target: string;\n instruction: string;\n}\n\n/**\n * Collect field references from a canonical document, leveraging the\n * field family classification when available.\n */\nexport function collectFieldReferencesFromCanonicalDocument(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): Array<{ family: string; target: string; instruction: string; paragraphIndex: number; displayText: string }> {\n const root = \"content\" in document ? document.content : document;\n const results: Array<{ family: string; target: string; instruction: string; paragraphIndex: number; displayText: string }> = [];\n let paragraphIndex = -1;\n\n walkDocument(root, (node) => {\n if (node.type === \"paragraph\") {\n paragraphIndex += 1;\n for (const child of node.children) {\n if (child.type === \"field\" && child.fieldFamily && child.fieldTarget) {\n const family = child.fieldFamily;\n if (family === \"REF\" || family === \"PAGEREF\" || family === \"NOTEREF\") {\n results.push({\n family,\n target: child.fieldTarget,\n instruction: child.instruction,\n paragraphIndex,\n displayText: flattenInlineText(child.children).trim(),\n });\n }\n }\n }\n }\n });\n\n return results;\n}\n\nconst CROSS_REFERENCE_PATTERN =\n /\\b(Section|Clause|Article|Schedule|Exhibit|Appendix)\\s+(\\d+(?:\\.\\d+)*|[A-Z]-\\d+|[A-Z])(?=[^A-Za-z0-9]|$)/g;\nconst W_REF_PATTERN = /<w:ref\\b([^>]*)\\/?>/g;\nconst ATTRIBUTE_PATTERN = /(?:^|\\s)(?:w:)?([A-Za-z][\\w-]*)=\"([^\"]*)\"/g;\nconst COMPLEX_FIELD_PATTERN =\n /<w:instrText\\b[^>]*>([\\s\\S]*?)<\\/w:instrText>[\\s\\S]*?<w:fldChar\\b[^>]*w:fldCharType=\"separate\"[^>]*\\/>[\\s\\S]*?<w:t\\b[^>]*>([\\s\\S]*?)<\\/w:t>[\\s\\S]*?<w:fldChar\\b[^>]*w:fldCharType=\"end\"[^>]*\\/>/g;\n\nexport function parseCrossReferencesFromDocumentXml(xml: string): CrossReference[] {\n const parsed = parseMainDocumentXml(xml);\n const results: CrossReference[] = [];\n\n parsed.blocks.forEach((block, paragraphIndex) => {\n if (block.type !== \"paragraph\") {\n return;\n }\n\n for (const child of block.children) {\n if (child.type === \"hyperlink\" && child.href.startsWith(\"#\")) {\n results.push({\n source: \"hyperlink\",\n kind: \"bookmark\",\n target: child.href.slice(1),\n label: flattenInlineText(child.children).trim() || child.href.slice(1),\n paragraphIndex,\n confidence: \"high\",\n });\n }\n }\n\n const { simpleFields } = parseFieldsFromParagraphXml(block.rawXml);\n for (const field of simpleFields) {\n const reference = parseFieldReferenceInstruction(field.instruction);\n if (!reference) {\n continue;\n }\n\n results.push({\n source: \"field\",\n kind: \"bookmark\",\n target: reference.target,\n instruction: reference.instruction,\n label: stripXml(field.contentXml) || reference.target,\n paragraphIndex,\n confidence: \"high\",\n });\n }\n\n for (const pattern of detectCrossReferencePatterns(flattenParagraphText(block as unknown as ParagraphNode))) {\n results.push({\n source: \"text-pattern\",\n kind: pattern.kind,\n target: pattern.targetHint,\n label: pattern.label,\n paragraphIndex,\n confidence: \"medium\",\n });\n }\n });\n\n for (const field of extractComplexFieldsFromBodyXml(xml)) {\n const reference = parseFieldReferenceInstruction(field.instruction);\n if (!reference) {\n continue;\n }\n results.push({\n source: \"field\",\n kind: \"bookmark\",\n target: reference.target,\n instruction: reference.instruction,\n label: stripXml(field.contentXml) || reference.target,\n confidence: \"high\",\n });\n }\n\n for (const field of extractComplexFieldsWithRegex(xml)) {\n const reference = parseFieldReferenceInstruction(field.instruction);\n if (!reference) {\n continue;\n }\n\n results.push({\n source: \"field\",\n kind: \"bookmark\",\n target: reference.target,\n instruction: reference.instruction,\n label: field.label || reference.target,\n confidence: \"high\",\n });\n }\n\n for (const element of extractWRefElements(xml)) {\n results.push({\n source: \"w:ref\",\n kind: \"bookmark\",\n target: element.target,\n label: element.label || element.target || \"w:ref\",\n confidence: element.target ? \"high\" : \"medium\",\n });\n }\n\n return dedupeCrossReferences(results);\n}\n\nexport function collectCrossReferencesFromCanonicalDocument(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): CrossReference[] {\n const root = \"content\" in document ? document.content : document;\n const results: CrossReference[] = [];\n let paragraphIndex = -1;\n\n walkDocument(root, (node) => {\n if (node.type === \"paragraph\") {\n paragraphIndex += 1;\n for (const child of node.children) {\n if (child.type === \"hyperlink\" && child.href.startsWith(\"#\")) {\n results.push({\n source: \"hyperlink\",\n kind: \"bookmark\",\n target: child.href.slice(1),\n label: flattenInlineText(child.children).trim() || child.href.slice(1),\n paragraphIndex,\n confidence: \"high\",\n });\n continue;\n }\n\n if (child.type === \"field\") {\n const reference = parseFieldReferenceInstruction(child.instruction);\n if (!reference) {\n continue;\n }\n results.push({\n source: \"field\",\n kind: \"bookmark\",\n target: reference.target,\n instruction: reference.instruction,\n label: flattenInlineText(child.children).trim() || reference.target,\n paragraphIndex,\n confidence: \"high\",\n });\n }\n }\n\n for (const pattern of detectCrossReferencePatterns(flattenParagraphText(node))) {\n results.push({\n source: \"text-pattern\",\n kind: pattern.kind,\n target: pattern.targetHint,\n label: pattern.label,\n paragraphIndex,\n confidence: \"medium\",\n });\n }\n }\n });\n\n return dedupeCrossReferences(results);\n}\n\nexport function detectCrossReferencePatterns(text: string): CrossReferencePattern[] {\n const matches: CrossReferencePattern[] = [];\n\n for (const match of text.matchAll(CROSS_REFERENCE_PATTERN)) {\n const referenceType = match[1]?.toLowerCase();\n const target = match[2];\n const label = `${match[1]} ${target}`.trim();\n\n if (!referenceType || !target) {\n continue;\n }\n\n matches.push({\n kind: referenceType as CrossReferencePattern[\"kind\"],\n label,\n targetHint: target,\n });\n }\n\n return matches;\n}\n\nexport function parseFieldReferenceInstruction(instruction: string): FieldReference | undefined {\n const trimmedInstruction = instruction.trim().replace(/\\s+/g, \" \");\n const match = /^(REF|PAGEREF|NOTEREF)\\s+(?:\"([^\"]+)\"|([^\\s\\\\]+))/i.exec(trimmedInstruction);\n if (!match) {\n return undefined;\n }\n\n return {\n kind: match[1].toUpperCase() as FieldReference[\"kind\"],\n target: (match[2] ?? match[3] ?? \"\").trim(),\n instruction: trimmedInstruction,\n };\n}\n\nfunction extractWRefElements(xml: string): Array<{ target?: string; label?: string }> {\n const matches: Array<{ target?: string; label?: string }> = [];\n\n for (const match of xml.matchAll(W_REF_PATTERN)) {\n const attributes = readAttributes(match[1] ?? \"\");\n matches.push({\n target: attributes.anchor ?? attributes.name ?? attributes.id,\n label: attributes.displayText ?? attributes.text,\n });\n }\n\n return matches;\n}\n\nfunction extractComplexFieldsWithRegex(xml: string): Array<{ instruction: string; label: string }> {\n const matches: Array<{ instruction: string; label: string }> = [];\n\n for (const match of xml.matchAll(COMPLEX_FIELD_PATTERN)) {\n const instruction = stripXml(match[1] ?? \"\");\n const label = stripXml(match[2] ?? \"\");\n if (!instruction) {\n continue;\n }\n matches.push({ instruction, label });\n }\n\n return matches;\n}\n\nfunction readAttributes(source: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n\n for (const match of source.matchAll(ATTRIBUTE_PATTERN)) {\n const [, key, value] = match;\n attributes[key] = value;\n }\n\n return attributes;\n}\n\nfunction stripXml(xml: string): string {\n return xml.replace(/<[^>]+>/g, \"\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction flattenParagraphText(paragraph: ParagraphNode): string {\n return paragraph.children\n .map((child) => {\n switch (child.type) {\n case \"text\":\n return child.text;\n case \"hyperlink\":\n return flattenInlineText(child.children);\n case \"field\":\n return child.children ? flattenInlineText(child.children) : \"\";\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n case \"column_break\":\n return \"\\n\";\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\nfunction flattenInlineText(children: HyperlinkNode[\"children\"] | FieldNode[\"children\"]): string {\n return children\n .map((child) => {\n if (child.type === \"text\") {\n return child.text;\n }\n if (child.type === \"tab\") {\n return \"\\t\";\n }\n if (child.type === \"hard_break\" || child.type === \"column_break\") {\n return \"\\n\";\n }\n return \"\";\n })\n .join(\"\");\n}\n\nfunction dedupeCrossReferences(references: CrossReference[]): CrossReference[] {\n const seen = new Set<string>();\n const deduped: CrossReference[] = [];\n\n for (const reference of references) {\n const key = [\n reference.source,\n reference.kind,\n reference.target ?? \"\",\n reference.label,\n String(reference.paragraphIndex ?? -1),\n ].join(\"|\");\n\n if (seen.has(key)) {\n continue;\n }\n\n seen.add(key);\n deduped.push(reference);\n }\n\n return deduped;\n}\n\n/**\n * Collect TOC entries from a field registry's tocStructure.\n * Returns the entries in document order with their heading text and levels.\n * Returns an empty array if no TOC structure is available.\n */\nexport function collectTocEntriesFromRegistry(\n registry: FieldRegistry | undefined,\n): TocEntry[] {\n return registry?.tocStructure?.entries ?? [];\n}\n\n/**\n * Assess whether the TOC structure in a field registry is current\n * with respect to the document's heading structure.\n */\nexport function assessTocFreshness(\n registry: FieldRegistry | undefined,\n): \"current\" | \"stale\" | \"absent\" {\n if (!registry?.tocStructure) return \"absent\";\n return registry.tocStructure.status;\n}\n\nfunction walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void): void {\n visit(node);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n walkDocument(child, visit);\n }\n }\n\n if (node.type === \"table\") {\n for (const row of node.rows) {\n walkDocument(row, visit);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n walkDocument(cell, visit);\n }\n }\n}\n","import { parseMainDocumentXml } from \"../io/ooxml/parse-main-document.ts\";\nimport type {\n CanonicalDocument,\n DocumentNode,\n ParagraphNode,\n} from \"../model/canonical-document.ts\";\n\nexport interface DefinedTermOccurrence {\n paragraphIndex: number;\n label: string;\n kind: \"definition\" | \"reference\";\n}\n\nexport interface DefinedTerm {\n term: string;\n normalizedTerm: string;\n definitionStyle: \"quoted\" | \"bare\";\n definitions: DefinedTermOccurrence[];\n references: DefinedTermOccurrence[];\n}\n\nconst QUOTED_DEFINITION_PATTERN =\n /[\"“]([A-Z][A-Za-z0-9]*(?:[ -][A-Z][A-Za-z0-9]*){0,5})[\"”]\\s+(?:means|has the meaning(?: set forth)?|shall mean|refers to)\\b/g;\nconst BARE_DEFINITION_PATTERN =\n /\\b([A-Z][A-Za-z0-9]*(?:\\s+[A-Z][A-Za-z0-9]*){0,5})\\s+(?:means|has the meaning(?: set forth)?|shall mean|refers to)\\b/g;\nconst BLOCKED_BARE_TERMS = new Set([\n \"This Agreement\",\n \"Such Term\",\n \"The Company\",\n \"This Section\",\n \"This Clause\",\n]);\n\nexport function collectDefinedTermsFromDocumentXml(xml: string): DefinedTerm[] {\n const parsed = parseMainDocumentXml(xml);\n const paragraphs = parsed.blocks\n .filter((block): block is typeof parsed.blocks[number] & { type: \"paragraph\" } => block.type === \"paragraph\")\n .map((block) => flattenParagraphText(block as unknown as ParagraphNode));\n\n return buildDefinedTermCatalog(paragraphs);\n}\n\nexport function collectDefinedTermsFromCanonicalDocument(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): DefinedTerm[] {\n const root = \"content\" in document ? document.content : document;\n const paragraphs: string[] = [];\n\n walkDocument(root, (node) => {\n if (node.type === \"paragraph\") {\n paragraphs.push(flattenParagraphText(node));\n }\n });\n\n return buildDefinedTermCatalog(paragraphs);\n}\n\nexport function buildDefinedTermCatalog(paragraphs: readonly string[]): DefinedTerm[] {\n const terms = new Map<string, DefinedTerm>();\n\n paragraphs.forEach((paragraph, paragraphIndex) => {\n for (const candidate of extractDefinitionCandidates(paragraph)) {\n const normalized = normalizeTerm(candidate.term);\n const existing = terms.get(normalized) ?? {\n term: candidate.term,\n normalizedTerm: normalized,\n definitionStyle: candidate.definitionStyle,\n definitions: [],\n references: [],\n };\n\n if (!terms.has(normalized)) {\n terms.set(normalized, existing);\n }\n\n existing.definitions.push({\n paragraphIndex,\n label: candidate.term,\n kind: \"definition\",\n });\n }\n });\n\n paragraphs.forEach((paragraph, paragraphIndex) => {\n for (const term of terms.values()) {\n const references = findTermReferences(paragraph, term.term);\n if (references === 0) {\n continue;\n }\n\n const hasDefinitionInParagraph = term.definitions.some(\n (definition) => definition.paragraphIndex === paragraphIndex,\n );\n const referenceCount = hasDefinitionInParagraph ? 0 : references;\n\n for (let count = 0; count < referenceCount; count += 1) {\n term.references.push({\n paragraphIndex,\n label: term.term,\n kind: \"reference\",\n });\n }\n }\n });\n\n return Array.from(terms.values()).sort((left, right) => left.term.localeCompare(right.term));\n}\n\ninterface DefinitionCandidate {\n term: string;\n definitionStyle: DefinedTerm[\"definitionStyle\"];\n}\n\nfunction extractDefinitionCandidates(paragraph: string): DefinitionCandidate[] {\n const candidates: DefinitionCandidate[] = [];\n\n for (const match of paragraph.matchAll(QUOTED_DEFINITION_PATTERN)) {\n const term = match[1]?.trim();\n if (!term) {\n continue;\n }\n\n candidates.push({\n term,\n definitionStyle: \"quoted\",\n });\n }\n\n for (const match of paragraph.matchAll(BARE_DEFINITION_PATTERN)) {\n const term = match[1]?.trim();\n if (!term || BLOCKED_BARE_TERMS.has(term) || isQuotedTerm(term, paragraph)) {\n continue;\n }\n\n candidates.push({\n term,\n definitionStyle: \"bare\",\n });\n }\n\n return candidates;\n}\n\nfunction normalizeTerm(term: string): string {\n return term.trim().replace(/\\s+/g, \" \").toLowerCase();\n}\n\nfunction isQuotedTerm(term: string, paragraph: string): boolean {\n return paragraph.includes(`\"${term}\"`) || paragraph.includes(`“${term}”`);\n}\n\nfunction findTermReferences(paragraph: string, term: string): number {\n const escapedTerm = escapeRegExp(term);\n const pattern = new RegExp(`(?:^|[^A-Za-z0-9])(?:\\\"|“)?(${escapedTerm})(?:\\\"|”)?(?=[^A-Za-z0-9]|$)`, \"g\");\n return Array.from(paragraph.matchAll(pattern)).length;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction flattenParagraphText(paragraph: ParagraphNode): string {\n return paragraph.children\n .map((child) => {\n switch (child.type) {\n case \"text\":\n return child.text;\n case \"hyperlink\":\n case \"field\":\n return child.children\n .map((nested) => (nested.type === \"text\" ? nested.text : nested.type === \"tab\" ? \"\\t\" : \"\"))\n .join(\"\");\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n case \"column_break\":\n return \"\\n\";\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\nfunction walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void): void {\n visit(node);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n walkDocument(child, visit);\n }\n }\n\n if (node.type === \"table\") {\n for (const row of node.rows) {\n walkDocument(row, visit);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n walkDocument(cell, visit);\n }\n }\n}\n","import type {\n BlockNode,\n CanonicalDocument,\n DocumentNode,\n ParagraphNode,\n} from \"../model/canonical-document.ts\";\n\nexport interface SignatureBlockCandidate {\n startIndex: number;\n endIndex: number;\n kind: \"execution-block\" | \"witness-block\" | \"notary-block\";\n parties: SignatureParty[];\n confidence: \"high\" | \"medium\";\n}\n\nexport interface SignatureParty {\n roleLabel?: string;\n nameLabel?: string;\n paragraphIndex: number;\n}\n\nexport interface SignatureBlockReport {\n reportVersion: \"signature-block-report/1\";\n candidates: SignatureBlockCandidate[];\n preservationSafe: boolean;\n warnings: string[];\n}\n\nconst EXECUTION_TRIGGER_PATTERN =\n /\\b(?:IN WITNESS WHEREOF|EXECUTED|AGREED AND ACCEPTED|SIGNATURES FOLLOW)\\b/i;\nconst ROLE_LINE_PATTERN =\n /^\\s*(?:By|Name|Title|Date|Witness|Authorized Signatory|Signature)\\s*[:\\-]?\\s*/i;\nconst PARTY_LABEL_PATTERN =\n /^(?:(?:The |)[A-Z][A-Za-z0-9 ,.'&()-]{2,60})\\s*$/;\nconst WITNESS_PATTERN = /\\bWITNESS(?:ED|ES)?\\b/i;\nconst NOTARY_PATTERN = /\\bNOTARY\\s+PUBLIC\\b/i;\nconst UNDERLINE_PLACEHOLDER_PATTERN = /_{4,}|\\.{4,}/;\n\nexport function detectSignatureBlocksFromCanonicalDocument(\n document: Pick<CanonicalDocument, \"content\" | \"preservation\"> | DocumentNode,\n): SignatureBlockReport {\n const root = \"content\" in document ? document.content : document;\n const paragraphs: Array<{ text: string; node: ParagraphNode }> = [];\n const warnings: string[] = [];\n\n walkBlocks(root, (node) => {\n if (node.type === \"paragraph\") {\n paragraphs.push({ text: flattenParagraphText(node), node });\n }\n });\n\n const candidates = findSignatureBlockCandidates(paragraphs);\n\n const hasPreservation =\n \"preservation\" in document &&\n document.preservation !== undefined;\n const preservationSafe = hasPreservation\n ? !hasOpaqueFragmentsInSignatureRanges(\n document as Pick<CanonicalDocument, \"content\" | \"preservation\">,\n candidates,\n )\n : true;\n\n if (!preservationSafe) {\n warnings.push(\n \"One or more signature block regions overlap with preserve-only opaque fragments. Export fidelity may be degraded.\",\n );\n }\n\n return {\n reportVersion: \"signature-block-report/1\",\n candidates,\n preservationSafe,\n warnings,\n };\n}\n\nfunction findSignatureBlockCandidates(\n paragraphs: ReadonlyArray<{ text: string; node: ParagraphNode }>,\n): SignatureBlockCandidate[] {\n const candidates: SignatureBlockCandidate[] = [];\n let index = 0;\n\n while (index < paragraphs.length) {\n const text = paragraphs[index].text;\n\n if (EXECUTION_TRIGGER_PATTERN.test(text)) {\n const block = scanSignatureBlock(paragraphs, index);\n if (block) {\n candidates.push(block);\n index = block.endIndex + 1;\n continue;\n }\n }\n\n index += 1;\n }\n\n return candidates;\n}\n\nfunction scanSignatureBlock(\n paragraphs: ReadonlyArray<{ text: string; node: ParagraphNode }>,\n triggerIndex: number,\n): SignatureBlockCandidate | undefined {\n const parties: SignatureParty[] = [];\n let endIndex = triggerIndex;\n let kind: SignatureBlockCandidate[\"kind\"] = \"execution-block\";\n let hasSignatureContent = false;\n\n for (\n let index = triggerIndex + 1;\n index < paragraphs.length && index <= triggerIndex + 40;\n index += 1\n ) {\n const text = paragraphs[index].text.trim();\n\n if (text.length === 0) {\n endIndex = index;\n continue;\n }\n\n if (WITNESS_PATTERN.test(text)) {\n kind = \"witness-block\";\n }\n if (NOTARY_PATTERN.test(text)) {\n kind = \"notary-block\";\n }\n\n if (ROLE_LINE_PATTERN.test(text)) {\n hasSignatureContent = true;\n endIndex = index;\n continue;\n }\n\n if (UNDERLINE_PLACEHOLDER_PATTERN.test(text)) {\n hasSignatureContent = true;\n endIndex = index;\n continue;\n }\n\n if (PARTY_LABEL_PATTERN.test(text) && !isBodyParagraph(text)) {\n parties.push({\n roleLabel: text.trim(),\n paragraphIndex: index,\n });\n hasSignatureContent = true;\n endIndex = index;\n continue;\n }\n\n if (hasSignatureContent && isBodyParagraph(text)) {\n break;\n }\n\n endIndex = index;\n }\n\n if (!hasSignatureContent) {\n return undefined;\n }\n\n return {\n startIndex: triggerIndex,\n endIndex,\n kind,\n parties,\n confidence: parties.length > 0 ? \"high\" : \"medium\",\n };\n}\n\nfunction isBodyParagraph(text: string): boolean {\n return text.length > 120 && /[.;]/.test(text);\n}\n\nfunction hasOpaqueFragmentsInSignatureRanges(\n document: Pick<CanonicalDocument, \"content\" | \"preservation\">,\n candidates: readonly SignatureBlockCandidate[],\n): boolean {\n if (candidates.length === 0) {\n return false;\n }\n\n const opaqueCount = Object.keys(document.preservation.opaqueFragments).length;\n if (opaqueCount === 0) {\n return false;\n }\n\n let paragraphIndex = 0;\n const opaqueIndices = new Set<number>();\n\n for (const block of document.content.children) {\n if (block.type === \"paragraph\") {\n paragraphIndex += 1;\n continue;\n }\n if (block.type === \"opaque_block\") {\n opaqueIndices.add(paragraphIndex);\n }\n paragraphIndex += 1;\n }\n\n return candidates.some((candidate) => {\n for (let index = candidate.startIndex; index <= candidate.endIndex; index += 1) {\n if (opaqueIndices.has(index)) {\n return true;\n }\n }\n return false;\n });\n}\n\nfunction flattenParagraphText(paragraph: ParagraphNode): string {\n return paragraph.children\n .map((child) => {\n switch (child.type) {\n case \"text\":\n return child.text;\n case \"hyperlink\":\n case \"field\":\n return child.children\n .map((nested) =>\n nested.type === \"text\" ? nested.text : nested.type === \"tab\" ? \"\\t\" : \"\",\n )\n .join(\"\");\n case \"tab\":\n return \"\\t\";\n case \"hard_break\":\n case \"column_break\":\n return \"\\n\";\n default:\n return \"\";\n }\n })\n .join(\"\");\n}\n\nfunction walkBlocks(\n node: DocumentNode,\n visit: (node: DocumentNode) => void,\n): void {\n visit(node);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n walkBlocks(child, visit);\n }\n }\n\n if (node.type === \"table\") {\n for (const row of node.rows) {\n walkBlocks(row, visit);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n walkBlocks(cell, visit);\n }\n }\n}\n"],"mappings":"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","names":["name","stack","parseXml","localName","decodeXmlEntities","name","findTagEnd","parseTag","parseXml","findFirstDescendant","findFirstChild","localName","findTagEnd","parseTag","parseXml","findFirstDescendant","findFirstChild","localName","findTagEnd","parseTag","parseXml","localName","readOptionalAttribute","findFirstDescendant","findFirstChild","decodeXmlEntities","name","findTagEnd","parseTag","walkDocument","walkDocument","flattenParagraphText","walkDocument","flattenParagraphText"]}
|