@beyondwork/docx-react-component 1.0.28 → 1.0.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canonical-document-BLEbzL2J.d.cts +844 -0
- package/dist/canonical-document-BLEbzL2J.d.ts +844 -0
- package/dist/chunk-2FJS5GZM.js +763 -0
- package/dist/chunk-2FJS5GZM.js.map +1 -0
- package/{src/core/commands/section-layout-commands.ts → dist/chunk-2OQBZS3F.js} +106 -340
- package/dist/chunk-2OQBZS3F.js.map +1 -0
- package/dist/chunk-2S7W4KFO.js +127 -0
- package/dist/chunk-2S7W4KFO.js.map +1 -0
- package/dist/chunk-2TG72QSW.js +3874 -0
- package/dist/chunk-2TG72QSW.js.map +1 -0
- package/{src/core/commands/table-structure-commands.ts → dist/chunk-36QNIZBO.js} +126 -315
- package/dist/chunk-36QNIZBO.js.map +1 -0
- package/dist/chunk-4AQOYAW4.js +3069 -0
- package/dist/chunk-4AQOYAW4.js.map +1 -0
- package/dist/chunk-4D5EWJ3P.js +77 -0
- package/dist/chunk-4D5EWJ3P.js.map +1 -0
- package/dist/chunk-5FN54NDH.js +2257 -0
- package/dist/chunk-5FN54NDH.js.map +1 -0
- package/dist/chunk-BOYGQYRQ.js +7306 -0
- package/dist/chunk-BOYGQYRQ.js.map +1 -0
- package/dist/chunk-CN3XMECL.js +212 -0
- package/dist/chunk-CN3XMECL.js.map +1 -0
- package/dist/chunk-EBI3BX6U.js +164 -0
- package/dist/chunk-EBI3BX6U.js.map +1 -0
- package/dist/chunk-EILUG3VB.js +1275 -0
- package/dist/chunk-EILUG3VB.js.map +1 -0
- package/dist/chunk-FUDY333O.js +70 -0
- package/dist/chunk-FUDY333O.js.map +1 -0
- package/dist/chunk-GBVOWFIK.js +1237 -0
- package/dist/chunk-GBVOWFIK.js.map +1 -0
- package/dist/chunk-H4TQ3H3Y.js +262 -0
- package/dist/chunk-H4TQ3H3Y.js.map +1 -0
- package/{src/core/commands/style-commands.ts → dist/chunk-JGB3IXZO.js} +40 -113
- package/dist/chunk-JGB3IXZO.js.map +1 -0
- package/dist/chunk-KD2QRQPY.js +4342 -0
- package/dist/chunk-KD2QRQPY.js.map +1 -0
- package/dist/chunk-KLMXQVYK.js +369 -0
- package/dist/chunk-KLMXQVYK.js.map +1 -0
- package/dist/chunk-KZUG5KFQ.js +214 -0
- package/dist/chunk-KZUG5KFQ.js.map +1 -0
- package/{src/core/state/text-transaction.ts → dist/chunk-QDAQ4CJU.js} +79 -236
- package/dist/chunk-QDAQ4CJU.js.map +1 -0
- package/{src/legal/bookmarks.ts → dist/chunk-RMH72RZI.js} +44 -130
- package/dist/chunk-RMH72RZI.js.map +1 -0
- package/dist/chunk-SWKWQZXM.js +117 -0
- package/dist/chunk-SWKWQZXM.js.map +1 -0
- package/{src/core/commands/formatting-commands.ts → dist/chunk-TJBP2K4T.js} +196 -536
- package/dist/chunk-TJBP2K4T.js.map +1 -0
- package/dist/chunk-TLCEAQDQ.js +542 -0
- package/dist/chunk-TLCEAQDQ.js.map +1 -0
- package/{src/core/commands/text-commands.ts → dist/chunk-UZXBISGO.js} +86 -142
- package/dist/chunk-UZXBISGO.js.map +1 -0
- package/dist/chunk-WGBAKP3Q.js +3220 -0
- package/dist/chunk-WGBAKP3Q.js.map +1 -0
- package/dist/compare/index.cjs +5475 -0
- package/dist/compare/index.cjs.map +1 -0
- package/dist/compare/index.d.cts +114 -0
- package/dist/compare/index.d.ts +114 -0
- package/dist/compare/index.js +731 -0
- package/dist/compare/index.js.map +1 -0
- package/dist/core/commands/formatting-commands.cjs +828 -0
- package/dist/core/commands/formatting-commands.cjs.map +1 -0
- package/dist/core/commands/formatting-commands.d.cts +63 -0
- package/dist/core/commands/formatting-commands.d.ts +63 -0
- package/dist/core/commands/formatting-commands.js +37 -0
- package/dist/core/commands/formatting-commands.js.map +1 -0
- package/dist/core/commands/image-commands.cjs +2023 -0
- package/dist/core/commands/image-commands.cjs.map +1 -0
- package/dist/core/commands/image-commands.d.cts +58 -0
- package/dist/core/commands/image-commands.d.ts +58 -0
- package/dist/core/commands/image-commands.js +18 -0
- package/dist/core/commands/image-commands.js.map +1 -0
- package/dist/core/commands/section-layout-commands.cjs +477 -0
- package/dist/core/commands/section-layout-commands.cjs.map +1 -0
- package/dist/core/commands/section-layout-commands.d.cts +62 -0
- package/dist/core/commands/section-layout-commands.d.ts +62 -0
- package/dist/core/commands/section-layout-commands.js +21 -0
- package/dist/core/commands/section-layout-commands.js.map +1 -0
- package/dist/core/commands/style-commands.cjs +214 -0
- package/dist/core/commands/style-commands.cjs.map +1 -0
- package/dist/core/commands/style-commands.d.cts +13 -0
- package/dist/core/commands/style-commands.d.ts +13 -0
- package/dist/core/commands/style-commands.js +9 -0
- package/dist/core/commands/style-commands.js.map +1 -0
- package/dist/core/commands/table-structure-commands.cjs +1883 -0
- package/dist/core/commands/table-structure-commands.cjs.map +1 -0
- package/dist/core/commands/table-structure-commands.d.cts +59 -0
- package/dist/core/commands/table-structure-commands.d.ts +59 -0
- package/dist/core/commands/table-structure-commands.js +12 -0
- package/dist/core/commands/table-structure-commands.js.map +1 -0
- package/dist/core/commands/text-commands.cjs +2391 -0
- package/dist/core/commands/text-commands.cjs.map +1 -0
- package/dist/core/commands/text-commands.d.cts +24 -0
- package/dist/core/commands/text-commands.d.ts +24 -0
- package/dist/core/commands/text-commands.js +28 -0
- package/dist/core/commands/text-commands.js.map +1 -0
- package/dist/core/selection/mapping.cjs +200 -0
- package/dist/core/selection/mapping.cjs.map +1 -0
- package/dist/core/selection/mapping.d.cts +2 -0
- package/dist/core/selection/mapping.d.ts +2 -0
- package/dist/core/selection/mapping.js +31 -0
- package/dist/core/selection/mapping.js.map +1 -0
- package/dist/core/state/editor-state.cjs +2278 -0
- package/dist/core/state/editor-state.cjs.map +1 -0
- package/dist/core/state/editor-state.d.cts +2 -0
- package/dist/core/state/editor-state.d.ts +2 -0
- package/dist/core/state/editor-state.js +26 -0
- package/dist/core/state/editor-state.js.map +1 -0
- package/dist/index.cjs +38553 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +7856 -0
- package/dist/index.js.map +1 -0
- package/dist/io/docx-session.cjs +16236 -0
- package/dist/io/docx-session.cjs.map +1 -0
- package/dist/io/docx-session.d.cts +21 -0
- package/dist/io/docx-session.d.ts +21 -0
- package/dist/io/docx-session.js +18 -0
- package/dist/io/docx-session.js.map +1 -0
- package/dist/legal/index.cjs +3900 -0
- package/dist/legal/index.cjs.map +1 -0
- package/dist/legal/index.d.cts +86 -0
- package/dist/legal/index.d.ts +86 -0
- package/dist/legal/index.js +616 -0
- package/dist/legal/index.js.map +1 -0
- package/dist/public-types-7ZL_94cz.d.ts +1573 -0
- package/dist/public-types-CeMaDueh.d.cts +1573 -0
- package/dist/public-types.cjs +19 -0
- package/dist/public-types.cjs.map +1 -0
- package/dist/public-types.d.cts +2 -0
- package/dist/public-types.d.ts +2 -0
- package/dist/public-types.js +1 -0
- package/dist/public-types.js.map +1 -0
- package/dist/runtime/document-runtime.cjs +11140 -0
- package/dist/runtime/document-runtime.cjs.map +1 -0
- package/dist/runtime/document-runtime.d.cts +231 -0
- package/dist/runtime/document-runtime.d.ts +231 -0
- package/dist/runtime/document-runtime.js +21 -0
- package/dist/runtime/document-runtime.js.map +1 -0
- package/dist/structural-helpers-CilgOVhh.d.cts +10 -0
- package/dist/structural-helpers-q0Gd-eBN.d.ts +10 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +313 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +1 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +67 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js +23 -0
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +1 -0
- package/dist/ui-tailwind/index.cjs +4833 -0
- package/dist/ui-tailwind/index.cjs.map +1 -0
- package/dist/ui-tailwind/index.d.cts +617 -0
- package/dist/ui-tailwind/index.d.ts +617 -0
- package/dist/ui-tailwind/index.js +575 -0
- package/dist/ui-tailwind/index.js.map +1 -0
- package/package.json +61 -41
- package/src/README.md +0 -85
- package/src/api/README.md +0 -26
- package/src/api/public-types.ts +0 -1421
- package/src/api/session-state.ts +0 -60
- package/src/compare/diff-engine.ts +0 -623
- package/src/compare/export-redlines.ts +0 -280
- package/src/compare/index.ts +0 -25
- package/src/compare/snapshot.ts +0 -97
- package/src/component-inventory.md +0 -99
- package/src/core/README.md +0 -10
- package/src/core/commands/README.md +0 -3
- package/src/core/commands/image-commands.ts +0 -373
- package/src/core/commands/index.ts +0 -1757
- package/src/core/commands/list-commands.ts +0 -565
- package/src/core/commands/paragraph-layout-commands.ts +0 -339
- package/src/core/commands/review-commands.ts +0 -108
- package/src/core/commands/structural-helpers.ts +0 -309
- package/src/core/schema/README.md +0 -3
- package/src/core/schema/text-schema.ts +0 -516
- package/src/core/search/search-text.ts +0 -357
- package/src/core/selection/README.md +0 -3
- package/src/core/selection/mapping.ts +0 -289
- package/src/core/selection/review-anchors.ts +0 -183
- package/src/core/state/README.md +0 -3
- package/src/core/state/editor-state.ts +0 -892
- package/src/formats/xlsx/io/parse-shared-strings.ts +0 -41
- package/src/formats/xlsx/io/parse-sheet.ts +0 -459
- package/src/formats/xlsx/io/parse-styles.ts +0 -59
- package/src/formats/xlsx/io/parse-workbook.ts +0 -75
- package/src/formats/xlsx/io/serialize-shared-strings.ts +0 -72
- package/src/formats/xlsx/io/serialize-sheet.ts +0 -333
- package/src/formats/xlsx/io/serialize-styles.ts +0 -98
- package/src/formats/xlsx/io/serialize-workbook.ts +0 -429
- package/src/formats/xlsx/io/xlsx-session.ts +0 -314
- package/src/formats/xlsx/model/cell.ts +0 -189
- package/src/formats/xlsx/model/sheet.ts +0 -326
- package/src/formats/xlsx/model/styles.ts +0 -118
- package/src/formats/xlsx/model/workbook.ts +0 -453
- package/src/formats/xlsx/runtime/cell-commands.ts +0 -567
- package/src/formats/xlsx/runtime/sheet-commands.ts +0 -206
- package/src/formats/xlsx/runtime/workbook-runtime.ts +0 -177
- package/src/formats/xlsx/runtime/workbook-transaction.ts +0 -822
- package/src/index.ts +0 -101
- package/src/io/README.md +0 -10
- package/src/io/docx-session.ts +0 -2882
- package/src/io/export/README.md +0 -3
- package/src/io/export/export-session.ts +0 -220
- package/src/io/export/minimal-docx.ts +0 -115
- package/src/io/export/reattach-preserved-parts.ts +0 -54
- package/src/io/export/serialize-comments.ts +0 -947
- package/src/io/export/serialize-footnotes.ts +0 -399
- package/src/io/export/serialize-headers-footers.ts +0 -372
- package/src/io/export/serialize-main-document.ts +0 -1376
- package/src/io/export/serialize-numbering.ts +0 -118
- package/src/io/export/serialize-revisions.ts +0 -389
- package/src/io/export/serialize-runtime-revisions.ts +0 -269
- package/src/io/export/serialize-tables.ts +0 -174
- package/src/io/export/split-review-boundaries.ts +0 -356
- package/src/io/normalize/README.md +0 -3
- package/src/io/normalize/normalize-text.ts +0 -639
- package/src/io/ooxml/README.md +0 -3
- package/src/io/ooxml/highlight-colors.ts +0 -39
- package/src/io/ooxml/numbering-sentinels.ts +0 -44
- package/src/io/ooxml/parse-comments.ts +0 -846
- package/src/io/ooxml/parse-complex-content.ts +0 -287
- package/src/io/ooxml/parse-fields.ts +0 -834
- package/src/io/ooxml/parse-footnotes.ts +0 -896
- package/src/io/ooxml/parse-headers-footers.ts +0 -1169
- package/src/io/ooxml/parse-inline-media.ts +0 -461
- package/src/io/ooxml/parse-main-document.ts +0 -2877
- package/src/io/ooxml/parse-numbering.ts +0 -432
- package/src/io/ooxml/parse-revisions.ts +0 -931
- package/src/io/ooxml/parse-settings.ts +0 -184
- package/src/io/ooxml/parse-shapes.ts +0 -296
- package/src/io/ooxml/parse-styles.ts +0 -463
- package/src/io/ooxml/parse-tables.ts +0 -618
- package/src/io/ooxml/parse-theme.ts +0 -346
- package/src/io/ooxml/part-manifest.ts +0 -136
- package/src/io/ooxml/revision-boundaries.ts +0 -351
- package/src/io/opc/README.md +0 -3
- package/src/io/opc/corrupt-package.ts +0 -166
- package/src/io/opc/docx-package.ts +0 -74
- package/src/io/opc/package-reader.ts +0 -325
- package/src/io/opc/package-writer.ts +0 -273
- package/src/io/source-package-provenance.ts +0 -241
- package/src/legal/cross-references.ts +0 -414
- package/src/legal/defined-terms.ts +0 -203
- package/src/legal/index.ts +0 -32
- package/src/legal/signature-blocks.ts +0 -259
- package/src/model/README.md +0 -3
- package/src/model/canonical-document.ts +0 -2632
- package/src/model/cds-1.0.0.ts +0 -212
- package/src/model/snapshot.ts +0 -649
- package/src/preservation/README.md +0 -3
- package/src/preservation/markup-compatibility.ts +0 -48
- package/src/preservation/opaque-fragment-store.ts +0 -89
- package/src/preservation/opaque-region.ts +0 -233
- package/src/preservation/package-preservation.ts +0 -113
- package/src/preservation/preserved-part-manifest.ts +0 -56
- package/src/preservation/relationship-retention.ts +0 -57
- package/src/preservation/store.ts +0 -185
- package/src/review/README.md +0 -16
- package/src/review/store/README.md +0 -3
- package/src/review/store/comment-anchors.ts +0 -70
- package/src/review/store/comment-remapping.ts +0 -154
- package/src/review/store/comment-store.ts +0 -331
- package/src/review/store/comment-thread.ts +0 -109
- package/src/review/store/revision-actions.ts +0 -394
- package/src/review/store/revision-store.ts +0 -312
- package/src/review/store/revision-types.ts +0 -171
- package/src/review/store/runtime-comment-store.ts +0 -43
- package/src/runtime/README.md +0 -3
- package/src/runtime/ai-action-policy.ts +0 -764
- package/src/runtime/document-layout.ts +0 -332
- package/src/runtime/document-navigation.ts +0 -603
- package/src/runtime/document-runtime.ts +0 -3159
- package/src/runtime/document-search.ts +0 -145
- package/src/runtime/numbering-prefix.ts +0 -216
- package/src/runtime/page-layout-estimation.ts +0 -212
- package/src/runtime/read-only-diagnostics-runtime.ts +0 -241
- package/src/runtime/review-runtime.ts +0 -44
- package/src/runtime/revision-runtime.ts +0 -107
- package/src/runtime/session-capabilities.ts +0 -192
- package/src/runtime/story-context.ts +0 -164
- package/src/runtime/story-targeting.ts +0 -162
- package/src/runtime/surface-projection.ts +0 -1357
- package/src/runtime/table-commands.ts +0 -173
- package/src/runtime/table-schema.ts +0 -309
- package/src/runtime/view-state.ts +0 -477
- package/src/runtime/virtualized-rendering.ts +0 -258
- package/src/runtime/workflow-markup.ts +0 -353
- package/src/ui/README.md +0 -30
- package/src/ui/WordReviewEditor.tsx +0 -4086
- package/src/ui/browser-export.ts +0 -52
- package/src/ui/comments/README.md +0 -3
- package/src/ui/compatibility/README.md +0 -3
- package/src/ui/editor-command-bag.ts +0 -120
- package/src/ui/editor-runtime-boundary.ts +0 -1457
- package/src/ui/editor-shell-view.tsx +0 -142
- package/src/ui/editor-surface/README.md +0 -3
- package/src/ui/editor-surface-controller.tsx +0 -61
- package/src/ui/headless/comment-decoration-model.ts +0 -124
- package/src/ui/headless/preserve-editor-selection.ts +0 -5
- package/src/ui/headless/revision-decoration-model.ts +0 -128
- package/src/ui/headless/selection-helpers.ts +0 -54
- package/src/ui/headless/selection-toolbar-model.ts +0 -34
- package/src/ui/headless/use-editor-keyboard.ts +0 -103
- package/src/ui/review/README.md +0 -3
- package/src/ui/runtime-snapshot-selectors.ts +0 -197
- package/src/ui/shared/revision-filters.ts +0 -31
- package/src/ui/status/README.md +0 -3
- package/src/ui/theme/README.md +0 -3
- package/src/ui/toolbar/README.md +0 -3
- package/src/ui/workflow-surface-blocked-rails.ts +0 -94
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +0 -64
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +0 -129
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +0 -114
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +0 -34
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +0 -386
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +0 -186
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +0 -139
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +0 -128
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +0 -58
- package/src/ui-tailwind/chrome/use-before-unload.ts +0 -20
- package/src/ui-tailwind/editor-surface/perf-probe.ts +0 -179
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +0 -184
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +0 -31
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +0 -427
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +0 -123
- package/src/ui-tailwind/editor-surface/pm-schema.ts +0 -876
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +0 -504
- package/src/ui-tailwind/editor-surface/search-plugin.ts +0 -168
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +0 -61
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +0 -12
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +0 -150
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +0 -129
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +0 -58
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +0 -151
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +0 -944
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +0 -111
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +0 -436
- package/src/ui-tailwind/index.ts +0 -62
- package/src/ui-tailwind/page-chrome-model.ts +0 -27
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +0 -406
- package/src/ui-tailwind/review/tw-health-panel.tsx +0 -149
- package/src/ui-tailwind/review/tw-review-rail.tsx +0 -120
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +0 -164
- package/src/ui-tailwind/status/tw-status-bar.tsx +0 -61
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +0 -52
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +0 -1064
- package/src/ui-tailwind/tw-review-workspace.tsx +0 -1417
- package/src/validation/README.md +0 -3
- package/src/validation/compatibility-engine.ts +0 -634
- package/src/validation/compatibility-report.ts +0 -161
- package/src/validation/diagnostics.ts +0 -204
- package/src/validation/docx-comment-proof.ts +0 -707
- package/src/validation/import-diagnostics.ts +0 -128
- package/src/validation/low-priority-word-surfaces.ts +0 -373
- /package/{src → dist}/ui-tailwind/theme/editor-theme.css +0 -0
|
@@ -1,57 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
BookmarkStartNode,
|
|
5
|
-
CanonicalDocument,
|
|
6
|
-
DocumentNode,
|
|
7
|
-
FieldRegistry,
|
|
8
|
-
FieldRegistryEntry,
|
|
9
|
-
} from "../model/canonical-document.ts";
|
|
1
|
+
import {
|
|
2
|
+
extractBookmarksFromBodyXml
|
|
3
|
+
} from "./chunk-TLCEAQDQ.js";
|
|
10
4
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
name?: string;
|
|
14
|
-
hidden: boolean;
|
|
15
|
-
source: "ooxml" | "canonical";
|
|
16
|
-
status: "paired" | "start-only" | "end-only";
|
|
17
|
-
startIndex?: number;
|
|
18
|
-
endIndex?: number;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface OpenBookmark {
|
|
22
|
-
bookmarkId: string;
|
|
23
|
-
name?: string;
|
|
24
|
-
hidden: boolean;
|
|
25
|
-
startIndex: number;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function parseBookmarksFromDocumentXml(xml: string): LegalBookmark[] {
|
|
5
|
+
// src/legal/bookmarks.ts
|
|
6
|
+
function parseBookmarksFromDocumentXml(xml) {
|
|
29
7
|
const bookmarks = extractBookmarksFromBodyXml(xml);
|
|
30
|
-
const openBookmarks = new Map
|
|
31
|
-
const results
|
|
32
|
-
|
|
8
|
+
const openBookmarks = /* @__PURE__ */ new Map();
|
|
9
|
+
const results = [];
|
|
33
10
|
for (let index = 0; index < bookmarks.length; index += 1) {
|
|
34
11
|
const bookmark = bookmarks[index];
|
|
35
|
-
|
|
36
12
|
if (bookmark.type === "bookmark_start") {
|
|
37
|
-
const entry
|
|
13
|
+
const entry = {
|
|
38
14
|
bookmarkId: bookmark.bookmarkId,
|
|
39
15
|
name: bookmark.name,
|
|
40
16
|
hidden: isHiddenBookmarkName(bookmark.name),
|
|
41
|
-
startIndex: index
|
|
17
|
+
startIndex: index
|
|
42
18
|
};
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
openBookmarks.set(bookmark.bookmarkId,
|
|
19
|
+
const stack2 = openBookmarks.get(bookmark.bookmarkId) ?? [];
|
|
20
|
+
stack2.push(entry);
|
|
21
|
+
openBookmarks.set(bookmark.bookmarkId, stack2);
|
|
46
22
|
continue;
|
|
47
23
|
}
|
|
48
|
-
|
|
49
24
|
const stack = openBookmarks.get(bookmark.bookmarkId);
|
|
50
25
|
const open = stack?.pop();
|
|
51
26
|
if (stack && stack.length === 0) {
|
|
52
27
|
openBookmarks.delete(bookmark.bookmarkId);
|
|
53
28
|
}
|
|
54
|
-
|
|
55
29
|
if (open) {
|
|
56
30
|
results.push({
|
|
57
31
|
bookmarkId: bookmark.bookmarkId,
|
|
@@ -60,20 +34,18 @@ export function parseBookmarksFromDocumentXml(xml: string): LegalBookmark[] {
|
|
|
60
34
|
source: "ooxml",
|
|
61
35
|
status: "paired",
|
|
62
36
|
startIndex: open.startIndex,
|
|
63
|
-
endIndex: index
|
|
37
|
+
endIndex: index
|
|
64
38
|
});
|
|
65
39
|
continue;
|
|
66
40
|
}
|
|
67
|
-
|
|
68
41
|
results.push({
|
|
69
42
|
bookmarkId: bookmark.bookmarkId,
|
|
70
43
|
hidden: false,
|
|
71
44
|
source: "ooxml",
|
|
72
45
|
status: "end-only",
|
|
73
|
-
endIndex: index
|
|
46
|
+
endIndex: index
|
|
74
47
|
});
|
|
75
48
|
}
|
|
76
|
-
|
|
77
49
|
for (const stack of openBookmarks.values()) {
|
|
78
50
|
for (const open of stack) {
|
|
79
51
|
results.push({
|
|
@@ -82,51 +54,41 @@ export function parseBookmarksFromDocumentXml(xml: string): LegalBookmark[] {
|
|
|
82
54
|
hidden: open.hidden,
|
|
83
55
|
source: "ooxml",
|
|
84
56
|
status: "start-only",
|
|
85
|
-
startIndex: open.startIndex
|
|
57
|
+
startIndex: open.startIndex
|
|
86
58
|
});
|
|
87
59
|
}
|
|
88
60
|
}
|
|
89
|
-
|
|
90
61
|
return results.sort(compareBookmarks);
|
|
91
62
|
}
|
|
92
|
-
|
|
93
|
-
export function collectBookmarksFromCanonicalDocument(
|
|
94
|
-
document: Pick<CanonicalDocument, "content"> | DocumentNode,
|
|
95
|
-
): LegalBookmark[] {
|
|
63
|
+
function collectBookmarksFromCanonicalDocument(document) {
|
|
96
64
|
const root = "content" in document ? document.content : document;
|
|
97
|
-
const sequence
|
|
98
|
-
|
|
65
|
+
const sequence = [];
|
|
99
66
|
walkDocument(root, (node) => {
|
|
100
67
|
if (node.type === "bookmark_start" || node.type === "bookmark_end") {
|
|
101
68
|
sequence.push(node);
|
|
102
69
|
}
|
|
103
70
|
});
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
const results: LegalBookmark[] = [];
|
|
107
|
-
|
|
71
|
+
const openBookmarks = /* @__PURE__ */ new Map();
|
|
72
|
+
const results = [];
|
|
108
73
|
for (let index = 0; index < sequence.length; index += 1) {
|
|
109
74
|
const bookmark = sequence[index];
|
|
110
|
-
|
|
111
75
|
if (bookmark.type === "bookmark_start") {
|
|
112
|
-
const entry
|
|
76
|
+
const entry = {
|
|
113
77
|
bookmarkId: bookmark.bookmarkId,
|
|
114
78
|
name: bookmark.name,
|
|
115
79
|
hidden: isHiddenBookmarkName(bookmark.name),
|
|
116
|
-
startIndex: index
|
|
80
|
+
startIndex: index
|
|
117
81
|
};
|
|
118
|
-
const
|
|
119
|
-
|
|
120
|
-
openBookmarks.set(bookmark.bookmarkId,
|
|
82
|
+
const stack2 = openBookmarks.get(bookmark.bookmarkId) ?? [];
|
|
83
|
+
stack2.push(entry);
|
|
84
|
+
openBookmarks.set(bookmark.bookmarkId, stack2);
|
|
121
85
|
continue;
|
|
122
86
|
}
|
|
123
|
-
|
|
124
87
|
const stack = openBookmarks.get(bookmark.bookmarkId);
|
|
125
88
|
const open = stack?.pop();
|
|
126
89
|
if (stack && stack.length === 0) {
|
|
127
90
|
openBookmarks.delete(bookmark.bookmarkId);
|
|
128
91
|
}
|
|
129
|
-
|
|
130
92
|
if (open) {
|
|
131
93
|
results.push({
|
|
132
94
|
bookmarkId: bookmark.bookmarkId,
|
|
@@ -135,20 +97,18 @@ export function collectBookmarksFromCanonicalDocument(
|
|
|
135
97
|
source: "canonical",
|
|
136
98
|
status: "paired",
|
|
137
99
|
startIndex: open.startIndex,
|
|
138
|
-
endIndex: index
|
|
100
|
+
endIndex: index
|
|
139
101
|
});
|
|
140
102
|
continue;
|
|
141
103
|
}
|
|
142
|
-
|
|
143
104
|
results.push({
|
|
144
105
|
bookmarkId: bookmark.bookmarkId,
|
|
145
106
|
hidden: false,
|
|
146
107
|
source: "canonical",
|
|
147
108
|
status: "end-only",
|
|
148
|
-
endIndex: index
|
|
109
|
+
endIndex: index
|
|
149
110
|
});
|
|
150
111
|
}
|
|
151
|
-
|
|
152
112
|
for (const stack of openBookmarks.values()) {
|
|
153
113
|
for (const open of stack) {
|
|
154
114
|
results.push({
|
|
@@ -157,29 +117,16 @@ export function collectBookmarksFromCanonicalDocument(
|
|
|
157
117
|
hidden: open.hidden,
|
|
158
118
|
source: "canonical",
|
|
159
119
|
status: "start-only",
|
|
160
|
-
startIndex: open.startIndex
|
|
120
|
+
startIndex: open.startIndex
|
|
161
121
|
});
|
|
162
122
|
}
|
|
163
123
|
}
|
|
164
|
-
|
|
165
124
|
return results.sort(compareBookmarks);
|
|
166
125
|
}
|
|
167
|
-
|
|
168
|
-
export function isHiddenBookmarkName(name: string | undefined): boolean {
|
|
126
|
+
function isHiddenBookmarkName(name) {
|
|
169
127
|
return Boolean(name && name.startsWith("_"));
|
|
170
128
|
}
|
|
171
|
-
|
|
172
|
-
export interface BookmarkIntegrityResult {
|
|
173
|
-
totalCount: number;
|
|
174
|
-
pairedCount: number;
|
|
175
|
-
startOnlyCount: number;
|
|
176
|
-
endOnlyCount: number;
|
|
177
|
-
hiddenCount: number;
|
|
178
|
-
namedCount: number;
|
|
179
|
-
integrityScore: "complete" | "partial" | "degraded";
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
export function assessBookmarkIntegrity(bookmarks: LegalBookmark[]): BookmarkIntegrityResult {
|
|
129
|
+
function assessBookmarkIntegrity(bookmarks) {
|
|
183
130
|
const pairedCount = bookmarks.filter((b) => b.status === "paired").length;
|
|
184
131
|
const startOnlyCount = bookmarks.filter((b) => b.status === "start-only").length;
|
|
185
132
|
const endOnlyCount = bookmarks.filter((b) => b.status === "end-only").length;
|
|
@@ -187,7 +134,6 @@ export function assessBookmarkIntegrity(bookmarks: LegalBookmark[]): BookmarkInt
|
|
|
187
134
|
const namedCount = bookmarks.filter((b) => b.name && !b.hidden).length;
|
|
188
135
|
const totalCount = bookmarks.length;
|
|
189
136
|
const unpairedCount = startOnlyCount + endOnlyCount;
|
|
190
|
-
|
|
191
137
|
return {
|
|
192
138
|
totalCount,
|
|
193
139
|
pairedCount,
|
|
@@ -195,34 +141,16 @@ export function assessBookmarkIntegrity(bookmarks: LegalBookmark[]): BookmarkInt
|
|
|
195
141
|
endOnlyCount,
|
|
196
142
|
hiddenCount,
|
|
197
143
|
namedCount,
|
|
198
|
-
integrityScore:
|
|
199
|
-
unpairedCount === 0
|
|
200
|
-
? "complete"
|
|
201
|
-
: unpairedCount <= pairedCount
|
|
202
|
-
? "partial"
|
|
203
|
-
: "degraded",
|
|
144
|
+
integrityScore: unpairedCount === 0 ? "complete" : unpairedCount <= pairedCount ? "partial" : "degraded"
|
|
204
145
|
};
|
|
205
146
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
return (
|
|
209
|
-
(left.startIndex ?? left.endIndex ?? Number.MAX_SAFE_INTEGER) -
|
|
210
|
-
(right.startIndex ?? right.endIndex ?? Number.MAX_SAFE_INTEGER) ||
|
|
211
|
-
left.bookmarkId.localeCompare(right.bookmarkId)
|
|
212
|
-
);
|
|
147
|
+
function compareBookmarks(left, right) {
|
|
148
|
+
return (left.startIndex ?? left.endIndex ?? Number.MAX_SAFE_INTEGER) - (right.startIndex ?? right.endIndex ?? Number.MAX_SAFE_INTEGER) || left.bookmarkId.localeCompare(right.bookmarkId);
|
|
213
149
|
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Build a lookup map from bookmark name to bookmarkId for the document.
|
|
217
|
-
* Used by the field refresh runtime to resolve REF/PAGEREF/NOTEREF targets.
|
|
218
|
-
*/
|
|
219
|
-
export function buildBookmarkNameMap(
|
|
220
|
-
document: Pick<CanonicalDocument, "content"> | DocumentNode,
|
|
221
|
-
): Map<string, { bookmarkId: string; paragraphIndex: number }> {
|
|
150
|
+
function buildBookmarkNameMap(document) {
|
|
222
151
|
const root = "content" in document ? document.content : document;
|
|
223
|
-
const map =
|
|
152
|
+
const map = /* @__PURE__ */ new Map();
|
|
224
153
|
let paragraphIndex = -1;
|
|
225
|
-
|
|
226
154
|
walkDocument(root, (node) => {
|
|
227
155
|
if (node.type === "paragraph") {
|
|
228
156
|
paragraphIndex += 1;
|
|
@@ -231,38 +159,15 @@ export function buildBookmarkNameMap(
|
|
|
231
159
|
map.set(node.name, { bookmarkId: node.bookmarkId, paragraphIndex });
|
|
232
160
|
}
|
|
233
161
|
});
|
|
234
|
-
|
|
235
162
|
return map;
|
|
236
163
|
}
|
|
237
|
-
|
|
238
|
-
/**
|
|
239
|
-
* Resolve field-to-bookmark dependencies from a field registry.
|
|
240
|
-
* Returns a map of bookmark names to the field entries that reference them.
|
|
241
|
-
* This enables the runtime to determine which fields need refresh when
|
|
242
|
-
* a bookmark's content changes.
|
|
243
|
-
*/
|
|
244
|
-
export function resolveBookmarkFieldDependencies(
|
|
245
|
-
registry: FieldRegistry,
|
|
246
|
-
): Map<string, FieldRegistryEntry[]> {
|
|
247
|
-
const deps = new Map<string, FieldRegistryEntry[]>();
|
|
248
|
-
for (const entry of registry.supported) {
|
|
249
|
-
if (!entry.fieldTarget) continue;
|
|
250
|
-
const existing = deps.get(entry.fieldTarget) ?? [];
|
|
251
|
-
existing.push(entry);
|
|
252
|
-
deps.set(entry.fieldTarget, existing);
|
|
253
|
-
}
|
|
254
|
-
return deps;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
function walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void): void {
|
|
164
|
+
function walkDocument(node, visit) {
|
|
258
165
|
visit(node);
|
|
259
|
-
|
|
260
166
|
if ("children" in node && Array.isArray(node.children)) {
|
|
261
167
|
for (const child of node.children) {
|
|
262
168
|
walkDocument(child, visit);
|
|
263
169
|
}
|
|
264
170
|
}
|
|
265
|
-
|
|
266
171
|
if (node.type === "table") {
|
|
267
172
|
for (const row of node.rows) {
|
|
268
173
|
walkDocument(row, visit);
|
|
@@ -273,3 +178,12 @@ function walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void):
|
|
|
273
178
|
}
|
|
274
179
|
}
|
|
275
180
|
}
|
|
181
|
+
|
|
182
|
+
export {
|
|
183
|
+
parseBookmarksFromDocumentXml,
|
|
184
|
+
collectBookmarksFromCanonicalDocument,
|
|
185
|
+
isHiddenBookmarkName,
|
|
186
|
+
assessBookmarkIntegrity,
|
|
187
|
+
buildBookmarkNameMap
|
|
188
|
+
};
|
|
189
|
+
//# sourceMappingURL=chunk-RMH72RZI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/legal/bookmarks.ts"],"sourcesContent":["import { extractBookmarksFromBodyXml } from \"../io/ooxml/parse-fields.ts\";\nimport type {\n BookmarkEndNode,\n BookmarkStartNode,\n CanonicalDocument,\n DocumentNode,\n FieldRegistry,\n FieldRegistryEntry,\n} from \"../model/canonical-document.ts\";\n\nexport interface LegalBookmark {\n bookmarkId: string;\n name?: string;\n hidden: boolean;\n source: \"ooxml\" | \"canonical\";\n status: \"paired\" | \"start-only\" | \"end-only\";\n startIndex?: number;\n endIndex?: number;\n}\n\ninterface OpenBookmark {\n bookmarkId: string;\n name?: string;\n hidden: boolean;\n startIndex: number;\n}\n\nexport function parseBookmarksFromDocumentXml(xml: string): LegalBookmark[] {\n const bookmarks = extractBookmarksFromBodyXml(xml);\n const openBookmarks = new Map<string, OpenBookmark[]>();\n const results: LegalBookmark[] = [];\n\n for (let index = 0; index < bookmarks.length; index += 1) {\n const bookmark = bookmarks[index];\n\n if (bookmark.type === \"bookmark_start\") {\n const entry: OpenBookmark = {\n bookmarkId: bookmark.bookmarkId,\n name: bookmark.name,\n hidden: isHiddenBookmarkName(bookmark.name),\n startIndex: index,\n };\n const stack = openBookmarks.get(bookmark.bookmarkId) ?? [];\n stack.push(entry);\n openBookmarks.set(bookmark.bookmarkId, stack);\n continue;\n }\n\n const stack = openBookmarks.get(bookmark.bookmarkId);\n const open = stack?.pop();\n if (stack && stack.length === 0) {\n openBookmarks.delete(bookmark.bookmarkId);\n }\n\n if (open) {\n results.push({\n bookmarkId: bookmark.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"ooxml\",\n status: \"paired\",\n startIndex: open.startIndex,\n endIndex: index,\n });\n continue;\n }\n\n results.push({\n bookmarkId: bookmark.bookmarkId,\n hidden: false,\n source: \"ooxml\",\n status: \"end-only\",\n endIndex: index,\n });\n }\n\n for (const stack of openBookmarks.values()) {\n for (const open of stack) {\n results.push({\n bookmarkId: open.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"ooxml\",\n status: \"start-only\",\n startIndex: open.startIndex,\n });\n }\n }\n\n return results.sort(compareBookmarks);\n}\n\nexport function collectBookmarksFromCanonicalDocument(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): LegalBookmark[] {\n const root = \"content\" in document ? document.content : document;\n const sequence: Array<BookmarkStartNode | BookmarkEndNode> = [];\n\n walkDocument(root, (node) => {\n if (node.type === \"bookmark_start\" || node.type === \"bookmark_end\") {\n sequence.push(node);\n }\n });\n\n const openBookmarks = new Map<string, OpenBookmark[]>();\n const results: LegalBookmark[] = [];\n\n for (let index = 0; index < sequence.length; index += 1) {\n const bookmark = sequence[index];\n\n if (bookmark.type === \"bookmark_start\") {\n const entry: OpenBookmark = {\n bookmarkId: bookmark.bookmarkId,\n name: bookmark.name,\n hidden: isHiddenBookmarkName(bookmark.name),\n startIndex: index,\n };\n const stack = openBookmarks.get(bookmark.bookmarkId) ?? [];\n stack.push(entry);\n openBookmarks.set(bookmark.bookmarkId, stack);\n continue;\n }\n\n const stack = openBookmarks.get(bookmark.bookmarkId);\n const open = stack?.pop();\n if (stack && stack.length === 0) {\n openBookmarks.delete(bookmark.bookmarkId);\n }\n\n if (open) {\n results.push({\n bookmarkId: bookmark.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"canonical\",\n status: \"paired\",\n startIndex: open.startIndex,\n endIndex: index,\n });\n continue;\n }\n\n results.push({\n bookmarkId: bookmark.bookmarkId,\n hidden: false,\n source: \"canonical\",\n status: \"end-only\",\n endIndex: index,\n });\n }\n\n for (const stack of openBookmarks.values()) {\n for (const open of stack) {\n results.push({\n bookmarkId: open.bookmarkId,\n name: open.name,\n hidden: open.hidden,\n source: \"canonical\",\n status: \"start-only\",\n startIndex: open.startIndex,\n });\n }\n }\n\n return results.sort(compareBookmarks);\n}\n\nexport function isHiddenBookmarkName(name: string | undefined): boolean {\n return Boolean(name && name.startsWith(\"_\"));\n}\n\nexport interface BookmarkIntegrityResult {\n totalCount: number;\n pairedCount: number;\n startOnlyCount: number;\n endOnlyCount: number;\n hiddenCount: number;\n namedCount: number;\n integrityScore: \"complete\" | \"partial\" | \"degraded\";\n}\n\nexport function assessBookmarkIntegrity(bookmarks: LegalBookmark[]): BookmarkIntegrityResult {\n const pairedCount = bookmarks.filter((b) => b.status === \"paired\").length;\n const startOnlyCount = bookmarks.filter((b) => b.status === \"start-only\").length;\n const endOnlyCount = bookmarks.filter((b) => b.status === \"end-only\").length;\n const hiddenCount = bookmarks.filter((b) => b.hidden).length;\n const namedCount = bookmarks.filter((b) => b.name && !b.hidden).length;\n const totalCount = bookmarks.length;\n const unpairedCount = startOnlyCount + endOnlyCount;\n\n return {\n totalCount,\n pairedCount,\n startOnlyCount,\n endOnlyCount,\n hiddenCount,\n namedCount,\n integrityScore:\n unpairedCount === 0\n ? \"complete\"\n : unpairedCount <= pairedCount\n ? \"partial\"\n : \"degraded\",\n };\n}\n\nfunction compareBookmarks(left: LegalBookmark, right: LegalBookmark): number {\n return (\n (left.startIndex ?? left.endIndex ?? Number.MAX_SAFE_INTEGER) -\n (right.startIndex ?? right.endIndex ?? Number.MAX_SAFE_INTEGER) ||\n left.bookmarkId.localeCompare(right.bookmarkId)\n );\n}\n\n/**\n * Build a lookup map from bookmark name to bookmarkId for the document.\n * Used by the field refresh runtime to resolve REF/PAGEREF/NOTEREF targets.\n */\nexport function buildBookmarkNameMap(\n document: Pick<CanonicalDocument, \"content\"> | DocumentNode,\n): Map<string, { bookmarkId: string; paragraphIndex: number }> {\n const root = \"content\" in document ? document.content : document;\n const map = new Map<string, { bookmarkId: string; paragraphIndex: number }>();\n let paragraphIndex = -1;\n\n walkDocument(root, (node) => {\n if (node.type === \"paragraph\") {\n paragraphIndex += 1;\n }\n if (node.type === \"bookmark_start\" && node.name) {\n map.set(node.name, { bookmarkId: node.bookmarkId, paragraphIndex });\n }\n });\n\n return map;\n}\n\n/**\n * Resolve field-to-bookmark dependencies from a field registry.\n * Returns a map of bookmark names to the field entries that reference them.\n * This enables the runtime to determine which fields need refresh when\n * a bookmark's content changes.\n */\nexport function resolveBookmarkFieldDependencies(\n registry: FieldRegistry,\n): Map<string, FieldRegistryEntry[]> {\n const deps = new Map<string, FieldRegistryEntry[]>();\n for (const entry of registry.supported) {\n if (!entry.fieldTarget) continue;\n const existing = deps.get(entry.fieldTarget) ?? [];\n existing.push(entry);\n deps.set(entry.fieldTarget, existing);\n }\n return deps;\n}\n\nfunction walkDocument(node: DocumentNode, visit: (node: DocumentNode) => void): void {\n visit(node);\n\n if (\"children\" in node && Array.isArray(node.children)) {\n for (const child of node.children) {\n walkDocument(child, visit);\n }\n }\n\n if (node.type === \"table\") {\n for (const row of node.rows) {\n walkDocument(row, visit);\n }\n } else if (node.type === \"table_row\") {\n for (const cell of node.cells) {\n walkDocument(cell, visit);\n }\n }\n}\n"],"mappings":";;;;;AA2BO,SAAS,8BAA8B,KAA8B;AAC1E,QAAM,YAAY,4BAA4B,GAAG;AACjD,QAAM,gBAAgB,oBAAI,IAA4B;AACtD,QAAM,UAA2B,CAAC;AAElC,WAAS,QAAQ,GAAG,QAAQ,UAAU,QAAQ,SAAS,GAAG;AACxD,UAAM,WAAW,UAAU,KAAK;AAEhC,QAAI,SAAS,SAAS,kBAAkB;AACtC,YAAM,QAAsB;AAAA,QAC1B,YAAY,SAAS;AAAA,QACrB,MAAM,SAAS;AAAA,QACf,QAAQ,qBAAqB,SAAS,IAAI;AAAA,QAC1C,YAAY;AAAA,MACd;AACA,YAAMA,SAAQ,cAAc,IAAI,SAAS,UAAU,KAAK,CAAC;AACzD,MAAAA,OAAM,KAAK,KAAK;AAChB,oBAAc,IAAI,SAAS,YAAYA,MAAK;AAC5C;AAAA,IACF;AAEA,UAAM,QAAQ,cAAc,IAAI,SAAS,UAAU;AACnD,UAAM,OAAO,OAAO,IAAI;AACxB,QAAI,SAAS,MAAM,WAAW,GAAG;AAC/B,oBAAc,OAAO,SAAS,UAAU;AAAA,IAC1C;AAEA,QAAI,MAAM;AACR,cAAQ,KAAK;AAAA,QACX,YAAY,SAAS;AAAA,QACrB,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,KAAK;AAAA,QACjB,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,YAAY,SAAS;AAAA,MACrB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,aAAW,SAAS,cAAc,OAAO,GAAG;AAC1C,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,KAAK;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,gBAAgB;AACtC;AAEO,SAAS,sCACd,UACiB;AACjB,QAAM,OAAO,aAAa,WAAW,SAAS,UAAU;AACxD,QAAM,WAAuD,CAAC;AAE9D,eAAa,MAAM,CAAC,SAAS;AAC3B,QAAI,KAAK,SAAS,oBAAoB,KAAK,SAAS,gBAAgB;AAClE,eAAS,KAAK,IAAI;AAAA,IACpB;AAAA,EACF,CAAC;AAED,QAAM,gBAAgB,oBAAI,IAA4B;AACtD,QAAM,UAA2B,CAAC;AAElC,WAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;AACvD,UAAM,WAAW,SAAS,KAAK;AAE/B,QAAI,SAAS,SAAS,kBAAkB;AACtC,YAAM,QAAsB;AAAA,QAC1B,YAAY,SAAS;AAAA,QACrB,MAAM,SAAS;AAAA,QACf,QAAQ,qBAAqB,SAAS,IAAI;AAAA,QAC1C,YAAY;AAAA,MACd;AACA,YAAMA,SAAQ,cAAc,IAAI,SAAS,UAAU,KAAK,CAAC;AACzD,MAAAA,OAAM,KAAK,KAAK;AAChB,oBAAc,IAAI,SAAS,YAAYA,MAAK;AAC5C;AAAA,IACF;AAEA,UAAM,QAAQ,cAAc,IAAI,SAAS,UAAU;AACnD,UAAM,OAAO,OAAO,IAAI;AACxB,QAAI,SAAS,MAAM,WAAW,GAAG;AAC/B,oBAAc,OAAO,SAAS,UAAU;AAAA,IAC1C;AAEA,QAAI,MAAM;AACR,cAAQ,KAAK;AAAA,QACX,YAAY,SAAS;AAAA,QACrB,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,KAAK;AAAA,QACjB,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX,YAAY,SAAS;AAAA,MACrB,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,aAAW,SAAS,cAAc,OAAO,GAAG;AAC1C,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK;AAAA,QACX,YAAY,KAAK;AAAA,QACjB,MAAM,KAAK;AAAA,QACX,QAAQ,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,KAAK;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,QAAQ,KAAK,gBAAgB;AACtC;AAEO,SAAS,qBAAqB,MAAmC;AACtE,SAAO,QAAQ,QAAQ,KAAK,WAAW,GAAG,CAAC;AAC7C;AAYO,SAAS,wBAAwB,WAAqD;AAC3F,QAAM,cAAc,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AACnE,QAAM,iBAAiB,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,YAAY,EAAE;AAC1E,QAAM,eAAe,UAAU,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE;AACtE,QAAM,cAAc,UAAU,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AACtD,QAAM,aAAa,UAAU,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE;AAChE,QAAM,aAAa,UAAU;AAC7B,QAAM,gBAAgB,iBAAiB;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBACE,kBAAkB,IACd,aACA,iBAAiB,cACf,YACA;AAAA,EACV;AACF;AAEA,SAAS,iBAAiB,MAAqB,OAA8B;AAC3E,UACG,KAAK,cAAc,KAAK,YAAY,OAAO,qBACzC,MAAM,cAAc,MAAM,YAAY,OAAO,qBAChD,KAAK,WAAW,cAAc,MAAM,UAAU;AAElD;AAMO,SAAS,qBACd,UAC6D;AAC7D,QAAM,OAAO,aAAa,WAAW,SAAS,UAAU;AACxD,QAAM,MAAM,oBAAI,IAA4D;AAC5E,MAAI,iBAAiB;AAErB,eAAa,MAAM,CAAC,SAAS;AAC3B,QAAI,KAAK,SAAS,aAAa;AAC7B,wBAAkB;AAAA,IACpB;AACA,QAAI,KAAK,SAAS,oBAAoB,KAAK,MAAM;AAC/C,UAAI,IAAI,KAAK,MAAM,EAAE,YAAY,KAAK,YAAY,eAAe,CAAC;AAAA,IACpE;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAqBA,SAAS,aAAa,MAAoB,OAA2C;AACnF,QAAM,IAAI;AAEV,MAAI,cAAc,QAAQ,MAAM,QAAQ,KAAK,QAAQ,GAAG;AACtD,eAAW,SAAS,KAAK,UAAU;AACjC,mBAAa,OAAO,KAAK;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,SAAS;AACzB,eAAW,OAAO,KAAK,MAAM;AAC3B,mBAAa,KAAK,KAAK;AAAA,IACzB;AAAA,EACF,WAAW,KAAK,SAAS,aAAa;AACpC,eAAW,QAAQ,KAAK,OAAO;AAC7B,mBAAa,MAAM,KAAK;AAAA,IAC1B;AAAA,EACF;AACF;","names":["stack"]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// src/preservation/store.ts
|
|
2
|
+
function getOpaqueFragment(store, fragmentId) {
|
|
3
|
+
return normalizeOpaqueFragmentMap(store)[fragmentId];
|
|
4
|
+
}
|
|
5
|
+
function listOpaqueFragments(store) {
|
|
6
|
+
return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {
|
|
7
|
+
return left.lastKnownRange.from - right.lastKnownRange.from || left.fragmentId.localeCompare(right.fragmentId);
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
function listPreservedPackageParts(store) {
|
|
11
|
+
return Object.values(normalizePackagePartMap(store)).sort(
|
|
12
|
+
(left, right) => left.packagePartName.localeCompare(right.packagePartName)
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
function findOpaqueFragmentsIntersectingRange(store, range) {
|
|
16
|
+
return listOpaqueFragments(store).filter(
|
|
17
|
+
(fragment) => rangesIntersect(fragment.lastKnownRange, range)
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
function describeOpaqueFragment(fragment) {
|
|
21
|
+
const xml = fragment.payloadReference;
|
|
22
|
+
const detail = createDetail(fragment);
|
|
23
|
+
if (/\b(?:w:)?sectPr\b/u.test(xml)) {
|
|
24
|
+
return {
|
|
25
|
+
featureKey: "sections",
|
|
26
|
+
label: "Section properties",
|
|
27
|
+
detail
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (/\b(?:w:)?tbl\b/u.test(xml)) {
|
|
31
|
+
return {
|
|
32
|
+
featureKey: "tables",
|
|
33
|
+
label: "Preserved table structure",
|
|
34
|
+
detail
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (/\b(?:w:)?hdr\b|\b(?:w:)?ftr\b/u.test(xml)) {
|
|
38
|
+
return {
|
|
39
|
+
featureKey: "headers-footers",
|
|
40
|
+
label: "Header or footer content",
|
|
41
|
+
detail
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (/\b(?:w:)?fldSimple\b|\b(?:w:)?fldChar\b|\b(?:w:)?instrText\b/u.test(xml)) {
|
|
45
|
+
return {
|
|
46
|
+
featureKey: "fields",
|
|
47
|
+
label: "Word field content",
|
|
48
|
+
detail
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (/\b(?:w:)?sdt\b/u.test(xml)) {
|
|
52
|
+
return {
|
|
53
|
+
featureKey: "content-controls",
|
|
54
|
+
label: "Content control",
|
|
55
|
+
detail
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (/\b(?:w:)?customXml\b/u.test(xml)) {
|
|
59
|
+
return {
|
|
60
|
+
featureKey: "custom-xml",
|
|
61
|
+
label: "Custom XML wrapper",
|
|
62
|
+
detail
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (/\b(?:w:)?altChunk\b/u.test(xml)) {
|
|
66
|
+
return {
|
|
67
|
+
featureKey: "alt-chunk",
|
|
68
|
+
label: "Alternate content import",
|
|
69
|
+
detail
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
if (/\b(?:w:)?object\b|\b(?:o:)?OLEObject\b/u.test(xml)) {
|
|
73
|
+
return {
|
|
74
|
+
featureKey: "embedded-objects",
|
|
75
|
+
label: "Embedded object",
|
|
76
|
+
detail
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (/\b(?:mc:)?AlternateContent\b/u.test(xml)) {
|
|
80
|
+
return {
|
|
81
|
+
featureKey: "alternate-content",
|
|
82
|
+
label: "Markup compatibility block",
|
|
83
|
+
detail
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
featureKey: "unknown-ooxml",
|
|
88
|
+
label: "Unsupported OOXML fragment",
|
|
89
|
+
detail
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function createDetail(fragment) {
|
|
93
|
+
const detail = [
|
|
94
|
+
`Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,
|
|
95
|
+
fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,
|
|
96
|
+
fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null
|
|
97
|
+
].filter(Boolean).join(" ");
|
|
98
|
+
return detail.length > 0 ? detail : "Preserved whole-unit to keep unsupported OOXML intact.";
|
|
99
|
+
}
|
|
100
|
+
function rangesIntersect(left, right) {
|
|
101
|
+
return left.from < right.to && right.from < left.to;
|
|
102
|
+
}
|
|
103
|
+
function normalizeOpaqueFragmentMap(store) {
|
|
104
|
+
return store && typeof store === "object" && store.opaqueFragments && typeof store.opaqueFragments === "object" ? store.opaqueFragments : {};
|
|
105
|
+
}
|
|
106
|
+
function normalizePackagePartMap(store) {
|
|
107
|
+
return store && typeof store === "object" && store.packageParts && typeof store.packageParts === "object" ? store.packageParts : {};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export {
|
|
111
|
+
getOpaqueFragment,
|
|
112
|
+
listOpaqueFragments,
|
|
113
|
+
listPreservedPackageParts,
|
|
114
|
+
findOpaqueFragmentsIntersectingRange,
|
|
115
|
+
describeOpaqueFragment
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=chunk-SWKWQZXM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/preservation/store.ts"],"sourcesContent":["import type {\n DocRange,\n OpaqueFragmentRecord,\n PreservationStore,\n PreservedPackagePart,\n} from \"../model/canonical-document.ts\";\n\nexport interface OpaqueFragmentDescriptor {\n featureKey:\n | \"sections\"\n | \"tables\"\n | \"headers-footers\"\n | \"fields\"\n | \"content-controls\"\n | \"custom-xml\"\n | \"alt-chunk\"\n | \"embedded-objects\"\n | \"alternate-content\"\n | \"unknown-ooxml\";\n label: string;\n detail: string;\n}\n\nexport function createPreservationStore(\n seed?: Partial<PreservationStore>,\n): PreservationStore {\n return {\n opaqueFragments: { ...(seed?.opaqueFragments ?? {}) },\n packageParts: { ...(seed?.packageParts ?? {}) },\n };\n}\n\nexport function getOpaqueFragment(\n store: PreservationStore,\n fragmentId: string,\n): OpaqueFragmentRecord | undefined {\n return normalizeOpaqueFragmentMap(store)[fragmentId];\n}\n\nexport function listOpaqueFragments(\n store: PreservationStore,\n): OpaqueFragmentRecord[] {\n return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {\n return (\n left.lastKnownRange.from - right.lastKnownRange.from ||\n left.fragmentId.localeCompare(right.fragmentId)\n );\n });\n}\n\nexport function listPreservedPackageParts(\n store: PreservationStore,\n): PreservedPackagePart[] {\n return Object.values(normalizePackagePartMap(store)).sort((left, right) =>\n left.packagePartName.localeCompare(right.packagePartName),\n );\n}\n\nexport function findOpaqueFragmentsIntersectingRange(\n store: PreservationStore,\n range: DocRange,\n): OpaqueFragmentRecord[] {\n return listOpaqueFragments(store).filter((fragment) =>\n rangesIntersect(fragment.lastKnownRange, range),\n );\n}\n\nexport function describeOpaqueFragment(\n fragment: OpaqueFragmentRecord,\n): OpaqueFragmentDescriptor {\n const xml = fragment.payloadReference;\n const detail = createDetail(fragment);\n\n if (/\\b(?:w:)?sectPr\\b/u.test(xml)) {\n return {\n featureKey: \"sections\",\n label: \"Section properties\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?tbl\\b/u.test(xml)) {\n return {\n featureKey: \"tables\",\n label: \"Preserved table structure\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?hdr\\b|\\b(?:w:)?ftr\\b/u.test(xml)) {\n return {\n featureKey: \"headers-footers\",\n label: \"Header or footer content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?fldSimple\\b|\\b(?:w:)?fldChar\\b|\\b(?:w:)?instrText\\b/u.test(xml)) {\n return {\n featureKey: \"fields\",\n label: \"Word field content\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?sdt\\b/u.test(xml)) {\n return {\n featureKey: \"content-controls\",\n label: \"Content control\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?customXml\\b/u.test(xml)) {\n return {\n featureKey: \"custom-xml\",\n label: \"Custom XML wrapper\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?altChunk\\b/u.test(xml)) {\n return {\n featureKey: \"alt-chunk\",\n label: \"Alternate content import\",\n detail,\n };\n }\n\n if (/\\b(?:w:)?object\\b|\\b(?:o:)?OLEObject\\b/u.test(xml)) {\n return {\n featureKey: \"embedded-objects\",\n label: \"Embedded object\",\n detail,\n };\n }\n\n if (/\\b(?:mc:)?AlternateContent\\b/u.test(xml)) {\n return {\n featureKey: \"alternate-content\",\n label: \"Markup compatibility block\",\n detail,\n };\n }\n\n return {\n featureKey: \"unknown-ooxml\",\n label: \"Unsupported OOXML fragment\",\n detail,\n };\n}\n\nfunction createDetail(fragment: OpaqueFragmentRecord): string {\n const detail = [\n `Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,\n fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,\n fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return detail.length > 0\n ? detail\n : \"Preserved whole-unit to keep unsupported OOXML intact.\";\n}\n\nfunction rangesIntersect(left: DocRange, right: DocRange): boolean {\n return left.from < right.to && right.from < left.to;\n}\n\nfunction normalizeOpaqueFragmentMap(\n store: PreservationStore,\n): Record<string, OpaqueFragmentRecord> {\n return store && typeof store === \"object\" && store.opaqueFragments && typeof store.opaqueFragments === \"object\"\n ? (store.opaqueFragments as Record<string, OpaqueFragmentRecord>)\n : {};\n}\n\nfunction normalizePackagePartMap(\n store: PreservationStore,\n): Record<string, PreservedPackagePart> {\n return store && typeof store === \"object\" && store.packageParts && typeof store.packageParts === \"object\"\n ? (store.packageParts as Record<string, PreservedPackagePart>)\n : {};\n}\n"],"mappings":"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","names":[]}
|