@stll/folio-core 0.0.1-placeholder.0 → 0.1.0
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/LICENSE +202 -0
- package/NOTICE.md +29 -0
- package/README.md +41 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/ai-edits/apply.d.ts +35 -0
- package/dist/ai-edits/apply.js +683 -0
- package/dist/ai-edits/clean-text.d.ts +28 -0
- package/dist/ai-edits/clean-text.js +23 -0
- package/dist/ai-edits/headless.d.ts +225 -0
- package/dist/ai-edits/headless.js +513 -0
- package/dist/ai-edits/index.d.ts +6 -0
- package/dist/ai-edits/index.js +5 -0
- package/dist/ai-edits/inline-emphasis.d.ts +38 -0
- package/dist/ai-edits/inline-emphasis.js +78 -0
- package/dist/ai-edits/snapshot.d.ts +9 -0
- package/dist/ai-edits/snapshot.js +195 -0
- package/dist/ai-edits/types.d.ts +156 -0
- package/dist/ai-edits/types.js +0 -0
- package/dist/ai-edits/word-diff.d.ts +20 -0
- package/dist/ai-edits/word-diff.js +77 -0
- package/dist/ai-suggestions/apply.d.ts +17 -0
- package/dist/ai-suggestions/apply.js +64 -0
- package/dist/ai-suggestions/conflict.d.ts +22 -0
- package/dist/ai-suggestions/conflict.js +67 -0
- package/dist/ai-suggestions/text-positions.d.ts +21 -0
- package/dist/ai-suggestions/text-positions.js +48 -0
- package/dist/ai-suggestions/types.d.ts +199 -0
- package/dist/ai-suggestions/types.js +59 -0
- package/dist/content-controls/errors.d.ts +52 -0
- package/dist/content-controls/errors.js +36 -0
- package/dist/content-controls/findContentControls.d.ts +55 -0
- package/dist/content-controls/findContentControls.js +75 -0
- package/dist/content-controls/index.d.ts +4 -0
- package/dist/content-controls/index.js +4 -0
- package/dist/content-controls/mutateContentControls.d.ts +51 -0
- package/dist/content-controls/mutateContentControls.js +377 -0
- package/dist/controller/folioEditor.d.ts +21 -0
- package/dist/controller/folioEditor.js +29 -0
- package/dist/controller/folioEditorEvents.d.ts +23 -0
- package/dist/controller/folioEditorEvents.js +24 -0
- package/dist/controller/hiddenEditorApi.d.ts +35 -0
- package/dist/controller/hiddenEditorApi.js +112 -0
- package/dist/controller/hiddenEditorManager.d.ts +93 -0
- package/dist/controller/hiddenEditorManager.js +308 -0
- package/dist/controller/layoutPipeline.d.ts +63 -0
- package/dist/controller/layoutPipeline.js +406 -0
- package/dist/controller/layoutScheduler.d.ts +41 -0
- package/dist/controller/layoutScheduler.js +59 -0
- package/dist/controller/layoutSession.d.ts +24 -0
- package/dist/controller/layoutSession.js +13 -0
- package/dist/docx/blockContentParser.d.ts +13 -0
- package/dist/docx/blockContentParser.js +289 -0
- package/dist/docx/bookmarkParser.d.ts +178 -0
- package/dist/docx/bookmarkParser.js +246 -0
- package/dist/docx/bookmarkPlacement.d.ts +10 -0
- package/dist/docx/bookmarkPlacement.js +50 -0
- package/dist/docx/bulletMarkers.d.ts +4 -0
- package/dist/docx/bulletMarkers.js +42 -0
- package/dist/docx/commentParser.d.ts +34 -0
- package/dist/docx/commentParser.js +127 -0
- package/dist/docx/commentReferenceNormalization.d.ts +25 -0
- package/dist/docx/commentReferenceNormalization.js +97 -0
- package/dist/docx/commentReplyMarkers.d.ts +20 -0
- package/dist/docx/commentReplyMarkers.js +123 -0
- package/dist/docx/compatibility.d.ts +12 -0
- package/dist/docx/compatibility.js +77 -0
- package/dist/docx/documentParser.d.ts +65 -0
- package/dist/docx/documentParser.js +209 -0
- package/dist/docx/drawingUtils.d.ts +56 -0
- package/dist/docx/drawingUtils.js +305 -0
- package/dist/docx/fieldParser.d.ts +228 -0
- package/dist/docx/fieldParser.js +559 -0
- package/dist/docx/footnoteParser.d.ts +109 -0
- package/dist/docx/footnoteParser.js +270 -0
- package/dist/docx/headerFooterParser.d.ts +119 -0
- package/dist/docx/headerFooterParser.js +266 -0
- package/dist/docx/headerFooterRefParser.d.ts +22 -0
- package/dist/docx/headerFooterRefParser.js +52 -0
- package/dist/docx/headerFooterReferenceNormalization.d.ts +19 -0
- package/dist/docx/headerFooterReferenceNormalization.js +64 -0
- package/dist/docx/hyperlinkParser.d.ts +108 -0
- package/dist/docx/hyperlinkParser.js +230 -0
- package/dist/docx/imageParser.d.ts +93 -0
- package/dist/docx/imageParser.js +522 -0
- package/dist/docx/mathToMathml.d.ts +15 -0
- package/dist/docx/mathToMathml.js +357 -0
- package/dist/docx/modelValidation.d.ts +13 -0
- package/dist/docx/modelValidation.js +21 -0
- package/dist/docx/normalizeBaseDirection.d.ts +12 -0
- package/dist/docx/normalizeBaseDirection.js +81 -0
- package/dist/docx/notePropertiesParser.d.ts +16 -0
- package/dist/docx/notePropertiesParser.js +99 -0
- package/dist/docx/numberingParser.d.ts +86 -0
- package/dist/docx/numberingParser.js +735 -0
- package/dist/docx/numberingReferenceNormalization.d.ts +25 -0
- package/dist/docx/numberingReferenceNormalization.js +22 -0
- package/dist/docx/paragraphParser.d.ts +86 -0
- package/dist/docx/paragraphParser.js +1132 -0
- package/dist/docx/paragraphTraversal.d.ts +19 -0
- package/dist/docx/paragraphTraversal.js +76 -0
- package/dist/docx/parser.d.ts +67 -0
- package/dist/docx/parser.js +391 -0
- package/dist/docx/parserEnums.d.ts +45 -0
- package/dist/docx/parserEnums.js +70 -0
- package/dist/docx/relsParser.d.ts +160 -0
- package/dist/docx/relsParser.js +235 -0
- package/dist/docx/replyToComment.d.ts +29 -0
- package/dist/docx/replyToComment.js +73 -0
- package/dist/docx/rezip.d.ts +166 -0
- package/dist/docx/rezip.js +1194 -0
- package/dist/docx/runConsolidator.d.ts +57 -0
- package/dist/docx/runConsolidator.js +224 -0
- package/dist/docx/runParser.d.ts +78 -0
- package/dist/docx/runParser.js +661 -0
- package/dist/docx/sdtProperties.d.ts +15 -0
- package/dist/docx/sdtProperties.js +290 -0
- package/dist/docx/sdtPropertiesPatch.d.ts +16 -0
- package/dist/docx/sdtPropertiesPatch.js +144 -0
- package/dist/docx/sectionParser.d.ts +95 -0
- package/dist/docx/sectionParser.js +534 -0
- package/dist/docx/selectiveSave.d.ts +25 -0
- package/dist/docx/selectiveSave.js +247 -0
- package/dist/docx/selectiveSaveFlags.d.ts +33 -0
- package/dist/docx/selectiveSaveFlags.js +11 -0
- package/dist/docx/selectiveSaveTripwire.d.ts +33 -0
- package/dist/docx/selectiveSaveTripwire.js +79 -0
- package/dist/docx/selectiveXmlPatch.d.ts +103 -0
- package/dist/docx/selectiveXmlPatch.js +493 -0
- package/dist/docx/serializer/blockSdtSerializer.d.ts +6 -0
- package/dist/docx/serializer/blockSdtSerializer.js +88 -0
- package/dist/docx/serializer/borderSerializer.d.ts +25 -0
- package/dist/docx/serializer/borderSerializer.js +44 -0
- package/dist/docx/serializer/commentSerializer.d.ts +31 -0
- package/dist/docx/serializer/commentSerializer.js +184 -0
- package/dist/docx/serializer/documentSerializer.d.ts +65 -0
- package/dist/docx/serializer/documentSerializer.js +199 -0
- package/dist/docx/serializer/headerFooterSerializer.d.ts +12 -0
- package/dist/docx/serializer/headerFooterSerializer.js +84 -0
- package/dist/docx/serializer/noteSerializer.d.ts +19 -0
- package/dist/docx/serializer/noteSerializer.js +70 -0
- package/dist/docx/serializer/numberingSerializer.d.ts +12 -0
- package/dist/docx/serializer/numberingSerializer.js +93 -0
- package/dist/docx/serializer/paragraphSerializer.d.ts +48 -0
- package/dist/docx/serializer/paragraphSerializer.js +559 -0
- package/dist/docx/serializer/runSerializer.d.ts +56 -0
- package/dist/docx/serializer/runSerializer.js +621 -0
- package/dist/docx/serializer/sectionPropertiesSerializer.d.ts +6 -0
- package/dist/docx/serializer/sectionPropertiesSerializer.js +187 -0
- package/dist/docx/serializer/tableSerializer.d.ts +79 -0
- package/dist/docx/serializer/tableSerializer.js +422 -0
- package/dist/docx/serializer/xmlUtils.d.ts +20 -0
- package/dist/docx/serializer/xmlUtils.js +25 -0
- package/dist/docx/settingsParser.d.ts +8 -0
- package/dist/docx/settingsParser.js +36 -0
- package/dist/docx/shapeParser.d.ts +20 -0
- package/dist/docx/shapeParser.js +272 -0
- package/dist/docx/styleParser.d.ts +50 -0
- package/dist/docx/styleParser.js +905 -0
- package/dist/docx/tableParser.d.ts +202 -0
- package/dist/docx/tableParser.js +811 -0
- package/dist/docx/textBoxParser.d.ts +117 -0
- package/dist/docx/textBoxParser.js +262 -0
- package/dist/docx/themeParser.d.ts +77 -0
- package/dist/docx/themeParser.js +330 -0
- package/dist/docx/trackedMoveRangeNormalization.d.ts +22 -0
- package/dist/docx/trackedMoveRangeNormalization.js +100 -0
- package/dist/docx/unzip.d.ts +118 -0
- package/dist/docx/unzip.js +383 -0
- package/dist/docx/vmlImageParser.d.ts +16 -0
- package/dist/docx/vmlImageParser.js +100 -0
- package/dist/docx/watermarkParser.d.ts +45 -0
- package/dist/docx/watermarkParser.js +348 -0
- package/dist/docx/wrapTypes.d.ts +29 -0
- package/dist/docx/wrapTypes.js +48 -0
- package/dist/docx/xmlParser.d.ts +297 -0
- package/dist/docx/xmlParser.js +527 -0
- package/dist/fields/bookmarkPages.d.ts +13 -0
- package/dist/fields/bookmarkPages.js +66 -0
- package/dist/fields/bookmarkText.d.ts +16 -0
- package/dist/fields/bookmarkText.js +61 -0
- package/dist/fields/evaluateField.d.ts +23 -0
- package/dist/fields/evaluateField.js +77 -0
- package/dist/fields/fieldContext.d.ts +21 -0
- package/dist/fields/fieldContext.js +0 -0
- package/dist/fields/resolveFieldValues.d.ts +44 -0
- package/dist/fields/resolveFieldValues.js +204 -0
- package/dist/fields/sectionPageCounts.d.ts +11 -0
- package/dist/fields/sectionPageCounts.js +16 -0
- package/dist/fields/seqValues.d.ts +14 -0
- package/dist/fields/seqValues.js +36 -0
- package/dist/fonts/embeddedFontTable.d.ts +42 -0
- package/dist/fonts/embeddedFontTable.js +80 -0
- package/dist/fonts/embeddedFonts.d.ts +46 -0
- package/dist/fonts/embeddedFonts.js +112 -0
- package/dist/fonts/fontDeobfuscation.d.ts +30 -0
- package/dist/fonts/fontDeobfuscation.js +57 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +23 -0
- package/dist/layout-bridge/convert/footnoteLayout.d.ts +57 -0
- package/dist/layout-bridge/convert/footnoteLayout.js +316 -0
- package/dist/layout-bridge/convert/headerFooterLayout.d.ts +74 -0
- package/dist/layout-bridge/convert/headerFooterLayout.js +432 -0
- package/dist/layout-bridge/convert/templatePreviewFlow.d.ts +36 -0
- package/dist/layout-bridge/convert/templatePreviewFlow.js +176 -0
- package/dist/layout-bridge/convert/toFlowBlocks.d.ts +65 -0
- package/dist/layout-bridge/convert/toFlowBlocks.js +1309 -0
- package/dist/layout-bridge/convert/wrapEditorViewAsSurface.d.ts +17 -0
- package/dist/layout-bridge/convert/wrapEditorViewAsSurface.js +36 -0
- package/dist/layout-bridge/dom/clickToPositionDom.d.ts +66 -0
- package/dist/layout-bridge/dom/clickToPositionDom.js +304 -0
- package/dist/layout-bridge/dom/findBodyPmSpans.d.ts +7 -0
- package/dist/layout-bridge/dom/findBodyPmSpans.js +17 -0
- package/dist/layout-bridge/dom/findHfPmSpans.d.ts +62 -0
- package/dist/layout-bridge/dom/findHfPmSpans.js +197 -0
- package/dist/layout-bridge/engine/clickToPosition.d.ts +66 -0
- package/dist/layout-bridge/engine/clickToPosition.js +403 -0
- package/dist/layout-bridge/engine/hitTest.d.ts +135 -0
- package/dist/layout-bridge/engine/hitTest.js +375 -0
- package/dist/layout-bridge/engine/measuring/index.d.ts +10 -0
- package/dist/layout-bridge/engine/measuring/index.js +9 -0
- package/dist/layout-bridge/engine/selectionRects.d.ts +59 -0
- package/dist/layout-bridge/engine/selectionRects.js +485 -0
- package/dist/layout-bridge/engine/tableWidthUtils.d.ts +7 -0
- package/dist/layout-bridge/engine/tableWidthUtils.js +25 -0
- package/dist/layout-engine/index.d.ts +44 -0
- package/dist/layout-engine/index.js +691 -0
- package/dist/layout-engine/keep-together.d.ts +43 -0
- package/dist/layout-engine/keep-together.js +98 -0
- package/dist/layout-engine/layoutInstrumentation.d.ts +50 -0
- package/dist/layout-engine/layoutInstrumentation.js +43 -0
- package/dist/layout-engine/lineFlow.d.ts +8 -0
- package/dist/layout-engine/lineFlow.js +17 -0
- package/dist/layout-engine/measure/cache.d.ts +93 -0
- package/dist/layout-engine/measure/cache.js +245 -0
- package/dist/layout-engine/measure/clampFloatingWrapMargins.d.ts +20 -0
- package/dist/layout-engine/measure/clampFloatingWrapMargins.js +29 -0
- package/dist/layout-engine/measure/featureFlags.d.ts +44 -0
- package/dist/layout-engine/measure/featureFlags.js +19 -0
- package/dist/layout-engine/measure/floatingZones.d.ts +89 -0
- package/dist/layout-engine/measure/floatingZones.js +152 -0
- package/dist/layout-engine/measure/font-metrics.worker.d.ts +17 -0
- package/dist/layout-engine/measure/font-metrics.worker.js +104 -0
- package/dist/layout-engine/measure/index.d.ts +9 -0
- package/dist/layout-engine/measure/index.js +8 -0
- package/dist/layout-engine/measure/listMarkerWidth.d.ts +40 -0
- package/dist/layout-engine/measure/listMarkerWidth.js +76 -0
- package/dist/layout-engine/measure/measureBlocks.d.ts +25 -0
- package/dist/layout-engine/measure/measureBlocks.js +450 -0
- package/dist/layout-engine/measure/measureContainer.d.ts +24 -0
- package/dist/layout-engine/measure/measureContainer.js +280 -0
- package/dist/layout-engine/measure/measureHelpers.d.ts +82 -0
- package/dist/layout-engine/measure/measureHelpers.js +156 -0
- package/dist/layout-engine/measure/measureParagraph.d.ts +61 -0
- package/dist/layout-engine/measure/measureParagraph.js +724 -0
- package/dist/layout-engine/measure/measureProvider.d.ts +23 -0
- package/dist/layout-engine/measure/measureProvider.js +35 -0
- package/dist/layout-engine/measure/measureTypes.d.ts +61 -0
- package/dist/layout-engine/measure/measureTypes.js +0 -0
- package/dist/layout-engine/measure/measureWorker.d.ts +54 -0
- package/dist/layout-engine/measure/measureWorker.js +249 -0
- package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +88 -0
- package/dist/layout-engine/measure/measureWorkerProtocol.js +20 -0
- package/dist/layout-engine/measure/tableCellFloating.d.ts +26 -0
- package/dist/layout-engine/measure/tableCellFloating.js +99 -0
- package/dist/layout-engine/paginator.d.ts +84 -0
- package/dist/layout-engine/paginator.js +348 -0
- package/dist/layout-engine/paragraphFragmentRange.d.ts +9 -0
- package/dist/layout-engine/paragraphFragmentRange.js +40 -0
- package/dist/layout-engine/section-breaks.d.ts +78 -0
- package/dist/layout-engine/section-breaks.js +182 -0
- package/dist/layout-engine/tableRowBreak.d.ts +23 -0
- package/dist/layout-engine/tableRowBreak.js +147 -0
- package/dist/layout-engine/textBoxFlow.d.ts +50 -0
- package/dist/layout-engine/textBoxFlow.js +160 -0
- package/dist/layout-engine/types.d.ts +1031 -0
- package/dist/layout-engine/types.js +100 -0
- package/dist/layout-painter/documentColors.d.ts +4 -0
- package/dist/layout-painter/documentColors.js +40 -0
- package/dist/layout-painter/index.d.ts +110 -0
- package/dist/layout-painter/index.js +182 -0
- package/dist/layout-painter/registry/modules/image.d.ts +6 -0
- package/dist/layout-painter/registry/modules/image.js +17 -0
- package/dist/layout-painter/registry/modules/paragraph.d.ts +6 -0
- package/dist/layout-painter/registry/modules/paragraph.js +18 -0
- package/dist/layout-painter/registry/modules/table.d.ts +6 -0
- package/dist/layout-painter/registry/modules/table.js +16 -0
- package/dist/layout-painter/registry/modules/textBox.d.ts +6 -0
- package/dist/layout-painter/registry/modules/textBox.js +13 -0
- package/dist/layout-painter/registry/modules.d.ts +6 -0
- package/dist/layout-painter/registry/modules.js +26 -0
- package/dist/layout-painter/registry/registry.d.ts +24 -0
- package/dist/layout-painter/registry/registry.js +53 -0
- package/dist/layout-painter/registry/types.d.ts +61 -0
- package/dist/layout-painter/registry/types.js +0 -0
- package/dist/layout-painter/renderFragment.d.ts +32 -0
- package/dist/layout-painter/renderFragment.js +114 -0
- package/dist/layout-painter/renderImage.d.ts +88 -0
- package/dist/layout-painter/renderImage.js +130 -0
- package/dist/layout-painter/renderPage.d.ts +264 -0
- package/dist/layout-painter/renderPage.js +1795 -0
- package/dist/layout-painter/renderParagraph.d.ts +93 -0
- package/dist/layout-painter/renderParagraph.js +1300 -0
- package/dist/layout-painter/renderTable.d.ts +36 -0
- package/dist/layout-painter/renderTable.js +432 -0
- package/dist/layout-painter/renderTextBox.d.ts +22 -0
- package/dist/layout-painter/renderTextBox.js +67 -0
- package/dist/layout-painter/renderUtils.d.ts +42 -0
- package/dist/layout-painter/renderUtils.js +30 -0
- package/dist/layout-painter/renderWatermark.d.ts +16 -0
- package/dist/layout-painter/renderWatermark.js +61 -0
- package/dist/layout-painter/sdtBoundary.d.ts +6 -0
- package/dist/layout-painter/sdtBoundary.js +28 -0
- package/dist/managers/ContextMenuManager.d.ts +28 -0
- package/dist/managers/ContextMenuManager.js +48 -0
- package/dist/managers/DocumentLoaderManager.d.ts +47 -0
- package/dist/managers/DocumentLoaderManager.js +69 -0
- package/dist/managers/EditorModeManager.d.ts +28 -0
- package/dist/managers/EditorModeManager.js +50 -0
- package/dist/managers/ErrorManager.d.ts +26 -0
- package/dist/managers/ErrorManager.js +85 -0
- package/dist/managers/FindReplaceManager.d.ts +54 -0
- package/dist/managers/FindReplaceManager.js +104 -0
- package/dist/managers/HistoryManager.d.ts +92 -0
- package/dist/managers/HistoryManager.js +193 -0
- package/dist/managers/Subscribable.d.ts +34 -0
- package/dist/managers/Subscribable.js +46 -0
- package/dist/managers/TableSelectionManager.d.ts +74 -0
- package/dist/managers/TableSelectionManager.js +225 -0
- package/dist/managers/editorShortcuts.d.ts +42 -0
- package/dist/managers/editorShortcuts.js +60 -0
- package/dist/managers/types.d.ts +41 -0
- package/dist/managers/types.js +0 -0
- package/dist/markdown/annotations.d.ts +14 -0
- package/dist/markdown/annotations.js +42 -0
- package/dist/markdown/escape.d.ts +36 -0
- package/dist/markdown/escape.js +59 -0
- package/dist/markdown/fromMarkdown.d.ts +11 -0
- package/dist/markdown/fromMarkdown.js +223 -0
- package/dist/markdown/headings.d.ts +13 -0
- package/dist/markdown/headings.js +20 -0
- package/dist/markdown/images.d.ts +13 -0
- package/dist/markdown/images.js +63 -0
- package/dist/markdown/index.d.ts +18 -0
- package/dist/markdown/index.js +33 -0
- package/dist/markdown/internals.d.ts +15 -0
- package/dist/markdown/internals.js +35 -0
- package/dist/markdown/renderBlock.d.ts +7 -0
- package/dist/markdown/renderBlock.js +68 -0
- package/dist/markdown/renderParagraph.d.ts +11 -0
- package/dist/markdown/renderParagraph.js +64 -0
- package/dist/markdown/renderRuns.d.ts +11 -0
- package/dist/markdown/renderRuns.js +265 -0
- package/dist/markdown/renderTable.d.ts +8 -0
- package/dist/markdown/renderTable.js +229 -0
- package/dist/markdown/trailers.d.ts +13 -0
- package/dist/markdown/trailers.js +54 -0
- package/dist/markdown/types.d.ts +118 -0
- package/dist/markdown/types.js +0 -0
- package/dist/model.d.ts +13 -0
- package/dist/model.js +4 -0
- package/dist/paged-layout/LayoutSelectionGate.d.ts +80 -0
- package/dist/paged-layout/LayoutSelectionGate.js +131 -0
- package/dist/paged-layout/headerFooterMargins.d.ts +73 -0
- package/dist/paged-layout/headerFooterMargins.js +120 -0
- package/dist/paged-layout/hiddenEditorScroll.d.ts +4 -0
- package/dist/paged-layout/hiddenEditorScroll.js +4 -0
- package/dist/paged-layout/incrementalMeasure.d.ts +33 -0
- package/dist/paged-layout/incrementalMeasure.js +56 -0
- package/dist/paged-layout/rangeProjection.d.ts +51 -0
- package/dist/paged-layout/rangeProjection.js +153 -0
- package/dist/paged-layout/readOnlyEditAttempt.d.ts +5 -0
- package/dist/paged-layout/readOnlyEditAttempt.js +22 -0
- package/dist/paged-layout/scrollNavigation.d.ts +23 -0
- package/dist/paged-layout/scrollNavigation.js +31 -0
- package/dist/paged-layout/scrollPageInfo.d.ts +41 -0
- package/dist/paged-layout/scrollPageInfo.js +34 -0
- package/dist/paged-layout/scrollToPmPosition.d.ts +17 -0
- package/dist/paged-layout/scrollToPmPosition.js +95 -0
- package/dist/paged-layout/sectionBlockWidths.d.ts +35 -0
- package/dist/paged-layout/sectionBlockWidths.js +52 -0
- package/dist/paged-layout/sectionGeometry.d.ts +21 -0
- package/dist/paged-layout/sectionGeometry.js +36 -0
- package/dist/paged-layout/selectionViewportRect.d.ts +29 -0
- package/dist/paged-layout/selectionViewportRect.js +55 -0
- package/dist/paged-layout/tableColumnResize.d.ts +19 -0
- package/dist/paged-layout/tableColumnResize.js +28 -0
- package/dist/paged-layout/tableInsertButtonGeometry.d.ts +15 -0
- package/dist/paged-layout/tableInsertButtonGeometry.js +15 -0
- package/dist/paged-layout/transactionDirtyRange.d.ts +7 -0
- package/dist/paged-layout/transactionDirtyRange.js +27 -0
- package/dist/paged-layout/zoomScrollAnchor.d.ts +40 -0
- package/dist/paged-layout/zoomScrollAnchor.js +25 -0
- package/dist/prosemirror/attrs/index.d.ts +80 -0
- package/dist/prosemirror/attrs/index.js +1218 -0
- package/dist/prosemirror/autospacingBase.d.ts +11 -0
- package/dist/prosemirror/autospacingBase.js +16 -0
- package/dist/prosemirror/commands/comments.d.ts +93 -0
- package/dist/prosemirror/commands/comments.js +435 -0
- package/dist/prosemirror/commands/contentControls.d.ts +45 -0
- package/dist/prosemirror/commands/contentControls.js +294 -0
- package/dist/prosemirror/commands/contentControlsBlockFill.d.ts +15 -0
- package/dist/prosemirror/commands/contentControlsBlockFill.js +19 -0
- package/dist/prosemirror/commands/formatPainter.d.ts +31 -0
- package/dist/prosemirror/commands/formatPainter.js +130 -0
- package/dist/prosemirror/commands/formatting.d.ts +32 -0
- package/dist/prosemirror/commands/formatting.js +45 -0
- package/dist/prosemirror/commands/hyperlink.d.ts +31 -0
- package/dist/prosemirror/commands/hyperlink.js +79 -0
- package/dist/prosemirror/commands/image.d.ts +59 -0
- package/dist/prosemirror/commands/image.js +219 -0
- package/dist/prosemirror/commands/index.d.ts +13 -0
- package/dist/prosemirror/commands/index.js +13 -0
- package/dist/prosemirror/commands/pageBreak.d.ts +10 -0
- package/dist/prosemirror/commands/pageBreak.js +47 -0
- package/dist/prosemirror/commands/paragraph.d.ts +39 -0
- package/dist/prosemirror/commands/paragraph.js +64 -0
- package/dist/prosemirror/commands/pastePlainText.d.ts +39 -0
- package/dist/prosemirror/commands/pastePlainText.js +67 -0
- package/dist/prosemirror/commands/table.d.ts +83 -0
- package/dist/prosemirror/commands/table.js +105 -0
- package/dist/prosemirror/conversion/fromProseDoc.d.ts +27 -0
- package/dist/prosemirror/conversion/fromProseDoc.js +1550 -0
- package/dist/prosemirror/conversion/index.d.ts +4 -0
- package/dist/prosemirror/conversion/index.js +4 -0
- package/dist/prosemirror/conversion/runShadingMark.d.ts +16 -0
- package/dist/prosemirror/conversion/runShadingMark.js +39 -0
- package/dist/prosemirror/conversion/toProseDoc.d.ts +39 -0
- package/dist/prosemirror/conversion/toProseDoc.js +1404 -0
- package/dist/prosemirror/extensions/ExtensionManager.d.ts +43 -0
- package/dist/prosemirror/extensions/ExtensionManager.js +86 -0
- package/dist/prosemirror/extensions/StarterKit.d.ts +16 -0
- package/dist/prosemirror/extensions/StarterKit.js +132 -0
- package/dist/prosemirror/extensions/core/DocExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/core/DocExtension.js +12 -0
- package/dist/prosemirror/extensions/core/HistoryExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/core/HistoryExtension.js +28 -0
- package/dist/prosemirror/extensions/core/ParagraphExtension.d.ts +25 -0
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +619 -0
- package/dist/prosemirror/extensions/core/TextExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/core/TextExtension.js +12 -0
- package/dist/prosemirror/extensions/create.d.ts +17 -0
- package/dist/prosemirror/extensions/create.js +129 -0
- package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +106 -0
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.d.ts +8 -0
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +172 -0
- package/dist/prosemirror/extensions/features/BidiShortcutExtension.d.ts +16 -0
- package/dist/prosemirror/extensions/features/BidiShortcutExtension.js +38 -0
- package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.d.ts +16 -0
- package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.js +21 -0
- package/dist/prosemirror/extensions/features/DropCursorExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/features/DropCursorExtension.js +20 -0
- package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.d.ts +8 -0
- package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.js +44 -0
- package/dist/prosemirror/extensions/features/GapCursorExtension.d.ts +19 -0
- package/dist/prosemirror/extensions/features/GapCursorExtension.js +24 -0
- package/dist/prosemirror/extensions/features/ImageDragExtension.d.ts +15 -0
- package/dist/prosemirror/extensions/features/ImageDragExtension.js +66 -0
- package/dist/prosemirror/extensions/features/ImagePasteExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/features/ImagePasteExtension.js +91 -0
- package/dist/prosemirror/extensions/features/ListExtension.d.ts +14 -0
- package/dist/prosemirror/extensions/features/ListExtension.js +340 -0
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +60 -0
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +35 -0
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +188 -0
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +20 -0
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +34 -0
- package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.d.ts +20 -0
- package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.js +145 -0
- package/dist/prosemirror/extensions/features/SelectionTrackerExtension.d.ts +10 -0
- package/dist/prosemirror/extensions/features/SelectionTrackerExtension.js +17 -0
- package/dist/prosemirror/extensions/features/bidiShortcutController.d.ts +31 -0
- package/dist/prosemirror/extensions/features/bidiShortcutController.js +27 -0
- package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +31 -0
- package/dist/prosemirror/extensions/features/pasteCleanup.js +159 -0
- package/dist/prosemirror/extensions/marks/AllCapsExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/AllCapsExtension.js +24 -0
- package/dist/prosemirror/extensions/marks/BoldExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/BoldExtension.js +41 -0
- package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.d.ts +14 -0
- package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.js +64 -0
- package/dist/prosemirror/extensions/marks/CharacterStyleExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/marks/CharacterStyleExtension.js +47 -0
- package/dist/prosemirror/extensions/marks/CommentExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/marks/CommentExtension.js +38 -0
- package/dist/prosemirror/extensions/marks/FontFamilyExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/FontFamilyExtension.js +55 -0
- package/dist/prosemirror/extensions/marks/FontSizeExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/FontSizeExtension.js +47 -0
- package/dist/prosemirror/extensions/marks/FootnoteRefExtension.d.ts +11 -0
- package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +92 -0
- package/dist/prosemirror/extensions/marks/HiddenTextExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/marks/HiddenTextExtension.js +35 -0
- package/dist/prosemirror/extensions/marks/HighlightExtension.d.ts +10 -0
- package/dist/prosemirror/extensions/marks/HighlightExtension.js +115 -0
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +146 -0
- package/dist/prosemirror/extensions/marks/ItalicExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/ItalicExtension.js +34 -0
- package/dist/prosemirror/extensions/marks/RtlExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/RtlExtension.js +21 -0
- package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.d.ts +11 -0
- package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.js +75 -0
- package/dist/prosemirror/extensions/marks/RunShadingExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/RunShadingExtension.js +38 -0
- package/dist/prosemirror/extensions/marks/SmallCapsExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SmallCapsExtension.js +24 -0
- package/dist/prosemirror/extensions/marks/StrikeExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/StrikeExtension.js +33 -0
- package/dist/prosemirror/extensions/marks/SubscriptExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SubscriptExtension.js +25 -0
- package/dist/prosemirror/extensions/marks/SuperscriptExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SuperscriptExtension.js +25 -0
- package/dist/prosemirror/extensions/marks/TextColorExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/TextColorExtension.js +50 -0
- package/dist/prosemirror/extensions/marks/TextEffectExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/TextEffectExtension.js +35 -0
- package/dist/prosemirror/extensions/marks/TextEffectsExtensions.d.ts +31 -0
- package/dist/prosemirror/extensions/marks/TextEffectsExtensions.js +134 -0
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.d.ts +22 -0
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +113 -0
- package/dist/prosemirror/extensions/marks/UnderlineExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/UnderlineExtension.js +60 -0
- package/dist/prosemirror/extensions/marks/markUtils.d.ts +34 -0
- package/dist/prosemirror/extensions/marks/markUtils.js +233 -0
- package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +22 -0
- package/dist/prosemirror/extensions/nodes/BlockSdtExtension.js +122 -0
- package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/nodes/FieldExtension.js +87 -0
- package/dist/prosemirror/extensions/nodes/HardBreakExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/HardBreakExtension.js +38 -0
- package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.js +18 -0
- package/dist/prosemirror/extensions/nodes/ImageExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/ImageExtension.js +132 -0
- package/dist/prosemirror/extensions/nodes/MathExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/nodes/MathExtension.js +56 -0
- package/dist/prosemirror/extensions/nodes/PageBreakExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/PageBreakExtension.js +20 -0
- package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/nodes/SdtExtension.js +107 -0
- package/dist/prosemirror/extensions/nodes/ShapeExtension.d.ts +30 -0
- package/dist/prosemirror/extensions/nodes/ShapeExtension.js +502 -0
- package/dist/prosemirror/extensions/nodes/TabExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/TabExtension.js +27 -0
- package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +34 -0
- package/dist/prosemirror/extensions/nodes/TableExtension.js +1972 -0
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.d.ts +34 -0
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +150 -0
- package/dist/prosemirror/extensions/types.d.ts +101 -0
- package/dist/prosemirror/extensions/types.js +10 -0
- package/dist/prosemirror/findReplaceSelection.d.ts +23 -0
- package/dist/prosemirror/findReplaceSelection.js +86 -0
- package/dist/prosemirror/index.d.ts +25 -0
- package/dist/prosemirror/index.js +23 -0
- package/dist/prosemirror/insertOperations.d.ts +12 -0
- package/dist/prosemirror/insertOperations.js +19 -0
- package/dist/prosemirror/paragraphDirection.d.ts +42 -0
- package/dist/prosemirror/paragraphDirection.js +33 -0
- package/dist/prosemirror/plugins/aiCitationDecorations.d.ts +40 -0
- package/dist/prosemirror/plugins/aiCitationDecorations.js +90 -0
- package/dist/prosemirror/plugins/aiSuggestionDecorations.d.ts +42 -0
- package/dist/prosemirror/plugins/aiSuggestionDecorations.js +135 -0
- package/dist/prosemirror/plugins/anonymizationDecorations.d.ts +60 -0
- package/dist/prosemirror/plugins/anonymizationDecorations.js +120 -0
- package/dist/prosemirror/plugins/autocompleteSuggestion.d.ts +123 -0
- package/dist/prosemirror/plugins/autocompleteSuggestion.js +283 -0
- package/dist/prosemirror/plugins/contentControlWidgets.d.ts +56 -0
- package/dist/prosemirror/plugins/contentControlWidgets.js +192 -0
- package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +37 -0
- package/dist/prosemirror/plugins/createDocScanPlugin.js +55 -0
- package/dist/prosemirror/plugins/documentStyles.d.ts +18 -0
- package/dist/prosemirror/plugins/documentStyles.js +46 -0
- package/dist/prosemirror/plugins/index.d.ts +3 -0
- package/dist/prosemirror/plugins/index.js +3 -0
- package/dist/prosemirror/plugins/pmTextScan.d.ts +19 -0
- package/dist/prosemirror/plugins/pmTextScan.js +39 -0
- package/dist/prosemirror/plugins/selectionTracker.d.ts +43 -0
- package/dist/prosemirror/plugins/selectionTracker.js +179 -0
- package/dist/prosemirror/plugins/suggestionMode.d.ts +70 -0
- package/dist/prosemirror/plugins/suggestionMode.js +489 -0
- package/dist/prosemirror/plugins/templateDirectives.d.ts +25 -0
- package/dist/prosemirror/plugins/templateDirectives.js +67 -0
- package/dist/prosemirror/plugins/templatePreviewValues.d.ts +49 -0
- package/dist/prosemirror/plugins/templatePreviewValues.js +117 -0
- package/dist/prosemirror/plugins/templateSlashMenu.d.ts +57 -0
- package/dist/prosemirror/plugins/templateSlashMenu.js +184 -0
- package/dist/prosemirror/schema/index.d.ts +15 -0
- package/dist/prosemirror/schema/index.js +20 -0
- package/dist/prosemirror/schema/marks.d.ts +118 -0
- package/dist/prosemirror/schema/marks.js +0 -0
- package/dist/prosemirror/schema/nodes.d.ts +389 -0
- package/dist/prosemirror/schema/nodes.js +0 -0
- package/dist/prosemirror/selectionState.d.ts +23 -0
- package/dist/prosemirror/selectionState.js +111 -0
- package/dist/prosemirror/styles/index.d.ts +2 -0
- package/dist/prosemirror/styles/index.js +2 -0
- package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +32 -0
- package/dist/prosemirror/styles/resolvedStyleAttrs.js +108 -0
- package/dist/prosemirror/styles/styleResolver.d.ts +94 -0
- package/dist/prosemirror/styles/styleResolver.js +200 -0
- package/dist/prosemirror/utils/findParagraphByParaId.d.ts +26 -0
- package/dist/prosemirror/utils/findParagraphByParaId.js +37 -0
- package/dist/prosemirror/utils/tabCalculator.d.ts +110 -0
- package/dist/prosemirror/utils/tabCalculator.js +137 -0
- package/dist/prosemirror/validation.d.ts +20 -0
- package/dist/prosemirror/validation.js +177 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.js +6 -0
- package/dist/style-engine/index.d.ts +3 -0
- package/dist/style-engine/index.js +2 -0
- package/dist/style-engine/styleEngine.d.ts +67 -0
- package/dist/style-engine/styleEngine.js +70 -0
- package/dist/types/block-id.d.ts +58 -0
- package/dist/types/block-id.js +61 -0
- package/dist/types/colors.d.ts +2 -0
- package/dist/types/colors.js +0 -0
- package/dist/types/content.d.ts +2 -0
- package/dist/types/content.js +0 -0
- package/dist/types/document.d.ts +7 -0
- package/dist/types/document.js +0 -0
- package/dist/types/documentEnumValues.d.ts +89 -0
- package/dist/types/documentEnumValues.js +693 -0
- package/dist/types/formatting.d.ts +2 -0
- package/dist/types/formatting.js +0 -0
- package/dist/types/index.d.ts +107 -0
- package/dist/types/index.js +0 -0
- package/dist/utils/authorColors.d.ts +16 -0
- package/dist/utils/authorColors.js +30 -0
- package/dist/utils/baseDirection.d.ts +23 -0
- package/dist/utils/baseDirection.js +34 -0
- package/dist/utils/clipboard.d.ts +126 -0
- package/dist/utils/clipboard.js +622 -0
- package/dist/utils/colorResolver.d.ts +158 -0
- package/dist/utils/colorResolver.js +557 -0
- package/dist/utils/createDocument.d.ts +50 -0
- package/dist/utils/createDocument.js +262 -0
- package/dist/utils/documentLoaderBehavior.d.ts +22 -0
- package/dist/utils/documentLoaderBehavior.js +14 -0
- package/dist/utils/docxInput.d.ts +22 -0
- package/dist/utils/docxInput.js +16 -0
- package/dist/utils/domGuards.d.ts +59 -0
- package/dist/utils/domGuards.js +82 -0
- package/dist/utils/fontFamilyMerge.d.ts +7 -0
- package/dist/utils/fontFamilyMerge.js +31 -0
- package/dist/utils/fontLoader.d.ts +50 -0
- package/dist/utils/fontLoader.js +177 -0
- package/dist/utils/fontResolver.d.ts +61 -0
- package/dist/utils/fontResolver.js +651 -0
- package/dist/utils/fontWeights.d.ts +4 -0
- package/dist/utils/fontWeights.js +4 -0
- package/dist/utils/formatToStyle.d.ts +103 -0
- package/dist/utils/formatToStyle.js +289 -0
- package/dist/utils/headerFooter.d.ts +74 -0
- package/dist/utils/headerFooter.js +257 -0
- package/dist/utils/headingCollector.d.ts +22 -0
- package/dist/utils/headingCollector.js +36 -0
- package/dist/utils/hexId.d.ts +33 -0
- package/dist/utils/hexId.js +37 -0
- package/dist/utils/imageValidation.d.ts +5 -0
- package/dist/utils/imageValidation.js +31 -0
- package/dist/utils/paragraphFormattingMerge.d.ts +14 -0
- package/dist/utils/paragraphFormattingMerge.js +68 -0
- package/dist/utils/replaceText.d.ts +17 -0
- package/dist/utils/replaceText.js +161 -0
- package/dist/utils/rotationBoundingBox.d.ts +12 -0
- package/dist/utils/rotationBoundingBox.js +36 -0
- package/dist/utils/scriptSegments.d.ts +36 -0
- package/dist/utils/scriptSegments.js +52 -0
- package/dist/utils/tableOperations.d.ts +87 -0
- package/dist/utils/tableOperations.js +259 -0
- package/dist/utils/textFormattingMerge.d.ts +6 -0
- package/dist/utils/textFormattingMerge.js +31 -0
- package/dist/utils/tiffConverter.d.ts +18 -0
- package/dist/utils/tiffConverter.js +83 -0
- package/dist/utils/units.d.ts +99 -0
- package/dist/utils/units.js +139 -0
- package/dist/utils/urlSecurity.d.ts +7 -0
- package/dist/utils/urlSecurity.js +65 -0
- package/dist/watermark/index.d.ts +39 -0
- package/dist/watermark/index.js +149 -0
- package/package.json +122 -2
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { hasUnsynthesizedReplyRanges } from "./commentReplyMarkers.js";
|
|
2
|
+
import { RELATIONSHIP_TYPES } from "./relsParser.js";
|
|
3
|
+
import { validateFolioDocumentModel } from "./modelValidation.js";
|
|
4
|
+
import { parseNumbering } from "./numberingParser.js";
|
|
5
|
+
import { buildPatchedDocumentXml, buildPatchedNoteXml, buildPatchedNumberingXml, collectChangedNumberingDefs, collectParaIds } from "./selectiveXmlPatch.js";
|
|
6
|
+
import { ensureThreadedCommentParaIds, serializeComments, serializeCommentsExtended } from "./serializer/commentSerializer.js";
|
|
7
|
+
import { serializeDocument } from "./serializer/documentSerializer.js";
|
|
8
|
+
import { serializeEndnotes, serializeFootnotes } from "./serializer/noteSerializer.js";
|
|
9
|
+
import { serializeNumberingXml } from "./serializer/numberingSerializer.js";
|
|
10
|
+
import { COMMENTS_CONTENT_TYPE, COMMENTS_EXTENDED_PART_LOWER, addCommentsExtendedOverride, addCommentsExtendedRelationship, applyUpdatesToZip, collectHeaderFooterUpdates, findMaxRId, hasModelDrivenPictureWatermark, hasUnmaterializedHeaderFooter, updateCoreProperties } from "./rezip.js";
|
|
11
|
+
import { parseCommentsExtended } from "./commentParser.js";
|
|
12
|
+
import "./selectiveSaveFlags.js";
|
|
13
|
+
//#region src/docx/selectiveSave.ts
|
|
14
|
+
const SYNTHETIC_IMAGE_RID_PREFIX = "rId_img_";
|
|
15
|
+
/**
|
|
16
|
+
* Check if document content has new images (data: URL without rId) or
|
|
17
|
+
* new hyperlinks (href without rId). Combined into a single traversal
|
|
18
|
+
* to avoid walking the block tree twice.
|
|
19
|
+
*/
|
|
20
|
+
function hasNewImagesOrHyperlinks(blocks) {
|
|
21
|
+
const runHasNewImage = (run) => run.content.some((c) => c.type === "drawing" && c.image?.src?.startsWith("data:") === true && (!c.image.rId || c.image.rId.startsWith(SYNTHETIC_IMAGE_RID_PREFIX)));
|
|
22
|
+
for (const block of blocks) if (block.type === "paragraph") {
|
|
23
|
+
for (const item of block.content) if (item.type === "run") {
|
|
24
|
+
if (runHasNewImage(item)) return true;
|
|
25
|
+
} else if (item.type === "hyperlink" && item.href && !item.rId && !item.anchor) return true;
|
|
26
|
+
else if (item.type === "insertion" || item.type === "deletion" || item.type === "moveFrom" || item.type === "moveTo") {
|
|
27
|
+
for (const sub of item.content) if (sub.type === "run" && runHasNewImage(sub)) return true;
|
|
28
|
+
}
|
|
29
|
+
} else if (block.type === "table") {
|
|
30
|
+
for (const row of block.rows) for (const cell of row.cells) if (hasNewImagesOrHyperlinks(cell.content)) return true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Splice edited footnote/endnote paragraphs into their parts and return the
|
|
36
|
+
* candidate ids that could NOT be routed to a note part (an id that is neither
|
|
37
|
+
* a body nor a note paragraph — the caller bails on those).
|
|
38
|
+
*
|
|
39
|
+
* The document model only retains the normal notes, so this never rewrites a
|
|
40
|
+
* whole note part (that would drop the separator notes the model omits): it
|
|
41
|
+
* splices only the edited note paragraphs by `paraId` via
|
|
42
|
+
* {@link buildPatchedNoteXml}, keeping separators and unedited notes byte-exact.
|
|
43
|
+
*
|
|
44
|
+
* Returns null to signal the caller should bail to a full repack (a note
|
|
45
|
+
* paragraph could not be spliced safely).
|
|
46
|
+
*/
|
|
47
|
+
async function patchNoteParts(zip, doc, candidateIds, updates) {
|
|
48
|
+
const footnotes = doc.package.footnotes ?? [];
|
|
49
|
+
const endnotes = doc.package.endnotes ?? [];
|
|
50
|
+
const remainingIds = new Set(candidateIds);
|
|
51
|
+
if (footnotes.length === 0 && endnotes.length === 0) return remainingIds;
|
|
52
|
+
const findPart = (conventionalLowerPath) => {
|
|
53
|
+
const direct = zip.file(conventionalLowerPath);
|
|
54
|
+
if (direct) return direct;
|
|
55
|
+
for (const [path, file] of Object.entries(zip.files)) if (!file.dir && path.toLowerCase() === conventionalLowerPath) return file;
|
|
56
|
+
return null;
|
|
57
|
+
};
|
|
58
|
+
const patchPart = async (conventionalLowerPath, serialize) => {
|
|
59
|
+
const file = findPart(conventionalLowerPath);
|
|
60
|
+
if (!file) return true;
|
|
61
|
+
const originalXml = await file.async("text");
|
|
62
|
+
const originalIds = collectParaIds(originalXml);
|
|
63
|
+
const partIds = /* @__PURE__ */ new Set();
|
|
64
|
+
for (const id of remainingIds) if (originalIds.has(id)) partIds.add(id);
|
|
65
|
+
if (partIds.size === 0) return true;
|
|
66
|
+
const patched = buildPatchedNoteXml(originalXml, serialize(), partIds);
|
|
67
|
+
if (patched === null) return false;
|
|
68
|
+
updates.set(file.name, patched);
|
|
69
|
+
for (const id of partIds) remainingIds.delete(id);
|
|
70
|
+
return true;
|
|
71
|
+
};
|
|
72
|
+
if (footnotes.length > 0 && !await patchPart("word/footnotes.xml", () => serializeFootnotes(footnotes))) return null;
|
|
73
|
+
if (endnotes.length > 0 && !await patchPart("word/endnotes.xml", () => serializeEndnotes(endnotes))) return null;
|
|
74
|
+
return remainingIds;
|
|
75
|
+
}
|
|
76
|
+
const findZipEntryCaseInsensitive = (zip, lowerPath) => {
|
|
77
|
+
const direct = zip.file(lowerPath);
|
|
78
|
+
if (direct) return direct;
|
|
79
|
+
for (const [path, file] of Object.entries(zip.files)) if (!file.dir && path.toLowerCase() === lowerPath) return file;
|
|
80
|
+
return null;
|
|
81
|
+
};
|
|
82
|
+
const commentsExtendedInfoEqual = (a, b) => {
|
|
83
|
+
if (a.size !== b.size) return false;
|
|
84
|
+
for (const [paraId, infoA] of a) {
|
|
85
|
+
const infoB = b.get(paraId);
|
|
86
|
+
if (!infoB || infoA.parentParaId !== infoB.parentParaId || (infoA.done ?? false) !== (infoB.done ?? false)) return false;
|
|
87
|
+
}
|
|
88
|
+
return true;
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Reconcile commentsExtended.xml on the selective path. Returns `false` to
|
|
92
|
+
* signal the caller must bail to a full repack (which owns removing / rewiring
|
|
93
|
+
* the part + content-type + relationship as a unit); `true` when the part is
|
|
94
|
+
* unchanged or was safely patched into `updates`.
|
|
95
|
+
*
|
|
96
|
+
* - Threading unchanged (compared through the same parser, so attribute-order
|
|
97
|
+
* noise is ignored): leave the part byte-exact.
|
|
98
|
+
* - Threading removed (no desired part but a baseline exists): bail — removing
|
|
99
|
+
* the part plus its dangling override/relationship cleanly is the full
|
|
100
|
+
* repack's job.
|
|
101
|
+
* - Threading changed: write the part and ensure its override + relationship,
|
|
102
|
+
* bailing if the packaging files needed to wire it are absent.
|
|
103
|
+
*/
|
|
104
|
+
async function patchCommentsExtended(zip, comments, updates) {
|
|
105
|
+
const desiredXml = serializeCommentsExtended(comments);
|
|
106
|
+
const existing = findZipEntryCaseInsensitive(zip, COMMENTS_EXTENDED_PART_LOWER);
|
|
107
|
+
if (!desiredXml) return existing === null;
|
|
108
|
+
const baselineInfo = existing ? parseCommentsExtended(await existing.async("text")) : /* @__PURE__ */ new Map();
|
|
109
|
+
if (commentsExtendedInfoEqual(parseCommentsExtended(desiredXml), baselineInfo)) return true;
|
|
110
|
+
updates.set(existing?.name ?? "word/commentsExtended.xml", desiredXml);
|
|
111
|
+
return ensureCommentsExtendedPackaging(zip, updates);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Add the content-type override + relationship for commentsExtended.xml if
|
|
115
|
+
* absent, composing over any pending `updates`. Returns `false` when a packaging
|
|
116
|
+
* file needed to wire the part is missing (the caller then bails to full repack
|
|
117
|
+
* rather than write a part nothing references).
|
|
118
|
+
*/
|
|
119
|
+
async function ensureCommentsExtendedPackaging(zip, updates) {
|
|
120
|
+
const ctPath = "[Content_Types].xml";
|
|
121
|
+
const ctXml = updates.get(ctPath) ?? await zip.file(ctPath)?.async("text");
|
|
122
|
+
if (ctXml === void 0) return false;
|
|
123
|
+
const nextCt = addCommentsExtendedOverride(ctXml);
|
|
124
|
+
if (nextCt !== ctXml) updates.set(ctPath, nextCt);
|
|
125
|
+
const relsPath = "word/_rels/document.xml.rels";
|
|
126
|
+
const relsXml = updates.get(relsPath) ?? await zip.file(relsPath)?.async("text");
|
|
127
|
+
if (relsXml === void 0) return false;
|
|
128
|
+
const nextRels = addCommentsExtendedRelationship(relsXml);
|
|
129
|
+
if (nextRels !== relsXml) updates.set(relsPath, nextRels);
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Splice edited numbering definitions into word/numbering.xml when the model's
|
|
134
|
+
* numbering differs from the original part.
|
|
135
|
+
*
|
|
136
|
+
* Numbering definitions carry no `paraId`, so this is NOT keyed off
|
|
137
|
+
* `changedParaIds` — it always runs (like the comments/header updates) and uses
|
|
138
|
+
* a re-parse+re-serialize baseline to detect which `w:abstractNum` / `w:num`
|
|
139
|
+
* definitions actually changed. The model omits parts of numbering.xml
|
|
140
|
+
* (`w:nsid`/`w:tmpl`, custom formats, level sub-elements), so only the changed
|
|
141
|
+
* definitions are spliced by id; every other definition stays byte-exact.
|
|
142
|
+
*
|
|
143
|
+
* Any absent numbering part, unchanged numbering, or unsplittable edit leaves
|
|
144
|
+
* the original part untouched — the file is simply not added to `updates`.
|
|
145
|
+
*/
|
|
146
|
+
async function patchNumberingPart(zip, doc, updates) {
|
|
147
|
+
const numbering = doc.package.numbering;
|
|
148
|
+
if (!numbering || numbering.abstractNums.length === 0 && numbering.nums.length === 0) return;
|
|
149
|
+
const conventionalLowerPath = "word/numbering.xml";
|
|
150
|
+
let file = zip.file(conventionalLowerPath);
|
|
151
|
+
if (!file) {
|
|
152
|
+
for (const [path, entry] of Object.entries(zip.files)) if (!entry.dir && path.toLowerCase() === conventionalLowerPath) {
|
|
153
|
+
file = entry;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (!file) return;
|
|
158
|
+
const originalXml = await file.async("text");
|
|
159
|
+
const baselineXml = serializeNumberingXml(parseNumbering(originalXml).definitions);
|
|
160
|
+
const currentXml = serializeNumberingXml(numbering);
|
|
161
|
+
const changed = collectChangedNumberingDefs(baselineXml, currentXml);
|
|
162
|
+
if (changed.abstractNums.size === 0 && changed.nums.size === 0) return;
|
|
163
|
+
const patched = buildPatchedNumberingXml(originalXml, currentXml, changed);
|
|
164
|
+
if (patched === null) return;
|
|
165
|
+
updates.set(file.name, patched);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Attempt a selective save — patch only changed paragraphs in document.xml.
|
|
169
|
+
* Also updates comments, headers/footers, and core properties so that
|
|
170
|
+
* all document parts stay in sync even when only paragraphs are patched.
|
|
171
|
+
*
|
|
172
|
+
* Returns the saved ArrayBuffer, or null if selective save is not possible
|
|
173
|
+
* (caller should fall back to full repack).
|
|
174
|
+
*/
|
|
175
|
+
async function attemptSelectiveSave(doc, originalBuffer, options) {
|
|
176
|
+
const { changedParaIds, structuralChange, hasUntrackedChanges } = options;
|
|
177
|
+
const maxBytes = options.maxBytes ?? 104857600;
|
|
178
|
+
if (structuralChange) return null;
|
|
179
|
+
if (hasUntrackedChanges) return null;
|
|
180
|
+
if (originalBuffer.byteLength > maxBytes) return null;
|
|
181
|
+
const content = doc.package.document.content;
|
|
182
|
+
if (hasNewImagesOrHyperlinks(content)) return null;
|
|
183
|
+
if (hasUnmaterializedHeaderFooter(doc)) return null;
|
|
184
|
+
if (hasModelDrivenPictureWatermark(doc)) return null;
|
|
185
|
+
if (hasUnsynthesizedReplyRanges(doc)) return null;
|
|
186
|
+
if (!validateFolioDocumentModel(doc).valid) return null;
|
|
187
|
+
const comments = doc.package.document.comments ?? [];
|
|
188
|
+
const hasComments = comments.length > 0;
|
|
189
|
+
const headerFooterUpdates = collectHeaderFooterUpdates(doc);
|
|
190
|
+
try {
|
|
191
|
+
const zip = await (await import("jszip")).default.loadAsync(originalBuffer);
|
|
192
|
+
const updates = /* @__PURE__ */ new Map();
|
|
193
|
+
if (changedParaIds.size > 0) {
|
|
194
|
+
const docXmlFile = zip.file("word/document.xml");
|
|
195
|
+
if (!docXmlFile) return null;
|
|
196
|
+
const originalDocXml = await docXmlFile.async("text");
|
|
197
|
+
const bodyParaIds = collectParaIds(originalDocXml);
|
|
198
|
+
const bodyChangedIds = /* @__PURE__ */ new Set();
|
|
199
|
+
const noteCandidateIds = /* @__PURE__ */ new Set();
|
|
200
|
+
for (const id of changedParaIds) if (bodyParaIds.has(id)) bodyChangedIds.add(id);
|
|
201
|
+
else noteCandidateIds.add(id);
|
|
202
|
+
if (noteCandidateIds.size > 0) {
|
|
203
|
+
const unrouted = await patchNoteParts(zip, doc, noteCandidateIds, updates);
|
|
204
|
+
if (unrouted === null || unrouted.size > 0) return null;
|
|
205
|
+
}
|
|
206
|
+
if (bodyChangedIds.size > 0) {
|
|
207
|
+
const patchedDocXml = buildPatchedDocumentXml(originalDocXml, serializeDocument(doc), bodyChangedIds);
|
|
208
|
+
if (!patchedDocXml) return null;
|
|
209
|
+
updates.set("word/document.xml", patchedDocXml);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const hadCommentsFile = zip.file("word/comments.xml") !== null;
|
|
213
|
+
if (hasComments || hadCommentsFile) {
|
|
214
|
+
ensureThreadedCommentParaIds(comments);
|
|
215
|
+
updates.set("word/comments.xml", serializeComments(comments));
|
|
216
|
+
}
|
|
217
|
+
if (hasComments) {
|
|
218
|
+
const ctFile = zip.file("[Content_Types].xml");
|
|
219
|
+
if (ctFile) {
|
|
220
|
+
const ctXml = await ctFile.async("text");
|
|
221
|
+
if (!ctXml.includes("/word/comments.xml")) updates.set("[Content_Types].xml", ctXml.replace("</Types>", `<Override PartName="/word/comments.xml" ContentType="${COMMENTS_CONTENT_TYPE}"/></Types>`));
|
|
222
|
+
}
|
|
223
|
+
const relsPath = "word/_rels/document.xml.rels";
|
|
224
|
+
const relsFile = zip.file(relsPath);
|
|
225
|
+
if (relsFile) {
|
|
226
|
+
const relsXml = await relsFile.async("text");
|
|
227
|
+
if (!relsXml.includes("comments.xml")) {
|
|
228
|
+
const maxId = findMaxRId(relsXml);
|
|
229
|
+
updates.set(relsPath, relsXml.replace("</Relationships>", `<Relationship Id="rId${maxId + 1}" Type="${RELATIONSHIP_TYPES.comments}" Target="comments.xml"/></Relationships>`));
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (!await patchCommentsExtended(zip, comments, updates)) return null;
|
|
234
|
+
await patchNumberingPart(zip, doc, updates);
|
|
235
|
+
for (const [path, xml] of headerFooterUpdates) updates.set(path, xml);
|
|
236
|
+
const corePropsFile = zip.file("docProps/core.xml");
|
|
237
|
+
if (corePropsFile) {
|
|
238
|
+
const corePropsXml = await corePropsFile.async("text");
|
|
239
|
+
updates.set("docProps/core.xml", updateCoreProperties(corePropsXml, { updateModifiedDate: true }));
|
|
240
|
+
}
|
|
241
|
+
return await applyUpdatesToZip(zip, updates);
|
|
242
|
+
} catch {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
//#endregion
|
|
247
|
+
export { attemptSelectiveSave };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region src/docx/selectiveSaveFlags.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Selective Save Feature Flags
|
|
4
|
+
*
|
|
5
|
+
* Operational controls for the selective save path. Default values keep the
|
|
6
|
+
* existing full-repack behavior in place so hosts opt in explicitly.
|
|
7
|
+
*
|
|
8
|
+
* - `selectiveSave` — gate the selective branch entirely.
|
|
9
|
+
* - `selectiveSaveTripwire` — run selective + full and compare bytes for CI
|
|
10
|
+
* observability. Never blocks the user-visible save.
|
|
11
|
+
* - `selectiveSaveMaxBytes` — refuse the selective path for original buffers
|
|
12
|
+
* above this size, since holding them in memory plus the JSZip overhead is
|
|
13
|
+
* the dominant cost.
|
|
14
|
+
*/
|
|
15
|
+
type FolioSelectiveSaveFlags = {
|
|
16
|
+
/** Enable the selective save path. Default: false (full repack only). */selectiveSave?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Run selective save and full repack on every save, compare bytes, and emit
|
|
19
|
+
* a `TripwireResult` via `onSelectiveSaveTripwire`. Independent of
|
|
20
|
+
* `selectiveSave`: the tripwire always observes both paths.
|
|
21
|
+
*/
|
|
22
|
+
selectiveSaveTripwire?: boolean; /** Maximum original buffer size, in bytes, for which selective save is allowed. */
|
|
23
|
+
selectiveSaveMaxBytes?: number;
|
|
24
|
+
};
|
|
25
|
+
declare const DEFAULT_SELECTIVE_SAVE_MAX_BYTES: number;
|
|
26
|
+
type ResolvedSelectiveSaveFlags = {
|
|
27
|
+
selectiveSave: boolean;
|
|
28
|
+
selectiveSaveTripwire: boolean;
|
|
29
|
+
selectiveSaveMaxBytes: number;
|
|
30
|
+
};
|
|
31
|
+
declare function resolveSelectiveSaveFlags(flags: FolioSelectiveSaveFlags | undefined): ResolvedSelectiveSaveFlags;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { DEFAULT_SELECTIVE_SAVE_MAX_BYTES, FolioSelectiveSaveFlags, ResolvedSelectiveSaveFlags, resolveSelectiveSaveFlags };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/docx/selectiveSaveFlags.ts
|
|
2
|
+
const DEFAULT_SELECTIVE_SAVE_MAX_BYTES = 100 * 1024 * 1024;
|
|
3
|
+
function resolveSelectiveSaveFlags(flags) {
|
|
4
|
+
return {
|
|
5
|
+
selectiveSave: flags?.selectiveSave ?? false,
|
|
6
|
+
selectiveSaveTripwire: flags?.selectiveSaveTripwire ?? false,
|
|
7
|
+
selectiveSaveMaxBytes: flags?.selectiveSaveMaxBytes ?? 104857600
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { DEFAULT_SELECTIVE_SAVE_MAX_BYTES, resolveSelectiveSaveFlags };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
//#region src/docx/selectiveSaveTripwire.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Selective Save Tripwire
|
|
4
|
+
*
|
|
5
|
+
* Compares the bytes produced by selective save against a full repack of the
|
|
6
|
+
* same document, so CI and local soak can detect divergence between the two
|
|
7
|
+
* paths before it reaches a user's `.docx`.
|
|
8
|
+
*
|
|
9
|
+
* Tripwire NEVER blocks a save. The host receives a structured `TripwireResult`
|
|
10
|
+
* via callback and decides what to do (log, surface as observability event,
|
|
11
|
+
* fail a CI assertion, etc.).
|
|
12
|
+
*
|
|
13
|
+
* The diff ignores `docProps/core.xml` because both paths refresh
|
|
14
|
+
* `dcterms:modified` with the current wall clock and would always disagree.
|
|
15
|
+
*/
|
|
16
|
+
type TripwireResult = {
|
|
17
|
+
kind: "match";
|
|
18
|
+
} | {
|
|
19
|
+
kind: "selective-skipped";
|
|
20
|
+
reason: string;
|
|
21
|
+
} | {
|
|
22
|
+
kind: "entry-set-diff";
|
|
23
|
+
onlyInSelective: readonly string[];
|
|
24
|
+
onlyInFull: readonly string[];
|
|
25
|
+
} | {
|
|
26
|
+
kind: "entry-byte-diff";
|
|
27
|
+
path: string;
|
|
28
|
+
selectiveSize: number;
|
|
29
|
+
fullSize: number;
|
|
30
|
+
};
|
|
31
|
+
declare function compareSelectiveVsFull(selective: ArrayBuffer | null, full: ArrayBuffer): Promise<TripwireResult>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { TripwireResult, compareSelectiveVsFull };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { panic } from "better-result";
|
|
2
|
+
//#region src/docx/selectiveSaveTripwire.ts
|
|
3
|
+
/**
|
|
4
|
+
* Selective Save Tripwire
|
|
5
|
+
*
|
|
6
|
+
* Compares the bytes produced by selective save against a full repack of the
|
|
7
|
+
* same document, so CI and local soak can detect divergence between the two
|
|
8
|
+
* paths before it reaches a user's `.docx`.
|
|
9
|
+
*
|
|
10
|
+
* Tripwire NEVER blocks a save. The host receives a structured `TripwireResult`
|
|
11
|
+
* via callback and decides what to do (log, surface as observability event,
|
|
12
|
+
* fail a CI assertion, etc.).
|
|
13
|
+
*
|
|
14
|
+
* The diff ignores `docProps/core.xml` because both paths refresh
|
|
15
|
+
* `dcterms:modified` with the current wall clock and would always disagree.
|
|
16
|
+
*/
|
|
17
|
+
const IGNORED_PATHS = /* @__PURE__ */ new Set(["docProps/core.xml"]);
|
|
18
|
+
async function listEntries(buffer) {
|
|
19
|
+
const zip = await (await import("jszip")).default.loadAsync(buffer);
|
|
20
|
+
const paths = [];
|
|
21
|
+
for (const [path, entry] of Object.entries(zip.files)) {
|
|
22
|
+
if (entry.dir) continue;
|
|
23
|
+
if (IGNORED_PATHS.has(path)) continue;
|
|
24
|
+
paths.push(path);
|
|
25
|
+
}
|
|
26
|
+
paths.sort();
|
|
27
|
+
return {
|
|
28
|
+
zip,
|
|
29
|
+
paths
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function bytesEqual(a, b) {
|
|
33
|
+
if (a.length !== b.length) return false;
|
|
34
|
+
for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
function readEntryBytes(zip, path, side) {
|
|
38
|
+
const entry = zip.file(path);
|
|
39
|
+
if (!entry) panic(`Missing ${side} zip entry: ${path}`);
|
|
40
|
+
return entry.async("uint8array");
|
|
41
|
+
}
|
|
42
|
+
function readCommonEntryBytes(selectiveZip, fullZip) {
|
|
43
|
+
return Promise.all(selectiveZip.paths.map(async (path) => {
|
|
44
|
+
const [selective, full] = await Promise.all([readEntryBytes(selectiveZip.zip, path, "selective"), readEntryBytes(fullZip.zip, path, "full")]);
|
|
45
|
+
return {
|
|
46
|
+
path,
|
|
47
|
+
selective,
|
|
48
|
+
full
|
|
49
|
+
};
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
async function compareSelectiveVsFull(selective, full) {
|
|
53
|
+
if (selective === null) return {
|
|
54
|
+
kind: "selective-skipped",
|
|
55
|
+
reason: "selective-returned-null"
|
|
56
|
+
};
|
|
57
|
+
const [selectiveZip, fullZip] = await Promise.all([listEntries(selective), listEntries(full)]);
|
|
58
|
+
const selectiveSet = new Set(selectiveZip.paths);
|
|
59
|
+
const fullSet = new Set(fullZip.paths);
|
|
60
|
+
const onlyInSelective = [];
|
|
61
|
+
const onlyInFull = [];
|
|
62
|
+
for (const path of selectiveSet) if (!fullSet.has(path)) onlyInSelective.push(path);
|
|
63
|
+
for (const path of fullSet) if (!selectiveSet.has(path)) onlyInFull.push(path);
|
|
64
|
+
if (onlyInSelective.length > 0 || onlyInFull.length > 0) return {
|
|
65
|
+
kind: "entry-set-diff",
|
|
66
|
+
onlyInSelective,
|
|
67
|
+
onlyInFull
|
|
68
|
+
};
|
|
69
|
+
const entries = await readCommonEntryBytes(selectiveZip, fullZip);
|
|
70
|
+
for (const { path, selective: selectiveBytes, full: fullBytes } of entries) if (!bytesEqual(selectiveBytes, fullBytes)) return {
|
|
71
|
+
kind: "entry-byte-diff",
|
|
72
|
+
path,
|
|
73
|
+
selectiveSize: selectiveBytes.length,
|
|
74
|
+
fullSize: fullBytes.length
|
|
75
|
+
};
|
|
76
|
+
return { kind: "match" };
|
|
77
|
+
}
|
|
78
|
+
//#endregion
|
|
79
|
+
export { compareSelectiveVsFull };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
//#region src/docx/selectiveXmlPatch.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Selective XML Patch Module
|
|
4
|
+
*
|
|
5
|
+
* Patches only changed paragraphs in document.xml, preserving
|
|
6
|
+
* unchanged content byte-for-byte. Uses string offset tracking
|
|
7
|
+
* with proper tag depth counting (not regex) to handle nested elements.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Find the exact string start and end offsets of a <w:p> element
|
|
11
|
+
* identified by its w14:paraId attribute.
|
|
12
|
+
*
|
|
13
|
+
* Handles nested <w:p> elements (e.g. inside mc:AlternateContent)
|
|
14
|
+
* via proper depth counting.
|
|
15
|
+
*
|
|
16
|
+
* Returns null if paraId not found or appears more than once (ambiguous).
|
|
17
|
+
*/
|
|
18
|
+
declare function findParagraphOffsets(xml: string, paraId: string): {
|
|
19
|
+
start: number;
|
|
20
|
+
end: number;
|
|
21
|
+
} | null;
|
|
22
|
+
/**
|
|
23
|
+
* Extract the serialized XML for a specific paragraph by paraId
|
|
24
|
+
* from a fully serialized document.xml string.
|
|
25
|
+
*/
|
|
26
|
+
declare function extractParagraphXml(serializedXml: string, paraId: string): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Count <w:p> elements in an XML string (top-level paragraph count).
|
|
29
|
+
* Counts opening <w:p tags that are NOT self-closing.
|
|
30
|
+
*/
|
|
31
|
+
declare function countParagraphElements(xml: string): number;
|
|
32
|
+
/**
|
|
33
|
+
* Find all paraIds in an XML string and return counts (to detect duplicates).
|
|
34
|
+
*/
|
|
35
|
+
declare function collectParaIds(xml: string): Map<string, number>;
|
|
36
|
+
type PatchValidationResult = {
|
|
37
|
+
safe: boolean;
|
|
38
|
+
reason?: string;
|
|
39
|
+
};
|
|
40
|
+
type PatchSafetyOptions = {
|
|
41
|
+
/**
|
|
42
|
+
* Require the original and serialized XML to hold the same number of `<w:p>`
|
|
43
|
+
* elements. Guards document.xml against structural drift. Notes disable it:
|
|
44
|
+
* the model only retains the normal notes, so a serialized note part
|
|
45
|
+
* legitimately has fewer paragraphs than the original (which still carries
|
|
46
|
+
* the separator notes). See {@link buildPatchedNoteXml}.
|
|
47
|
+
*/
|
|
48
|
+
checkParagraphCount?: boolean;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Validate that a selective patch can be safely applied.
|
|
52
|
+
*
|
|
53
|
+
* Checks:
|
|
54
|
+
* - All changed paraIds exist in original XML (exactly once)
|
|
55
|
+
* - All changed paraIds exist in serialized XML (exactly once)
|
|
56
|
+
* - Paragraph count matches between original and serialized (unless disabled)
|
|
57
|
+
*/
|
|
58
|
+
declare function validatePatchSafety(originalXml: string, serializedXml: string, changedIds: Set<string>, options?: PatchSafetyOptions): PatchValidationResult;
|
|
59
|
+
/**
|
|
60
|
+
* Build a patched document.xml by splicing new paragraph XML into
|
|
61
|
+
* the original at the correct offsets. Only changed paragraphs
|
|
62
|
+
* are replaced; everything else is preserved byte-for-byte.
|
|
63
|
+
*
|
|
64
|
+
* Returns null if any step fails.
|
|
65
|
+
*/
|
|
66
|
+
declare function buildPatchedDocumentXml(originalXml: string, serializedXml: string, changedIds: Set<string>): string | null;
|
|
67
|
+
/**
|
|
68
|
+
* Build a patched note part (word/footnotes.xml / word/endnotes.xml) by
|
|
69
|
+
* splicing edited note paragraphs into the original, preserving unchanged
|
|
70
|
+
* content byte-for-byte.
|
|
71
|
+
*
|
|
72
|
+
* Unlike {@link buildPatchedDocumentXml} this does NOT require the paragraph
|
|
73
|
+
* counts to match: the document model only retains the normal notes, so the
|
|
74
|
+
* serialized note XML omits the separator / continuationSeparator paragraphs
|
|
75
|
+
* the original part still carries. Splicing by `paraId` keeps those separators
|
|
76
|
+
* and every unedited note byte-exact while replacing only the edited ones.
|
|
77
|
+
*
|
|
78
|
+
* Returns null if any changed id is missing or ambiguous in either input, so
|
|
79
|
+
* the caller can fall back to preserving the original part verbatim.
|
|
80
|
+
*/
|
|
81
|
+
declare function buildPatchedNoteXml(originalXml: string, serializedXml: string, changedIds: Set<string>): string | null;
|
|
82
|
+
type ChangedNumberingDefs = {
|
|
83
|
+
abstractNums: Set<string>;
|
|
84
|
+
nums: Set<string>;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* The numbering definitions whose current serialization differs from the
|
|
88
|
+
* baseline (re-parsed original) serialization — the ones actually edited. An id
|
|
89
|
+
* is only considered when it resolves uniquely in BOTH inputs, so a definition
|
|
90
|
+
* added or removed relative to the original (which cannot be spliced by id) is
|
|
91
|
+
* left out; both save paths defer those to the byte-exact original part.
|
|
92
|
+
*/
|
|
93
|
+
declare function collectChangedNumberingDefs(baselineXml: string, currentXml: string): ChangedNumberingDefs;
|
|
94
|
+
/**
|
|
95
|
+
* Build a patched `word/numbering.xml` by splicing the changed `w:abstractNum` /
|
|
96
|
+
* `w:num` definitions from `currentXml` (the model's serialization) into
|
|
97
|
+
* `originalXml`, preserving every other byte. Returns the original unchanged
|
|
98
|
+
* when nothing changed, or null when a changed id cannot be resolved uniquely
|
|
99
|
+
* in either input (so the caller preserves the original part verbatim).
|
|
100
|
+
*/
|
|
101
|
+
declare function buildPatchedNumberingXml(originalXml: string, currentXml: string, changed: ChangedNumberingDefs): string | null;
|
|
102
|
+
//#endregion
|
|
103
|
+
export { ChangedNumberingDefs, PatchSafetyOptions, PatchValidationResult, buildPatchedDocumentXml, buildPatchedNoteXml, buildPatchedNumberingXml, collectChangedNumberingDefs, collectParaIds, countParagraphElements, extractParagraphXml, findParagraphOffsets, validatePatchSafety };
|