@beyondwork/docx-react-component 1.0.29 → 1.0.30
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/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 +298 -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 +200 -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 +65 -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 +122 -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/tw-toolbar-icon-button.tsx +52 -0
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1133 -0
- package/src/ui-tailwind/tw-review-workspace.tsx +1460 -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/opc/package-writer.ts","../src/io/opc/docx-package.ts","../src/io/opc/package-reader.ts","../src/io/export/reattach-preserved-parts.ts","../src/io/export/export-session.ts","../src/io/ooxml/numbering-sentinels.ts","../src/io/export/serialize-numbering.ts","../src/preservation/relationship-retention.ts","../src/io/export/serialize-main-document.ts","../src/io/export/serialize-comments.ts","../src/io/export/split-review-boundaries.ts","../src/io/ooxml/revision-boundaries.ts","../src/io/export/serialize-runtime-revisions.ts"],"sourcesContent":["import {\n CONTENT_TYPES_PATH,\n OpcCompressionMethod,\n OpcPackageManifest,\n OpcPackagePart,\n OpcRelationship,\n PACKAGE_RELATIONSHIPS_PATH,\n comparePartPaths,\n getExtension,\n getRelationshipsPartPath,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\nimport type { OpcPackage } from \"./package-reader.ts\";\n\ninterface ZipEntryPayload {\n path: string;\n compression: OpcCompressionMethod;\n uncompressedBytes: Uint8Array;\n compressedBytes: Uint8Array;\n crc32: number;\n}\n\nexport function writeOpcPackage(input: OpcPackage | { manifest: OpcPackageManifest; parts: Map<string, OpcPackagePart> }): Uint8Array {\n const entries = collectZipEntries(input.manifest, input.parts);\n return buildZipArchive(entries);\n}\n\nfunction collectZipEntries(\n manifest: OpcPackageManifest,\n parts: Map<string, OpcPackagePart>,\n): ZipEntryPayload[] {\n const entries: ZipEntryPayload[] = [];\n const contentParts = [...parts.values()]\n .filter((part) => part.surfaceKind === \"content\")\n .sort((left, right) => comparePartPaths(left.path, right.path));\n\n entries.push(createZipPayload(CONTENT_TYPES_PATH, \"deflate\", encodeXml(buildContentTypesXml(manifest, contentParts))));\n entries.push(\n createZipPayload(\n PACKAGE_RELATIONSHIPS_PATH,\n \"deflate\",\n encodeXml(buildRelationshipsXml(manifest.packageRelationships)),\n ),\n );\n\n for (const part of contentParts) {\n entries.push(createZipPayload(part.path, part.compression, part.bytes));\n\n if (part.relationships.length > 0) {\n entries.push(\n createZipPayload(\n getRelationshipsPartPath(part.path),\n \"deflate\",\n encodeXml(buildRelationshipsXml(part.relationships)),\n ),\n );\n }\n }\n\n return entries.sort((left, right) => comparePartPaths(left.path, right.path));\n}\n\nfunction buildContentTypesXml(\n manifest: OpcPackageManifest,\n parts: OpcPackagePart[],\n): string {\n const defaults: Record<string, string> = {\n ...manifest.contentTypes.defaults,\n rels: manifest.contentTypes.defaults.rels ?? \"application/vnd.openxmlformats-package.relationships+xml\",\n xml: manifest.contentTypes.defaults.xml ?? \"application/xml\",\n };\n\n const overrides = { ...manifest.contentTypes.overrides };\n\n for (const part of parts) {\n if (!part.contentType) {\n throw new Error(`Cannot write OPC package: missing content type for ${part.path}.`);\n }\n\n const extension = getExtension(part.path);\n if (!extension) {\n overrides[part.path] = part.contentType;\n continue;\n }\n\n const defaultContentType = defaults[extension];\n if (!defaultContentType) {\n defaults[extension] = part.contentType;\n delete overrides[part.path];\n continue;\n }\n\n if (defaultContentType === part.contentType) {\n delete overrides[part.path];\n continue;\n }\n\n overrides[part.path] = part.contentType;\n }\n\n const defaultEntries = Object.entries(defaults).sort(([left], [right]) => left.localeCompare(right));\n const overrideEntries = Object.entries(overrides).sort(([left], [right]) => comparePartPaths(left, right));\n\n const defaultXml = defaultEntries\n .map(([extension, contentType]) => ` <Default Extension=\"${escapeXml(extension)}\" ContentType=\"${escapeXml(contentType)}\"/>`)\n .join(\"\\n\");\n const overrideXml = overrideEntries\n .map(([partName, contentType]) => ` <Override PartName=\"${escapeXml(partName)}\" ContentType=\"${escapeXml(contentType)}\"/>`)\n .join(\"\\n\");\n const body = [defaultXml, overrideXml].filter((value) => value.length > 0).join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">`,\n body,\n `</Types>`,\n ].join(\"\\n\");\n}\n\nfunction buildRelationshipsXml(relationships: OpcRelationship[]): string {\n const relationshipXml = [...relationships]\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((relationship) => {\n const targetMode =\n relationship.targetMode === \"external\"\n ? ` TargetMode=\"External\"`\n : \"\";\n return ` <Relationship Id=\"${escapeXml(relationship.id)}\" Type=\"${escapeXml(relationship.type)}\" Target=\"${escapeXml(relationship.target)}\"${targetMode}/>`;\n })\n .join(\"\\n\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">`,\n relationshipXml,\n `</Relationships>`,\n ].join(\"\\n\");\n}\n\nfunction createZipPayload(\n path: string,\n compression: OpcCompressionMethod,\n bytes: Uint8Array,\n): ZipEntryPayload {\n const normalizedPath = normalizePartPath(path).slice(1);\n const uncompressedBytes = new Uint8Array(bytes);\n // Keep export browser-safe by storing entries without Node-only compression primitives.\n const compressedBytes = uncompressedBytes;\n const effectiveCompression: OpcCompressionMethod = \"store\";\n\n return {\n path: normalizedPath,\n compression: effectiveCompression,\n uncompressedBytes,\n compressedBytes,\n crc32: calculateCrc32(uncompressedBytes),\n };\n}\n\nfunction buildZipArchive(entries: ZipEntryPayload[]): Uint8Array {\n const localChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let localOffset = 0;\n\n for (const entry of entries) {\n const fileName = encodeUtf8(entry.path);\n const localHeader = createByteBuffer(30 + fileName.length);\n const localHeaderView = new DataView(localHeader.buffer);\n localHeaderView.setUint32(0, 0x04034b50, true);\n localHeaderView.setUint16(4, 20, true);\n localHeaderView.setUint16(6, 0, true);\n localHeaderView.setUint16(8, entry.compression === \"store\" ? 0 : 8, true);\n localHeaderView.setUint16(10, 0, true);\n localHeaderView.setUint16(12, 0, true);\n localHeaderView.setUint32(14, entry.crc32 >>> 0, true);\n localHeaderView.setUint32(18, entry.compressedBytes.byteLength, true);\n localHeaderView.setUint32(22, entry.uncompressedBytes.byteLength, true);\n localHeaderView.setUint16(26, fileName.length, true);\n localHeaderView.setUint16(28, 0, true);\n localHeader.set(fileName, 30);\n\n localChunks.push(localHeader, entry.compressedBytes);\n\n const centralHeader = createByteBuffer(46 + fileName.length);\n const centralHeaderView = new DataView(centralHeader.buffer);\n centralHeaderView.setUint32(0, 0x02014b50, true);\n centralHeaderView.setUint16(4, 20, true);\n centralHeaderView.setUint16(6, 20, true);\n centralHeaderView.setUint16(8, 0, true);\n centralHeaderView.setUint16(10, entry.compression === \"store\" ? 0 : 8, true);\n centralHeaderView.setUint16(12, 0, true);\n centralHeaderView.setUint16(14, 0, true);\n centralHeaderView.setUint32(16, entry.crc32 >>> 0, true);\n centralHeaderView.setUint32(20, entry.compressedBytes.byteLength, true);\n centralHeaderView.setUint32(24, entry.uncompressedBytes.byteLength, true);\n centralHeaderView.setUint16(28, fileName.length, true);\n centralHeaderView.setUint16(30, 0, true);\n centralHeaderView.setUint16(32, 0, true);\n centralHeaderView.setUint16(34, 0, true);\n centralHeaderView.setUint16(36, 0, true);\n centralHeaderView.setUint32(38, 0, true);\n centralHeaderView.setUint32(42, localOffset, true);\n centralHeader.set(fileName, 46);\n centralChunks.push(centralHeader);\n\n localOffset += localHeader.byteLength + entry.compressedBytes.byteLength;\n }\n\n const centralDirectoryOffset = localOffset;\n const centralDirectory = concatByteArrays(centralChunks);\n const endOfCentralDirectory = createByteBuffer(22);\n const endOfCentralDirectoryView = new DataView(endOfCentralDirectory.buffer);\n endOfCentralDirectoryView.setUint32(0, 0x06054b50, true);\n endOfCentralDirectoryView.setUint16(4, 0, true);\n endOfCentralDirectoryView.setUint16(6, 0, true);\n endOfCentralDirectoryView.setUint16(8, entries.length, true);\n endOfCentralDirectoryView.setUint16(10, entries.length, true);\n endOfCentralDirectoryView.setUint32(12, centralDirectory.byteLength, true);\n endOfCentralDirectoryView.setUint32(16, centralDirectoryOffset, true);\n endOfCentralDirectoryView.setUint16(20, 0, true);\n\n return concatByteArrays([...localChunks, centralDirectory, endOfCentralDirectory]);\n}\n\nfunction encodeXml(xml: string): Uint8Array {\n return encodeUtf8(xml);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/'/g, \"'\");\n}\n\nfunction calculateCrc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n\n for (const byte of bytes) {\n crc ^= byte;\n for (let bit = 0; bit < 8; bit += 1) {\n const mask = -(crc & 1);\n crc = (crc >>> 1) ^ (0xedb88320 & mask);\n }\n }\n\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nfunction createByteBuffer(size: number): Uint8Array {\n return new Uint8Array(size);\n}\n\nfunction concatByteArrays(chunks: readonly Uint8Array[]): Uint8Array {\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);\n const combined = new Uint8Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.byteLength;\n }\n\n return combined;\n}\n\nfunction encodeUtf8(value: string): Uint8Array {\n return new TextEncoder().encode(value);\n}\n\nexport { buildContentTypesXml, buildRelationshipsXml, calculateCrc32 };\n","import {\n getRelationshipsPartPath,\n type OpcPackageManifest,\n type OpcPackagePart,\n} from \"../ooxml/part-manifest.ts\";\nimport { writeOpcPackage } from \"./package-writer.ts\";\n\nexport const DOCX_MIME_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\nexport const DOCX_DOCUMENT_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\";\nexport const DOCX_DOCUMENT_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\";\n\ninterface WriteDocxPackageInput {\n documentXml: string;\n documentContentType?: string;\n packageRelationshipType?: string;\n}\n\nexport function writeDocxPackage(input: WriteDocxPackageInput): Uint8Array {\n const documentPath = \"/word/document.xml\";\n const contentType = input.documentContentType ?? DOCX_DOCUMENT_CONTENT_TYPE;\n const relationshipType =\n input.packageRelationshipType ?? DOCX_DOCUMENT_RELATIONSHIP_TYPE;\n const documentBytes = new TextEncoder().encode(input.documentXml);\n\n const documentPart: OpcPackagePart = {\n path: documentPath,\n surfaceKind: \"content\",\n contentType,\n relationshipsPartPath: getRelationshipsPartPath(documentPath),\n relationships: [],\n compression: \"deflate\",\n bytes: documentBytes,\n crc32: 0,\n };\n\n const manifest: OpcPackageManifest = {\n contentTypes: {\n defaults: {\n rels: \"application/vnd.openxmlformats-package.relationships+xml\",\n xml: \"application/xml\",\n },\n overrides: {\n [documentPath]: contentType,\n },\n },\n packageRelationships: [\n {\n id: \"rId1\",\n type: relationshipType,\n target: \"word/document.xml\",\n targetMode: \"internal\",\n },\n ],\n parts: [\n {\n path: documentPart.path,\n surfaceKind: documentPart.surfaceKind,\n contentType: documentPart.contentType,\n relationshipsPartPath: documentPart.relationshipsPartPath,\n relationships: documentPart.relationships,\n compression: documentPart.compression,\n byteLength: documentPart.bytes.byteLength,\n },\n ],\n };\n\n return writeOpcPackage({\n manifest,\n parts: new Map([[documentPart.path, documentPart]]),\n });\n}\n","import { inflateSync } from \"fflate\";\n\nimport {\n CONTENT_TYPES_PATH,\n OpcCompressionMethod,\n OpcPackageManifest,\n OpcPackagePart,\n OpcPartManifestEntry,\n OpcRelationship,\n PACKAGE_RELATIONSHIPS_PATH,\n getRelationshipsPartPath,\n getSourcePartPathFromRelationshipsPart,\n normalizePartPath,\n} from \"../ooxml/part-manifest.ts\";\n\ninterface ZipCentralDirectoryEntry {\n path: string;\n compression: OpcCompressionMethod;\n crc32: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n generalPurposeBitFlag: number;\n}\n\nexport interface OpcPackage {\n manifest: OpcPackageManifest;\n parts: Map<string, OpcPackagePart>;\n sourceByteLength: number;\n}\n\nconst EOCD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\n\nexport function readOpcPackage(source: Uint8Array | ArrayBuffer): OpcPackage {\n const bytes = source instanceof Uint8Array ? source : new Uint8Array(source);\n const centralDirectory = readCentralDirectory(bytes);\n const parts = new Map<string, OpcPackagePart>();\n\n for (const entry of centralDirectory) {\n if (entry.path.endsWith(\"/\")) {\n continue;\n }\n\n const storedBytes = readZipEntry(bytes, entry);\n const normalizedPath = normalizePartPath(entry.path);\n const surfaceKind = getSurfaceKind(normalizedPath);\n\n parts.set(normalizedPath, {\n path: normalizedPath,\n surfaceKind,\n contentType: null,\n relationshipsPartPath:\n surfaceKind === \"content\" ? getRelationshipsPartPath(normalizedPath) : null,\n relationships: [],\n compression: entry.compression,\n bytes: storedBytes,\n crc32: entry.crc32 >>> 0,\n });\n }\n\n const contentTypesPart = parts.get(CONTENT_TYPES_PATH);\n if (!contentTypesPart) {\n throw new Error(\"Invalid OPC package: missing /[Content_Types].xml.\");\n }\n\n const contentTypes = parseContentTypesXml(decodeXml(contentTypesPart.bytes));\n const packageRelationshipsPart = parts.get(PACKAGE_RELATIONSHIPS_PATH);\n const packageRelationships = packageRelationshipsPart\n ? parseRelationshipsXml(decodeXml(packageRelationshipsPart.bytes))\n : [];\n\n const manifestParts: OpcPartManifestEntry[] = [];\n\n for (const [path, part] of [...parts.entries()].sort(([left], [right]) => left.localeCompare(right))) {\n const contentType = resolveContentType(path, contentTypes);\n const relationshipsPartPath = part.surfaceKind === \"content\" ? getRelationshipsPartPath(path) : null;\n const relationshipsPart = relationshipsPartPath ? parts.get(relationshipsPartPath) : undefined;\n const relationships = relationshipsPart\n ? parseRelationshipsXml(decodeXml(relationshipsPart.bytes))\n : [];\n\n const nextPart: OpcPackagePart = {\n ...part,\n contentType,\n relationshipsPartPath,\n relationships,\n };\n\n parts.set(path, nextPart);\n manifestParts.push({\n path,\n surfaceKind: nextPart.surfaceKind,\n contentType,\n relationshipsPartPath,\n relationships,\n compression: nextPart.compression,\n byteLength: nextPart.bytes.byteLength,\n });\n }\n\n return {\n manifest: {\n contentTypes,\n packageRelationships,\n parts: manifestParts,\n },\n parts,\n sourceByteLength: bytes.byteLength,\n };\n}\n\nfunction readCentralDirectory(archive: Uint8Array): ZipCentralDirectoryEntry[] {\n const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength);\n const eocdOffset = findEndOfCentralDirectory(archive, view);\n const entryCount = view.getUint16(eocdOffset + 10, true);\n const centralDirectoryOffset = view.getUint32(eocdOffset + 16, true);\n const entries: ZipCentralDirectoryEntry[] = [];\n let offset = centralDirectoryOffset;\n\n for (let index = 0; index < entryCount; index += 1) {\n const signature = view.getUint32(offset, true);\n if (signature !== CENTRAL_DIRECTORY_SIGNATURE) {\n throw new Error(`Invalid ZIP central directory signature at offset ${offset}.`);\n }\n\n const generalPurposeBitFlag = view.getUint16(offset + 8, true);\n const compressionMethod = view.getUint16(offset + 10, true);\n const crc32 = view.getUint32(offset + 16, true);\n const compressedSize = view.getUint32(offset + 20, true);\n const uncompressedSize = view.getUint32(offset + 24, true);\n const fileNameLength = view.getUint16(offset + 28, true);\n const extraFieldLength = view.getUint16(offset + 30, true);\n const fileCommentLength = view.getUint16(offset + 32, true);\n const localHeaderOffset = view.getUint32(offset + 42, true);\n const fileNameOffset = offset + 46;\n const fileName = decodeUtf8(archive.subarray(fileNameOffset, fileNameOffset + fileNameLength));\n\n entries.push({\n path: fileName,\n compression: mapCompressionMethod(compressionMethod),\n crc32,\n compressedSize,\n uncompressedSize,\n localHeaderOffset,\n generalPurposeBitFlag,\n });\n\n offset += 46 + fileNameLength + extraFieldLength + fileCommentLength;\n }\n\n return entries;\n}\n\nfunction findEndOfCentralDirectory(archive: Uint8Array, view: DataView): number {\n const minimumEocdSize = 22;\n const maximumCommentSize = 0xffff;\n const searchStart = Math.max(0, archive.length - minimumEocdSize - maximumCommentSize);\n\n for (let offset = archive.length - minimumEocdSize; offset >= searchStart; offset -= 1) {\n if (view.getUint32(offset, true) === EOCD_SIGNATURE) {\n return offset;\n }\n }\n\n throw new Error(\"Invalid ZIP archive: end of central directory not found.\");\n}\n\nfunction readZipEntry(archive: Uint8Array, entry: ZipCentralDirectoryEntry): Uint8Array {\n const view = new DataView(archive.buffer, archive.byteOffset, archive.byteLength);\n const headerOffset = entry.localHeaderOffset;\n const signature = view.getUint32(headerOffset, true);\n if (signature !== LOCAL_FILE_HEADER_SIGNATURE) {\n throw new Error(`Invalid ZIP local file header signature at offset ${headerOffset}.`);\n }\n\n const fileNameLength = view.getUint16(headerOffset + 26, true);\n const extraFieldLength = view.getUint16(headerOffset + 28, true);\n const dataOffset = headerOffset + 30 + fileNameLength + extraFieldLength;\n const compressed = archive.subarray(dataOffset, dataOffset + entry.compressedSize);\n\n switch (entry.compression) {\n case \"store\":\n return new Uint8Array(compressed);\n case \"deflate\":\n return inflateSync(compressed);\n default:\n throw new Error(`Unsupported ZIP compression for ${entry.path}.`);\n }\n}\n\nfunction mapCompressionMethod(method: number): OpcCompressionMethod {\n switch (method) {\n case 0:\n return \"store\";\n case 8:\n return \"deflate\";\n default:\n throw new Error(`Unsupported ZIP compression method ${method}.`);\n }\n}\n\nfunction getSurfaceKind(path: string): OpcPartManifestEntry[\"surfaceKind\"] {\n if (path === CONTENT_TYPES_PATH) {\n return \"content-types\";\n }\n\n if (path === PACKAGE_RELATIONSHIPS_PATH || path.includes(\"/_rels/\")) {\n return \"relationships\";\n }\n\n return \"content\";\n}\n\nfunction decodeXml(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\").decode(bytes);\n}\n\nfunction decodeUtf8(bytes: Uint8Array): string {\n return new TextDecoder(\"utf-8\").decode(bytes);\n}\n\nfunction parseContentTypesXml(xml: string): OpcPackageManifest[\"contentTypes\"] {\n const defaults: Record<string, string> = {};\n const overrides: Record<string, string> = {};\n\n for (const attributes of findTagAttributes(xml, \"Default\")) {\n const extension = attributes.Extension?.toLowerCase();\n const contentType = attributes.ContentType;\n if (!extension || !contentType) {\n continue;\n }\n\n defaults[extension] = contentType;\n }\n\n for (const attributes of findTagAttributes(xml, \"Override\")) {\n const partName = attributes.PartName;\n const contentType = attributes.ContentType;\n if (!partName || !contentType) {\n continue;\n }\n\n overrides[normalizePartPath(partName)] = contentType;\n }\n\n return { defaults, overrides };\n}\n\nfunction parseRelationshipsXml(xml: string): OpcRelationship[] {\n const relationships: OpcRelationship[] = [];\n\n for (const attributes of findTagAttributes(xml, \"Relationship\")) {\n const id = attributes.Id;\n const type = attributes.Type;\n const target = attributes.Target;\n if (!id || !type || !target) {\n continue;\n }\n\n relationships.push({\n id,\n type,\n target,\n targetMode: attributes.TargetMode === \"External\" ? \"external\" : \"internal\",\n });\n }\n\n return relationships;\n}\n\nfunction findTagAttributes(xml: string, tagName: string): Record<string, string>[] {\n const tagPattern = new RegExp(`<(?:[A-Za-z_][\\\\w.-]*:)?${tagName}\\\\b([^>]*)\\\\/?>`, \"g\");\n const results: Record<string, string>[] = [];\n let tagMatch: RegExpExecArray | null = tagPattern.exec(xml);\n\n while (tagMatch) {\n results.push(parseAttributes(tagMatch[1] ?? \"\"));\n tagMatch = tagPattern.exec(xml);\n }\n\n return results;\n}\n\nfunction parseAttributes(rawAttributes: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attributePattern = /([A-Za-z_][\\w:.-]*)\\s*=\\s*([\"'])([\\s\\S]*?)\\2/g;\n let match: RegExpExecArray | null = attributePattern.exec(rawAttributes);\n\n while (match) {\n attributes[match[1]] = decodeXmlEntities(match[3]);\n match = attributePattern.exec(rawAttributes);\n }\n\n return attributes;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\");\n}\n\nfunction resolveContentType(\n path: string,\n contentTypes: OpcPackageManifest[\"contentTypes\"],\n): string | null {\n if (path === CONTENT_TYPES_PATH) {\n return \"application/xml\";\n }\n\n const override = contentTypes.overrides[path];\n if (override) {\n return override;\n }\n\n const extension = path.includes(\".\") ? path.slice(path.lastIndexOf(\".\") + 1).toLowerCase() : \"\";\n return extension ? contentTypes.defaults[extension] ?? null : null;\n}\n\nexport { parseContentTypesXml, parseRelationshipsXml };\n","import type { OpcPackage } from \"../opc/package-reader.ts\";\nimport type { OpcPackagePart, OpcRelationship } from \"../ooxml/part-manifest.ts\";\n\nexport function reattachPreservedParts(\n sourcePackage: OpcPackage,\n workingParts: Map<string, OpcPackagePart>,\n packageRelationships: OpcRelationship[],\n ownedPaths: ReadonlySet<string>,\n): void {\n for (const [path, sourcePart] of sourcePackage.parts.entries()) {\n if (ownedPaths.has(path) || sourcePart.surfaceKind !== \"content\") {\n continue;\n }\n\n if (!workingParts.has(path)) {\n workingParts.set(path, clonePart(sourcePart));\n continue;\n }\n\n const currentPart = workingParts.get(path);\n if (!currentPart) {\n continue;\n }\n\n currentPart.contentType = sourcePart.contentType;\n currentPart.relationships = sourcePart.relationships.map(cloneRelationship);\n currentPart.relationshipsPartPath = sourcePart.relationshipsPartPath;\n currentPart.compression = sourcePart.compression;\n currentPart.bytes = new Uint8Array(sourcePart.bytes);\n currentPart.crc32 = sourcePart.crc32;\n }\n\n const knownPackageRelationshipIds = new Set(packageRelationships.map((relationship) => relationship.id));\n for (const relationship of sourcePackage.manifest.packageRelationships) {\n if (knownPackageRelationshipIds.has(relationship.id)) {\n continue;\n }\n\n packageRelationships.push(cloneRelationship(relationship));\n knownPackageRelationshipIds.add(relationship.id);\n }\n}\n\nfunction clonePart(part: OpcPackagePart): OpcPackagePart {\n return {\n ...part,\n relationships: part.relationships.map(cloneRelationship),\n bytes: new Uint8Array(part.bytes),\n };\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n","import {\n CONTENT_TYPES_PATH,\n PACKAGE_RELATIONSHIPS_PATH,\n OpcCompressionMethod,\n OpcPackagePart,\n OpcRelationship,\n comparePartPaths,\n getRelationshipsPartPath,\n normalizePartPath,\n resolveRelationshipTarget,\n} from \"../ooxml/part-manifest.ts\";\nimport type { OpcPackage } from \"../opc/package-reader.ts\";\nimport { writeOpcPackage } from \"../opc/package-writer.ts\";\nimport { reattachPreservedParts } from \"./reattach-preserved-parts.ts\";\n\nexport interface ExportPartReplacement {\n path: string;\n bytes: Uint8Array;\n contentType: string;\n relationships?: OpcRelationship[];\n compression?: OpcCompressionMethod;\n}\n\nexport interface ExportSessionSnapshot {\n manifest: OpcPackage[\"manifest\"];\n parts: Map<string, OpcPackagePart>;\n}\n\nexport class ExportSession {\n private readonly ownedPaths: Set<string>;\n private readonly workingParts: Map<string, OpcPackagePart>;\n private readonly packageRelationships: OpcRelationship[];\n\n public constructor(private readonly sourcePackage: OpcPackage, ownedOutputPaths: Iterable<string>) {\n this.ownedPaths = new Set(\n [...ownedOutputPaths].map((path) => {\n const normalized = normalizePartPath(path);\n if (normalized === CONTENT_TYPES_PATH || normalized.endsWith(\".rels\") || normalized === PACKAGE_RELATIONSHIPS_PATH) {\n throw new Error(`ExportSession cannot directly own reserved OPC manifest path ${normalized}.`);\n }\n\n return normalized;\n }),\n );\n this.workingParts = cloneParts(sourcePackage.parts);\n this.packageRelationships = sourcePackage.manifest.packageRelationships.map(cloneRelationship);\n }\n\n public replaceOwnedPart(replacement: ExportPartReplacement): void {\n const normalizedPath = normalizePartPath(replacement.path);\n if (!this.ownedPaths.has(normalizedPath)) {\n throw new Error(`Attempted to rewrite non-owned OPC path ${normalizedPath}.`);\n }\n\n const existing = this.workingParts.get(normalizedPath);\n const nextPart: OpcPackagePart = {\n path: normalizedPath,\n surfaceKind: \"content\",\n contentType: replacement.contentType,\n relationshipsPartPath: getRelationshipsPartPath(normalizedPath),\n relationships: (replacement.relationships ?? existing?.relationships ?? []).map(cloneRelationship),\n compression: replacement.compression ?? existing?.compression ?? \"deflate\",\n bytes: new Uint8Array(replacement.bytes),\n crc32: 0,\n };\n\n this.workingParts.set(normalizedPath, nextPart);\n }\n\n public withOwnedPart(replacement: ExportPartReplacement): ExportSession {\n this.replaceOwnedPart(replacement);\n return this;\n }\n\n public ensurePackageRelationship(input: {\n type: string;\n target: string;\n targetMode?: OpcRelationship[\"targetMode\"];\n preferredId?: string;\n }): void {\n const targetMode = input.targetMode ?? \"internal\";\n const normalizedTarget =\n targetMode === \"internal\" ? normalizePartPath(input.target) : input.target;\n const existing = this.packageRelationships.find((relationship) => {\n if (relationship.type !== input.type || relationship.targetMode !== targetMode) {\n return false;\n }\n\n return targetMode === \"internal\"\n ? resolveRelationshipTarget(null, relationship) === normalizedTarget\n : relationship.target === normalizedTarget;\n });\n if (existing) {\n return;\n }\n\n const relationshipId = createUniqueRelationshipId(\n new Set(this.packageRelationships.map((relationship) => relationship.id)),\n input.preferredId ?? \"rIdPackage1\",\n );\n this.packageRelationships.push({\n id: relationshipId,\n type: input.type,\n target:\n targetMode === \"internal\"\n ? toPackageRelationshipTarget(normalizedTarget)\n : normalizedTarget,\n targetMode,\n });\n }\n\n public toPackage(): OpcPackage {\n reattachPreservedParts(\n this.sourcePackage,\n this.workingParts,\n this.packageRelationships,\n this.ownedPaths,\n );\n const parts = pruneReservedManifestParts(this.workingParts);\n const manifest = buildManifest(parts, this.packageRelationships, this.sourcePackage.manifest.contentTypes);\n return {\n manifest,\n parts,\n sourceByteLength: this.sourcePackage.sourceByteLength,\n };\n }\n\n public serialize(): Uint8Array {\n return writeOpcPackage(this.toPackage());\n }\n}\n\nexport function createExportSession(\n sourcePackage: OpcPackage,\n ownedOutputPaths: Iterable<string>,\n): ExportSession {\n return new ExportSession(sourcePackage, ownedOutputPaths);\n}\n\nfunction cloneParts(parts: Map<string, OpcPackagePart>): Map<string, OpcPackagePart> {\n return new Map(\n [...parts.entries()].map(([path, part]) => [\n path,\n {\n ...part,\n relationships: part.relationships.map(cloneRelationship),\n bytes: new Uint8Array(part.bytes),\n },\n ]),\n );\n}\n\nfunction pruneReservedManifestParts(parts: Map<string, OpcPackagePart>): Map<string, OpcPackagePart> {\n return new Map(\n [...parts.entries()].filter(([path]) => path !== CONTENT_TYPES_PATH && path !== PACKAGE_RELATIONSHIPS_PATH && !path.includes(\"/_rels/\")),\n );\n}\n\nfunction buildManifest(\n parts: Map<string, OpcPackagePart>,\n packageRelationships: OpcRelationship[],\n contentTypesSeed: OpcPackage[\"manifest\"][\"contentTypes\"],\n): OpcPackage[\"manifest\"] {\n const partsList = [...parts.values()].sort((left, right) => comparePartPaths(left.path, right.path));\n\n const overrides = { ...contentTypesSeed.overrides };\n for (const key of Object.keys(overrides)) {\n if (!parts.has(normalizePartPath(key))) {\n delete overrides[key];\n }\n }\n\n for (const part of partsList) {\n if (!part.contentType) {\n throw new Error(`Cannot export part without content type: ${part.path}`);\n }\n\n overrides[part.path] = part.contentType;\n }\n\n return {\n contentTypes: {\n defaults: { ...contentTypesSeed.defaults },\n overrides,\n },\n packageRelationships: packageRelationships.map(cloneRelationship),\n parts: partsList.map((part) => ({\n path: part.path,\n surfaceKind: part.surfaceKind,\n contentType: part.contentType,\n relationshipsPartPath: part.relationshipsPartPath,\n relationships: part.relationships.map(cloneRelationship),\n compression: part.compression,\n byteLength: part.bytes.byteLength,\n })),\n };\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nfunction createUniqueRelationshipId(existingIds: ReadonlySet<string>, preferredId: string): string {\n if (!existingIds.has(preferredId)) {\n return preferredId;\n }\n\n let nextIndex = 2;\n while (existingIds.has(`${preferredId}-${nextIndex}`)) {\n nextIndex += 1;\n }\n\n return `${preferredId}-${nextIndex}`;\n}\n\nfunction toPackageRelationshipTarget(partPath: string): string {\n return normalizePartPath(partPath).slice(1);\n}\n\nexport { buildManifest };\n","import type { NumberingCatalog } from \"../../model/canonical-document.ts\";\n\nexport const DOCX_NULL_NUMBERING_INSTANCE_ID = \"num:0\";\nexport const DOCX_NULL_ABSTRACT_NUMBERING_ID = \"abstract-num:__docx-import-null__\";\n\nexport function createSyntheticDocxNullNumberingCatalog(): Pick<\n NumberingCatalog,\n \"abstractDefinitions\" | \"instances\"\n> {\n return {\n abstractDefinitions: {\n [DOCX_NULL_ABSTRACT_NUMBERING_ID]: {\n abstractNumberingId: DOCX_NULL_ABSTRACT_NUMBERING_ID,\n levels: Array.from({ length: 9 }, (_unused, level) => ({\n level,\n format: \"none\",\n text: \"\",\n })),\n },\n },\n instances: {\n [DOCX_NULL_NUMBERING_INSTANCE_ID]: {\n numberingInstanceId: DOCX_NULL_NUMBERING_INSTANCE_ID,\n abstractNumberingId: DOCX_NULL_ABSTRACT_NUMBERING_ID,\n overrides: [],\n },\n },\n };\n}\n\nexport function isSyntheticDocxNullAbstractDefinition(\n definition: NumberingCatalog[\"abstractDefinitions\"][string],\n): boolean {\n return definition.abstractNumberingId === DOCX_NULL_ABSTRACT_NUMBERING_ID;\n}\n\nexport function isSyntheticDocxNullNumberingInstance(\n instance: NumberingCatalog[\"instances\"][string],\n): boolean {\n return (\n instance.numberingInstanceId === DOCX_NULL_NUMBERING_INSTANCE_ID &&\n instance.abstractNumberingId === DOCX_NULL_ABSTRACT_NUMBERING_ID\n );\n}\n","import type { NumberingCatalog, ParagraphNode } from \"../../model/canonical-document.ts\";\nimport {\n isSyntheticDocxNullAbstractDefinition,\n isSyntheticDocxNullNumberingInstance,\n} from \"../ooxml/numbering-sentinels.ts\";\n\nexport const WORD_NUMBERING_CONTENT_TYPE =\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\";\n\nexport function serializeNumberingXml(catalog: NumberingCatalog): string {\n const abstractDefinitions = Object.values(catalog.abstractDefinitions)\n .filter((definition) => !isSyntheticDocxNullAbstractDefinition(definition))\n .sort((left, right) =>\n compareSerializedIds(left.abstractNumberingId, right.abstractNumberingId),\n );\n const instances = Object.values(catalog.instances)\n .filter((instance) => !isSyntheticDocxNullNumberingInstance(instance))\n .sort((left, right) =>\n compareSerializedIds(left.numberingInstanceId, right.numberingInstanceId),\n );\n\n const body = [\n ...abstractDefinitions.map((definition) => serializeAbstractDefinition(definition)),\n ...instances.map((instance) => serializeInstance(instance)),\n ].join(\"\");\n\n return [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n `<w:numbering xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">${body}</w:numbering>`,\n ].join(\"\\n\");\n}\n\nexport function hasSerializableNumberingEntries(catalog: NumberingCatalog): boolean {\n return (\n Object.values(catalog.abstractDefinitions).some(\n (definition) => !isSyntheticDocxNullAbstractDefinition(definition),\n ) ||\n Object.values(catalog.instances).some(\n (instance) => !isSyntheticDocxNullNumberingInstance(instance),\n )\n );\n}\n\nexport function serializeParagraphNumberingProperties(\n numbering: ParagraphNode[\"numbering\"],\n): string {\n if (!numbering) {\n return \"\";\n }\n\n return `<w:numPr><w:ilvl w:val=\"${numbering.level}\"/><w:numId w:val=\"${escapeAttribute(\n stripCanonicalPrefix(numbering.numberingInstanceId, \"num:\"),\n )}\"/></w:numPr>`;\n}\n\nfunction serializeAbstractDefinition(definition: NumberingCatalog[\"abstractDefinitions\"][string]): string {\n const abstractNumId = escapeAttribute(\n stripCanonicalPrefix(definition.abstractNumberingId, \"abstract-num:\"),\n );\n const levels = [...definition.levels]\n .sort((left, right) => left.level - right.level)\n .map((level) => serializeLevel(level))\n .join(\"\");\n\n return `<w:abstractNum w:abstractNumId=\"${abstractNumId}\">${levels}</w:abstractNum>`;\n}\n\nfunction serializeLevel(level: NumberingCatalog[\"abstractDefinitions\"][string][\"levels\"][number]): string {\n const start = level.startAt !== undefined ? `<w:start w:val=\"${level.startAt}\"/>` : \"\";\n const paragraphStyle = level.paragraphStyleId\n ? `<w:pStyle w:val=\"${escapeAttribute(level.paragraphStyleId)}\"/>`\n : \"\";\n const isLegal = level.isLegalNumbering ? \"<w:isLgl/>\" : \"\";\n const suffix = level.suffix ? `<w:suff w:val=\"${escapeAttribute(level.suffix)}\"/>` : \"\";\n\n return `<w:lvl w:ilvl=\"${level.level}\">${start}<w:numFmt w:val=\"${escapeAttribute(\n level.format,\n )}\"/><w:lvlText w:val=\"${escapeAttribute(level.text)}\"/>${paragraphStyle}${isLegal}${suffix}</w:lvl>`;\n}\n\nfunction serializeInstance(instance: NumberingCatalog[\"instances\"][string]): string {\n const numId = escapeAttribute(stripCanonicalPrefix(instance.numberingInstanceId, \"num:\"));\n const abstractNumId = escapeAttribute(\n stripCanonicalPrefix(instance.abstractNumberingId, \"abstract-num:\"),\n );\n const overrides = [...instance.overrides]\n .sort((left, right) => left.level - right.level)\n .map((override) => serializeOverride(override))\n .join(\"\");\n\n return `<w:num w:numId=\"${numId}\"><w:abstractNumId w:val=\"${abstractNumId}\"/>${overrides}</w:num>`;\n}\n\nfunction serializeOverride(override: NumberingCatalog[\"instances\"][string][\"overrides\"][number]): string {\n const startOverride =\n override.startAt !== undefined ? `<w:startOverride w:val=\"${override.startAt}\"/>` : \"\";\n return `<w:lvlOverride w:ilvl=\"${override.level}\">${startOverride}</w:lvlOverride>`;\n}\n\nfunction compareSerializedIds(left: string, right: string): number {\n return stripKnownPrefix(left).localeCompare(stripKnownPrefix(right), \"en\", { numeric: true });\n}\n\nfunction stripKnownPrefix(value: string): string {\n return value.replace(/^abstract-num:|^num:/, \"\");\n}\n\nfunction stripCanonicalPrefix(value: string, prefix: \"abstract-num:\" | \"num:\"): string {\n return value.startsWith(prefix) ? value.slice(prefix.length) : value;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n","import type { OpaqueFragmentRecord, PreservationStore } from \"../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"../io/ooxml/part-manifest.ts\";\n\nexport function retainRelationshipsForFragment(\n fragment: OpaqueFragmentRecord | undefined,\n relationships: OpcRelationship[],\n existingRelationshipMap: Map<string, OpcRelationship>,\n retainedRelationshipIds: Set<string>,\n): void {\n if (!fragment || fragment.payloadKind !== \"xml-subtree\") {\n return;\n }\n\n for (const relationshipId of extractReferencedRelationshipIds(fragment.payloadReference)) {\n if (retainedRelationshipIds.has(relationshipId)) {\n continue;\n }\n\n const relationship = existingRelationshipMap.get(relationshipId);\n if (!relationship) {\n continue;\n }\n\n relationships.push({ ...relationship });\n retainedRelationshipIds.add(relationshipId);\n }\n}\n\nexport function retainRelationshipsForStore(\n store: PreservationStore,\n relationships: OpcRelationship[],\n existingRelationshipMap: Map<string, OpcRelationship>,\n retainedRelationshipIds: Set<string>,\n): void {\n for (const fragment of Object.values(store.opaqueFragments)) {\n retainRelationshipsForFragment(\n fragment,\n relationships,\n existingRelationshipMap,\n retainedRelationshipIds,\n );\n }\n}\n\nexport function extractReferencedRelationshipIds(xml: string): Set<string> {\n const relationshipIds = new Set<string>();\n const relationshipPattern = /\\br:id=([\"'])([^\"']+)\\1/gu;\n\n for (const match of xml.matchAll(relationshipPattern)) {\n const relationshipId = match[2];\n if (relationshipId) {\n relationshipIds.add(relationshipId);\n }\n }\n\n return relationshipIds;\n}\n","import type {\n AltChunkNode,\n BorderSpec,\n CustomXmlNode,\n DocumentRootNode,\n InlineNode,\n MediaCatalog,\n ParagraphNode,\n PreservationStore,\n SdtNode,\n SectionProperties,\n TableNode,\n TableCellNode,\n TextMark,\n} from \"../../model/canonical-document.ts\";\nimport type { OpcRelationship } from \"../ooxml/part-manifest.ts\";\nimport type { RevisionParagraphBoundary } from \"../ooxml/revision-boundaries.ts\";\nimport { getOpaqueFragment } from \"../../preservation/store.ts\";\nimport { retainRelationshipsForFragment } from \"../../preservation/relationship-retention.ts\";\nimport { serializeParagraphNumberingProperties } from \"./serialize-numbering.ts\";\n\nconst HYPERLINK_RELATIONSHIP_TYPE =\n \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\";\n\nexport interface SerializedMainDocument {\n documentXml: string;\n relationships: OpcRelationship[];\n paragraphBoundaries: RevisionParagraphBoundary[];\n}\n\nexport interface SerializeMainDocumentOptions {\n documentAttributes?: Record<string, string>;\n media?: MediaCatalog;\n finalSectionProperties?: SectionProperties;\n}\n\ninterface SerializationState {\n nextHyperlinkRelationshipIndex: number;\n relationships: OpcRelationship[];\n existingRelationshipMap: Map<string, OpcRelationship>;\n retainedRelationshipIds: Set<string>;\n media: MediaCatalog;\n preservation: PreservationStore;\n}\n\ninterface InlineSerializationResult {\n xml: string;\n cursor: number;\n boundaries: Map<number, number>;\n}\n\ninterface ParagraphSerializationResult {\n xml: string;\n nextCursor: number;\n boundary: RevisionParagraphBoundary;\n}\n\nexport function serializeMainDocument(\n content: DocumentRootNode,\n preservation: PreservationStore = { opaqueFragments: {}, packageParts: {} },\n existingRelationships: readonly OpcRelationship[] = [],\n options: SerializeMainDocumentOptions = {},\n): SerializedMainDocument {\n const nextRelationshipIndex =\n existingRelationships.reduce((maxIndex, relationship) => {\n const match = /^rIdHyperlink(\\d+)$/.exec(relationship.id);\n return match ? Math.max(maxIndex, Number.parseInt(match[1] ?? \"0\", 10)) : maxIndex;\n }, 0) + 1;\n const state: SerializationState = {\n nextHyperlinkRelationshipIndex: nextRelationshipIndex,\n relationships: existingRelationships.filter(\n (relationship) => relationship.type !== HYPERLINK_RELATIONSHIP_TYPE,\n ).map(cloneRelationship),\n existingRelationshipMap: new Map(\n existingRelationships.map((relationship) => [relationship.id, cloneRelationship(relationship)]),\n ),\n retainedRelationshipIds: new Set(\n existingRelationships\n .filter((relationship) => relationship.type !== HYPERLINK_RELATIONSHIP_TYPE)\n .map((relationship) => relationship.id),\n ),\n media: options.media ?? { items: {} },\n preservation,\n };\n const documentOpen = `<w:document${serializeDocumentAttributes(options.documentAttributes, content)}>`;\n const prefix = [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n documentOpen,\n ` <w:body>`,\n ].join(\"\\n\");\n const suffix = `</w:body>\\n</w:document>`;\n const bodyPieces: string[] = [];\n const paragraphBoundaries: RevisionParagraphBoundary[] = [];\n let bodyLength = 0;\n let sectionPropertiesXml = options.finalSectionProperties\n ? serializeSectionPropertiesXml(options.finalSectionProperties)\n : \"<w:sectPr/>\";\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const block of content.children) {\n if (block.type === \"paragraph\") {\n if (previousWasParagraph) {\n cursor += 1;\n }\n\n paragraphIndex += 1;\n const serializedParagraph = serializeParagraph(\n block,\n state,\n cursor,\n paragraphIndex,\n );\n const paragraphOffset = prefix.length + bodyLength;\n bodyPieces.push(serializedParagraph.xml);\n bodyLength += serializedParagraph.xml.length;\n paragraphBoundaries.push(\n offsetParagraphBoundary(serializedParagraph.boundary, paragraphOffset),\n );\n cursor = serializedParagraph.nextCursor;\n previousWasParagraph = true;\n continue;\n }\n\n if (block.type === \"table\") {\n const tableXml = serializeTableNode(block, state);\n bodyPieces.push(tableXml);\n bodyLength += tableXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"sdt\") {\n const sdtXml = serializeSdtNode(block, state);\n bodyPieces.push(sdtXml);\n bodyLength += sdtXml.length;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n const customXml = serializeCustomXmlNode(block, state);\n bodyPieces.push(customXml);\n bodyLength += customXml.length;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"alt_chunk\") {\n const altChunkXml = serializeAltChunkNode(block);\n bodyPieces.push(altChunkXml);\n bodyLength += altChunkXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (block.type === \"section_break\") {\n // Inline section breaks must be emitted as a paragraph with <w:sectPr>\n // in its <w:pPr> element (OOXML compliance). The body-level <w:sectPr>\n // is reserved for the final section only.\n let inlineSectPr: string;\n if (block.sectionPropertiesXml ?? block.propertiesXml) {\n inlineSectPr = block.sectionPropertiesXml ?? block.propertiesXml!;\n } else if (block.sectionProperties) {\n inlineSectPr = serializeSectionPropertiesXml(block.sectionProperties);\n } else {\n inlineSectPr = \"<w:sectPr/>\";\n }\n const sectionParagraphXml = `<w:p><w:pPr>${inlineSectPr}</w:pPr></w:p>`;\n bodyPieces.push(sectionParagraphXml);\n bodyLength += sectionParagraphXml.length;\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n const blockXml = serializeOpaqueBlock(block, state);\n if (looksLikeSectionPropertiesXml(blockXml)) {\n sectionPropertiesXml = blockXml;\n } else {\n bodyPieces.push(blockXml);\n bodyLength += blockXml.length;\n }\n cursor += 1;\n previousWasParagraph = false;\n }\n\n const bodyXml = bodyPieces.join(\"\");\n const documentXml = `${prefix}${bodyXml || \"<w:p><w:r><w:t></w:t></w:r></w:p>\"}${sectionPropertiesXml}${suffix}`;\n\n return {\n documentXml,\n relationships: state.relationships,\n paragraphBoundaries,\n };\n}\n\nfunction serializeOpaqueBlock(\n block: Extract<DocumentRootNode[\"children\"][number], { type: \"opaque_block\" }>,\n state: SerializationState,\n): string {\n return lookupOpaqueXml(block.fragmentId, state);\n}\n\nfunction serializeTableNode(\n table: TableNode,\n state: SerializationState,\n): string {\n const propertiesXml = table.propertiesXml ?? buildTablePropertiesXml(table);\n const gridXml =\n table.gridColumns.length > 0\n ? `<w:tblGrid>${table.gridColumns\n .map((width) => `<w:gridCol w:w=\"${width}\"/>`)\n .join(\"\")}</w:tblGrid>`\n : \"\";\n const rowsXml = table.rows\n .map((row) => {\n const rowPropertiesXml = row.propertiesXml ?? buildTableRowPropertiesXml(row);\n const cellsXml = row.cells\n .map((cell) => serializeTableCellNode(cell, state))\n .join(\"\");\n return `<w:tr>${rowPropertiesXml}${cellsXml}</w:tr>`;\n })\n .join(\"\");\n return `<w:tbl>${propertiesXml}${gridXml}${rowsXml}</w:tbl>`;\n}\n\nfunction serializeTableCellNode(\n cell: TableCellNode,\n state: SerializationState,\n): string {\n const propertiesXml = cell.propertiesXml ?? buildCellPropertiesXml(cell);\n const blocksXml = cell.children\n .map((child) => serializeBlockNode(child, state))\n .join(\"\");\n return `<w:tc>${propertiesXml}${blocksXml || \"<w:p/>\"}</w:tc>`;\n}\n\nfunction serializeBlockNode(\n block: DocumentRootNode[\"children\"][number],\n state: SerializationState,\n): string {\n switch (block.type) {\n case \"paragraph\":\n return serializeTableCellParagraph(block, state);\n case \"table\":\n return serializeTableNode(block, state);\n case \"sdt\":\n return serializeSdtNode(block, state);\n case \"custom_xml\":\n return serializeCustomXmlNode(block, state);\n case \"alt_chunk\":\n return serializeAltChunkNode(block);\n case \"opaque_block\":\n return lookupOpaqueXml(block.fragmentId, state);\n case \"section_break\":\n if (block.sectionPropertiesXml ?? block.propertiesXml) {\n return block.sectionPropertiesXml ?? block.propertiesXml!;\n }\n if (block.sectionProperties) return serializeSectionPropertiesXml(block.sectionProperties);\n return \"<w:sectPr/>\";\n }\n}\n\nfunction buildCellPropertiesXml(cell: TableCellNode): string {\n const children: string[] = [];\n if (cell.gridSpan && cell.gridSpan > 1) {\n children.push(`<w:gridSpan w:val=\"${cell.gridSpan}\"/>`);\n }\n if (cell.verticalMerge) {\n children.push(\n cell.verticalMerge === \"restart\"\n ? `<w:vMerge w:val=\"restart\"/>`\n : `<w:vMerge/>`,\n );\n }\n return children.length > 0 ? `<w:tcPr>${children.join(\"\")}</w:tcPr>` : \"\";\n}\n\nfunction buildTableRowPropertiesXml(row: TableNode[\"rows\"][number]): string {\n const children: string[] = [];\n if (row.gridBefore !== undefined) {\n children.push(`<w:gridBefore w:val=\"${row.gridBefore}\"/>`);\n }\n if (row.widthBefore) {\n children.push(`<w:wBefore w:w=\"${row.widthBefore.value}\" w:type=\"${row.widthBefore.type}\"/>`);\n }\n if (row.gridAfter !== undefined) {\n children.push(`<w:gridAfter w:val=\"${row.gridAfter}\"/>`);\n }\n if (row.widthAfter) {\n children.push(`<w:wAfter w:w=\"${row.widthAfter.value}\" w:type=\"${row.widthAfter.type}\"/>`);\n }\n if (children.length === 0) {\n return \"\";\n }\n return `<w:trPr>${children.join(\"\")}</w:trPr>`;\n}\n\nfunction serializeSdtNode(\n block: SdtNode,\n state: SerializationState,\n): string {\n const propertiesXml = block.properties.propertiesXml ?? buildSdtPropertiesXml(block);\n const childrenXml = block.children.map((child) => serializeBlockNode(child, state)).join(\"\") || \"<w:p/>\";\n return `<w:sdt>${propertiesXml}<w:sdtContent>${childrenXml}</w:sdtContent></w:sdt>`;\n}\n\nfunction serializeCustomXmlNode(\n block: CustomXmlNode,\n state: SerializationState,\n): string {\n const attrs: string[] = [];\n if (block.uri) {\n attrs.push(`w:uri=\"${escapeAttribute(block.uri)}\"`);\n }\n if (block.element) {\n attrs.push(`w:element=\"${escapeAttribute(block.element)}\"`);\n }\n const attrXml = attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\";\n const childrenXml = block.children.map((child) => serializeBlockNode(child, state)).join(\"\");\n return `<w:customXml${attrXml}>${childrenXml || \"<w:p/>\"}</w:customXml>`;\n}\n\nfunction serializeAltChunkNode(\n block: AltChunkNode,\n): string {\n return `<w:altChunk r:id=\"${escapeAttribute(block.relationshipId)}\"/>`;\n}\n\nfunction buildSdtPropertiesXml(block: SdtNode): string {\n const children: string[] = [];\n if (block.properties.alias) {\n children.push(`<w:alias w:val=\"${escapeAttribute(block.properties.alias)}\"/>`);\n }\n if (block.properties.tag) {\n children.push(`<w:tag w:val=\"${escapeAttribute(block.properties.tag)}\"/>`);\n }\n if (block.properties.lock) {\n children.push(`<w:lock w:val=\"${escapeAttribute(block.properties.lock)}\"/>`);\n }\n if (block.properties.showingPlcHdr) {\n children.push(`<w:showingPlcHdr/>`);\n }\n if (block.properties.checkbox) {\n const cb = block.properties.checkbox;\n const cbParts: string[] = [];\n cbParts.push(`<w14:checked w14:val=\"${cb.checked ? \"1\" : \"0\"}\"/>`);\n if (cb.checkedChar) cbParts.push(`<w14:checkedState w14:val=\"${escapeAttribute(cb.checkedChar)}\"/>`);\n if (cb.uncheckedChar) cbParts.push(`<w14:uncheckedState w14:val=\"${escapeAttribute(cb.uncheckedChar)}\"/>`);\n children.push(`<w14:checkbox>${cbParts.join(\"\")}</w14:checkbox>`);\n } else if (block.properties.datePicker) {\n const dp = block.properties.datePicker;\n const dateAttrs = dp.fullDate ? ` w:fullDate=\"${escapeAttribute(dp.fullDate)}\"` : \"\";\n const dpParts: string[] = [];\n if (dp.dateFormat) dpParts.push(`<w:dateFormat w:val=\"${escapeAttribute(dp.dateFormat)}\"/>`);\n if (dp.lid) dpParts.push(`<w:lid w:val=\"${escapeAttribute(dp.lid)}\"/>`);\n children.push(dpParts.length > 0 ? `<w:date${dateAttrs}>${dpParts.join(\"\")}</w:date>` : `<w:date${dateAttrs}/>`);\n } else if (block.properties.dropdownList) {\n const items = block.properties.dropdownList.map((item) => {\n const dt = item.displayText ? ` w:displayText=\"${escapeAttribute(item.displayText)}\"` : \"\";\n return `<w:listItem${dt} w:value=\"${escapeAttribute(item.value)}\"/>`;\n }).join(\"\");\n children.push(`<w:dropDownList>${items}</w:dropDownList>`);\n } else if (block.properties.comboBox) {\n const items = block.properties.comboBox.map((item) => {\n const dt = item.displayText ? ` w:displayText=\"${escapeAttribute(item.displayText)}\"` : \"\";\n return `<w:listItem${dt} w:value=\"${escapeAttribute(item.value)}\"/>`;\n }).join(\"\");\n children.push(`<w:comboBox>${items}</w:comboBox>`);\n } else if (block.properties.sdtType === \"plainText\") {\n children.push(`<w:text/>`);\n } else if (block.properties.sdtType === \"richText\") {\n children.push(`<w:richText/>`);\n } else if (block.properties.sdtType) {\n children.push(`<w:${block.properties.sdtType}/>`);\n }\n return children.length > 0 ? `<w:sdtPr>${children.join(\"\")}</w:sdtPr>` : \"<w:sdtPr/>\";\n}\n\nfunction serializeTableCellParagraph(\n paragraph: ParagraphNode,\n state: SerializationState,\n): string {\n let xml = \"<w:p>\";\n const paragraphPropertiesXml = buildParagraphPropertiesXml(paragraph);\n if (paragraphPropertiesXml.length > 0) {\n xml += paragraphPropertiesXml;\n }\n const childrenXml = paragraph.children.map((child) => serializeTableInlineNode(child, state)).join(\"\");\n xml += childrenXml || \"<w:r><w:t></w:t></w:r>\";\n xml += \"</w:p>\";\n return xml;\n}\n\nfunction serializeTableInlineNode(\n node: InlineNode,\n state: SerializationState,\n): string {\n switch (node.type) {\n case \"text\": {\n const marks = node.marks;\n const properties = serializeRunPropertiesFromMarks(marks);\n const preserve = requiresPreservedSpace(node.text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:r>${properties}<w:t${preserve}>${escapeXml(node.text)}</w:t></w:r>`;\n }\n case \"tab\":\n return \"<w:r><w:tab/></w:r>\";\n case \"column_break\":\n return \"<w:r><w:br w:type=\\\"column\\\"/></w:r>\";\n case \"hard_break\":\n return \"<w:r><w:br/></w:r>\";\n case \"symbol\": {\n const properties = serializeRunPropertiesFromMarks(node.marks);\n const fontAttribute = node.font ? ` w:font=\"${escapeAttribute(node.font)}\"` : \"\";\n return `<w:r>${properties}<w:sym${fontAttribute} w:char=\"${escapeAttribute(node.char)}\"/></w:r>`;\n }\n case \"image\":\n return serializeImageNode(node, state);\n case \"opaque_inline\":\n return lookupOpaqueXml(node.fragmentId, state);\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n return wrapInlineRawXml(node.rawXml);\n case \"hyperlink\": {\n const hyperlinkOpen = node.href.startsWith(\"#\")\n ? `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">`\n : (() => {\n const relationshipId = `rIdHyperlink${state.nextHyperlinkRelationshipIndex}`;\n state.nextHyperlinkRelationshipIndex += 1;\n state.relationships.push({\n id: relationshipId,\n type: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n target: node.href,\n targetMode: \"external\",\n });\n state.retainedRelationshipIds.add(relationshipId);\n return `<w:hyperlink r:id=\"${relationshipId}\">`;\n })();\n const childrenXml = node.children.map((child) => serializeTableInlineNode(child, state)).join(\"\");\n return `${hyperlinkOpen}${childrenXml}</w:hyperlink>`;\n }\n case \"field\": {\n if (node.children && node.children.length > 0) {\n const childrenXml = node.children\n .map((child) => serializeTableInlineNode(child, state))\n .join(\"\");\n if (node.fieldType === \"complex\") {\n return (\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\"> ${escapeXml(node.instruction)} </w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>` +\n childrenXml +\n `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`\n );\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">${childrenXml}</w:fldSimple>`;\n }\n return `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n }\n case \"bookmark_start\":\n return (\n `<w:bookmarkStart w:id=\"${escapeAttribute(node.bookmarkId)}\"` +\n ` w:name=\"${escapeAttribute(node.name)}\"/>`\n );\n case \"bookmark_end\":\n return `<w:bookmarkEnd w:id=\"${escapeAttribute(node.bookmarkId)}\"/>`;\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n const styleVal =\n node.noteKind === \"footnote\"\n ? \"FootnoteReference\"\n : \"EndnoteReference\";\n return `<w:r><w:rPr><w:rStyle w:val=\"${styleVal}\"/></w:rPr>${refElement}</w:r>`;\n }\n default:\n return \"\";\n }\n}\n\nfunction buildParagraphPropertiesXml(paragraph: ParagraphNode): string {\n const children: string[] = [];\n\n if (paragraph.styleId) {\n children.push(`<w:pStyle w:val=\"${escapeAttribute(paragraph.styleId)}\"/>`);\n }\n if (paragraph.keepNext) {\n children.push(\"<w:keepNext/>\");\n }\n if (paragraph.keepLines) {\n children.push(\"<w:keepLines/>\");\n }\n if (paragraph.pageBreakBefore) {\n children.push(\"<w:pageBreakBefore/>\");\n }\n if (paragraph.widowControl) {\n children.push(\"<w:widowControl/>\");\n }\n if (paragraph.outlineLevel !== undefined) {\n children.push(`<w:outlineLvl w:val=\"${paragraph.outlineLevel}\"/>`);\n }\n if (paragraph.numbering) {\n children.push(serializeParagraphNumberingProperties(paragraph.numbering));\n }\n if (paragraph.spacing) {\n const s = paragraph.spacing;\n const attrs: string[] = [];\n if (s.before !== undefined) attrs.push(`w:before=\"${s.before}\"`);\n if (s.after !== undefined) attrs.push(`w:after=\"${s.after}\"`);\n if (s.line !== undefined) attrs.push(`w:line=\"${s.line}\"`);\n if (s.lineRule !== undefined) attrs.push(`w:lineRule=\"${s.lineRule}\"`);\n if (attrs.length > 0) children.push(`<w:spacing ${attrs.join(\" \")}/>`);\n }\n if (paragraph.contextualSpacing !== undefined) {\n children.push(\n paragraph.contextualSpacing\n ? \"<w:contextualSpacing/>\"\n : `<w:contextualSpacing w:val=\"0\"/>`,\n );\n }\n if (paragraph.indentation) {\n const ind = paragraph.indentation;\n const attrs: string[] = [];\n if (ind.left !== undefined) attrs.push(`w:left=\"${ind.left}\"`);\n if (ind.right !== undefined) attrs.push(`w:right=\"${ind.right}\"`);\n if (ind.firstLine !== undefined) attrs.push(`w:firstLine=\"${ind.firstLine}\"`);\n if (ind.hanging !== undefined) attrs.push(`w:hanging=\"${ind.hanging}\"`);\n if (attrs.length > 0) children.push(`<w:ind ${attrs.join(\" \")}/>`);\n }\n if (paragraph.alignment) {\n children.push(`<w:jc w:val=\"${paragraph.alignment}\"/>`);\n }\n if (paragraph.borders) {\n const bordersXml = serializeParagraphBorders(paragraph.borders);\n if (bordersXml) {\n children.push(bordersXml);\n }\n }\n if (paragraph.shading) {\n const shadingXml = serializeParagraphShading(paragraph.shading);\n if (shadingXml) {\n children.push(shadingXml);\n }\n }\n if (paragraph.bidi) {\n children.push(\"<w:bidi/>\");\n }\n if (paragraph.suppressLineNumbers) {\n children.push(\"<w:suppressLineNumbers/>\");\n }\n if (paragraph.cnfStyle) {\n children.push(`<w:cnfStyle w:val=\"${escapeAttribute(paragraph.cnfStyle)}\"/>`);\n }\n if (paragraph.tabStops && paragraph.tabStops.length > 0) {\n const tabsXml = paragraph.tabStops.map((tab) => {\n const leaderAttr = tab.leader ? ` w:leader=\"${tab.leader}\"` : \"\";\n return `<w:tab w:val=\"${tab.align}\" w:pos=\"${tab.position}\"${leaderAttr}/>`;\n }).join(\"\");\n children.push(`<w:tabs>${tabsXml}</w:tabs>`);\n }\n\n if (children.length === 0) return \"\";\n return `<w:pPr>${children.join(\"\")}</w:pPr>`;\n}\n\nfunction buildTablePropertiesXml(table: TableNode): string {\n const children: string[] = [];\n if (table.styleId) {\n children.push(`<w:tblStyle w:val=\"${escapeAttribute(table.styleId)}\"/>`);\n }\n if (table.tblLook) {\n const attrs: string[] = [];\n if (table.tblLook.val) {\n attrs.push(`w:val=\"${escapeAttribute(table.tblLook.val)}\"`);\n }\n for (const [key, attr] of [\n [\"firstRow\", \"w:firstRow\"],\n [\"lastRow\", \"w:lastRow\"],\n [\"firstColumn\", \"w:firstColumn\"],\n [\"lastColumn\", \"w:lastColumn\"],\n [\"noHBand\", \"w:noHBand\"],\n [\"noVBand\", \"w:noVBand\"],\n ] as const) {\n const value = table.tblLook[key];\n if (value !== undefined) {\n attrs.push(`${attr}=\"${value ? \"1\" : \"0\"}\"`);\n }\n }\n if (attrs.length > 0) {\n children.push(`<w:tblLook ${attrs.join(\" \")}/>`);\n }\n }\n return children.length > 0 ? `<w:tblPr>${children.join(\"\")}</w:tblPr>` : \"\";\n}\n\nfunction serializeParagraphBorders(borders: ParagraphNode[\"borders\"]): string {\n if (!borders) {\n return \"\";\n }\n const parts: string[] = [];\n for (const [name, border] of [\n [\"top\", borders.top],\n [\"left\", borders.left],\n [\"bottom\", borders.bottom],\n [\"right\", borders.right],\n [\"bar\", borders.bar],\n [\"between\", borders.between],\n ] as const) {\n const xml = serializeBorder(name, border);\n if (xml) {\n parts.push(xml);\n }\n }\n return parts.length > 0 ? `<w:pBdr>${parts.join(\"\")}</w:pBdr>` : \"\";\n}\n\nfunction serializeBorder(name: string, border: BorderSpec | undefined): string {\n if (!border) {\n return \"\";\n }\n const attrs: string[] = [];\n if (border.value) attrs.push(`w:val=\"${escapeAttribute(border.value)}\"`);\n if (border.size !== undefined) attrs.push(`w:sz=\"${border.size}\"`);\n if (border.space !== undefined) attrs.push(`w:space=\"${border.space}\"`);\n if (border.color) attrs.push(`w:color=\"${escapeAttribute(border.color)}\"`);\n return attrs.length > 0 ? `<w:${name} ${attrs.join(\" \")}/>` : \"\";\n}\n\nfunction serializeParagraphShading(shading: ParagraphNode[\"shading\"]): string {\n if (!shading) {\n return \"\";\n }\n const attrs: string[] = [];\n if (shading.val) attrs.push(`w:val=\"${escapeAttribute(shading.val)}\"`);\n if (shading.color) attrs.push(`w:color=\"${escapeAttribute(shading.color)}\"`);\n if (shading.fill) attrs.push(`w:fill=\"${escapeAttribute(shading.fill)}\"`);\n return attrs.length > 0 ? `<w:shd ${attrs.join(\" \")}/>` : \"\";\n}\n\nfunction serializeRunPropertiesFromMarks(marks: TextMark[] | undefined): string {\n return serializeRunProperties(marks);\n}\n\nfunction serializeParagraph(\n paragraph: ParagraphNode,\n state: SerializationState,\n cursor: number,\n paragraphIndex: number,\n): ParagraphSerializationResult {\n let xml = \"<w:p>\";\n const boundaries = new Map<number, number>();\n const paragraphStart = 0;\n const paragraphStartTagEnd = xml.length;\n boundaries.set(cursor, paragraphStartTagEnd);\n\n let paragraphPropertiesStart: number | undefined;\n let paragraphPropertiesEnd: number | undefined;\n\n const paragraphPropertiesXml = buildParagraphPropertiesXml(paragraph);\n if (paragraphPropertiesXml.length > 0) {\n paragraphPropertiesStart = xml.length;\n xml += paragraphPropertiesXml;\n paragraphPropertiesEnd = xml.length;\n }\n\n const children = serializeParagraphChildren(paragraph.children, state, cursor, xml.length);\n xml += children.xml;\n const contentEmpty = children.xml.length === 0;\n if (contentEmpty) {\n xml += \"<w:r><w:t></w:t></w:r>\";\n }\n const paragraphEndTagStart = xml.length;\n xml += \"</w:p>\";\n\n if (!children.boundaries.has(children.cursor)) {\n children.boundaries.set(children.cursor, paragraphEndTagStart);\n }\n\n return {\n xml,\n nextCursor: children.cursor,\n boundary: {\n paragraphIndex,\n start: cursor,\n end: children.cursor,\n boundaries: children.boundaries,\n paragraphStart,\n paragraphStartTagEnd,\n paragraphEndTagStart,\n paragraphEnd: xml.length,\n ...(paragraphPropertiesStart !== undefined\n ? { paragraphPropertiesStart }\n : {}),\n ...(paragraphPropertiesEnd !== undefined ? { paragraphPropertiesEnd } : {}),\n },\n };\n}\n\nfunction serializeParagraphChildren(\n children: InlineNode[],\n state: SerializationState,\n cursor: number,\n xmlOffset: number,\n): InlineSerializationResult {\n const pieces: string[] = [];\n const boundaries = new Map<number, number>();\n let nextCursor = cursor;\n let nextOffset = xmlOffset;\n boundaries.set(nextCursor, nextOffset);\n\n for (const child of children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n pieces.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n\n return {\n xml: pieces.join(\"\"),\n cursor: nextCursor,\n boundaries,\n };\n}\n\ntype RunPiece =\n | { kind: \"text\"; text: string; marks?: TextMark[] }\n | { kind: \"tab\" }\n | { kind: \"hard_break\" };\n\nfunction serializeRunPiece(piece: RunPiece): string {\n switch (piece.kind) {\n case \"text\":\n return serializeText(piece.text);\n case \"tab\":\n return \"<w:tab/>\";\n case \"hard_break\":\n return \"<w:br/>\";\n }\n}\n\nfunction serializeText(text: string): string {\n const preserve = requiresPreservedSpace(text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:t${preserve}>${escapeXml(text)}</w:t>`;\n}\n\nfunction serializeInlineNode(\n node: InlineNode,\n state: SerializationState,\n cursor: number,\n xmlOffset: number,\n): InlineSerializationResult {\n switch (node.type) {\n case \"text\": {\n const xml = serializeRun({\n kind: \"text\",\n text: node.text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + Array.from(node.text).length, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + Array.from(node.text).length,\n boundaries,\n };\n }\n case \"tab\": {\n const xml = serializeRun({ kind: \"tab\" });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"column_break\": {\n const xml = `<w:r><w:br w:type=\"column\"/></w:r>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"hard_break\": {\n const xml = serializeRun({ kind: \"hard_break\" });\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"symbol\": {\n const xml = serializeTableInlineNode(node, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"image\": {\n const xml = serializeImageNode(node, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"opaque_inline\": {\n const xml = lookupOpaqueXml(node.fragmentId, state);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\": {\n // Reattach original XML unchanged for lossless round-trip.\n const xml = wrapInlineRawXml(node.rawXml);\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"hyperlink\": {\n const hyperlinkOpen = node.href.startsWith(\"#\")\n ? `<w:hyperlink w:anchor=\"${escapeAttribute(node.href.slice(1))}\">`\n : (() => {\n const relationshipId = `rIdHyperlink${state.nextHyperlinkRelationshipIndex}`;\n state.nextHyperlinkRelationshipIndex += 1;\n state.relationships.push({\n id: relationshipId,\n type: HYPERLINK_RELATIONSHIP_TYPE,\n target: node.href,\n targetMode: \"external\",\n });\n state.retainedRelationshipIds.add(relationshipId);\n return `<w:hyperlink r:id=\"${relationshipId}\">`;\n })();\n const hyperlinkClose = \"</w:hyperlink>\";\n const boundaries = new Map<number, number>();\n let nextCursor = cursor;\n let nextOffset = xmlOffset + hyperlinkOpen.length;\n boundaries.set(cursor, nextOffset);\n const children: string[] = [];\n\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n\n boundaries.set(nextCursor, nextOffset);\n return {\n xml: `${hyperlinkOpen}${children.join(\"\")}${hyperlinkClose}`,\n cursor: nextCursor,\n boundaries,\n };\n }\n case \"field\": {\n if (node.children && node.children.length > 0) {\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n let nextCursor = cursor;\n let nextOffset = xmlOffset;\n\n if (node.fieldType === \"complex\") {\n const beginXml =\n `<w:r><w:fldChar w:fldCharType=\"begin\"/></w:r>` +\n `<w:r><w:instrText xml:space=\"preserve\"> ${escapeXml(node.instruction)} </w:instrText></w:r>` +\n `<w:r><w:fldChar w:fldCharType=\"separate\"/></w:r>`;\n nextOffset += beginXml.length;\n\n const children: string[] = [beginXml];\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n const endXml = `<w:r><w:fldChar w:fldCharType=\"end\"/></w:r>`;\n children.push(endXml);\n nextOffset += endXml.length;\n boundaries.set(nextCursor, nextOffset);\n return { xml: children.join(\"\"), cursor: nextCursor, boundaries };\n }\n\n // Simple field with children\n const openXml = `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\">`;\n nextOffset += openXml.length;\n const children: string[] = [openXml];\n for (const child of node.children) {\n const result = serializeInlineNode(child, state, nextCursor, nextOffset);\n children.push(result.xml);\n for (const [position, index] of result.boundaries) {\n boundaries.set(position, index);\n }\n nextCursor = result.cursor;\n nextOffset += result.xml.length;\n }\n children.push(\"</w:fldSimple>\");\n nextOffset += \"</w:fldSimple>\".length;\n boundaries.set(nextCursor, nextOffset);\n return { xml: children.join(\"\"), cursor: nextCursor, boundaries };\n }\n\n const xml = `<w:fldSimple w:instr=\"${escapeAttribute(node.instruction)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n case \"bookmark_start\": {\n const xml =\n `<w:bookmarkStart w:id=\"${escapeAttribute(node.bookmarkId)}\"` +\n ` w:name=\"${escapeAttribute(node.name)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor, xmlOffset + xml.length);\n return { xml, cursor, boundaries };\n }\n case \"bookmark_end\": {\n const xml = `<w:bookmarkEnd w:id=\"${escapeAttribute(node.bookmarkId)}\"/>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor, xmlOffset + xml.length);\n return { xml, cursor, boundaries };\n }\n case \"footnote_ref\": {\n const refElement =\n node.noteKind === \"footnote\"\n ? `<w:footnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`\n : `<w:endnoteReference w:id=\"${escapeAttribute(node.noteId)}\"/>`;\n const styleVal =\n node.noteKind === \"footnote\"\n ? \"FootnoteReference\"\n : \"EndnoteReference\";\n const xml = `<w:r><w:rPr><w:rStyle w:val=\"${styleVal}\"/></w:rPr>${refElement}</w:r>`;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n boundaries.set(cursor + 1, xmlOffset + xml.length);\n return {\n xml,\n cursor: cursor + 1,\n boundaries,\n };\n }\n default: {\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, xmlOffset);\n return { xml: \"\", cursor, boundaries };\n }\n }\n}\n\nfunction serializeImageNode(\n node: Extract<InlineNode, { type: \"image\" }>,\n state: SerializationState,\n): string {\n const placementXml = typeof node.placementXml === \"string\" ? node.placementXml.trim() : \"\";\n if (placementXml.length > 0) {\n return placementXml.startsWith(\"<w:r\") ? placementXml : `<w:r>${placementXml}</w:r>`;\n }\n\n const mediaItem = state.media.items[node.mediaId];\n if (mediaItem?.relationshipId && state.existingRelationshipMap.has(mediaItem.relationshipId)) {\n const altText = node.altText ?? mediaItem.altText ?? mediaItem.filename;\n return `<w:r><w:drawing><wp:inline xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\"><wp:extent cx=\"9525\" cy=\"9525\"/><wp:docPr id=\"1\" name=\"${escapeAttribute(mediaItem.filename)}\" descr=\"${escapeAttribute(altText ?? \"\")}\"/><wp:cNvGraphicFramePr/><a:graphic><a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\"><pic:pic><pic:nvPicPr><pic:cNvPr id=\"0\" name=\"${escapeAttribute(mediaItem.filename)}\"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed=\"${escapeAttribute(mediaItem.relationshipId)}\"/><a:stretch><a:fillRect/></a:stretch></pic:blipFill><pic:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"9525\" cy=\"9525\"/></a:xfrm><a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r>`;\n }\n\n return serializeRun({\n kind: \"text\",\n text: node.altText ?? \"[Image]\",\n });\n}\n\nfunction serializeRun(piece: RunPiece): string {\n const marks = piece.kind === \"text\" ? piece.marks : undefined;\n const properties = serializeRunProperties(marks);\n const content = serializeRunPiece(piece);\n return `<w:r>${properties}${content}</w:r>`;\n}\n\nfunction serializeRunProperties(marks: TextMark[] | undefined): string {\n if (!marks || marks.length === 0) {\n return \"\";\n }\n\n const markParts: string[] = [];\n for (const mark of marks) {\n switch (mark.type) {\n case \"bold\":\n markParts.push(\"<w:b/>\");\n break;\n case \"italic\":\n markParts.push(\"<w:i/>\");\n break;\n case \"underline\":\n markParts.push(`<w:u w:val=\"single\"/>`);\n break;\n case \"strikethrough\":\n markParts.push(\"<w:strike/>\");\n break;\n case \"doubleStrikethrough\":\n markParts.push(\"<w:dstrike/>\");\n break;\n case \"vanish\":\n markParts.push(\"<w:vanish/>\");\n break;\n case \"lang\":\n markParts.push(`<w:lang w:val=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"highlight\":\n markParts.push(`<w:highlight w:val=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"backgroundColor\":\n markParts.push(\n `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${escapeAttribute(mark.color)}\"/>`,\n );\n break;\n case \"charSpacing\":\n markParts.push(`<w:spacing w:val=\"${mark.val}\"/>`);\n break;\n case \"kerning\":\n markParts.push(`<w:kern w:val=\"${mark.val}\"/>`);\n break;\n case \"emboss\":\n markParts.push(\"<w:emboss/>\");\n break;\n case \"imprint\":\n markParts.push(\"<w:imprint/>\");\n break;\n case \"shadow\":\n markParts.push(\"<w:shadow/>\");\n break;\n case \"position\":\n markParts.push(`<w:position w:val=\"${mark.val}\"/>`);\n break;\n case \"textFill\":\n markParts.push(mark.xml);\n break;\n case \"fontFamily\":\n markParts.push(`<w:rFonts w:ascii=\"${escapeAttribute(mark.val)}\" w:hAnsi=\"${escapeAttribute(mark.val)}\"/>`);\n break;\n case \"fontSize\":\n markParts.push(`<w:sz w:val=\"${mark.val}\"/>`);\n break;\n case \"textColor\":\n markParts.push(`<w:color w:val=\"${escapeAttribute(mark.color)}\"/>`);\n break;\n case \"smallCaps\":\n markParts.push(\"<w:smallCaps/>\");\n break;\n case \"allCaps\":\n markParts.push(\"<w:caps/>\");\n break;\n }\n }\n\n const children = markParts.join(\"\");\n return children.length > 0 ? `<w:rPr>${children}</w:rPr>` : \"\";\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return /^\\s/.test(text) || /\\s$/.test(text) || text.includes(\" \");\n}\n\nfunction lookupOpaqueXml(fragmentId: string, state: SerializationState): string {\n const fragment = getOpaqueFragment(state.preservation, fragmentId);\n if (!fragment || fragment.payloadKind !== \"xml-subtree\") {\n throw new Error(`Missing preserved OOXML fragment ${fragmentId} during serialization.`);\n }\n\n retainRelationshipsForFragment(\n fragment,\n state.relationships,\n state.existingRelationshipMap,\n state.retainedRelationshipIds,\n );\n return fragment.payloadReference;\n}\n\nfunction cloneRelationship(relationship: OpcRelationship): OpcRelationship {\n return { ...relationship };\n}\n\nfunction looksLikeSectionPropertiesXml(xml: string): boolean {\n return /^<[^>]*:?sectPr(?:\\s|>|\\/)/.test(xml.trim());\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeXml(value).replace(/\"/g, \""\");\n}\n\nfunction offsetParagraphBoundary(\n boundary: RevisionParagraphBoundary,\n offset: number,\n): RevisionParagraphBoundary {\n return {\n ...boundary,\n boundaries: new Map(\n [...boundary.boundaries.entries()].map(([position, index]) => [\n position,\n index + offset,\n ]),\n ),\n paragraphStart: boundary.paragraphStart + offset,\n paragraphStartTagEnd: boundary.paragraphStartTagEnd + offset,\n paragraphEndTagStart: boundary.paragraphEndTagStart + offset,\n paragraphEnd: boundary.paragraphEnd + offset,\n ...(boundary.paragraphPropertiesStart !== undefined\n ? { paragraphPropertiesStart: boundary.paragraphPropertiesStart + offset }\n : {}),\n ...(boundary.paragraphPropertiesEnd !== undefined\n ? { paragraphPropertiesEnd: boundary.paragraphPropertiesEnd + offset }\n : {}),\n ...(boundary.paragraphRunPropertiesStart !== undefined\n ? { paragraphRunPropertiesStart: boundary.paragraphRunPropertiesStart + offset }\n : {}),\n ...(boundary.paragraphRunPropertiesEnd !== undefined\n ? { paragraphRunPropertiesEnd: boundary.paragraphRunPropertiesEnd + offset }\n : {}),\n };\n}\n\nfunction serializeDocumentAttributes(\n attributes: Record<string, string> | undefined,\n content?: DocumentRootNode,\n): string {\n const merged = {\n \"xmlns:r\": \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n \"xmlns:w\": \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\n ...(content && documentNeedsW14Namespace(content)\n ? { \"xmlns:w14\": \"http://schemas.microsoft.com/office/word/2010/wordml\" }\n : {}),\n ...(attributes ?? {}),\n };\n\n return Object.entries(merged)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nexport function serializeSectionPropertiesXml(props: SectionProperties): string {\n const children: string[] = [];\n\n // Header references\n if (props.headerReferences) {\n for (const ref of props.headerReferences) {\n children.push(`<w:headerReference w:type=\"${escapeAttribute(ref.variant)}\" r:id=\"${escapeAttribute(ref.relationshipId)}\"/>`);\n }\n }\n\n // Footer references\n if (props.footerReferences) {\n for (const ref of props.footerReferences) {\n children.push(`<w:footerReference w:type=\"${escapeAttribute(ref.variant)}\" r:id=\"${escapeAttribute(ref.relationshipId)}\"/>`);\n }\n }\n\n // Section type\n if (props.sectionType) {\n children.push(`<w:type w:val=\"${escapeAttribute(props.sectionType)}\"/>`);\n }\n\n // Page size\n if (props.pageSize) {\n let pgSz = `<w:pgSz w:w=\"${props.pageSize.width}\" w:h=\"${props.pageSize.height}\"`;\n if (props.pageSize.orientation) {\n pgSz += ` w:orient=\"${props.pageSize.orientation}\"`;\n }\n pgSz += \"/>\";\n children.push(pgSz);\n }\n\n // Page margins\n if (props.pageMargins) {\n let pgMar = `<w:pgMar w:top=\"${props.pageMargins.top}\" w:right=\"${props.pageMargins.right}\" w:bottom=\"${props.pageMargins.bottom}\" w:left=\"${props.pageMargins.left}\"`;\n if (props.pageMargins.header !== undefined) pgMar += ` w:header=\"${props.pageMargins.header}\"`;\n if (props.pageMargins.footer !== undefined) pgMar += ` w:footer=\"${props.pageMargins.footer}\"`;\n if (props.pageMargins.gutter !== undefined) pgMar += ` w:gutter=\"${props.pageMargins.gutter}\"`;\n pgMar += \"/>\";\n children.push(pgMar);\n }\n\n // Columns\n if (props.columns) {\n let cols = \"<w:cols\";\n if (props.columns.count !== undefined) cols += ` w:num=\"${props.columns.count}\"`;\n if (props.columns.space !== undefined) cols += ` w:space=\"${props.columns.space}\"`;\n if (props.columns.equalWidth !== undefined) cols += ` w:equalWidth=\"${props.columns.equalWidth ? \"1\" : \"0\"}\"`;\n if (props.columns.separator) cols += ` w:sep=\"1\"`;\n if (props.columns.columns && props.columns.columns.length > 0) {\n cols += \">\";\n for (const col of props.columns.columns) {\n let colXml = `<w:col w:w=\"${col.width}\"`;\n if (col.space !== undefined) colXml += ` w:space=\"${col.space}\"`;\n colXml += \"/>\";\n cols += colXml;\n }\n cols += \"</w:cols>\";\n } else {\n cols += \"/>\";\n }\n children.push(cols);\n }\n\n // Page numbering\n if (props.pageNumbering) {\n let pgNum = \"<w:pgNumType\";\n if (props.pageNumbering.format) pgNum += ` w:fmt=\"${escapeAttribute(props.pageNumbering.format)}\"`;\n if (props.pageNumbering.start !== undefined) pgNum += ` w:start=\"${props.pageNumbering.start}\"`;\n if (props.pageNumbering.chapStyle) pgNum += ` w:chapStyle=\"${escapeAttribute(props.pageNumbering.chapStyle)}\"`;\n if (props.pageNumbering.chapSep) pgNum += ` w:chapSep=\"${escapeAttribute(props.pageNumbering.chapSep)}\"`;\n pgNum += \"/>\";\n children.push(pgNum);\n }\n\n if (props.lineNumbering) {\n let lineNumbering = \"<w:lnNumType\";\n if (props.lineNumbering.countBy !== undefined) {\n lineNumbering += ` w:countBy=\"${props.lineNumbering.countBy}\"`;\n }\n if (props.lineNumbering.start !== undefined) {\n lineNumbering += ` w:start=\"${props.lineNumbering.start}\"`;\n }\n if (props.lineNumbering.distance !== undefined) {\n lineNumbering += ` w:distance=\"${props.lineNumbering.distance}\"`;\n }\n if (props.lineNumbering.restart) {\n lineNumbering += ` w:restart=\"${escapeAttribute(props.lineNumbering.restart)}\"`;\n }\n lineNumbering += \"/>\";\n children.push(lineNumbering);\n }\n\n if (props.pageBorders) {\n const attrs: string[] = [];\n if (props.pageBorders.offsetFrom) {\n attrs.push(`w:offsetFrom=\"${escapeAttribute(props.pageBorders.offsetFrom)}\"`);\n }\n if (props.pageBorders.display) {\n attrs.push(`w:display=\"${escapeAttribute(props.pageBorders.display)}\"`);\n }\n if (props.pageBorders.zOrder) {\n attrs.push(`w:zOrder=\"${escapeAttribute(props.pageBorders.zOrder)}\"`);\n }\n const borderXml = [\n serializeBorder(\"top\", props.pageBorders.top),\n serializeBorder(\"left\", props.pageBorders.left),\n serializeBorder(\"bottom\", props.pageBorders.bottom),\n serializeBorder(\"right\", props.pageBorders.right),\n ].filter((entry) => entry.length > 0);\n if (attrs.length > 0 || borderXml.length > 0) {\n children.push(\n `<w:pgBorders${attrs.length > 0 ? ` ${attrs.join(\" \")}` : \"\"}>${borderXml.join(\"\")}</w:pgBorders>`,\n );\n }\n }\n\n // Title page\n if (props.titlePage) {\n children.push(\"<w:titlePg/>\");\n }\n\n if (props.documentGrid) {\n const attrs: string[] = [];\n if (props.documentGrid.type) {\n attrs.push(`w:type=\"${escapeAttribute(props.documentGrid.type)}\"`);\n }\n if (props.documentGrid.linePitch !== undefined) {\n attrs.push(`w:linePitch=\"${props.documentGrid.linePitch}\"`);\n }\n if (props.documentGrid.charSpace !== undefined) {\n attrs.push(`w:charSpace=\"${props.documentGrid.charSpace}\"`);\n }\n if (attrs.length > 0) {\n children.push(`<w:docGrid ${attrs.join(\" \")}/>`);\n }\n }\n\n if (children.length === 0) {\n return \"<w:sectPr/>\";\n }\n\n return `<w:sectPr>${children.join(\"\")}</w:sectPr>`;\n}\n\nfunction wrapInlineRawXml(rawXml: string): string {\n const trimmed = rawXml.trimStart();\n return trimmed.startsWith(\"<w:r\") ? rawXml : `<w:r>${rawXml}</w:r>`;\n}\n\nfunction documentNeedsW14Namespace(content: DocumentRootNode): boolean {\n const blockQueue = [...content.children];\n while (blockQueue.length > 0) {\n const block = blockQueue.shift();\n if (!block) {\n continue;\n }\n if (block.type === \"paragraph\") {\n for (const child of block.children) {\n if (\n (child.type === \"text\" || child.type === \"symbol\") &&\n child.marks?.some((mark) => mark.type === \"textFill\")\n ) {\n return true;\n }\n }\n continue;\n }\n if (block.type === \"table\") {\n for (const row of block.rows) {\n for (const cell of row.cells) {\n blockQueue.push(...cell.children);\n }\n }\n }\n }\n return false;\n}\n","import type { CommentEntry, CommentThread } from \"../../review/store/comment-store.ts\";\nimport type { RevisionParagraphBoundary } from \"../ooxml/revision-boundaries.ts\";\nimport type { ImportedCommentDefinition } from \"../ooxml/parse-comments.ts\";\n\ninterface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n}\n\ninterface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\ntype XmlNode = XmlElementNode | XmlTextNode;\n\ninterface ParagraphBoundaryMap {\n paragraphIndex: number;\n start: number;\n end: number;\n boundaries: Map<number, number>;\n}\n\ninterface SerializableCommentEntry {\n thread: CommentThread;\n entry: CommentEntry;\n exportCommentId: string;\n paraId: string;\n durableId?: string;\n isRoot: boolean;\n}\n\nexport interface SerializedCommentsResult {\n commentsXml: string;\n serializedCommentIds: string[];\n commentsExtendedXml?: string;\n commentsIdsXml?: string;\n peopleXml?: string;\n}\n\nexport interface SerializeMergedCommentsXmlOptions {\n preservedDefinitions?: readonly ImportedCommentDefinition[];\n sourceRootTag?: string;\n sourceExtendedRootTag?: string;\n sourceIdsRootTag?: string;\n sourcePeopleRootTag?: string;\n peopleAuthors?: readonly string[];\n exportCommentIds?: ReadonlyMap<string, string>;\n}\n\nexport interface SerializeCommentAnchorsOptions {\n exportCommentIds?: ReadonlyMap<string, string>;\n}\n\nexport interface SerializedCommentDocumentResult {\n documentXml: string;\n serializedCommentIds: string[];\n skippedCommentIds: string[];\n}\n\nconst DEFAULT_COMMENTS_ROOT_TAG =\n `<w:comments xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"w14\">`;\nconst DEFAULT_COMMENTS_EXTENDED_ROOT_TAG =\n `<w15:commentsEx xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\">`;\nconst DEFAULT_COMMENTS_IDS_ROOT_TAG =\n `<w16cid:commentsIds xmlns:w16cid=\"http://schemas.microsoft.com/office/word/2016/wordml/cid\">`;\nconst DEFAULT_PEOPLE_ROOT_TAG =\n `<w15:people xmlns:w15=\"http://schemas.microsoft.com/office/word/2012/wordml\">`;\n\nexport function serializeCommentsXml(\n threads: readonly CommentThread[],\n options: {\n exportCommentIds?: ReadonlyMap<string, string>;\n } = {},\n): SerializedCommentsResult {\n return serializeMergedCommentsXml(threads, {\n exportCommentIds: options.exportCommentIds,\n });\n}\n\nexport function serializeMergedCommentsXml(\n threads: readonly CommentThread[],\n options: SerializeMergedCommentsXmlOptions = {},\n): SerializedCommentsResult {\n const serializableThreads = threads.filter((thread) => thread.entries.length > 0);\n const preservedDefinitions = (options.preservedDefinitions ?? [])\n .slice()\n .sort((left, right) => left.order - right.order);\n const runtimeThreadById = new Map(\n serializableThreads.map((thread) => [thread.commentId, thread]),\n );\n const exportCommentIds =\n options.exportCommentIds ??\n createCommentExportIdMap(serializableThreads, preservedDefinitions);\n const serializableEntries = createSerializableEntries(\n serializableThreads,\n preservedDefinitions,\n exportCommentIds,\n );\n const serializedEntryByOoxmlId = new Map(\n serializableEntries.map((entry) => [entry.exportCommentId, entry]),\n );\n const emittedThreadIds = new Set<string>();\n const mergedComments: string[] = [];\n\n for (const definition of preservedDefinitions) {\n const ownedThread = runtimeThreadById.get(definition.commentId);\n if (ownedThread) {\n if (emittedThreadIds.has(ownedThread.commentId)) {\n continue;\n }\n mergedComments.push(\n ...serializeThreadEntries(\n serializableEntries.filter((entry) => entry.thread.commentId === ownedThread.commentId),\n ),\n );\n emittedThreadIds.add(ownedThread.commentId);\n continue;\n }\n\n if (serializedEntryByOoxmlId.has(definition.commentId)) {\n continue;\n }\n\n mergedComments.push(definition.rawXml);\n }\n\n for (const thread of serializableThreads) {\n if (emittedThreadIds.has(thread.commentId)) {\n continue;\n }\n\n mergedComments.push(\n ...serializeThreadEntries(\n serializableEntries.filter((entry) => entry.thread.commentId === thread.commentId),\n ),\n );\n emittedThreadIds.add(thread.commentId);\n }\n\n const mergedExtendedEntries = [\n ...serializePreservedCommentExtensions(\n preservedDefinitions.filter((definition) => !serializedEntryByOoxmlId.has(definition.commentId)),\n ),\n ...serializableEntries\n .map((entry) => serializeCommentExtension(entry))\n .filter((xml): xml is string => Boolean(xml)),\n ];\n const mergedDurableIds = [\n ...serializePreservedCommentIds(\n preservedDefinitions.filter((definition) => !serializedEntryByOoxmlId.has(definition.commentId)),\n ),\n ...serializableEntries\n .map((entry) => serializeCommentDurableId(entry))\n .filter((xml): xml is string => Boolean(xml)),\n ];\n const peopleAuthors = new Set([\n ...(options.peopleAuthors ?? []),\n ...preservedDefinitions\n .map((definition) => definition.authorId)\n .filter((authorId): authorId is string => typeof authorId === \"string\" && authorId.length > 0),\n ...serializableEntries\n .map((entry) => entry.entry.authorId)\n .filter((authorId): authorId is string => typeof authorId === \"string\" && authorId.length > 0),\n ]);\n\n return {\n commentsXml: [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n normalizeCommentsRootTag(options.sourceRootTag ?? DEFAULT_COMMENTS_ROOT_TAG),\n ...mergedComments,\n `</w:comments>`,\n ].join(\"\\n\"),\n serializedCommentIds: serializableThreads.map((thread) => thread.commentId),\n commentsExtendedXml:\n mergedExtendedEntries.length > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourceExtendedRootTag ?? DEFAULT_COMMENTS_EXTENDED_ROOT_TAG,\n ...mergedExtendedEntries,\n `</w15:commentsEx>`,\n ].join(\"\\n\")\n : undefined,\n commentsIdsXml:\n mergedDurableIds.length > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourceIdsRootTag ?? DEFAULT_COMMENTS_IDS_ROOT_TAG,\n ...mergedDurableIds,\n `</w16cid:commentsIds>`,\n ].join(\"\\n\")\n : undefined,\n peopleXml:\n peopleAuthors.size > 0\n ? [\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>`,\n options.sourcePeopleRootTag ?? DEFAULT_PEOPLE_ROOT_TAG,\n ...[...peopleAuthors]\n .sort((left, right) => left.localeCompare(right))\n .map(\n (authorId) =>\n `<w15:person w15:author=\"${escapeAttribute(authorId)}\" />`,\n ),\n `</w15:people>`,\n ].join(\"\\n\")\n : undefined,\n };\n}\n\nfunction normalizeCommentsRootTag(rootTag: string): string {\n let normalized = rootTag;\n if (!/\\bxmlns:w14=/u.test(normalized)) {\n normalized = normalized.replace(\n />$/u,\n ` xmlns:w14=\"http://schemas.microsoft.com/office/word/2010/wordml\">`,\n );\n }\n if (!/\\bxmlns:mc=/u.test(normalized)) {\n normalized = normalized.replace(\n />$/u,\n ` xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">`,\n );\n }\n if (!/\\bmc:Ignorable=/u.test(normalized)) {\n normalized = normalized.replace(/>$/u, ` mc:Ignorable=\"w14\">`);\n } else if (!/\\bmc:Ignorable=\"[^\"]*\\bw14\\b/u.test(normalized)) {\n normalized = normalized.replace(\n /\\bmc:Ignorable=\"([^\"]*)\"/u,\n (_match, value: string) =>\n `mc:Ignorable=\"${`${value} w14`.trim().replace(/\\s+/gu, \" \")}\"`,\n );\n }\n return normalized;\n}\n\nexport function serializeCommentAnchorsIntoDocumentXml(\n documentXml: string,\n threads: readonly CommentThread[],\n paragraphs: readonly Pick<\n RevisionParagraphBoundary,\n \"paragraphIndex\" | \"start\" | \"end\" | \"boundaries\"\n >[] = mapParagraphBoundaries(documentXml),\n options: SerializeCommentAnchorsOptions = {},\n): SerializedCommentDocumentResult {\n const insertions = new Map<number, string[]>();\n const serializedCommentIds: string[] = [];\n const skippedCommentIds: string[] = [];\n const exportCommentIds =\n options.exportCommentIds ?? createCommentExportIdMap(threads);\n\n for (const thread of threads) {\n const { anchor } = thread;\n if (anchor.kind !== \"range\") {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const paragraph = paragraphs.find(\n (candidate) =>\n anchor.range.from >= candidate.start &&\n anchor.range.to <= candidate.end,\n );\n\n if (!paragraph) {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const startIndex = paragraph.boundaries.get(anchor.range.from);\n const endIndex = paragraph.boundaries.get(anchor.range.to);\n\n if (startIndex === undefined || endIndex === undefined) {\n skippedCommentIds.push(thread.commentId);\n continue;\n }\n\n const exportCommentId = exportCommentIds.get(thread.commentId) ?? thread.commentId;\n pushInsertion(\n insertions,\n startIndex,\n `<w:commentRangeStart w:id=\"${escapeAttribute(exportCommentId)}\"/>`,\n );\n pushInsertion(\n insertions,\n endIndex,\n `<w:commentRangeEnd w:id=\"${escapeAttribute(exportCommentId)}\"/>`,\n );\n pushInsertion(\n insertions,\n endIndex,\n `<w:r><w:commentReference w:id=\"${escapeAttribute(exportCommentId)}\"/></w:r>`,\n );\n serializedCommentIds.push(thread.commentId);\n }\n\n const sortedInsertions = [...insertions.entries()].sort((left, right) => left[0] - right[0]);\n let cursor = 0;\n let output = \"\";\n\n for (const [index, snippets] of sortedInsertions) {\n output += documentXml.slice(cursor, index);\n output += snippets.join(\"\");\n cursor = index;\n }\n\n output += documentXml.slice(cursor);\n\n return {\n documentXml: output,\n serializedCommentIds,\n skippedCommentIds,\n };\n}\n\nexport function createCommentExportIdMap(\n threads: readonly CommentThread[],\n preservedDefinitions: readonly ImportedCommentDefinition[] = [],\n): ReadonlyMap<string, string> {\n const exportIds = new Map<string, string>();\n const reservedNumericIds = new Set<number>();\n\n for (const definition of preservedDefinitions) {\n const numericId = parseOoxmlNumericId(definition.commentId);\n if (numericId !== undefined) {\n reservedNumericIds.add(numericId);\n }\n }\n\n for (const thread of threads) {\n const rootEntry = getRootEntry(thread);\n const preferredValue =\n thread.metadata?.rootOoxmlCommentId ??\n rootEntry?.metadata?.ooxmlCommentId ??\n thread.commentId;\n const numericId = parseOoxmlNumericId(preferredValue);\n if (numericId !== undefined && !reservedNumericIds.has(numericId)) {\n exportIds.set(thread.commentId, String(numericId));\n reservedNumericIds.add(numericId);\n }\n }\n\n let nextGeneratedId =\n reservedNumericIds.size > 0 ? Math.max(...reservedNumericIds) + 1 : 1;\n\n for (const thread of threads) {\n if (exportIds.has(thread.commentId)) {\n continue;\n }\n\n while (reservedNumericIds.has(nextGeneratedId)) {\n nextGeneratedId += 1;\n }\n\n exportIds.set(thread.commentId, String(nextGeneratedId));\n reservedNumericIds.add(nextGeneratedId);\n nextGeneratedId += 1;\n }\n\n return exportIds;\n}\n\nfunction createSerializableEntries(\n threads: readonly CommentThread[],\n preservedDefinitions: readonly ImportedCommentDefinition[],\n exportCommentIds: ReadonlyMap<string, string>,\n): SerializableCommentEntry[] {\n const entries: SerializableCommentEntry[] = [];\n const reservedNumericIds = new Set<number>();\n\n for (const definition of preservedDefinitions) {\n const numericId = parseOoxmlNumericId(definition.commentId);\n if (numericId !== undefined) {\n reservedNumericIds.add(numericId);\n }\n }\n\n for (const thread of threads) {\n const rootEntry = getRootEntry(thread);\n if (!rootEntry) {\n continue;\n }\n\n const rootExportCommentId = exportCommentIds.get(thread.commentId) ?? thread.commentId;\n const rootNumericId = parseOoxmlNumericId(rootExportCommentId);\n if (rootNumericId !== undefined) {\n reservedNumericIds.add(rootNumericId);\n }\n\n const rootParaId =\n rootEntry.metadata?.paraId ??\n thread.metadata?.rootParaId ??\n generateParaId(thread.commentId, 0);\n const rootDurableId =\n rootEntry.metadata?.durableId ??\n createDurableId(rootEntry, rootExportCommentId, 0);\n\n entries.push({\n thread,\n entry: rootEntry,\n exportCommentId: rootExportCommentId,\n paraId: rootParaId,\n durableId: rootDurableId,\n isRoot: true,\n });\n\n for (let index = 1; index < thread.entries.length; index += 1) {\n const entry = thread.entries[index];\n if (!entry) {\n continue;\n }\n\n const preferredCommentId = entry.metadata?.ooxmlCommentId;\n let exportCommentId: string | undefined;\n const preferredNumericId = preferredCommentId\n ? parseOoxmlNumericId(preferredCommentId)\n : undefined;\n if (\n preferredNumericId !== undefined &&\n !reservedNumericIds.has(preferredNumericId)\n ) {\n exportCommentId = String(preferredNumericId);\n reservedNumericIds.add(preferredNumericId);\n } else {\n let nextGeneratedId =\n reservedNumericIds.size > 0 ? Math.max(...reservedNumericIds) + 1 : 1;\n while (reservedNumericIds.has(nextGeneratedId)) {\n nextGeneratedId += 1;\n }\n exportCommentId = String(nextGeneratedId);\n reservedNumericIds.add(nextGeneratedId);\n }\n\n entries.push({\n thread,\n entry,\n exportCommentId,\n paraId: entry.metadata?.paraId ?? generateParaId(thread.commentId, index),\n durableId:\n entry.metadata?.durableId ??\n createDurableId(entry, exportCommentId, index),\n isRoot: false,\n });\n }\n }\n\n return entries;\n}\n\nfunction serializeThreadEntries(entries: readonly SerializableCommentEntry[]): string[] {\n return entries.map((entry) => serializeCommentEntry(entry));\n}\n\nfunction serializeCommentEntry(entry: SerializableCommentEntry): string {\n const author = escapeAttribute(entry.entry.authorId);\n const createdAt = escapeAttribute(entry.entry.createdAt);\n const initials = entry.entry.metadata?.initials;\n const paragraphXml = serializeCommentParagraphs(entry.entry.body, entry.paraId);\n\n return `<w:comment w:id=\"${escapeAttribute(entry.exportCommentId)}\"${initials ? ` w:initials=\"${escapeAttribute(initials)}\"` : \"\"} w:author=\"${author}\" w:date=\"${createdAt}\">${paragraphXml}</w:comment>`;\n}\n\nfunction serializeCommentParagraphs(body: string, paraId: string): string {\n const paragraphs = body.length > 0 ? body.split(\"\\n\") : [\"\"];\n const textId = deriveTextIdFromParaId(paraId);\n return paragraphs\n .map((paragraph, index) => {\n const attributes =\n index === 0\n ? ` w14:paraId=\"${escapeAttribute(paraId)}\" w14:textId=\"${escapeAttribute(textId)}\"`\n : \"\";\n return `<w:p${attributes}><w:r>${serializeText(paragraph)}</w:r></w:p>`;\n })\n .join(\"\");\n}\n\nfunction serializePreservedCommentExtensions(\n definitions: readonly ImportedCommentDefinition[],\n): string[] {\n return definitions\n .map((definition) =>\n definition.paraId\n ? serializePreservedCommentExtension(definition)\n : undefined,\n )\n .filter((xml): xml is string => Boolean(xml));\n}\n\nfunction serializePreservedCommentExtension(\n definition: ImportedCommentDefinition,\n): string {\n const doneValue = definition.isDone ? \"true\" : \"false\";\n return `<w15:commentEx w15:paraId=\"${escapeAttribute(definition.paraId!)}\"${definition.parentParaId ? ` w15:paraIdParent=\"${escapeAttribute(definition.parentParaId)}\"` : \"\"} w15:done=\"${doneValue}\" />`;\n}\n\nfunction serializeCommentExtension(\n entry: SerializableCommentEntry,\n): string | undefined {\n return `<w15:commentEx w15:paraId=\"${escapeAttribute(entry.paraId)}\"${entry.isRoot ? \"\" : ` w15:paraIdParent=\"${escapeAttribute(findRootParaId(entry.thread, entry.paraId))}\"`} w15:done=\"${entry.isRoot && entry.thread.status === \"resolved\" ? \"true\" : \"false\"}\" />`;\n}\n\nfunction serializePreservedCommentIds(\n definitions: readonly ImportedCommentDefinition[],\n): string[] {\n return definitions\n .map((definition) =>\n definition.paraId && definition.durableId\n ? `<w16cid:commentId w16cid:paraId=\"${escapeAttribute(definition.paraId)}\" w16cid:durableId=\"${escapeAttribute(definition.durableId)}\" />`\n : undefined,\n )\n .filter((xml): xml is string => Boolean(xml));\n}\n\nfunction serializeCommentDurableId(\n entry: SerializableCommentEntry,\n): string | undefined {\n if (!entry.durableId) {\n return undefined;\n }\n\n return `<w16cid:commentId w16cid:paraId=\"${escapeAttribute(entry.paraId)}\" w16cid:durableId=\"${escapeAttribute(entry.durableId)}\" />`;\n}\n\nfunction getRootEntry(thread: CommentThread): CommentEntry | undefined {\n return thread.entries[0];\n}\n\nfunction findRootParaId(thread: CommentThread, fallback: string): string {\n return (\n thread.entries[0]?.metadata?.paraId ??\n thread.metadata?.rootParaId ??\n fallback\n );\n}\n\nfunction generateParaId(seed: string, index: number): string {\n const normalized = `${seed}:${index}`;\n let hash = 0;\n\n for (let cursor = 0; cursor < normalized.length; cursor += 1) {\n hash = (hash * 31 + normalized.charCodeAt(cursor)) >>> 0;\n }\n\n return hash.toString(16).toUpperCase().padStart(8, \"0\").slice(-8);\n}\n\nfunction createDurableId(\n entry: CommentEntry,\n exportCommentId: string,\n index: number,\n): string {\n const seed = `${entry.entryId}:${exportCommentId}:${index}`;\n let hash = 0n;\n\n for (let cursor = 0; cursor < seed.length; cursor += 1) {\n hash = (hash * 131n + BigInt(seed.charCodeAt(cursor))) & 0xffffffffffffffffn;\n }\n\n return hash.toString(16).toUpperCase().padStart(16, \"0\").slice(-16);\n}\n\nfunction deriveTextIdFromParaId(paraId: string): string {\n return paraId.slice(-8).padStart(8, \"0\");\n}\n\nfunction parseOoxmlNumericId(value: string): number | undefined {\n if (!/^-?\\d+$/u.test(value)) {\n return undefined;\n }\n\n const numericId = Number.parseInt(value, 10);\n return Number.isFinite(numericId) ? numericId : undefined;\n}\n\nexport function mapParagraphBoundaries(documentXml: string): ParagraphBoundaryMap[] {\n const root = parseXml(documentXml);\n const documentElement = findChildElement(root, \"document\");\n const bodyElement = findChildElement(documentElement, \"body\");\n const paragraphs: ParagraphBoundaryMap[] = [];\n walkBlockNodesForParagraphBoundaries(\n bodyElement.children,\n documentXml,\n paragraphs,\n 0,\n -1,\n true,\n );\n\n return paragraphs;\n}\n\nfunction walkBlockNodesForParagraphBoundaries(\n nodes: readonly XmlNode[],\n documentXml: string,\n paragraphs: ParagraphBoundaryMap[],\n globalCursor: number,\n paragraphIndex: number,\n useSurfaceParagraphSeparators: boolean,\n): {\n globalCursor: number;\n paragraphIndex: number;\n} {\n let nextCursor = globalCursor;\n let nextParagraphIndex = paragraphIndex;\n let elementIndex = -1;\n\n for (const node of nodes) {\n if (node.type !== \"element\") {\n continue;\n }\n elementIndex += 1;\n\n const name = localName(node.name);\n if (name === \"p\") {\n if (useSurfaceParagraphSeparators && elementIndex > 0) {\n nextCursor += 1;\n }\n nextParagraphIndex += 1;\n const boundaries = new Map<number, number>();\n boundaries.set(nextCursor, node.start + openingTagLength(documentXml, node.start));\n\n walkParagraphForBoundaries(\n node,\n documentXml,\n boundaries,\n () => nextCursor,\n (next) => {\n nextCursor = next;\n },\n );\n\n if (!boundaries.has(nextCursor)) {\n boundaries.set(nextCursor, node.end - 4);\n }\n paragraphs.push({\n paragraphIndex: nextParagraphIndex,\n start: Math.min(...boundaries.keys()),\n end: Math.max(...boundaries.keys()),\n boundaries,\n });\n continue;\n }\n\n if (name === \"tbl\") {\n for (const child of node.children) {\n if (child.type !== \"element\" || localName(child.name) !== \"tr\") {\n continue;\n }\n for (const rowChild of child.children) {\n if (rowChild.type !== \"element\" || localName(rowChild.name) !== \"tc\") {\n continue;\n }\n const result = walkBlockNodesForParagraphBoundaries(\n rowChild.children,\n documentXml,\n paragraphs,\n nextCursor,\n nextParagraphIndex,\n false,\n );\n nextCursor = result.globalCursor;\n nextParagraphIndex = result.paragraphIndex;\n }\n }\n continue;\n }\n\n if (name === \"sdt\") {\n const sdtContent = findChildElement(node, \"sdtContent\");\n const result = walkBlockNodesForParagraphBoundaries(\n sdtContent.children,\n documentXml,\n paragraphs,\n nextCursor,\n nextParagraphIndex,\n false,\n );\n nextCursor = result.globalCursor;\n nextParagraphIndex = result.paragraphIndex;\n continue;\n }\n\n if (name === \"customXml\") {\n nextCursor += 1;\n continue;\n }\n\n nextCursor += 0;\n }\n\n return {\n globalCursor: nextCursor,\n paragraphIndex: nextParagraphIndex,\n };\n}\n\nfunction walkParagraphForBoundaries(\n paragraph: XmlElementNode,\n sourceXml: string,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const child of paragraph.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n}\n\nfunction walkInlineNodeForBoundaries(\n node: XmlNode,\n sourceXml: string,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"r\": {\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n\n for (const child of node.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n\n boundaries.set(getCursor(), node.end);\n return;\n }\n case \"t\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n setCursor(getCursor() + Array.from(text).length);\n return;\n }\n case \"tab\":\n case \"br\": {\n const startCursor = getCursor();\n boundaries.set(startCursor, node.start);\n const nextCursor = startCursor + 1;\n boundaries.set(nextCursor, node.end);\n setCursor(nextCursor);\n return;\n }\n default:\n for (const child of node.children) {\n walkInlineNodeForBoundaries(child, sourceXml, boundaries, getCursor, setCursor);\n }\n }\n}\n\nfunction pushInsertion(\n insertions: Map<number, string[]>,\n index: number,\n xml: string,\n): void {\n const bucket = insertions.get(index);\n if (bucket) {\n bucket.push(xml);\n return;\n }\n\n insertions.set(index, [xml]);\n}\n\nfunction serializeText(text: string): string {\n const preserve = requiresPreservedSpace(text) ? ` xml:space=\"preserve\"` : \"\";\n return `<w:t${preserve}>${escapeXml(text)}</w:t>`;\n}\n\nfunction requiresPreservedSpace(text: string): boolean {\n return /^\\s/u.test(text) || /\\s$/u.test(text) || /\\s{2,}/u.test(text);\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeXml(value).replace(/\"/g, \""\");\n}\n\nfunction openingTagLength(xml: string, start: number): number {\n const end = xml.indexOf(\">\", start);\n if (end < 0) {\n throw new Error(\"Malformed XML: missing tag close.\");\n }\n\n return end - start + 1;\n}\n\nfunction parseXml(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"#document\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n const tokenPattern =\n /<!--[\\s\\S]*?-->|<\\?[\\s\\S]*?\\?>|<!DOCTYPE[\\s\\S]*?>|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>|<[^>]+>|[^<]+/gu;\n\n for (const match of xml.matchAll(tokenPattern)) {\n const token = match[0] ?? \"\";\n const start = match.index ?? 0;\n const end = start + token.length;\n\n if (token.startsWith(\"<?\") || token.startsWith(\"<!DOCTYPE\") || token.startsWith(\"<!--\")) {\n continue;\n }\n\n if (token.startsWith(\"<![CDATA[\")) {\n const text = token.slice(9, -3);\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n continue;\n }\n\n if (token.startsWith(\"</\")) {\n const node = stack.pop();\n if (!node) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n node.end = end;\n continue;\n }\n\n if (token.startsWith(\"<\")) {\n const selfClosing = /\\/>$/.test(token);\n const tagBody = token.slice(1, token.length - (selfClosing ? 2 : 1)).trim();\n const { name, attributes } = parseTag(tagBody);\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start,\n end,\n };\n stack[stack.length - 1]?.children.push(node);\n if (!selfClosing) {\n stack.push(node);\n }\n continue;\n }\n\n const text = decodeXmlText(token);\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start,\n end,\n });\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed tag.\");\n }\n\n return root;\n}\n\nfunction parseTag(tagBody: string): { name: string; attributes: Record<string, string> } {\n const whitespaceIndex = tagBody.search(/\\s/u);\n const name = whitespaceIndex === -1 ? tagBody : tagBody.slice(0, whitespaceIndex);\n const rawAttributes = whitespaceIndex === -1 ? \"\" : tagBody.slice(whitespaceIndex + 1);\n const attributes: Record<string, string> = {};\n const pattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/gu;\n\n for (const match of rawAttributes.matchAll(pattern)) {\n const key = match[1];\n const value = match[3] ?? match[4] ?? \"\";\n if (key) {\n attributes[key] = decodeXmlText(value);\n }\n }\n\n return { name, attributes };\n}\n\nfunction findChildElement(node: XmlElementNode, name: string): XmlElementNode {\n const match = node.children.find(\n (child): child is XmlElementNode =>\n child.type === \"element\" && localName(child.name) === name,\n );\n\n if (!match) {\n throw new Error(`Expected XML element ${name}.`);\n }\n\n return match;\n}\n\nfunction localName(name: string): string {\n const index = name.indexOf(\":\");\n return index === -1 ? name : name.slice(index + 1);\n}\n\nfunction decodeXmlText(text: string): string {\n return text.replace(\n /&(?:#x([0-9A-Fa-f]+)|#([0-9]+)|([A-Za-z]+));/gu,\n (_, hex, dec, named) => {\n if (hex) {\n return String.fromCodePoint(Number.parseInt(hex, 16));\n }\n if (dec) {\n return String.fromCodePoint(Number.parseInt(dec, 10));\n }\n\n switch (named) {\n case \"amp\":\n return \"&\";\n case \"lt\":\n return \"<\";\n case \"gt\":\n return \">\";\n case \"quot\":\n return \"\\\"\";\n case \"apos\":\n return \"'\";\n default:\n return `&${named};`;\n }\n },\n );\n}\n","import type {\n DocumentRootNode,\n HyperlinkNode,\n InlineNode,\n ParagraphNode,\n TextNode,\n} from \"../../model/canonical-document.ts\";\nimport type { CommentThread } from \"../../review/store/comment-store.ts\";\nimport type { RevisionRecord } from \"../../review/store/revision-types.ts\";\n\nexport function splitDocumentAtReviewBoundaries(\n content: DocumentRootNode,\n comments: readonly CommentThread[],\n revisions: readonly RevisionRecord[],\n): DocumentRootNode {\n const splitPositions = collectSplitPositions(comments, revisions);\n if (splitPositions.size === 0) {\n return content;\n }\n\n return {\n type: \"doc\",\n children: splitBlockNodes(content.children, splitPositions, 0, true).children,\n };\n}\n\nfunction collectSplitPositions(\n comments: readonly CommentThread[],\n revisions: readonly RevisionRecord[],\n): Set<number> {\n const positions = new Set<number>();\n\n for (const thread of comments) {\n if (thread.anchor.kind !== \"range\") {\n continue;\n }\n\n positions.add(thread.anchor.range.from);\n positions.add(thread.anchor.range.to);\n }\n\n for (const revision of revisions) {\n if (revision.status !== \"active\" || revision.anchor.kind !== \"range\") {\n continue;\n }\n\n if (\n revision.metadata.importedRevisionForm === \"paragraph-insertion\" ||\n revision.metadata.importedRevisionForm === \"paragraph-deletion\"\n ) {\n continue;\n }\n\n positions.add(revision.anchor.range.from);\n positions.add(revision.anchor.range.to);\n }\n\n return positions;\n}\n\nfunction splitParagraph(\n paragraph: ParagraphNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { paragraph: ParagraphNode; cursor: number } {\n const children: InlineNode[] = [];\n let nextCursor = cursor;\n\n for (const child of paragraph.children) {\n if (child.type === \"text\") {\n const split = splitTextNode(child, splitPositions, nextCursor);\n children.push(...split.children);\n nextCursor = split.cursor;\n continue;\n }\n\n if (child.type === \"hyperlink\") {\n const split = splitHyperlinkNode(child, splitPositions, nextCursor);\n children.push(...split.children);\n nextCursor = split.cursor;\n continue;\n }\n\n children.push(child);\n nextCursor += measureInlineNodeForReviewBoundaries(child);\n }\n\n return {\n paragraph: {\n ...paragraph,\n children,\n },\n cursor: nextCursor,\n };\n}\n\nfunction splitBlockNodes(\n blocks: readonly DocumentRootNode[\"children\"][number][],\n splitPositions: ReadonlySet<number>,\n cursor: number,\n useSurfaceParagraphSeparators: boolean,\n): {\n children: DocumentRootNode[\"children\"];\n cursor: number;\n} {\n const children: DocumentRootNode[\"children\"] = [];\n let nextCursor = cursor;\n for (const [index, block] of blocks.entries()) {\n if (block.type === \"paragraph\") {\n if (useSurfaceParagraphSeparators && index > 0) {\n nextCursor += 1;\n }\n const next = splitParagraph(block, splitPositions, nextCursor);\n children.push(next.paragraph);\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"table\") {\n const next = splitTableAtReviewBoundaries(block, splitPositions, nextCursor);\n children.push(next.table);\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"sdt\") {\n const next = splitBlockNodes(block.children, splitPositions, nextCursor, false);\n children.push({\n ...block,\n children: next.children,\n });\n nextCursor = next.cursor;\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n children.push(block);\n nextCursor += 1;\n continue;\n }\n\n children.push(block);\n nextCursor += 1;\n }\n\n return {\n children,\n cursor: nextCursor,\n };\n}\n\nfunction splitTableAtReviewBoundaries(\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): {\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>;\n cursor: number;\n} {\n let nextCursor = cursor;\n const rows = table.rows.map((row) => ({\n ...row,\n cells: row.cells.map((cell) => {\n const next = splitBlockNodes(cell.children, splitPositions, nextCursor, false);\n nextCursor = next.cursor;\n return {\n ...cell,\n children: next.children,\n };\n }),\n }));\n\n return {\n table: {\n ...table,\n rows,\n },\n cursor: nextCursor,\n };\n}\n\nfunction advanceCursorThroughTable(\n table: Extract<DocumentRootNode[\"children\"][number], { type: \"table\" }>,\n cursor: number,\n): number {\n let nextCursor = cursor;\n for (const row of table.rows) {\n for (const cell of row.cells) {\n nextCursor = measureBlockNodesForReviewBoundaries(cell.children, nextCursor, false);\n }\n }\n return nextCursor;\n}\n\nfunction measureBlockNodesForReviewBoundaries(\n blocks: readonly DocumentRootNode[\"children\"][number][],\n cursor: number,\n useSurfaceParagraphSeparators: boolean,\n): number {\n let nextCursor = cursor;\n for (const [index, block] of blocks.entries()) {\n if (block.type === \"paragraph\") {\n if (useSurfaceParagraphSeparators && index > 0) {\n nextCursor += 1;\n }\n nextCursor += block.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n continue;\n }\n\n if (block.type === \"table\") {\n nextCursor = advanceCursorThroughTable(block, nextCursor);\n continue;\n }\n\n if (block.type === \"sdt\") {\n nextCursor = measureBlockNodesForReviewBoundaries(\n block.children,\n nextCursor,\n false,\n );\n continue;\n }\n\n if (block.type === \"custom_xml\") {\n nextCursor += 1;\n continue;\n }\n\n nextCursor += 1;\n }\n\n return nextCursor;\n}\n\nfunction splitHyperlinkNode(\n node: HyperlinkNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { children: HyperlinkNode[]; cursor: number } {\n let nextCursor = cursor;\n const groups: Array<HyperlinkNode[\"children\"]> = [[]];\n\n for (const child of node.children) {\n if (child.type === \"text\") {\n const split = splitTextNode(child, splitPositions, nextCursor);\n for (const piece of split.children) {\n groups[groups.length - 1]?.push(piece);\n nextCursor += Array.from(piece.text).length;\n if (splitPositions.has(nextCursor)) {\n groups.push([]);\n }\n }\n continue;\n }\n\n groups[groups.length - 1]?.push(child);\n nextCursor += measureInlineNodeForReviewBoundaries(child);\n if (splitPositions.has(nextCursor)) {\n groups.push([]);\n }\n }\n\n const hyperlinks = groups\n .filter((children) => children.length > 0)\n .map((children) => ({\n type: \"hyperlink\" as const,\n href: node.href,\n children,\n }));\n\n return {\n children: hyperlinks.length > 0 ? hyperlinks : [node],\n cursor: nextCursor,\n };\n}\n\nfunction splitTextNode(\n node: TextNode,\n splitPositions: ReadonlySet<number>,\n cursor: number,\n): { children: TextNode[]; cursor: number } {\n const codepoints = Array.from(node.text);\n if (codepoints.length === 0) {\n return { children: [], cursor };\n }\n\n const boundaries = new Set<number>([0, codepoints.length]);\n for (let index = 1; index < codepoints.length; index += 1) {\n if (splitPositions.has(cursor + index)) {\n boundaries.add(index);\n }\n }\n\n const ordered = [...boundaries].sort((left, right) => left - right);\n const children: TextNode[] = [];\n\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const start = ordered[index] ?? 0;\n const end = ordered[index + 1] ?? codepoints.length;\n const text = codepoints.slice(start, end).join(\"\");\n if (text.length === 0) {\n continue;\n }\n\n children.push({\n type: \"text\",\n text,\n ...(node.marks && node.marks.length > 0 ? { marks: node.marks } : {}),\n });\n }\n\n return {\n children: children.length > 0 ? children : [node],\n cursor: cursor + codepoints.length,\n };\n}\n\nfunction measureInlineNodeForReviewBoundaries(node: InlineNode): number {\n switch (node.type) {\n case \"text\":\n return Array.from(node.text).length;\n case \"bookmark_start\":\n case \"bookmark_end\":\n return 0;\n case \"hyperlink\":\n return node.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n case \"field\": {\n const childWidth = node.children.reduce(\n (size, child) => size + measureInlineNodeForReviewBoundaries(child),\n 0,\n );\n return childWidth > 0 ? childWidth : 1;\n }\n case \"tab\":\n case \"hard_break\":\n case \"column_break\":\n case \"footnote_ref\":\n case \"image\":\n case \"opaque_inline\":\n case \"chart_preview\":\n case \"smartart_preview\":\n case \"shape\":\n case \"wordart\":\n case \"vml_shape\":\n case \"symbol\":\n return 1;\n default:\n return 1;\n }\n}\n","export interface XmlElementNode {\n type: \"element\";\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n start: number;\n end: number;\n openingTagEnd: number;\n closingTagStart: number;\n}\n\nexport interface XmlTextNode {\n type: \"text\";\n text: string;\n start: number;\n end: number;\n}\n\nexport type XmlNode = XmlElementNode | XmlTextNode;\n\nexport interface RevisionParagraphBoundary {\n paragraphIndex: number;\n start: number;\n end: number;\n boundaries: Map<number, number>;\n paragraphStart: number;\n paragraphStartTagEnd: number;\n paragraphEndTagStart: number;\n paragraphEnd: number;\n paragraphPropertiesStart?: number;\n paragraphPropertiesEnd?: number;\n paragraphRunPropertiesStart?: number;\n paragraphRunPropertiesEnd?: number;\n}\n\nexport function mapRevisionBoundaries(\n documentXml: string,\n): RevisionParagraphBoundary[] {\n const root = parseXmlWithPositions(documentXml);\n const documentElement = findRequiredChildElement(root, \"document\");\n const bodyElement = findRequiredChildElement(documentElement, \"body\");\n const paragraphs: RevisionParagraphBoundary[] = [];\n let cursor = 0;\n let paragraphIndex = -1;\n let previousWasParagraph = false;\n\n for (const child of bodyElement.children) {\n if (child.type !== \"element\") {\n continue;\n }\n\n if (localName(child.name) !== \"p\") {\n cursor += 1;\n previousWasParagraph = false;\n continue;\n }\n\n if (previousWasParagraph) {\n cursor += 1;\n }\n paragraphIndex += 1;\n const boundaries = new Map<number, number>();\n boundaries.set(cursor, child.openingTagEnd);\n\n const paragraphProperties = findChildElement(child, \"pPr\");\n const paragraphRunProperties = paragraphProperties\n ? findChildElement(paragraphProperties, \"rPr\")\n : undefined;\n\n walkStoryNodesForBoundaries(\n child.children,\n boundaries,\n () => cursor,\n (next) => {\n cursor = next;\n },\n );\n\n boundaries.set(cursor, child.closingTagStart);\n paragraphs.push({\n paragraphIndex,\n start: Math.min(...boundaries.keys()),\n end: Math.max(...boundaries.keys()),\n boundaries,\n paragraphStart: child.start,\n paragraphStartTagEnd: child.openingTagEnd,\n paragraphEndTagStart: child.closingTagStart,\n paragraphEnd: child.end,\n ...(paragraphProperties\n ? {\n paragraphPropertiesStart: paragraphProperties.start,\n paragraphPropertiesEnd: paragraphProperties.end,\n }\n : {}),\n ...(paragraphRunProperties\n ? {\n paragraphRunPropertiesStart: paragraphRunProperties.start,\n paragraphRunPropertiesEnd: paragraphRunProperties.end,\n }\n : {}),\n });\n previousWasParagraph = true;\n }\n\n return paragraphs;\n}\n\nfunction walkStoryNodesForBoundaries(\n nodes: XmlNode[],\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n for (const node of nodes) {\n walkStoryNodeForBoundaries(node, boundaries, getCursor, setCursor);\n }\n}\n\nfunction walkStoryNodeForBoundaries(\n node: XmlNode,\n boundaries: Map<number, number>,\n getCursor: () => number,\n setCursor: (next: number) => void,\n): void {\n if (node.type !== \"element\") {\n return;\n }\n\n switch (localName(node.name)) {\n case \"pPr\":\n return;\n case \"r\":\n boundaries.set(getCursor(), node.start);\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n boundaries.set(getCursor(), node.end);\n return;\n case \"ins\":\n case \"del\":\n case \"moveFrom\":\n case \"moveTo\":\n case \"hyperlink\":\n case \"smartTag\":\n case \"sdtContent\":\n case \"customXml\":\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n return;\n case \"t\":\n case \"delText\":\n case \"instrText\":\n case \"delInstrText\": {\n const text = node.children\n .filter((child): child is XmlTextNode => child.type === \"text\")\n .map((child) => child.text)\n .join(\"\");\n if (text.length === 0) {\n return;\n }\n\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n setCursor(getCursor() + text.length);\n boundaries.set(getCursor(), node.end);\n return;\n }\n case \"tab\":\n case \"br\":\n case \"cr\":\n if (!boundaries.has(getCursor())) {\n boundaries.set(getCursor(), node.start);\n }\n setCursor(getCursor() + 1);\n boundaries.set(getCursor(), node.end);\n return;\n default:\n for (const child of node.children) {\n walkStoryNodeForBoundaries(child, boundaries, getCursor, setCursor);\n }\n }\n}\n\nexport function parseXmlWithPositions(xml: string): XmlElementNode {\n const root: XmlElementNode = {\n type: \"element\",\n name: \"__root__\",\n attributes: {},\n children: [],\n start: 0,\n end: xml.length,\n openingTagEnd: 0,\n closingTagStart: xml.length,\n };\n const stack: XmlElementNode[] = [root];\n let cursor = 0;\n\n while (cursor < xml.length) {\n if (xml.startsWith(\"<!--\", cursor)) {\n const end = xml.indexOf(\"-->\", cursor);\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<?\", cursor)) {\n const end = xml.indexOf(\"?>\", cursor);\n cursor = end >= 0 ? end + 2 : xml.length;\n continue;\n }\n\n if (xml.startsWith(\"<![CDATA[\", cursor)) {\n const end = xml.indexOf(\"]]>\", cursor);\n const textEnd = end >= 0 ? end : xml.length;\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text: xml.slice(cursor + 9, textEnd),\n start: cursor,\n end: textEnd,\n });\n cursor = end >= 0 ? end + 3 : xml.length;\n continue;\n }\n\n if (xml[cursor] !== \"<\") {\n const nextTag = xml.indexOf(\"<\", cursor);\n const end = nextTag >= 0 ? nextTag : xml.length;\n const text = decodeXmlEntities(xml.slice(cursor, end));\n if (text.length > 0) {\n stack[stack.length - 1]?.children.push({\n type: \"text\",\n text,\n start: cursor,\n end,\n });\n }\n cursor = end;\n continue;\n }\n\n if (xml[cursor + 1] === \"/\") {\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n throw new Error(\"Malformed XML: unterminated closing tag.\");\n }\n\n const node = stack.pop();\n if (!node || stack.length === 0) {\n throw new Error(\"Malformed XML: unexpected closing tag.\");\n }\n\n node.closingTagStart = cursor;\n node.end = tagEnd + 1;\n cursor = tagEnd + 1;\n continue;\n }\n\n const tagEnd = xml.indexOf(\">\", cursor);\n if (tagEnd < 0) {\n throw new Error(\"Malformed XML: unterminated opening tag.\");\n }\n\n const rawTag = xml.slice(cursor + 1, tagEnd);\n const selfClosing = /\\/\\s*$/.test(rawTag);\n const normalizedTag = selfClosing ? rawTag.replace(/\\/\\s*$/, \"\") : rawTag;\n const parts = normalizedTag.trim().split(/\\s+/, 1);\n const name = parts[0];\n if (!name) {\n throw new Error(\"Malformed XML: empty tag name.\");\n }\n\n const attributes = parseAttributes(normalizedTag.slice(name.length));\n const node: XmlElementNode = {\n type: \"element\",\n name,\n attributes,\n children: [],\n start: cursor,\n end: selfClosing ? tagEnd + 1 : xml.length,\n openingTagEnd: tagEnd + 1,\n closingTagStart: tagEnd + 1,\n };\n\n stack[stack.length - 1]?.children.push(node);\n cursor = tagEnd + 1;\n\n if (!selfClosing) {\n stack.push(node);\n }\n }\n\n if (stack.length !== 1) {\n throw new Error(\"Malformed XML: unclosed element.\");\n }\n\n return root;\n}\n\nexport function findRequiredChildElement(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode {\n const child = findChildElement(node, childLocalName);\n if (!child) {\n throw new Error(`Expected <${childLocalName}> element.`);\n }\n\n return child;\n}\n\nexport function findChildElement(\n node: XmlElementNode,\n childLocalName: string,\n): XmlElementNode | undefined {\n return node.children.find(\n (entry): entry is XmlElementNode =>\n entry.type === \"element\" && localName(entry.name) === childLocalName,\n );\n}\n\nexport function localName(name: string): string {\n const separatorIndex = name.indexOf(\":\");\n return separatorIndex >= 0 ? name.slice(separatorIndex + 1) : name;\n}\n\nfunction parseAttributes(source: string): Record<string, string> {\n const attributes: Record<string, string> = {};\n const attributePattern = /([A-Za-z_][A-Za-z0-9:._-]*)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n\n for (const match of source.matchAll(attributePattern)) {\n const key = match[1];\n if (!key) {\n continue;\n }\n\n const rawValue = match[3] ?? match[4] ?? \"\";\n attributes[key] = decodeXmlEntities(rawValue);\n }\n\n return attributes;\n}\n\nfunction decodeXmlEntities(value: string): string {\n return value\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, \"\\\"\")\n .replace(/'/g, \"'\")\n .replace(/&/g, \"&\");\n}\n","import type { RevisionRecord } from \"../../review/store/revision-types.ts\";\nimport {\n mapRevisionBoundaries,\n type RevisionParagraphBoundary,\n} from \"../ooxml/revision-boundaries.ts\";\n\ninterface XmlReplacement {\n start: number;\n end: number;\n replacement: string;\n}\n\nexport interface SerializedRuntimeRevisionsResult {\n documentXml: string;\n serializedRevisionIds: string[];\n skippedRevisionIds: string[];\n}\n\nexport function serializeRuntimeRevisionsIntoDocumentXml(\n documentXml: string,\n revisions: readonly RevisionRecord[],\n boundaries: readonly RevisionParagraphBoundary[] = mapRevisionBoundaries(documentXml),\n): SerializedRuntimeRevisionsResult {\n const replacements: XmlReplacement[] = [];\n const serializedRevisionIds: string[] = [];\n const skippedRevisionIds: string[] = [];\n const paragraphMarkers = new Map<\n number,\n { boundary: RevisionParagraphBoundary; markers: string[]; revisionIds: string[] }\n >();\n\n for (const revision of revisions) {\n if (revision.status !== \"active\" || revision.anchor.kind !== \"range\") {\n continue;\n }\n\n if (revision.kind !== \"insertion\" && revision.kind !== \"deletion\") {\n continue;\n }\n\n const form = revision.metadata.importedRevisionForm;\n if (form === \"paragraph-insertion\" || form === \"paragraph-deletion\") {\n const paragraphBoundary = findParagraphBoundaryForAnchor(boundaries, revision);\n if (!paragraphBoundary) {\n skippedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n const entry = paragraphMarkers.get(paragraphBoundary.paragraphIndex) ?? {\n boundary: paragraphBoundary,\n markers: [],\n revisionIds: [],\n };\n entry.markers.push(createParagraphRevisionMarker(revision));\n entry.revisionIds.push(revision.revisionId);\n paragraphMarkers.set(paragraphBoundary.paragraphIndex, entry);\n serializedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n const rangeReplacement = createRangeRevisionReplacement(documentXml, boundaries, revision);\n if (!rangeReplacement) {\n skippedRevisionIds.push(revision.revisionId);\n continue;\n }\n\n replacements.push(rangeReplacement);\n serializedRevisionIds.push(revision.revisionId);\n }\n\n for (const { boundary, markers, revisionIds } of paragraphMarkers.values()) {\n const paragraphInsertion = createParagraphRevisionInsertion(\n documentXml,\n boundary,\n markers,\n );\n if (!paragraphInsertion) {\n skippedRevisionIds.push(...revisionIds);\n continue;\n }\n\n replacements.push(paragraphInsertion);\n }\n\n return {\n documentXml: applyReplacements(documentXml, replacements),\n serializedRevisionIds,\n skippedRevisionIds,\n };\n}\n\nfunction createRangeRevisionReplacement(\n documentXml: string,\n boundaries: readonly RevisionParagraphBoundary[],\n revision: RevisionRecord,\n): XmlReplacement | undefined {\n const { anchor } = revision;\n if (anchor.kind !== \"range\") {\n return undefined;\n }\n const paragraphBoundary = findParagraphBoundaryForRange(boundaries, anchor.range.from, anchor.range.to);\n if (!paragraphBoundary) {\n return undefined;\n }\n\n const startIndex = paragraphBoundary.boundaries.get(anchor.range.from);\n const endIndex = paragraphBoundary.boundaries.get(anchor.range.to);\n if (startIndex === undefined || endIndex === undefined || endIndex < startIndex) {\n return undefined;\n }\n\n const xml = documentXml.slice(startIndex, endIndex);\n const attributes = serializeRevisionAttributes(revision);\n return {\n start: startIndex,\n end: endIndex,\n replacement:\n revision.kind === \"insertion\"\n ? `<w:ins${attributes}>${xml}</w:ins>`\n : `<w:del${attributes}>${convertRunsToDeletedContent(xml)}</w:del>`,\n };\n}\n\nfunction createParagraphRevisionMarker(revision: RevisionRecord): string {\n const markerName = revision.kind === \"insertion\" ? \"w:ins\" : \"w:del\";\n return `<${markerName}${serializeRevisionAttributes(revision)}/>`;\n}\n\nfunction createParagraphRevisionInsertion(\n documentXml: string,\n paragraphBoundary: RevisionParagraphBoundary,\n markers: readonly string[],\n): XmlReplacement | undefined {\n const paragraphXml = documentXml.slice(\n paragraphBoundary.paragraphStart,\n paragraphBoundary.paragraphEnd,\n );\n const markerXml = markers.join(\"\");\n const paragraphRunPropertiesInsertionIndex = findClosingTagInsertionIndex(\n documentXml,\n paragraphBoundary.paragraphRunPropertiesStart,\n paragraphBoundary.paragraphRunPropertiesEnd,\n \"w:rPr\",\n );\n if (paragraphRunPropertiesInsertionIndex !== undefined) {\n return {\n start: paragraphRunPropertiesInsertionIndex,\n end: paragraphRunPropertiesInsertionIndex,\n replacement: markerXml,\n };\n }\n\n const paragraphPropertiesInsertionIndex = findClosingTagInsertionIndex(\n documentXml,\n paragraphBoundary.paragraphPropertiesStart,\n paragraphBoundary.paragraphPropertiesEnd,\n \"w:pPr\",\n );\n if (paragraphPropertiesInsertionIndex !== undefined) {\n return {\n start: paragraphPropertiesInsertionIndex,\n end: paragraphPropertiesInsertionIndex,\n replacement: `<w:rPr>${markerXml}</w:rPr>`,\n };\n }\n\n if (!/<w:p[\\s>]/u.test(paragraphXml)) {\n return undefined;\n }\n\n return {\n start: paragraphBoundary.paragraphStartTagEnd,\n end: paragraphBoundary.paragraphStartTagEnd,\n replacement: `<w:pPr><w:rPr>${markerXml}</w:rPr></w:pPr>`,\n };\n}\n\nfunction findParagraphBoundaryForRange(\n boundaries: readonly RevisionParagraphBoundary[],\n from: number,\n to: number,\n): RevisionParagraphBoundary | undefined {\n return boundaries.find(\n (boundary) => from >= boundary.start && to <= boundary.end,\n );\n}\n\nfunction findParagraphBoundaryForAnchor(\n boundaries: readonly RevisionParagraphBoundary[],\n revision: RevisionRecord,\n): RevisionParagraphBoundary | undefined {\n const anchor = revision.anchor.kind === \"range\" ? revision.anchor.range.from : undefined;\n if (anchor === undefined) {\n return undefined;\n }\n\n return boundaries.find(\n (boundary) =>\n boundary.end === anchor ||\n (anchor >= boundary.start && anchor <= boundary.end),\n );\n}\n\nfunction serializeRevisionAttributes(revision: RevisionRecord): string {\n const attributes = {\n \"w:id\": revision.metadata.ooxmlRevisionId ?? sanitizeRevisionId(revision.revisionId),\n \"w:author\": revision.authorId,\n \"w:date\": revision.createdAt,\n };\n\n return Object.entries(attributes)\n .filter(([, value]) => value && value.length > 0)\n .map(([name, value]) => ` ${name}=\"${escapeAttribute(value)}\"`)\n .join(\"\");\n}\n\nfunction findClosingTagInsertionIndex(\n documentXml: string,\n start: number | undefined,\n end: number | undefined,\n tagName: string,\n): number | undefined {\n if (start === undefined || end === undefined) {\n return undefined;\n }\n\n const closingTag = `</${tagName}>`;\n const closingIndex = documentXml.lastIndexOf(closingTag, end);\n if (closingIndex < start) {\n return undefined;\n }\n\n return closingIndex;\n}\n\nfunction sanitizeRevisionId(revisionId: string): string {\n const numericTail = /(\\d+)$/.exec(revisionId)?.[1];\n return numericTail ?? revisionId.replace(/[^A-Za-z0-9._-]/g, \"-\");\n}\n\nfunction convertRunsToDeletedContent(xml: string): string {\n return xml\n .replace(/<(\\/?)w:t\\b/g, \"<$1w:delText\")\n .replace(/<(\\/?)w:instrText\\b/g, \"<$1w:delInstrText\");\n}\n\nfunction applyReplacements(documentXml: string, replacements: readonly XmlReplacement[]): string {\n const sorted = replacements\n .slice()\n .sort((left, right) => right.start - left.start || right.end - left.end);\n let output = documentXml;\n\n for (const replacement of sorted) {\n output =\n output.slice(0, replacement.start) +\n replacement.replacement +\n output.slice(replacement.end);\n }\n\n return output;\n}\n\nfunction escapeAttribute(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n"],"mappings":"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","names":["cloneRelationship","cloneRelationship","escapeAttribute","escapeXml","boundaries","children","escapeAttribute","serializeText","requiresPreservedSpace","escapeXml","text","localName","findChildElement","decodeXmlEntities","tagEnd","node","parseAttributes","escapeAttribute"]}
|