@stll/folio-core 0.46.0 → 0.47.1
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/ai-edits/apply.d.ts +17 -1
- package/dist/ai-edits/apply.js +31 -27
- package/dist/ai-edits/headless.d.ts +9 -2
- package/dist/ai-edits/headless.js +5 -3
- package/dist/ai-edits/read.d.ts +1 -0
- package/dist/ai-edits/read.js +1 -0
- package/dist/ai-edits/snapshot.js +32 -27
- package/dist/ai-edits/table-cell-mutations.js +15 -7
- package/dist/ai-edits/table-geometry.js +21 -18
- package/dist/ai-edits/table-template.js +2 -2
- package/dist/compare/compare.js +2 -1
- package/dist/compare/content-alignment.js +192 -46
- package/dist/compare/content-types.d.ts +8 -2
- package/dist/compare/content.js +2 -11
- package/dist/compare/plan.js +7 -4
- package/dist/compare/section-boundary-properties.js +1 -2
- package/dist/content-controls/checkboxDisplay.d.ts +8 -2
- package/dist/content-controls/checkboxDisplay.js +11 -5
- package/dist/content-controls/mutateContentControls.js +41 -42
- package/dist/controller/layoutPipeline.js +8 -3
- package/dist/display-list/build/buildDisplayList.js +7 -7
- package/dist/display-list/build/imagePrimitives.d.ts +4 -4
- package/dist/display-list/build/imagePrimitives.js +38 -20
- package/dist/display-list/build/pageBorderPrimitives.js +2 -1
- package/dist/display-list/build/paragraphPrimitives.js +93 -13
- package/dist/display-list/build/previewPrimitives.d.ts +10 -0
- package/dist/display-list/build/previewPrimitives.js +89 -0
- package/dist/display-list/build/strokes.d.ts +177 -8
- package/dist/display-list/build/strokes.js +167 -47
- package/dist/display-list/build/tablePrimitives.js +4 -2
- package/dist/display-list/build/textBoxPrimitives.js +6 -4
- package/dist/display-list/build/textDecorations.d.ts +15 -1
- package/dist/display-list/build/textDecorations.js +15 -1
- package/dist/display-list/dom/renderDisplayListToDom.js +1 -19
- package/dist/display-list/primitives.d.ts +13 -2
- package/dist/display-list/primitives.js +36 -1
- package/dist/document-operations.d.ts +9 -2
- package/dist/document-operations.js +5 -3
- package/dist/docx/attributeRemainder.d.ts +34 -1
- package/dist/docx/attributeRemainder.js +49 -3
- package/dist/docx/blockContentParser.d.ts +2 -0
- package/dist/docx/blockContentParser.js +39 -67
- package/dist/docx/blockPlainText.js +3 -1
- package/dist/docx/borderParser.js +26 -11
- package/dist/docx/builtInStyles.d.ts +8 -16
- package/dist/docx/builtInStyles.js +54 -17
- package/dist/docx/commentAnchorIndex.js +1 -1
- package/dist/docx/commentParser.js +3 -3
- package/dist/docx/commentRangeIntegrity.js +1 -1
- package/dist/docx/commentRangeJoin.js +1 -1
- package/dist/docx/commentReferenceNormalization.js +3 -2
- package/dist/docx/commentReplyMarkers.js +1 -1
- package/dist/docx/compatibility.js +56 -42
- package/dist/docx/containerChildren.d.ts +110 -13
- package/dist/docx/containerChildren.gen.d.ts +16 -1
- package/dist/docx/containerChildren.gen.js +18 -1
- package/dist/docx/containerChildren.js +63 -13
- package/dist/docx/diagramPreview.d.ts +14 -2
- package/dist/docx/diagramPreview.js +81 -169
- package/dist/docx/documentParser.js +4 -1
- package/dist/docx/drawingAnchor.d.ts +87 -0
- package/dist/docx/drawingAnchor.js +201 -0
- package/dist/docx/drawingUtils.d.ts +43 -38
- package/dist/docx/drawingUtils.js +205 -118
- package/dist/docx/fontTableParser.js +102 -41
- package/dist/docx/footnoteParser.js +10 -6
- package/dist/docx/groupDrawingParser.js +4 -3
- package/dist/docx/headerFooterReferenceNormalization.js +1 -1
- package/dist/docx/hyperlinkParser.d.ts +45 -7
- package/dist/docx/hyperlinkParser.js +126 -57
- package/dist/docx/imageParser.js +127 -107
- package/dist/docx/index.d.ts +2 -1
- package/dist/docx/index.js +2 -1
- package/dist/docx/inlineContentRemovals.d.ts +28 -0
- package/dist/docx/inlineContentRemovals.js +46 -0
- package/dist/docx/inlineWrapperContent.d.ts +84 -3
- package/dist/docx/inlineWrapperContent.js +85 -4
- package/dist/docx/inlineWrapperParser.d.ts +11 -0
- package/dist/docx/inlineWrapperParser.js +60 -0
- package/dist/docx/nonVisualDrawingProps.d.ts +5 -13
- package/dist/docx/normalizeBaseDirection.js +4 -2
- package/dist/docx/numberingParser.d.ts +25 -2
- package/dist/docx/numberingParser.js +264 -361
- package/dist/docx/numberingReference.d.ts +9 -16
- package/dist/docx/numberingReference.js +17 -16
- package/dist/docx/numberingReferenceNormalization.js +7 -7
- package/dist/docx/ooxmlCounterFormatter.d.ts +1 -1
- package/dist/docx/ooxmlCounterFormatter.js +4 -1
- package/dist/docx/paraIdAttribute.d.ts +91 -1
- package/dist/docx/paraIdAttribute.js +79 -1
- package/dist/docx/paragraphParser.d.ts +9 -24
- package/dist/docx/paragraphParser.js +212 -396
- package/dist/docx/paragraphProperties.d.ts +23 -0
- package/dist/docx/paragraphProperties.js +279 -0
- package/dist/docx/paragraphPropertySource.js +2 -0
- package/dist/docx/paragraphTextBoxEnrichment.d.ts +2 -1
- package/dist/docx/paragraphTextBoxEnrichment.js +14 -7
- package/dist/docx/paragraphTraversal.d.ts +14 -10
- package/dist/docx/paragraphTraversal.js +47 -49
- package/dist/docx/parseWarningMessage.js +3 -0
- package/dist/docx/parserEnums.d.ts +6 -8
- package/dist/docx/parserEnums.js +4 -6
- package/dist/docx/preservedRunContent.js +16 -6
- package/dist/docx/previewBudget.d.ts +44 -23
- package/dist/docx/previewBudget.js +61 -30
- package/dist/docx/propertyElementAttributes.d.ts +178 -0
- package/dist/docx/propertyElementAttributes.js +114 -0
- package/dist/docx/renderedPageBreakNormalization.js +2 -2
- package/dist/docx/rezip.d.ts +28 -2
- package/dist/docx/rezip.js +78 -9
- package/dist/docx/runConsolidator.d.ts +42 -2
- package/dist/docx/runConsolidator.js +60 -6
- package/dist/docx/runParser.d.ts +54 -18
- package/dist/docx/runParser.js +379 -295
- package/dist/docx/runPayload.d.ts +5 -0
- package/dist/docx/runPayload.js +4 -0
- package/dist/docx/sdtProperties.d.ts +39 -5
- package/dist/docx/sdtProperties.js +205 -84
- package/dist/docx/sdtPropertiesPatch.d.ts +5 -9
- package/dist/docx/sdtPropertiesPatch.js +68 -112
- package/dist/docx/sectionParser.d.ts +1 -2
- package/dist/docx/sectionParser.js +236 -240
- package/dist/docx/selectiveSave.js +3 -2
- package/dist/docx/selectiveXmlPatch.d.ts +21 -2
- package/dist/docx/selectiveXmlPatch.js +195 -99
- package/dist/docx/serializer/blockSdtSerializer.js +2 -96
- package/dist/docx/serializer/borderSerializer.d.ts +5 -5
- package/dist/docx/serializer/borderSerializer.js +10 -8
- package/dist/docx/serializer/documentSerializer.js +3 -0
- package/dist/docx/serializer/fontTableSerializer.js +31 -3
- package/dist/docx/serializer/headerFooterSerializer.js +3 -0
- package/dist/docx/serializer/markupRangeAttributes.d.ts +9 -1
- package/dist/docx/serializer/markupRangeAttributes.js +9 -1
- package/dist/docx/serializer/noteSerializer.js +3 -0
- package/dist/docx/serializer/numberingSerializer.d.ts +1 -6
- package/dist/docx/serializer/numberingSerializer.js +81 -79
- package/dist/docx/serializer/paragraphSerializer.d.ts +1 -9
- package/dist/docx/serializer/paragraphSerializer.js +88 -188
- package/dist/docx/serializer/runSerializer.d.ts +1 -5
- package/dist/docx/serializer/runSerializer.js +109 -59
- package/dist/docx/serializer/sdtPropertiesSerializer.d.ts +26 -0
- package/dist/docx/serializer/sdtPropertiesSerializer.js +111 -0
- package/dist/docx/serializer/sectionPropertiesSerializer.js +34 -45
- package/dist/docx/serializer/settingsSerializer.js +6 -4
- package/dist/docx/serializer/stylesSerializer.js +8 -11
- package/dist/docx/serializer/tableSerializer.js +268 -100
- package/dist/docx/serializer/textFormattingSerializer.d.ts +28 -4
- package/dist/docx/serializer/textFormattingSerializer.js +111 -101
- package/dist/docx/serializer/xmlUtils.d.ts +1 -1
- package/dist/docx/serializer/xmlUtils.js +1 -1
- package/dist/docx/server/createBilingualDocument.js +18 -16
- package/dist/docx/server/migrateYjsAttrSchema.js +3 -3
- package/dist/docx/settingsParser.js +7 -4
- package/dist/docx/shadingParser.d.ts +2 -1
- package/dist/docx/shadingParser.js +43 -7
- package/dist/docx/shapeParser.js +8 -3
- package/dist/docx/strictNames.d.ts +11 -0
- package/dist/docx/strictNames.gen.d.ts +45 -0
- package/dist/docx/strictNames.gen.js +50 -0
- package/dist/docx/strictNames.js +43 -0
- package/dist/docx/strictValueEncodings.gen.js +133 -131
- package/dist/docx/styleParser.js +17 -349
- package/dist/docx/tableParser.d.ts +10 -1
- package/dist/docx/tableParser.js +505 -181
- package/dist/docx/textBoxParser.d.ts +3 -1
- package/dist/docx/textBoxParser.js +18 -8
- package/dist/docx/themeColorAttribute.d.ts +13 -0
- package/dist/docx/themeColorAttribute.js +24 -0
- package/dist/docx/trackedMoveRangeNormalization.js +2 -1
- package/dist/docx/vmlImageParser.d.ts +13 -4
- package/dist/docx/vmlImageParser.js +74 -31
- package/dist/docx/vmlPreview.js +2 -2
- package/dist/docx/wrapPolygon.d.ts +30 -0
- package/dist/docx/wrapPolygon.js +70 -0
- package/dist/docx/xmlParser.d.ts +14 -1
- package/dist/docx/xmlParser.js +18 -2
- package/dist/fonts/embeddedFonts.js +3 -3
- package/dist/headless-layout.js +2 -0
- package/dist/i18n/messages/catalogs.gen.d.ts +68 -0
- package/dist/i18n/messages/catalogs.gen.js +102 -34
- package/dist/i18n/messages/messages.gen.d.ts +4 -0
- package/dist/internal/headlessRevisionResolution.js +9 -0
- package/dist/internal/pageBreakRunSourceDescendantIndex.js +3 -1
- package/dist/internal/paragraphFormattingSerialization.d.ts +20 -9
- package/dist/internal/paragraphFormattingSerialization.js +118 -83
- package/dist/layout-bridge/convert/footnoteLayout.d.ts +1 -0
- package/dist/layout-bridge/convert/footnoteLayout.js +1 -0
- package/dist/layout-bridge/convert/headerFooterLayout.d.ts +1 -0
- package/dist/layout-bridge/convert/headerFooterLayout.js +2 -0
- package/dist/layout-bridge/convert/toFlowBlocks.d.ts +17 -12
- package/dist/layout-bridge/convert/toFlowBlocks.js +177 -101
- package/dist/layout-engine/index.d.ts +2 -2
- package/dist/layout-engine/index.js +53 -17
- package/dist/layout-engine/measure/measureBlocks.d.ts +3 -0
- package/dist/layout-engine/measure/measureBlocks.js +6 -10
- package/dist/layout-engine/measure/tableCellGrid.js +2 -1
- package/dist/layout-engine/measure/tableFragmentBorderGeometry.js +2 -1
- package/dist/layout-engine/measure/tableInlinePlacement.js +2 -5
- package/dist/layout-engine/paragraphSequence.js +3 -2
- package/dist/layout-engine/renderedBreakReconciliation.js +2 -1
- package/dist/layout-engine/section-breaks.d.ts +49 -2
- package/dist/layout-engine/section-breaks.js +55 -4
- package/dist/layout-engine/types.d.ts +47 -17
- package/dist/layout-engine/types.js +16 -1
- package/dist/layout-painter/borderStroke.d.ts +18 -4
- package/dist/layout-painter/renderPage.js +6 -4
- package/dist/layout-painter/renderParagraph.d.ts +2 -1
- package/dist/layout-painter/renderParagraph.js +13 -26
- package/dist/layout-painter/renderTable.d.ts +4 -1
- package/dist/layout-painter/renderTable.js +22 -22
- package/dist/layout-painter/renderTextBox.js +5 -3
- package/dist/markdown/renderBlock.js +3 -1
- package/dist/markdown/renderRuns.js +7 -2
- package/dist/markdown/renderTable.js +2 -1
- package/dist/model.d.ts +3 -3
- package/dist/model.js +2 -2
- package/dist/paged-layout/sectionBlockWidths.d.ts +3 -0
- package/dist/paged-layout/sectionBlockWidths.js +26 -4
- package/dist/prosemirror/attrs/index.d.ts +22 -4
- package/dist/prosemirror/attrs/index.js +498 -60
- package/dist/prosemirror/bookmarkBoundaryAttrs.d.ts +9 -1
- package/dist/prosemirror/bookmarkBoundaryAttrs.js +22 -3
- package/dist/prosemirror/commands/comments.js +68 -53
- package/dist/prosemirror/commands/contentControls.js +24 -19
- package/dist/prosemirror/commands/image.d.ts +1 -1
- package/dist/prosemirror/commands/image.js +4 -1
- package/dist/prosemirror/commands/paragraph.d.ts +2 -1
- package/dist/prosemirror/commands/propertyChangeScope.d.ts +12 -4
- package/dist/prosemirror/commands/propertyChangeScope.js +22 -4
- package/dist/prosemirror/commands/sectionBreak.d.ts +33 -1
- package/dist/prosemirror/commands/sectionBreak.js +187 -11
- package/dist/prosemirror/conversion/fromProseDoc.d.ts +18 -2
- package/dist/prosemirror/conversion/fromProseDoc.js +330 -183
- package/dist/prosemirror/conversion/index.d.ts +2 -2
- package/dist/prosemirror/conversion/preservedSinkCarriers.d.ts +39 -0
- package/dist/prosemirror/conversion/preservedSinkCarriers.js +19 -0
- package/dist/prosemirror/conversion/runShadingMark.js +14 -1
- package/dist/prosemirror/conversion/sdtAttrs.d.ts +10 -1
- package/dist/prosemirror/conversion/sdtAttrs.js +19 -5
- package/dist/prosemirror/conversion/toProseDoc.js +371 -141
- package/dist/prosemirror/emptyRangeAnchor.d.ts +53 -0
- package/dist/prosemirror/emptyRangeAnchor.js +158 -0
- package/dist/prosemirror/extensions/StarterKit.js +8 -2
- package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +19 -15
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +3 -2
- package/dist/prosemirror/extensions/features/ListExtension.js +43 -24
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +4 -3
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +3 -3
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +5 -5
- package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +3 -1
- package/dist/prosemirror/extensions/features/pasteCleanup.js +56 -2
- package/dist/prosemirror/extensions/features/pastedHeadingStyles.js +5 -4
- package/dist/prosemirror/extensions/markRegistry.d.ts +26 -2
- package/dist/prosemirror/extensions/markRegistry.js +73 -10
- package/dist/prosemirror/extensions/marks/InlineWrapperExtension.js +17 -3
- package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +26 -0
- package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +134 -0
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +2 -1
- package/dist/prosemirror/extensions/marks/UnderlineExtension.js +12 -18
- package/dist/prosemirror/extensions/marks/markUtils.js +2 -1
- package/dist/prosemirror/extensions/nodes/BlockBookmarkBoundaryExtension.d.ts +29 -0
- package/dist/prosemirror/extensions/nodes/BlockBookmarkBoundaryExtension.js +46 -0
- package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +4 -3
- package/dist/prosemirror/extensions/nodes/BlockSdtExtension.js +18 -13
- package/dist/prosemirror/extensions/nodes/BookmarkBoundaryExtension.js +28 -53
- package/dist/prosemirror/extensions/nodes/CommentReferenceExtension.js +10 -0
- package/dist/prosemirror/extensions/nodes/ImageExtension.js +8 -1
- package/dist/prosemirror/extensions/nodes/MoveRangeBoundaryExtension.d.ts +11 -0
- package/dist/prosemirror/extensions/nodes/MoveRangeBoundaryExtension.js +43 -0
- package/dist/prosemirror/extensions/nodes/RangeAnchorExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/nodes/RangeAnchorExtension.js +65 -0
- package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +3 -1
- package/dist/prosemirror/extensions/nodes/SdtExtension.js +22 -16
- package/dist/prosemirror/extensions/nodes/ShapeExtension.js +4 -0
- package/dist/prosemirror/extensions/nodes/TableExtension.js +141 -123
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +4 -0
- package/dist/prosemirror/extensions/nodes/bookmarkBoundaryDom.d.ts +23 -0
- package/dist/prosemirror/extensions/nodes/bookmarkBoundaryDom.js +57 -0
- package/dist/prosemirror/extensions/types.d.ts +12 -3
- package/dist/prosemirror/index.d.ts +4 -2
- package/dist/prosemirror/index.js +2 -1
- package/dist/prosemirror/inlineWrapperStack.js +20 -3
- package/dist/prosemirror/listMarker.d.ts +2 -2
- package/dist/prosemirror/listMarker.js +7 -8
- package/dist/prosemirror/listRenderingAttrs.js +11 -1
- package/dist/prosemirror/listState.d.ts +62 -0
- package/dist/prosemirror/listState.js +49 -0
- package/dist/prosemirror/moveRangeBoundaryAttrs.d.ts +13 -0
- package/dist/prosemirror/moveRangeBoundaryAttrs.js +114 -0
- package/dist/prosemirror/numberedRefFields.js +4 -4
- package/dist/prosemirror/numberingAttr.d.ts +55 -0
- package/dist/prosemirror/numberingAttr.js +74 -0
- package/dist/prosemirror/outlineLevelAttr.d.ts +29 -0
- package/dist/prosemirror/outlineLevelAttr.js +42 -0
- package/dist/prosemirror/paragraphFormattingProvenance.d.ts +9 -0
- package/dist/prosemirror/paragraphFormattingProvenance.js +4 -1
- package/dist/prosemirror/plugins/selectionTracker.d.ts +3 -6
- package/dist/prosemirror/plugins/selectionTracker.js +3 -10
- package/dist/prosemirror/rangeAnchorAttrs.d.ts +14 -0
- package/dist/prosemirror/rangeAnchorAttrs.js +101 -0
- package/dist/prosemirror/replacedAnnotations.d.ts +1 -1
- package/dist/prosemirror/replacedAnnotations.js +24 -6
- package/dist/prosemirror/revisionCarriers.d.ts +86 -2
- package/dist/prosemirror/revisionCarriers.js +86 -60
- package/dist/prosemirror/runFormattingInlineCarriers.d.ts +2 -0
- package/dist/prosemirror/runFormattingInlineCarriers.js +2 -0
- package/dist/prosemirror/runIdentity.d.ts +28 -0
- package/dist/prosemirror/runIdentity.js +36 -0
- package/dist/prosemirror/runStyleFormatting.js +1 -1
- package/dist/prosemirror/schema/index.d.ts +2 -2
- package/dist/prosemirror/schema/marks.d.ts +23 -4
- package/dist/prosemirror/schema/nodes.d.ts +220 -24
- package/dist/prosemirror/sectionCarrier.d.ts +37 -0
- package/dist/prosemirror/sectionCarrier.js +40 -0
- package/dist/prosemirror/selectionState.d.ts +3 -0
- package/dist/prosemirror/selectionState.js +4 -1
- package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +5 -4
- package/dist/prosemirror/styles/resolvedStyleAttrs.js +15 -13
- package/dist/prosemirror/tableResize.js +5 -6
- package/dist/prosemirror/trackedRunInlineAtoms.d.ts +2 -0
- package/dist/prosemirror/trackedRunInlineAtoms.js +2 -0
- package/dist/prosemirror/utils/extractTrackedChanges.d.ts +10 -11
- package/dist/prosemirror/utils/extractTrackedChanges.js +109 -92
- package/dist/prosemirror/validation.js +17 -6
- package/dist/prosemirror/yjsDocumentMetadata.d.ts +2 -2
- package/dist/prosemirror/yjsDocumentMetadata.js +428 -7
- package/dist/prosemirror/zeroWidthAnchors.js +4 -0
- package/dist/style-sets/extract.js +4 -4
- package/dist/style-sets/stellaStyle.js +36 -23
- package/dist/types/colors.d.ts +2 -2
- package/dist/types/content.d.ts +2 -2
- package/dist/types/documentEnumValues.d.ts +53 -26
- package/dist/types/documentEnumValues.js +72 -174
- package/dist/types/formatting.d.ts +2 -2
- package/dist/types/index.d.ts +9 -2
- package/dist/utils/borderCss.d.ts +246 -0
- package/dist/utils/borderCss.js +325 -0
- package/dist/utils/colorResolver.d.ts +4 -3
- package/dist/utils/colorResolver.js +45 -76
- package/dist/utils/createDocument.js +24 -6
- package/dist/utils/findReplace.js +52 -10
- package/dist/utils/formatToStyle.d.ts +84 -2
- package/dist/utils/formatToStyle.js +133 -52
- package/dist/utils/headingCollector.js +3 -2
- package/dist/utils/mergeDocumentContent.js +5 -3
- package/dist/utils/paragraphFormattingMerge.js +27 -6
- package/dist/utils/replaceText.js +1 -1
- package/dist/utils/tableOperations.d.ts +5 -3
- package/dist/utils/tableOperations.js +14 -1
- package/dist/utils/tablePlacement.d.ts +7 -0
- package/dist/utils/tablePlacement.js +14 -0
- package/dist/utils/textDirectionFlow.d.ts +15 -0
- package/dist/utils/textDirectionFlow.js +38 -0
- package/dist/utils/textFormattingMerge.js +16 -4
- package/package.json +10 -10
- package/dist/ai-edits/__fixtures__/paragraphs.d.ts +0 -17
- package/dist/ai-edits/__fixtures__/paragraphs.js +0 -33
- package/dist/compare/__fixtures__/body-sequence.d.ts +0 -119
- package/dist/compare/__fixtures__/body-sequence.js +0 -225
- package/dist/compare/__fixtures__/nested-table.d.ts +0 -16
- package/dist/compare/__fixtures__/nested-table.js +0 -50
- package/dist/compare/__fixtures__/numbered-list.d.ts +0 -34
- package/dist/compare/__fixtures__/numbered-list.js +0 -85
- package/dist/docx/bookmarkPlacement.d.ts +0 -9
- package/dist/docx/bookmarkPlacement.js +0 -52
- package/dist/fonts/embeddedFontTable.d.ts +0 -45
- package/dist/fonts/embeddedFontTable.js +0 -80
- package/dist/prosemirror/extensions/marks/PageBreakRunOwnerExtension.d.ts +0 -13
- package/dist/prosemirror/extensions/marks/PageBreakRunOwnerExtension.js +0 -39
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { alignParagraphOrdinals } from "../docx/paraIdAttribute.js";
|
|
1
2
|
import { alignTableColumns } from "./column-alignment.js";
|
|
2
3
|
import { panic } from "better-result";
|
|
3
4
|
//#region src/compare/content-alignment.ts
|
|
@@ -273,6 +274,44 @@ const pairsInAnchorGaps = ({ baseLength, revisedLength, anchors, pairGap }) => {
|
|
|
273
274
|
}
|
|
274
275
|
return pairs;
|
|
275
276
|
};
|
|
277
|
+
/**
|
|
278
|
+
* Blocks the anchor passes left unpaired whose exact text stands, also
|
|
279
|
+
* unpaired, on the other side.
|
|
280
|
+
*
|
|
281
|
+
* Anchoring is monotone, so content that moved past other content leaves one
|
|
282
|
+
* of its two correspondences unanchored by construction: two paragraphs that
|
|
283
|
+
* swap places produce two exact candidates that cross, and only one survives
|
|
284
|
+
* the increasing subsequence. What is left over is both ends of that crossing.
|
|
285
|
+
* It is not a paragraph rewritten into another, so the positional fallback
|
|
286
|
+
* must not fuse them: a relocation would come back as a replacement neither
|
|
287
|
+
* document contains, and the move pass would never see the removal and the
|
|
288
|
+
* arrival it is there to pair.
|
|
289
|
+
*/
|
|
290
|
+
const crossedExactTextBlocks = ({ base, revised, anchors, canPair }) => {
|
|
291
|
+
const uniqueUnanchoredByText = (blocks, anchored) => {
|
|
292
|
+
const blocksByText = /* @__PURE__ */ new Map();
|
|
293
|
+
for (const block of blocks) {
|
|
294
|
+
if (anchored.has(block.index) || !NON_WHITESPACE.test(block.block.text)) continue;
|
|
295
|
+
const { text } = block.block;
|
|
296
|
+
blocksByText.set(text, blocksByText.has(text) ? null : block);
|
|
297
|
+
}
|
|
298
|
+
return blocksByText;
|
|
299
|
+
};
|
|
300
|
+
const baseByText = uniqueUnanchoredByText(base, new Set(anchors.map(({ baseIndex }) => baseIndex)));
|
|
301
|
+
const revisedByText = uniqueUnanchoredByText(revised, new Set(anchors.map(({ revisedIndex }) => revisedIndex)));
|
|
302
|
+
const crossedBase = /* @__PURE__ */ new Set();
|
|
303
|
+
const crossedRevised = /* @__PURE__ */ new Set();
|
|
304
|
+
for (const [text, baseBlock] of baseByText) {
|
|
305
|
+
const revisedBlock = revisedByText.get(text);
|
|
306
|
+
if (!baseBlock || !revisedBlock || !canPair(baseBlock, revisedBlock)) continue;
|
|
307
|
+
crossedBase.add(baseBlock.index);
|
|
308
|
+
crossedRevised.add(revisedBlock.index);
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
base: crossedBase,
|
|
312
|
+
revised: crossedRevised
|
|
313
|
+
};
|
|
314
|
+
};
|
|
276
315
|
const alignFolioContentBlocksInScope = (baseBlocks, revisedBlocks, options) => {
|
|
277
316
|
const stableIdMismatch = options.stableIdMismatch ?? "separate";
|
|
278
317
|
const idStability = options.idStability ?? folioContentIdStability;
|
|
@@ -322,13 +361,19 @@ const alignFolioContentBlocksInScope = (baseBlocks, revisedBlocks, options) => {
|
|
|
322
361
|
})
|
|
323
362
|
});
|
|
324
363
|
const anchors = [...exactAndStableAnchors, ...continuityAnchors].toSorted((left, right) => left.baseIndex - right.baseIndex || left.revisedIndex - right.revisedIndex);
|
|
364
|
+
const crossed = crossedExactTextBlocks({
|
|
365
|
+
base: prepared.base,
|
|
366
|
+
revised: prepared.revised,
|
|
367
|
+
anchors,
|
|
368
|
+
canPair
|
|
369
|
+
});
|
|
325
370
|
const events = [];
|
|
326
371
|
const emitPositionalGap = (baseFrom, baseTo, revisedFrom, revisedTo) => {
|
|
327
372
|
const pairedCount = Math.min(baseTo - baseFrom, revisedTo - revisedFrom);
|
|
328
373
|
for (let offset = 0; offset < pairedCount; offset++) {
|
|
329
374
|
const baseBlock = prepared.base[baseFrom + offset];
|
|
330
375
|
const revisedBlock = prepared.revised[revisedFrom + offset];
|
|
331
|
-
if (baseBlock && revisedBlock) if (!canPair(baseBlock, revisedBlock)) {
|
|
376
|
+
if (baseBlock && revisedBlock) if (baseBlock.block.text !== revisedBlock.block.text && crossed.base.has(baseBlock.index) && crossed.revised.has(revisedBlock.index) || !canPair(baseBlock, revisedBlock)) {
|
|
332
377
|
events.push({
|
|
333
378
|
type: "baseOnly",
|
|
334
379
|
block: baseBlock.block
|
|
@@ -437,6 +482,37 @@ const groupFolioContentTableRows = (blocks) => {
|
|
|
437
482
|
}
|
|
438
483
|
return [...rows.values()];
|
|
439
484
|
};
|
|
485
|
+
/**
|
|
486
|
+
* Which uninterrupted run of its own cell each block belongs to.
|
|
487
|
+
*
|
|
488
|
+
* A cell holds paragraphs and nested tables, and the nested table splits the
|
|
489
|
+
* cell's paragraphs into runs: the ones before it and the ones after it are
|
|
490
|
+
* separate sequences, because nothing moves a block from one side of a table
|
|
491
|
+
* to the other. Aligned as one sequence they pair across it, and the plan that
|
|
492
|
+
* follows can neither move the base paragraph past the nested table nor delete
|
|
493
|
+
* the one it left behind when that paragraph ends the cell. So the runs are
|
|
494
|
+
* aligned separately, the way rows and cells already are.
|
|
495
|
+
*
|
|
496
|
+
* Document order is the whole input: a cell's blocks are contiguous until a
|
|
497
|
+
* block of another cell interrupts them, and inside one table segment the only
|
|
498
|
+
* cell that can interrupt another is one of a table nested in it.
|
|
499
|
+
*/
|
|
500
|
+
const cellRunOrdinals = (blocks) => {
|
|
501
|
+
const ordinals = /* @__PURE__ */ new Map();
|
|
502
|
+
const runByCell = /* @__PURE__ */ new Map();
|
|
503
|
+
let previousKey = null;
|
|
504
|
+
for (const block of blocks) {
|
|
505
|
+
const { table } = block;
|
|
506
|
+
if (!table) continue;
|
|
507
|
+
const key = `${String(table.tableIndex)}:${String(table.rowIndex)}:${String(table.cellIndex)}`;
|
|
508
|
+
const seen = runByCell.get(key) ?? -1;
|
|
509
|
+
const run = key === previousKey ? seen : seen + 1;
|
|
510
|
+
runByCell.set(key, run);
|
|
511
|
+
ordinals.set(block, run);
|
|
512
|
+
previousKey = key;
|
|
513
|
+
}
|
|
514
|
+
return ordinals;
|
|
515
|
+
};
|
|
440
516
|
const groupTables = (blocks) => {
|
|
441
517
|
const tables = /* @__PURE__ */ new Map();
|
|
442
518
|
for (const block of blocks) {
|
|
@@ -644,15 +720,64 @@ const stableContentSequencePairs = (base, revised) => {
|
|
|
644
720
|
}
|
|
645
721
|
return pairs;
|
|
646
722
|
};
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
723
|
+
/**
|
|
724
|
+
* A container's blocks as the paragraph identities the save reasons about: a
|
|
725
|
+
* stable id is one the package wrote, a positional id one folio minted for a
|
|
726
|
+
* paragraph that arrived without one.
|
|
727
|
+
*/
|
|
728
|
+
const containerParagraphIdentities = (profile) => profile.blockIds.map((paraId, ordinal) => profile.idStabilities[ordinal] === "stable" ? {
|
|
729
|
+
type: "authored",
|
|
730
|
+
paraId,
|
|
731
|
+
ordinal
|
|
732
|
+
} : {
|
|
733
|
+
type: "minted",
|
|
734
|
+
paraId,
|
|
735
|
+
ordinal
|
|
736
|
+
});
|
|
737
|
+
/**
|
|
738
|
+
* Whether two containers are the same container, read from the paragraph ids
|
|
739
|
+
* their blocks carry.
|
|
740
|
+
*
|
|
741
|
+
* This used to ask for a positional-to-stable *transition* with identical ids
|
|
742
|
+
* at every index, which is the shape a save produced when it stamped folio's
|
|
743
|
+
* minted ids into the package it wrote. That made the comparison depend on a
|
|
744
|
+
* side effect of the save rather than on the documents in front of it: once a
|
|
745
|
+
* save stopped persisting a minted id, both sides read positional, the
|
|
746
|
+
* transition never fired, and an edited row was reported deleted and inserted
|
|
747
|
+
* instead of edited.
|
|
748
|
+
*
|
|
749
|
+
* The question is the one {@link alignParagraphOrdinals} answers, and it is
|
|
750
|
+
* asked through the owner the save asks it through, so the two cannot come to
|
|
751
|
+
* disagree about which paragraph is which. A comparison sees two different
|
|
752
|
+
* documents, so absence of contradiction is not enough on its own: most of the
|
|
753
|
+
* container has to actively confirm the ordinals, or every container of equal
|
|
754
|
+
* size would pair with every other on the strength of saying nothing. A
|
|
755
|
+
* positional id is derived from the paragraph's own text and position, so an
|
|
756
|
+
* unedited block keeps it across the edit and supplies that confirmation, while
|
|
757
|
+
* an edited block's id changes with its text. A majority is therefore "the
|
|
758
|
+
* blocks this edit did not touch", and it is what separates a row with an edit
|
|
759
|
+
* in it from a row replaced by a different row, which shares no id at all.
|
|
760
|
+
*
|
|
761
|
+
* This signal only has to carry the containers similarity cannot reach: a pair
|
|
762
|
+
* it declines is still weighed on content, so a two-block container with one
|
|
763
|
+
* block edited pairs on the half it kept rather than on a bare majority.
|
|
764
|
+
*/
|
|
765
|
+
const contentContainersShareIdentity = (base, revised) => {
|
|
766
|
+
if (base === null || revised === null || base.status !== "available" || revised.status !== "available" || base.blockIds.length === 0) return false;
|
|
767
|
+
const alignment = alignParagraphOrdinals(containerParagraphIdentities(base), containerParagraphIdentities(revised));
|
|
768
|
+
return alignment.consistent && alignment.sharedOrdinals * 2 > base.blockIds.length;
|
|
655
769
|
};
|
|
770
|
+
/**
|
|
771
|
+
* Whether two containers carry the same block ids in the same order, over
|
|
772
|
+
* their whole length.
|
|
773
|
+
*
|
|
774
|
+
* Stricter than {@link contentContainersShareIdentity}, which answers which
|
|
775
|
+
* container this is while blocks come and go. This answers whether there is
|
|
776
|
+
* anything left to decide: nothing moved within either container, so paired
|
|
777
|
+
* with equal content they are one container seen twice. An identity a cap
|
|
778
|
+
* withheld is unknown, never equal.
|
|
779
|
+
*/
|
|
780
|
+
const contentContainerIdsAreEqual = (base, revised) => base !== null && revised !== null && base.status === "available" && revised.status === "available" && base.blockIds.length > 0 && base.blockIds.length === revised.blockIds.length && base.blockIds.every((id, index) => id === revised.blockIds[index]);
|
|
656
781
|
const uniqueExactContentSequencePairs = ({ baseKeys, revisedKeys }) => {
|
|
657
782
|
const uniqueIndexes = (keys) => {
|
|
658
783
|
const indexes = /* @__PURE__ */ new Map();
|
|
@@ -723,7 +848,7 @@ const persistedContentSequencePairs = ({ base, revised, anchors, canPair }) => {
|
|
|
723
848
|
baseIndex,
|
|
724
849
|
revisedIndex
|
|
725
850
|
};
|
|
726
|
-
if (revisedItem && canPair(baseItem, revisedItem) &&
|
|
851
|
+
if (revisedItem && canPair(baseItem, revisedItem) && contentContainersShareIdentity(baseItem.profile.containerIdentity, revisedItem.profile.containerIdentity) && pairIsCompatibleWithAnchors(pair, anchors)) candidates.push(pair);
|
|
727
852
|
}
|
|
728
853
|
return new Set(monotoneContentSequencePairs(candidates).map(({ baseIndex, revisedIndex }) => baseIndex * revised.length + revisedIndex));
|
|
729
854
|
};
|
|
@@ -742,7 +867,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
|
|
|
742
867
|
const revisedProfile = revised[index]?.profile;
|
|
743
868
|
if (!baseProfile || !revisedProfile) continue;
|
|
744
869
|
const hasContainerIdentity = baseProfile.containerIdentity !== null || revisedProfile.containerIdentity !== null;
|
|
745
|
-
let hasProvenanceTransition =
|
|
870
|
+
let hasProvenanceTransition = contentContainersShareIdentity(baseProfile.containerIdentity, revisedProfile.containerIdentity);
|
|
746
871
|
if (!hasContainerIdentity) {
|
|
747
872
|
const revisedIds = new Set(revisedProfile.blockIds);
|
|
748
873
|
const baseStableIds = new Set(baseProfile.stableIds);
|
|
@@ -861,6 +986,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
|
|
|
861
986
|
let revisedIndex = 0;
|
|
862
987
|
let pairCount = 0;
|
|
863
988
|
let solePairIsShifted = false;
|
|
989
|
+
let solePairIsIdentity = false;
|
|
864
990
|
let hasBaseOnly = false;
|
|
865
991
|
let hasRevisedOnly = false;
|
|
866
992
|
while (baseIndex < base.length && revisedIndex < revised.length) {
|
|
@@ -875,6 +1001,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
|
|
|
875
1001
|
});
|
|
876
1002
|
pairCount += 1;
|
|
877
1003
|
solePairIsShifted = baseIndex !== revisedIndex;
|
|
1004
|
+
solePairIsIdentity = baseExactSignatureKeys[baseIndex] === revisedExactSignatureKeys[revisedIndex] && contentContainerIdsAreEqual(base[baseIndex]?.profile.containerIdentity ?? null, revised[revisedIndex]?.profile.containerIdentity ?? null);
|
|
878
1005
|
baseIndex += 1;
|
|
879
1006
|
revisedIndex += 1;
|
|
880
1007
|
} else if (direction === ALIGNMENT_DIRECTION.revisedOnly && revisedItem !== void 0) {
|
|
@@ -907,7 +1034,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
|
|
|
907
1034
|
});
|
|
908
1035
|
hasRevisedOnly = true;
|
|
909
1036
|
}
|
|
910
|
-
if ((soleShiftedPairResiduePolicy === "conservative" || base.length === revised.length) && pairCount === 1 && solePairIsShifted && hasBaseOnly && hasRevisedOnly) return aligned.flatMap((entry) => entry.type === "pair" ? [{
|
|
1037
|
+
if (!solePairIsIdentity && (soleShiftedPairResiduePolicy === "conservative" || base.length === revised.length) && pairCount === 1 && solePairIsShifted && hasBaseOnly && hasRevisedOnly) return aligned.flatMap((entry) => entry.type === "pair" ? [{
|
|
911
1038
|
type: "baseOnly",
|
|
912
1039
|
item: entry.base
|
|
913
1040
|
}, {
|
|
@@ -917,7 +1044,7 @@ const alignProfiledContentSequence = ({ base, revised, workSession, canPair = ()
|
|
|
917
1044
|
return aligned;
|
|
918
1045
|
};
|
|
919
1046
|
const rowLocation = (row) => row.at(0)?.table ?? null;
|
|
920
|
-
const alignRowCells = ({ baseRow, revisedRow, workSession, moveScopeContext, stableIdMismatch, idStability, baseColumnKeys, revisedColumnKeys }) => {
|
|
1047
|
+
const alignRowCells = ({ baseRow, revisedRow, workSession, moveScopeContext, stableIdMismatch, idStability, baseColumnKeys, revisedColumnKeys, cellRuns }) => {
|
|
921
1048
|
const byCell = (row, columnKeys) => {
|
|
922
1049
|
const cells = /* @__PURE__ */ new Map();
|
|
923
1050
|
for (const block of row) {
|
|
@@ -928,47 +1055,62 @@ const alignRowCells = ({ baseRow, revisedRow, workSession, moveScopeContext, sta
|
|
|
928
1055
|
if (alignedColumn === void 0) return panic("A paired table cell has no aligned grid column", { gridColumnIndex: table.gridColumnIndex });
|
|
929
1056
|
cellIndex = alignedColumn;
|
|
930
1057
|
}
|
|
931
|
-
const
|
|
1058
|
+
const runs = cells.get(cellIndex) ?? /* @__PURE__ */ new Map();
|
|
1059
|
+
cells.set(cellIndex, runs);
|
|
1060
|
+
const run = cellRuns.get(block) ?? 0;
|
|
1061
|
+
const blocks = runs.get(run);
|
|
932
1062
|
if (blocks) blocks.push(block);
|
|
933
|
-
else
|
|
1063
|
+
else runs.set(run, [block]);
|
|
934
1064
|
}
|
|
935
1065
|
return cells;
|
|
936
1066
|
};
|
|
1067
|
+
const ascending = (left, right) => left - right;
|
|
937
1068
|
const baseCells = byCell(baseRow, baseColumnKeys);
|
|
938
1069
|
const revisedCells = byCell(revisedRow, revisedColumnKeys);
|
|
939
|
-
const cellIndexes = [.../* @__PURE__ */ new Set([...baseCells.keys(), ...revisedCells.keys()])].toSorted(
|
|
1070
|
+
const cellIndexes = [.../* @__PURE__ */ new Set([...baseCells.keys(), ...revisedCells.keys()])].toSorted(ascending);
|
|
940
1071
|
const steps = [];
|
|
941
1072
|
for (const cellIndex of cellIndexes) {
|
|
942
|
-
const
|
|
943
|
-
const
|
|
944
|
-
const
|
|
1073
|
+
const baseRuns = baseCells.get(cellIndex) ?? /* @__PURE__ */ new Map();
|
|
1074
|
+
const revisedRuns = revisedCells.get(cellIndex) ?? /* @__PURE__ */ new Map();
|
|
1075
|
+
const runOrdinals = [.../* @__PURE__ */ new Set([...baseRuns.keys(), ...revisedRuns.keys()])].toSorted(ascending);
|
|
1076
|
+
for (const run of runOrdinals) steps.push(...alignCellRun({
|
|
1077
|
+
baseBlocks: baseRuns.get(run) ?? [],
|
|
1078
|
+
revisedBlocks: revisedRuns.get(run) ?? [],
|
|
945
1079
|
workSession,
|
|
946
|
-
|
|
1080
|
+
moveScopeContext,
|
|
947
1081
|
stableIdMismatch,
|
|
948
|
-
|
|
949
|
-
})
|
|
950
|
-
if (event.type === "pair" && !contentBlocksShareContainerPath(event.baseBlock, event.revisedBlock)) return [{
|
|
951
|
-
type: "baseOnly",
|
|
952
|
-
block: event.baseBlock
|
|
953
|
-
}, {
|
|
954
|
-
type: "revisedOnly",
|
|
955
|
-
block: event.revisedBlock
|
|
956
|
-
}];
|
|
957
|
-
return [event];
|
|
958
|
-
});
|
|
959
|
-
const bucketByContainerPath = /* @__PURE__ */ new Map();
|
|
960
|
-
const bucketForBlock = (block) => {
|
|
961
|
-
const path = containerPathKeyOf(block);
|
|
962
|
-
const existing = bucketByContainerPath.get(path);
|
|
963
|
-
if (existing !== void 0) return existing;
|
|
964
|
-
const bucket = moveScopeContext.nextTableCellBucket++;
|
|
965
|
-
bucketByContainerPath.set(path, bucket);
|
|
966
|
-
return bucket;
|
|
967
|
-
};
|
|
968
|
-
steps.push(...scopedAlignmentSteps(aligned, moveScopeContext, bucketForBlock));
|
|
1082
|
+
idStability
|
|
1083
|
+
}));
|
|
969
1084
|
}
|
|
970
1085
|
return steps;
|
|
971
1086
|
};
|
|
1087
|
+
const alignCellRun = ({ baseBlocks, revisedBlocks, workSession, moveScopeContext, stableIdMismatch, idStability }) => {
|
|
1088
|
+
const aligned = alignFolioContentBlocksInScope(baseBlocks, revisedBlocks, {
|
|
1089
|
+
workSession,
|
|
1090
|
+
idStability,
|
|
1091
|
+
stableIdMismatch,
|
|
1092
|
+
structuralScope: "pairedTableCell"
|
|
1093
|
+
}).flatMap((event) => {
|
|
1094
|
+
if (event.type === "pair" && !contentBlocksShareContainerPath(event.baseBlock, event.revisedBlock)) return [{
|
|
1095
|
+
type: "baseOnly",
|
|
1096
|
+
block: event.baseBlock
|
|
1097
|
+
}, {
|
|
1098
|
+
type: "revisedOnly",
|
|
1099
|
+
block: event.revisedBlock
|
|
1100
|
+
}];
|
|
1101
|
+
return [event];
|
|
1102
|
+
});
|
|
1103
|
+
const bucketByContainerPath = /* @__PURE__ */ new Map();
|
|
1104
|
+
const bucketForBlock = (block) => {
|
|
1105
|
+
const path = containerPathKeyOf(block);
|
|
1106
|
+
const existing = bucketByContainerPath.get(path);
|
|
1107
|
+
if (existing !== void 0) return existing;
|
|
1108
|
+
const bucket = moveScopeContext.nextTableCellBucket++;
|
|
1109
|
+
bucketByContainerPath.set(path, bucket);
|
|
1110
|
+
return bucket;
|
|
1111
|
+
};
|
|
1112
|
+
return scopedAlignmentSteps(aligned, moveScopeContext, bucketForBlock);
|
|
1113
|
+
};
|
|
972
1114
|
const pairTableRows = ({ baseRows, revisedRows, workSession, idStability }) => {
|
|
973
1115
|
const profile = (row) => ({
|
|
974
1116
|
item: row,
|
|
@@ -1001,7 +1143,7 @@ const pairTableRows = ({ baseRows, revisedRows, workSession, idStability }) => {
|
|
|
1001
1143
|
}
|
|
1002
1144
|
});
|
|
1003
1145
|
};
|
|
1004
|
-
const alignTableRows = ({ rows, workSession, moveScopeContext, stableIdMismatch, idStability, baseColumnKeys, revisedColumnKeys }) => {
|
|
1146
|
+
const alignTableRows = ({ rows, workSession, moveScopeContext, stableIdMismatch, idStability, baseColumnKeys, revisedColumnKeys, cellRuns }) => {
|
|
1005
1147
|
const steps = [];
|
|
1006
1148
|
const pushRow = (row, side) => {
|
|
1007
1149
|
const location = rowLocation(row);
|
|
@@ -1027,7 +1169,8 @@ const alignTableRows = ({ rows, workSession, moveScopeContext, stableIdMismatch,
|
|
|
1027
1169
|
stableIdMismatch,
|
|
1028
1170
|
idStability,
|
|
1029
1171
|
baseColumnKeys,
|
|
1030
|
-
revisedColumnKeys
|
|
1172
|
+
revisedColumnKeys,
|
|
1173
|
+
cellRuns
|
|
1031
1174
|
}));
|
|
1032
1175
|
break;
|
|
1033
1176
|
default: panic("Unhandled table row alignment", { alignment });
|
|
@@ -1052,7 +1195,7 @@ const rowCellSpansEqual = (baseRow, revisedRow) => {
|
|
|
1052
1195
|
});
|
|
1053
1196
|
};
|
|
1054
1197
|
const rowHasVerticalSpan = (row) => row.some(({ table }) => table !== void 0 && table.rowSpan > 1);
|
|
1055
|
-
const buildTablePlan = ({ baseBlocks, revisedBlocks, workSession, moveScopeContext, stableIdMismatch, idStability }) => {
|
|
1198
|
+
const buildTablePlan = ({ baseBlocks, revisedBlocks, workSession, moveScopeContext, stableIdMismatch, idStability, cellRuns }) => {
|
|
1056
1199
|
const resolveIdStability = idStability ?? folioContentIdStability;
|
|
1057
1200
|
const columns = alignTableColumns(baseBlocks, revisedBlocks);
|
|
1058
1201
|
const rows = pairTableRows({
|
|
@@ -1073,13 +1216,15 @@ const buildTablePlan = ({ baseBlocks, revisedBlocks, workSession, moveScopeConte
|
|
|
1073
1216
|
stableIdMismatch,
|
|
1074
1217
|
idStability: resolveIdStability,
|
|
1075
1218
|
baseColumnKeys: columns?.baseColumnKeys,
|
|
1076
|
-
revisedColumnKeys: columns?.revisedColumnKeys
|
|
1219
|
+
revisedColumnKeys: columns?.revisedColumnKeys,
|
|
1220
|
+
cellRuns
|
|
1077
1221
|
})]
|
|
1078
1222
|
};
|
|
1079
1223
|
};
|
|
1080
1224
|
const buildTableSegmentPlan = ({ baseBlocks, revisedBlocks, workSession, moveScopeContext, stableIdMismatch, idStability }) => {
|
|
1081
1225
|
const baseTables = groupTables(baseBlocks);
|
|
1082
1226
|
const revisedTables = groupTables(revisedBlocks);
|
|
1227
|
+
const cellRuns = new Map([...cellRunOrdinals(baseBlocks), ...cellRunOrdinals(revisedBlocks)]);
|
|
1083
1228
|
const resolveIdStability = idStability ?? folioContentIdStability;
|
|
1084
1229
|
const profile = (blocks) => ({
|
|
1085
1230
|
item: blocks,
|
|
@@ -1101,7 +1246,8 @@ const buildTableSegmentPlan = ({ baseBlocks, revisedBlocks, workSession, moveSco
|
|
|
1101
1246
|
workSession,
|
|
1102
1247
|
moveScopeContext,
|
|
1103
1248
|
stableIdMismatch,
|
|
1104
|
-
idStability: resolveIdStability
|
|
1249
|
+
idStability: resolveIdStability,
|
|
1250
|
+
cellRuns
|
|
1105
1251
|
});
|
|
1106
1252
|
steps.push(...table.steps);
|
|
1107
1253
|
representable &&= table.representable;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { document_d_exports } from "../types/document.js";
|
|
1
2
|
//#region src/compare/content-types.d.ts
|
|
2
3
|
/** How callers expect a block identifier to behave across document revisions. */
|
|
3
4
|
type FolioContentIdStability = "stable" | "positional";
|
|
@@ -74,8 +75,13 @@ type FolioContentTableLocation = {
|
|
|
74
75
|
rowSpan: number;
|
|
75
76
|
paragraphIndex: number;
|
|
76
77
|
};
|
|
77
|
-
/**
|
|
78
|
-
|
|
78
|
+
/**
|
|
79
|
+
* Direct paragraph alignment understood by the neutral comparison model.
|
|
80
|
+
*
|
|
81
|
+
* The model's own `ST_Jc` union: a copy spelled here would refuse an alignment
|
|
82
|
+
* a parsed document carries.
|
|
83
|
+
*/
|
|
84
|
+
type FolioContentParagraphAlignment = document_d_exports.ParagraphAlignment;
|
|
79
85
|
/** Line-height interpretation understood by the neutral comparison model. */
|
|
80
86
|
type FolioContentLineSpacingRule = "auto" | "exact" | "atLeast";
|
|
81
87
|
/** The complete modeled attribute set of direct paragraph indentation. */
|
package/dist/compare/content.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { WORD_DIFF_GRANULARITIES, createWordDiffSession } from "../ai-edits/word-diff.js";
|
|
2
2
|
import { paragraphIndentationEqual } from "../prosemirror/paragraphIndentation.js";
|
|
3
|
+
import { PARAGRAPH_ALIGNMENT_VALUES } from "../types/documentEnumValues.js";
|
|
3
4
|
import { alignFolioContentStructure, contentBlocksShareContainer, createFolioContentAlignmentWorkSession } from "./content-alignment.js";
|
|
4
5
|
import { inlineFormattingSegments } from "./formatting.js";
|
|
5
6
|
import { Result, TaggedError, panic } from "better-result";
|
|
@@ -67,17 +68,7 @@ const isFiniteInteger = (value) => typeof value === "number" && Number.isSafeInt
|
|
|
67
68
|
const isFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value);
|
|
68
69
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
69
70
|
const hasRecordShape = (value) => isRecord(value);
|
|
70
|
-
const PARAGRAPH_ALIGNMENTS =
|
|
71
|
-
"left",
|
|
72
|
-
"center",
|
|
73
|
-
"right",
|
|
74
|
-
"both",
|
|
75
|
-
"distribute",
|
|
76
|
-
"mediumKashida",
|
|
77
|
-
"highKashida",
|
|
78
|
-
"lowKashida",
|
|
79
|
-
"thaiDistribute"
|
|
80
|
-
]);
|
|
71
|
+
const PARAGRAPH_ALIGNMENTS = new Set(PARAGRAPH_ALIGNMENT_VALUES);
|
|
81
72
|
const validateRunFormatting = (block, side, blockIndex) => {
|
|
82
73
|
for (const [runIndex, run] of (block.previewRuns ?? []).entries()) {
|
|
83
74
|
if (run.directFormatting !== void 0 && !isRecord(run.directFormatting)) return invalidInput(side, `blocks[${String(blockIndex)}].previewRuns[${String(runIndex)}].directFormatting`, "Direct inline formatting must be an object.", blockIndex);
|
package/dist/compare/plan.js
CHANGED
|
@@ -178,16 +178,19 @@ const terminalCarrierIsStranded = (steps, baseBlocks) => {
|
|
|
178
178
|
* back over the next paragraph. The applier rotates instead — the paragraph
|
|
179
179
|
* the run was appended after takes the inserted mark, and the last one takes
|
|
180
180
|
* the free mark — and that rotation reaches only across paragraphs. A table
|
|
181
|
-
* among them stops it, and
|
|
182
|
-
*
|
|
181
|
+
* among them stops it, and so does removing the paragraph the rotation turns
|
|
182
|
+
* on: a run appended after a paragraph that is itself deleted has no mark to
|
|
183
|
+
* take. Either way the words the target ends with have to be written into the
|
|
184
|
+
* base's own last paragraph instead.
|
|
183
185
|
*/
|
|
184
186
|
const addedTerminalCarrierIsStranded = (steps, baseBlocks, targetBlocks) => {
|
|
185
187
|
const baseLast = baseBlocks.at(-1);
|
|
186
188
|
const targetLast = targetBlocks.at(-1);
|
|
187
189
|
if (baseLast === void 0 || targetLast === void 0) return false;
|
|
188
190
|
if (!steps.some((step) => step.type === "targetOnly" && step.block.id === targetLast.id)) return false;
|
|
189
|
-
const
|
|
190
|
-
|
|
191
|
+
const baseLastStepIndex = steps.findIndex((step) => step.type === "pair" && step.baseBlock.id === baseLast.id || step.type === "baseOnly" && step.block.id === baseLast.id);
|
|
192
|
+
const baseLastStep = steps[baseLastStepIndex];
|
|
193
|
+
return baseLastStep === void 0 || baseLastStep.type === "baseOnly" || steps.slice(baseLastStepIndex + 1).some((step) => step.type !== "targetOnly");
|
|
191
194
|
};
|
|
192
195
|
const buildSteps = ({ baseSnapshot, targetSnapshot, wholeTableReplacement, workSession }) => {
|
|
193
196
|
const baseBlocks = baseSnapshot.blocks;
|
|
@@ -220,8 +220,7 @@ const stageSectionBoundaryProperties = ({ state, target, originalRevisionIdSeed,
|
|
|
220
220
|
_sectionProperties: {
|
|
221
221
|
...update.target,
|
|
222
222
|
...propertyChanges === void 0 ? {} : { propertyChanges }
|
|
223
|
-
}
|
|
224
|
-
sectionBreakType: update.target.sectionStart ?? null
|
|
223
|
+
}
|
|
225
224
|
});
|
|
226
225
|
}
|
|
227
226
|
return {
|
|
@@ -5,7 +5,13 @@ type CheckboxDisplayContent = Extract<document_d_exports.RunContent, {
|
|
|
5
5
|
} | {
|
|
6
6
|
type: "text";
|
|
7
7
|
}>;
|
|
8
|
-
/**
|
|
9
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Resolve the authored checkbox state into the run payload Word expects.
|
|
10
|
+
*
|
|
11
|
+
* @param checkboxXml the preserved `w14:checkbox` element, from
|
|
12
|
+
* `SdtProperties.preserved`. A control that carries none — one built in
|
|
13
|
+
* code, or one whose author wrote no glyphs — gets Word's own defaults.
|
|
14
|
+
*/
|
|
15
|
+
declare const checkboxDisplayContent: (checkboxXml: string | undefined, checked: boolean) => CheckboxDisplayContent;
|
|
10
16
|
//#endregion
|
|
11
17
|
export { checkboxDisplayContent };
|
|
@@ -11,16 +11,22 @@ const defaultDisplay = (checked) => ({
|
|
|
11
11
|
char: checked ? DEFAULT_CHECKED_CHARACTER : DEFAULT_UNCHECKED_CHARACTER,
|
|
12
12
|
font: DEFAULT_CHECKBOX_FONT
|
|
13
13
|
});
|
|
14
|
-
/**
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Resolve the authored checkbox state into the run payload Word expects.
|
|
16
|
+
*
|
|
17
|
+
* @param checkboxXml the preserved `w14:checkbox` element, from
|
|
18
|
+
* `SdtProperties.preserved`. A control that carries none — one built in
|
|
19
|
+
* code, or one whose author wrote no glyphs — gets Word's own defaults.
|
|
20
|
+
*/
|
|
21
|
+
const checkboxDisplayContent = (checkboxXml, checked) => {
|
|
22
|
+
if (!checkboxXml || checkboxXml.length > MAX_CHECKBOX_PROPERTIES_CHARACTERS) return defaultDisplay(checked);
|
|
17
23
|
let root;
|
|
18
24
|
try {
|
|
19
|
-
root = parseXml(
|
|
25
|
+
root = parseXml(checkboxXml, OOXML_NAMESPACE_SCOPE);
|
|
20
26
|
} catch {
|
|
21
27
|
return defaultDisplay(checked);
|
|
22
28
|
}
|
|
23
|
-
const state = findChildByNamespaceUri(findChildByNamespaceUri(
|
|
29
|
+
const state = findChildByNamespaceUri(findChildByNamespaceUri(root, CHECKBOX_NAMESPACE_URIS, "checkbox"), CHECKBOX_NAMESPACE_URIS, checked ? "checkedState" : "uncheckedState");
|
|
24
30
|
const rawCharacter = getAttributeByNamespaceUri(state, CHECKBOX_NAMESPACE_URIS, "val");
|
|
25
31
|
if (!rawCharacter || !HEX_CODE_POINT.test(rawCharacter)) return defaultDisplay(checked);
|
|
26
32
|
const codePoint = Number.parseInt(rawCharacter, 16);
|