@beyondwork/docx-react-component 1.0.29 → 1.0.31
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/package.json +65 -96
- package/src/README.md +85 -0
- package/src/api/README.md +26 -0
- package/src/api/public-types.ts +1952 -0
- package/src/api/session-state.ts +62 -0
- package/src/compare/diff-engine.ts +623 -0
- package/src/compare/export-redlines.ts +280 -0
- package/src/compare/index.ts +25 -0
- package/src/compare/snapshot.ts +97 -0
- package/src/component-inventory.md +99 -0
- package/src/core/README.md +10 -0
- package/src/core/commands/README.md +3 -0
- package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
- package/src/core/commands/image-commands.ts +373 -0
- package/src/core/commands/index.ts +1879 -0
- package/src/core/commands/list-commands.ts +565 -0
- package/src/core/commands/paragraph-layout-commands.ts +339 -0
- package/src/core/commands/review-commands.ts +108 -0
- package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
- package/src/core/commands/structural-helpers.ts +309 -0
- package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
- package/src/core/commands/table-structure-commands.ts +854 -0
- package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
- package/src/core/schema/README.md +3 -0
- package/src/core/schema/text-schema.ts +516 -0
- package/src/core/search/search-text.ts +357 -0
- package/src/core/selection/README.md +3 -0
- package/src/core/selection/mapping.ts +289 -0
- package/src/core/selection/review-anchors.ts +183 -0
- package/src/core/state/README.md +3 -0
- package/src/core/state/editor-state.ts +892 -0
- package/src/core/state/text-transaction.ts +869 -0
- package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
- package/src/formats/xlsx/io/parse-sheet.ts +459 -0
- package/src/formats/xlsx/io/parse-styles.ts +59 -0
- package/src/formats/xlsx/io/parse-workbook.ts +75 -0
- package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
- package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
- package/src/formats/xlsx/io/serialize-styles.ts +98 -0
- package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
- package/src/formats/xlsx/io/xlsx-session.ts +314 -0
- package/src/formats/xlsx/model/cell.ts +189 -0
- package/src/formats/xlsx/model/sheet.ts +326 -0
- package/src/formats/xlsx/model/styles.ts +118 -0
- package/src/formats/xlsx/model/workbook.ts +453 -0
- package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
- package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
- package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
- package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
- package/src/index.ts +142 -0
- package/src/io/README.md +10 -0
- package/src/io/docx-session.ts +3175 -0
- package/src/io/export/README.md +3 -0
- package/src/io/export/export-session.ts +220 -0
- package/src/io/export/minimal-docx.ts +115 -0
- package/src/io/export/reattach-preserved-parts.ts +54 -0
- package/src/io/export/serialize-comments.ts +947 -0
- package/src/io/export/serialize-footnotes.ts +394 -0
- package/src/io/export/serialize-headers-footers.ts +368 -0
- package/src/io/export/serialize-main-document.ts +1342 -0
- package/src/io/export/serialize-numbering.ts +218 -0
- package/src/io/export/serialize-revisions.ts +389 -0
- package/src/io/export/serialize-runtime-revisions.ts +463 -0
- package/src/io/export/serialize-tables.ts +174 -0
- package/src/io/export/split-review-boundaries.ts +356 -0
- package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
- package/src/io/export/table-properties-xml.ts +318 -0
- package/src/io/normalize/README.md +3 -0
- package/src/io/normalize/normalize-text.ts +670 -0
- package/src/io/ooxml/README.md +3 -0
- package/src/io/ooxml/highlight-colors.ts +39 -0
- package/src/io/ooxml/numbering-sentinels.ts +44 -0
- package/src/io/ooxml/parse-comments.ts +852 -0
- package/src/io/ooxml/parse-complex-content.ts +287 -0
- package/src/io/ooxml/parse-fields.ts +834 -0
- package/src/io/ooxml/parse-footnotes.ts +952 -0
- package/src/io/ooxml/parse-headers-footers.ts +1212 -0
- package/src/io/ooxml/parse-inline-media.ts +461 -0
- package/src/io/ooxml/parse-main-document.ts +2947 -0
- package/src/io/ooxml/parse-numbering.ts +747 -0
- package/src/io/ooxml/parse-revisions.ts +1045 -0
- package/src/io/ooxml/parse-settings.ts +184 -0
- package/src/io/ooxml/parse-shapes.ts +296 -0
- package/src/io/ooxml/parse-styles.ts +639 -0
- package/src/io/ooxml/parse-tables.ts +627 -0
- package/src/io/ooxml/parse-theme.ts +346 -0
- package/src/io/ooxml/part-manifest.ts +136 -0
- package/src/io/ooxml/revision-boundaries.ts +475 -0
- package/src/io/ooxml/workflow-payload.ts +544 -0
- package/src/io/opc/README.md +3 -0
- package/src/io/opc/corrupt-package.ts +166 -0
- package/src/io/opc/docx-package.ts +74 -0
- package/src/io/opc/package-reader.ts +325 -0
- package/src/io/opc/package-writer.ts +273 -0
- package/src/io/source-package-provenance.ts +241 -0
- package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
- package/src/legal/cross-references.ts +414 -0
- package/src/legal/defined-terms.ts +203 -0
- package/src/legal/index.ts +32 -0
- package/src/legal/signature-blocks.ts +259 -0
- package/src/model/README.md +3 -0
- package/src/model/canonical-document.ts +2722 -0
- package/src/model/cds-1.0.0.ts +212 -0
- package/src/model/snapshot.ts +760 -0
- package/src/preservation/README.md +3 -0
- package/src/preservation/markup-compatibility.ts +48 -0
- package/src/preservation/opaque-fragment-store.ts +89 -0
- package/src/preservation/opaque-region.ts +233 -0
- package/src/preservation/package-preservation.ts +113 -0
- package/src/preservation/preserved-part-manifest.ts +56 -0
- package/src/preservation/relationship-retention.ts +57 -0
- package/src/preservation/store.ts +255 -0
- package/src/review/README.md +16 -0
- package/src/review/store/README.md +3 -0
- package/src/review/store/comment-anchors.ts +70 -0
- package/src/review/store/comment-remapping.ts +154 -0
- package/src/review/store/comment-store.ts +349 -0
- package/src/review/store/comment-thread.ts +109 -0
- package/src/review/store/revision-actions.ts +423 -0
- package/src/review/store/revision-store.ts +323 -0
- package/src/review/store/revision-types.ts +182 -0
- package/src/review/store/runtime-comment-store.ts +43 -0
- package/src/runtime/README.md +3 -0
- package/src/runtime/ai-action-policy.ts +764 -0
- package/src/runtime/context-analytics.ts +824 -0
- package/src/runtime/document-layout.ts +332 -0
- package/src/runtime/document-locations.ts +521 -0
- package/src/runtime/document-navigation.ts +616 -0
- package/src/runtime/document-outline.ts +440 -0
- package/src/runtime/document-runtime.ts +4055 -0
- package/src/runtime/document-search.ts +145 -0
- package/src/runtime/event-refresh-hints.ts +137 -0
- package/src/runtime/numbering-prefix.ts +244 -0
- package/src/runtime/page-layout-estimation.ts +305 -0
- package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
- package/src/runtime/resolved-numbering-geometry.ts +293 -0
- package/src/runtime/review-runtime.ts +44 -0
- package/src/runtime/revision-runtime.ts +107 -0
- package/src/runtime/session-capabilities.ts +192 -0
- package/src/runtime/story-context.ts +164 -0
- package/src/runtime/story-targeting.ts +162 -0
- package/src/runtime/suggestions-snapshot.ts +137 -0
- package/src/runtime/surface-projection.ts +1553 -0
- package/src/runtime/table-commands.ts +173 -0
- package/src/runtime/table-schema.ts +309 -0
- package/src/runtime/table-style-resolver.ts +409 -0
- package/src/runtime/view-state.ts +493 -0
- package/src/runtime/virtualized-rendering.ts +258 -0
- package/src/runtime/workflow-markup.ts +393 -0
- package/src/ui/README.md +30 -0
- package/src/ui/WordReviewEditor.tsx +5268 -0
- package/src/ui/browser-export.ts +52 -0
- package/src/ui/comments/README.md +3 -0
- package/src/ui/compatibility/README.md +3 -0
- package/src/ui/editor-command-bag.ts +127 -0
- package/src/ui/editor-runtime-boundary.ts +1558 -0
- package/src/ui/editor-shell-view.tsx +144 -0
- package/src/ui/editor-surface/README.md +3 -0
- package/src/ui/editor-surface-controller.tsx +66 -0
- package/src/ui/headless/comment-decoration-model.ts +124 -0
- package/src/ui/headless/preserve-editor-selection.ts +5 -0
- package/src/ui/headless/revision-decoration-model.ts +128 -0
- package/src/ui/headless/selection-helpers.ts +54 -0
- package/src/ui/headless/selection-tool-context.ts +19 -0
- package/src/ui/headless/selection-tool-resolver.ts +752 -0
- package/src/ui/headless/selection-tool-types.ts +129 -0
- package/src/ui/headless/selection-toolbar-model.ts +11 -0
- package/src/ui/headless/use-editor-keyboard.ts +103 -0
- package/src/ui/review/README.md +3 -0
- package/src/ui/runtime-shortcut-dispatch.ts +365 -0
- package/src/ui/runtime-snapshot-selectors.ts +197 -0
- package/src/ui/shared/revision-filters.ts +31 -0
- package/src/ui/status/README.md +3 -0
- package/src/ui/theme/README.md +3 -0
- package/src/ui/toolbar/README.md +3 -0
- package/src/ui/workflow-surface-blocked-rails.ts +94 -0
- package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
- package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
- package/src/ui-tailwind/chrome/responsive-chrome.ts +46 -0
- package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
- package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +303 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +250 -0
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
- package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
- package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
- package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
- package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +63 -0
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
- package/src/ui-tailwind/index.ts +62 -0
- package/src/ui-tailwind/page-chrome-model.ts +27 -0
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
- package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
- package/src/ui-tailwind/review/tw-review-rail.tsx +130 -0
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
- package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
- package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
- package/src/ui-tailwind/toolbar/toolbar-layout.ts +47 -0
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1478 -0
- package/src/ui-tailwind/tw-review-workspace.tsx +1587 -0
- package/src/validation/README.md +3 -0
- package/src/validation/compatibility-engine.ts +878 -0
- package/src/validation/compatibility-report.ts +161 -0
- package/src/validation/diagnostics.ts +204 -0
- package/src/validation/docx-comment-proof.ts +720 -0
- package/src/validation/import-diagnostics.ts +128 -0
- package/src/validation/low-priority-word-surfaces.ts +373 -0
- package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
- package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
- package/dist/chunk-2FJS5GZM.js +0 -763
- package/dist/chunk-2FJS5GZM.js.map +0 -1
- package/dist/chunk-2OQBZS3F.js +0 -446
- package/dist/chunk-2OQBZS3F.js.map +0 -1
- package/dist/chunk-2S7W4KFO.js +0 -127
- package/dist/chunk-2S7W4KFO.js.map +0 -1
- package/dist/chunk-2TG72QSW.js +0 -3874
- package/dist/chunk-2TG72QSW.js.map +0 -1
- package/dist/chunk-36QNIZBO.js +0 -532
- package/dist/chunk-36QNIZBO.js.map +0 -1
- package/dist/chunk-4AQOYAW4.js +0 -3069
- package/dist/chunk-4AQOYAW4.js.map +0 -1
- package/dist/chunk-4D5EWJ3P.js +0 -77
- package/dist/chunk-4D5EWJ3P.js.map +0 -1
- package/dist/chunk-5FN54NDH.js +0 -2257
- package/dist/chunk-5FN54NDH.js.map +0 -1
- package/dist/chunk-BOYGQYRQ.js +0 -7306
- package/dist/chunk-BOYGQYRQ.js.map +0 -1
- package/dist/chunk-CN3XMECL.js +0 -212
- package/dist/chunk-CN3XMECL.js.map +0 -1
- package/dist/chunk-EBI3BX6U.js +0 -164
- package/dist/chunk-EBI3BX6U.js.map +0 -1
- package/dist/chunk-EILUG3VB.js +0 -1275
- package/dist/chunk-EILUG3VB.js.map +0 -1
- package/dist/chunk-FUDY333O.js +0 -70
- package/dist/chunk-FUDY333O.js.map +0 -1
- package/dist/chunk-GBVOWFIK.js +0 -1237
- package/dist/chunk-GBVOWFIK.js.map +0 -1
- package/dist/chunk-H4TQ3H3Y.js +0 -262
- package/dist/chunk-H4TQ3H3Y.js.map +0 -1
- package/dist/chunk-JGB3IXZO.js +0 -189
- package/dist/chunk-JGB3IXZO.js.map +0 -1
- package/dist/chunk-KD2QRQPY.js +0 -4342
- package/dist/chunk-KD2QRQPY.js.map +0 -1
- package/dist/chunk-KLMXQVYK.js +0 -369
- package/dist/chunk-KLMXQVYK.js.map +0 -1
- package/dist/chunk-KZUG5KFQ.js +0 -214
- package/dist/chunk-KZUG5KFQ.js.map +0 -1
- package/dist/chunk-QDAQ4CJU.js +0 -345
- package/dist/chunk-QDAQ4CJU.js.map +0 -1
- package/dist/chunk-RMH72RZI.js.map +0 -1
- package/dist/chunk-SWKWQZXM.js +0 -117
- package/dist/chunk-SWKWQZXM.js.map +0 -1
- package/dist/chunk-TJBP2K4T.js.map +0 -1
- package/dist/chunk-TLCEAQDQ.js +0 -542
- package/dist/chunk-TLCEAQDQ.js.map +0 -1
- package/dist/chunk-UZXBISGO.js.map +0 -1
- package/dist/chunk-WGBAKP3Q.js +0 -3220
- package/dist/chunk-WGBAKP3Q.js.map +0 -1
- package/dist/compare/index.cjs +0 -5475
- package/dist/compare/index.cjs.map +0 -1
- package/dist/compare/index.d.cts +0 -114
- package/dist/compare/index.d.ts +0 -114
- package/dist/compare/index.js +0 -731
- package/dist/compare/index.js.map +0 -1
- package/dist/core/commands/formatting-commands.cjs +0 -828
- package/dist/core/commands/formatting-commands.cjs.map +0 -1
- package/dist/core/commands/formatting-commands.d.cts +0 -63
- package/dist/core/commands/formatting-commands.d.ts +0 -63
- package/dist/core/commands/formatting-commands.js +0 -37
- package/dist/core/commands/formatting-commands.js.map +0 -1
- package/dist/core/commands/image-commands.cjs +0 -2023
- package/dist/core/commands/image-commands.cjs.map +0 -1
- package/dist/core/commands/image-commands.d.cts +0 -58
- package/dist/core/commands/image-commands.d.ts +0 -58
- package/dist/core/commands/image-commands.js +0 -18
- package/dist/core/commands/image-commands.js.map +0 -1
- package/dist/core/commands/section-layout-commands.cjs.map +0 -1
- package/dist/core/commands/section-layout-commands.d.cts +0 -62
- package/dist/core/commands/section-layout-commands.d.ts +0 -62
- package/dist/core/commands/section-layout-commands.js +0 -21
- package/dist/core/commands/section-layout-commands.js.map +0 -1
- package/dist/core/commands/style-commands.cjs.map +0 -1
- package/dist/core/commands/style-commands.d.cts +0 -13
- package/dist/core/commands/style-commands.d.ts +0 -13
- package/dist/core/commands/style-commands.js +0 -9
- package/dist/core/commands/style-commands.js.map +0 -1
- package/dist/core/commands/table-structure-commands.cjs +0 -1883
- package/dist/core/commands/table-structure-commands.cjs.map +0 -1
- package/dist/core/commands/table-structure-commands.d.cts +0 -59
- package/dist/core/commands/table-structure-commands.d.ts +0 -59
- package/dist/core/commands/table-structure-commands.js +0 -12
- package/dist/core/commands/table-structure-commands.js.map +0 -1
- package/dist/core/commands/text-commands.cjs +0 -2391
- package/dist/core/commands/text-commands.cjs.map +0 -1
- package/dist/core/commands/text-commands.d.cts +0 -24
- package/dist/core/commands/text-commands.d.ts +0 -24
- package/dist/core/commands/text-commands.js +0 -28
- package/dist/core/commands/text-commands.js.map +0 -1
- package/dist/core/selection/mapping.cjs +0 -200
- package/dist/core/selection/mapping.cjs.map +0 -1
- package/dist/core/selection/mapping.d.cts +0 -2
- package/dist/core/selection/mapping.d.ts +0 -2
- package/dist/core/selection/mapping.js +0 -31
- package/dist/core/selection/mapping.js.map +0 -1
- package/dist/core/state/editor-state.cjs +0 -2278
- package/dist/core/state/editor-state.cjs.map +0 -1
- package/dist/core/state/editor-state.d.cts +0 -2
- package/dist/core/state/editor-state.d.ts +0 -2
- package/dist/core/state/editor-state.js +0 -26
- package/dist/core/state/editor-state.js.map +0 -1
- package/dist/index.cjs +0 -38553
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -15
- package/dist/index.d.ts +0 -15
- package/dist/index.js +0 -7856
- package/dist/index.js.map +0 -1
- package/dist/io/docx-session.cjs +0 -16236
- package/dist/io/docx-session.cjs.map +0 -1
- package/dist/io/docx-session.d.cts +0 -21
- package/dist/io/docx-session.d.ts +0 -21
- package/dist/io/docx-session.js +0 -18
- package/dist/io/docx-session.js.map +0 -1
- package/dist/legal/index.cjs +0 -3900
- package/dist/legal/index.cjs.map +0 -1
- package/dist/legal/index.d.cts +0 -86
- package/dist/legal/index.d.ts +0 -86
- package/dist/legal/index.js +0 -616
- package/dist/legal/index.js.map +0 -1
- package/dist/public-types-7ZL_94cz.d.ts +0 -1573
- package/dist/public-types-CeMaDueh.d.cts +0 -1573
- package/dist/public-types.cjs +0 -19
- package/dist/public-types.cjs.map +0 -1
- package/dist/public-types.d.cts +0 -2
- package/dist/public-types.d.ts +0 -2
- package/dist/public-types.js +0 -1
- package/dist/public-types.js.map +0 -1
- package/dist/runtime/document-runtime.cjs +0 -11140
- package/dist/runtime/document-runtime.cjs.map +0 -1
- package/dist/runtime/document-runtime.d.cts +0 -231
- package/dist/runtime/document-runtime.d.ts +0 -231
- package/dist/runtime/document-runtime.js +0 -21
- package/dist/runtime/document-runtime.js.map +0 -1
- package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
- package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
- package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
- package/dist/ui-tailwind/index.cjs +0 -4833
- package/dist/ui-tailwind/index.cjs.map +0 -1
- package/dist/ui-tailwind/index.d.cts +0 -617
- package/dist/ui-tailwind/index.d.ts +0 -617
- package/dist/ui-tailwind/index.js +0 -575
- package/dist/ui-tailwind/index.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/io/ooxml/parse-numbering.ts","../src/io/ooxml/parse-inline-media.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"],"sourcesContent":["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","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","/**\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"],"mappings":"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","names":["name","parseXml","localName","decodeXmlEntities","name","findTagEnd","parseTag","parseXml","findFirstDescendant","localName","findTagEnd","parseTag","parseXml","findFirstDescendant","findFirstChild","localName","findTagEnd","parseTag","parseXml","findChildElement","localName","readOptionalAttribute","findFirstDescendant","findFirstChild","decodeXmlEntities","name","findTagEnd","parseTag"]}
|
package/dist/chunk-4D5EWJ3P.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
buildSearchPattern
|
|
3
|
-
} from "./chunk-CN3XMECL.js";
|
|
4
|
-
|
|
5
|
-
// src/ui-tailwind/editor-surface/search-plugin.ts
|
|
6
|
-
import { Plugin, PluginKey } from "prosemirror-state";
|
|
7
|
-
import { Decoration, DecorationSet } from "prosemirror-view";
|
|
8
|
-
var DEFAULT_SEARCH_HIGHLIGHT_COLOR = "#fde68a";
|
|
9
|
-
var searchPluginKey = new PluginKey("search");
|
|
10
|
-
function createSearchPlugin() {
|
|
11
|
-
return new Plugin({
|
|
12
|
-
key: searchPluginKey,
|
|
13
|
-
state: {
|
|
14
|
-
init() {
|
|
15
|
-
return { results: [], highlightColor: null };
|
|
16
|
-
},
|
|
17
|
-
apply(tr, pluginState) {
|
|
18
|
-
const meta = tr.getMeta(searchPluginKey);
|
|
19
|
-
if (meta) return meta;
|
|
20
|
-
return pluginState;
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
props: {
|
|
24
|
-
decorations(state) {
|
|
25
|
-
const pluginState = searchPluginKey.getState(state);
|
|
26
|
-
if (!pluginState || pluginState.results.length === 0 || !pluginState.highlightColor) {
|
|
27
|
-
return DecorationSet.empty;
|
|
28
|
-
}
|
|
29
|
-
const decos = pluginState.results.map(
|
|
30
|
-
(r) => Decoration.inline(r.from, r.to, {
|
|
31
|
-
style: `background-color: ${pluginState.highlightColor}; border-radius: 2px;`,
|
|
32
|
-
class: "search-highlight"
|
|
33
|
-
})
|
|
34
|
-
);
|
|
35
|
-
return DecorationSet.create(state.doc, decos);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
function performSearch(state, query, options = {}) {
|
|
41
|
-
const pattern = buildSearchPattern(query, options);
|
|
42
|
-
if (!pattern) return [];
|
|
43
|
-
const results = [];
|
|
44
|
-
state.doc.descendants((node, pos) => {
|
|
45
|
-
if (!node.isText || !node.text) return;
|
|
46
|
-
let match;
|
|
47
|
-
pattern.lastIndex = 0;
|
|
48
|
-
while ((match = pattern.exec(node.text)) !== null) {
|
|
49
|
-
results.push({
|
|
50
|
-
from: pos + match.index,
|
|
51
|
-
to: pos + match.index + match[0].length,
|
|
52
|
-
text: match[0],
|
|
53
|
-
index: results.length
|
|
54
|
-
});
|
|
55
|
-
if (match[0].length === 0) {
|
|
56
|
-
pattern.lastIndex += 1;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
return results;
|
|
61
|
-
}
|
|
62
|
-
function clearSearch(state, dispatch) {
|
|
63
|
-
if (!dispatch) return true;
|
|
64
|
-
dispatch(
|
|
65
|
-
state.tr.setMeta(searchPluginKey, { results: [], highlightColor: null })
|
|
66
|
-
);
|
|
67
|
-
return true;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export {
|
|
71
|
-
DEFAULT_SEARCH_HIGHLIGHT_COLOR,
|
|
72
|
-
searchPluginKey,
|
|
73
|
-
createSearchPlugin,
|
|
74
|
-
performSearch,
|
|
75
|
-
clearSearch
|
|
76
|
-
};
|
|
77
|
-
//# sourceMappingURL=chunk-4D5EWJ3P.js.map
|