@stll/folio-core 0.52.0 → 0.54.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/README.md +23 -0
- package/dist/ai-edits/apply.d.ts +26 -1
- package/dist/ai-edits/apply.js +1779 -141
- package/dist/ai-edits/batch-claims.d.ts +145 -0
- package/dist/ai-edits/batch-claims.js +275 -0
- package/dist/ai-edits/blockRange.js +9 -3
- package/dist/ai-edits/character-boundaries.d.ts +43 -0
- package/dist/ai-edits/character-boundaries.js +95 -0
- package/dist/ai-edits/clean-text.d.ts +33 -3
- package/dist/ai-edits/clean-text.js +52 -6
- package/dist/ai-edits/comment-lifecycle.d.ts +18 -0
- package/dist/ai-edits/comment-lifecycle.js +52 -0
- package/dist/ai-edits/headless.d.ts +91 -7
- package/dist/ai-edits/headless.js +520 -51
- package/dist/ai-edits/index.d.ts +2 -1
- package/dist/ai-edits/index.js +2 -1
- package/dist/ai-edits/minimal-replacement.d.ts +21 -6
- package/dist/ai-edits/minimal-replacement.js +134 -15
- package/dist/ai-edits/newListNumbering.d.ts +23 -0
- package/dist/ai-edits/newListNumbering.js +94 -0
- package/dist/ai-edits/note-references.d.ts +96 -0
- package/dist/ai-edits/note-references.js +139 -0
- package/dist/ai-edits/pending-suggestions.d.ts +79 -0
- package/dist/ai-edits/pending-suggestions.js +306 -0
- package/dist/ai-edits/read.d.ts +6 -4
- package/dist/ai-edits/read.js +113 -50
- package/dist/ai-edits/result-validation.d.ts +29 -0
- package/dist/ai-edits/result-validation.js +164 -0
- package/dist/ai-edits/revisionStretches.d.ts +17 -0
- package/dist/ai-edits/revisionStretches.js +80 -0
- package/dist/ai-edits/snapshot.d.ts +36 -3
- package/dist/ai-edits/snapshot.js +180 -25
- package/dist/ai-edits/table-cell-mutations.d.ts +4 -2
- package/dist/ai-edits/table-cell-mutations.js +6 -2
- package/dist/ai-edits/table-geometry.d.ts +1 -1
- package/dist/ai-edits/table-row-column-mutations.d.ts +44 -17
- package/dist/ai-edits/table-row-column-mutations.js +86 -34
- package/dist/ai-edits/types.d.ts +155 -16
- package/dist/compare/compare.d.ts +1 -1
- package/dist/compare/compare.js +65 -16
- package/dist/compare/content-alignment.d.ts +5 -1
- package/dist/compare/content-alignment.js +52 -34
- package/dist/compare/content-types.d.ts +7 -0
- package/dist/compare/content.d.ts +4 -1
- package/dist/compare/content.js +6 -1
- package/dist/compare/formatting.js +2 -1
- package/dist/compare/inline-atoms.d.ts +21 -4
- package/dist/compare/inline-atoms.js +138 -16
- package/dist/compare/inline-provenance.js +1 -1
- package/dist/compare/plan.js +10 -5
- package/dist/compare/scenario.js +14 -3
- package/dist/compare/section-boundary-properties.js +1 -1
- package/dist/compare/types.d.ts +4 -2
- package/dist/compare/types.js +2 -1
- package/dist/compare/verification.d.ts +1 -1
- package/dist/compare/verification.js +15 -3
- package/dist/controller/committedLayoutDiff.d.ts +25 -0
- package/dist/controller/committedLayoutDiff.js +71 -0
- package/dist/controller/contentControlWidgetController.d.ts +1 -1
- package/dist/controller/folioEditor.d.ts +1 -1
- package/dist/controller/fontReadiness.d.ts +70 -3
- package/dist/controller/fontReadiness.js +100 -10
- package/dist/controller/headerFooterEditorManager.js +6 -1
- package/dist/controller/layoutPipeline.d.ts +12 -10
- package/dist/controller/layoutPipeline.js +65 -11
- package/dist/controller/layoutRunOptions.d.ts +24 -0
- package/dist/controller/layoutRunOptions.js +17 -0
- package/dist/controller/layoutScheduler.d.ts +19 -14
- package/dist/controller/layoutScheduler.js +15 -12
- package/dist/controller/layoutSession.d.ts +26 -2
- package/dist/controller/layoutSession.js +1 -1
- package/dist/controller/noteEditorManager.js +8 -3
- package/dist/document-operations.d.ts +11 -2
- package/dist/document-operations.js +230 -21
- package/dist/docx/altChunk.d.ts +8 -0
- package/dist/docx/altChunk.js +17 -0
- package/dist/docx/archiveInflation.d.ts +127 -0
- package/dist/docx/archiveInflation.js +181 -0
- package/dist/docx/attributeRemainder.d.ts +1 -1
- package/dist/docx/blockContentParser.d.ts +64 -1
- package/dist/docx/blockContentParser.js +17 -4
- package/dist/docx/blockCustomXmlShell.d.ts +7 -0
- package/dist/docx/blockCustomXmlShell.js +14 -0
- package/dist/docx/blockPlainText.js +7 -0
- package/dist/docx/commentAnchorIndex.js +1 -1
- package/dist/docx/commentRangeIntegrity.js +8 -3
- package/dist/docx/commentReferenceNormalization.js +1 -1
- package/dist/docx/commentReplyMarkers.js +20 -1
- package/dist/docx/compatibility.d.ts +1 -1
- package/dist/docx/compatibility.js +34 -13
- package/dist/docx/containerChildren.gen.d.ts +1 -1
- package/dist/docx/containerChildren.gen.js +1 -0
- package/dist/docx/documentParser.js +12 -12
- package/dist/docx/drawingIdNormalization.d.ts +3 -1
- package/dist/docx/drawingIdNormalization.js +6 -1
- package/dist/docx/ensureParaIds.js +119 -97
- package/dist/docx/footnoteParser.js +8 -4
- package/dist/docx/headerFooterParser.js +3 -3
- package/dist/docx/headerFooterReferenceNormalization.d.ts +20 -1
- package/dist/docx/headerFooterReferenceNormalization.js +52 -27
- package/dist/docx/hyperlinkParser.d.ts +1 -1
- package/dist/docx/index.d.ts +1 -1
- package/dist/docx/listNumberingInstances.d.ts +59 -0
- package/dist/docx/listNumberingInstances.js +249 -0
- package/dist/docx/metadataPrivacy.js +24 -1
- package/dist/docx/normalizeBaseDirection.js +2 -1
- package/dist/docx/noteReferenceMark.d.ts +15 -0
- package/dist/docx/noteReferenceMark.js +48 -0
- package/dist/docx/opaqueCarrier.d.ts +7 -0
- package/dist/docx/opaqueCarrier.js +38 -0
- package/dist/docx/packageParts.js +4 -1
- package/dist/docx/paragraphParser.js +96 -27
- package/dist/docx/paragraphPropertySource.d.ts +4 -2
- package/dist/docx/paragraphPropertySource.js +10 -2
- package/dist/docx/paragraphTraversal.js +1 -0
- package/dist/docx/parseWarningMessage.js +4 -1
- package/dist/docx/parser.js +175 -22
- package/dist/docx/rezip.js +31 -7
- package/dist/docx/sdtProperties.js +1 -1
- package/dist/docx/sdtPropertiesPatch.js +3 -0
- package/dist/docx/selectiveSave.js +16 -9
- package/dist/docx/selectiveXmlPatch.d.ts +3 -1
- package/dist/docx/selectiveXmlPatch.js +186 -39
- package/dist/docx/serializer/blockCustomXmlSerializer.d.ts +5 -0
- package/dist/docx/serializer/blockCustomXmlSerializer.js +4 -0
- package/dist/docx/serializer/documentSerializer.js +2 -0
- package/dist/docx/serializer/headerFooterSerializer.js +2 -0
- package/dist/docx/serializer/noteSerializer.js +3 -1
- package/dist/docx/serializer/paragraphSerializer.js +33 -9
- package/dist/docx/serializer/tableSerializer.js +25 -38
- package/dist/docx/server/boundedArchive.d.ts +8 -13
- package/dist/docx/server/boundedArchive.js +70 -59
- package/dist/docx/server/createBilingualDocument.js +3 -3
- package/dist/docx/server/extractDocxText.d.ts +8 -2
- package/dist/docx/server/extractDocxText.js +2 -2
- package/dist/docx/server/validateDocxConformance.d.ts +1 -1
- package/dist/docx/server/validateDocxConformance.js +1 -0
- package/dist/docx/tableParser.d.ts +157 -1
- package/dist/docx/tableParser.js +89 -10
- package/dist/docx/textBoxParser.js +1 -1
- package/dist/docx/unzip.d.ts +20 -2
- package/dist/docx/unzip.js +136 -25
- package/dist/docx/wordprocessingPrefixes.d.ts +78 -0
- package/dist/docx/wordprocessingPrefixes.js +286 -0
- package/dist/fonts/embeddedFonts.js +1 -1
- package/dist/i18n/messages/catalogs.gen.d.ts +170 -34
- package/dist/i18n/messages/catalogs.gen.js +187 -51
- package/dist/i18n/messages/messages.gen.d.ts +10 -2
- package/dist/internal/compare/inline-presentation.d.ts +2 -1
- package/dist/internal/compare/inline-presentation.js +11 -10
- package/dist/internal/headlessRevisionResolutionGuard.d.ts +2 -8
- package/dist/internal/headlessRevisionResolutionGuard.js +2 -11
- package/dist/internal/indexedPositionMap.d.ts +11 -0
- package/dist/internal/indexedPositionMap.js +42 -0
- package/dist/internal/pageBreakRunSourceDescendantIndex.js +2 -1
- package/dist/internal/revisionResolutionEdits.d.ts +13 -0
- package/dist/internal/revisionResolutionEdits.js +19 -0
- package/dist/internal/revisionResolutionInline.d.ts +24 -0
- package/dist/internal/{headlessRevisionResolution.js → revisionResolutionInline.js} +61 -43
- package/dist/internal/revisionResolutionStep.d.ts +34 -0
- package/dist/internal/revisionResolutionStep.js +282 -0
- package/dist/internal/revisionResolutionTracking.d.ts +11 -0
- package/dist/internal/revisionResolutionTracking.js +124 -0
- package/dist/internal/wholeStoryRevisionResolution.d.ts +56 -0
- package/dist/internal/wholeStoryRevisionResolution.js +600 -0
- package/dist/layout-bridge/convert/markupViewFlow.d.ts +20 -0
- package/dist/layout-bridge/convert/markupViewFlow.js +123 -0
- package/dist/layout-bridge/convert/tableConversion.js +1 -1
- package/dist/layout-bridge/convert/toFlowBlocks.js +10 -1
- package/dist/layout-engine/layoutInstrumentation.d.ts +9 -1
- package/dist/layout-engine/layoutInstrumentation.js +4 -1
- package/dist/layout-engine/measure/cache.d.ts +18 -1
- package/dist/layout-engine/measure/cache.js +31 -1
- package/dist/layout-engine/measure/font-metrics.worker.js +3 -7
- package/dist/layout-engine/measure/measureContainer.js +7 -47
- package/dist/layout-engine/measure/measureHelpers.d.ts +6 -1
- package/dist/layout-engine/measure/measureHelpers.js +22 -2
- package/dist/layout-engine/measure/measureParagraph.js +2 -2
- package/dist/layout-engine/measure/measureWorker.js +2 -3
- package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +6 -7
- package/dist/layout-engine/measure/measureWorkerProtocol.js +1 -2
- package/dist/layout-engine/measure/paragraphMeasureShared.d.ts +12 -1
- package/dist/layout-engine/measure/paragraphMeasureShared.js +14 -1
- package/dist/layout-engine/types.d.ts +6 -0
- package/dist/layout-painter/renderPage.js +1 -0
- package/dist/layout-painter/renderParagraph.js +1 -1
- package/dist/managers/ContextMenuManager.js +5 -2
- package/dist/managers/types.d.ts +3 -0
- package/dist/markdown/escape.d.ts +2 -2
- package/dist/markdown/escape.js +4 -5
- package/dist/markdown/fromMarkdown.js +2 -1
- package/dist/markdown/internals.d.ts +11 -1
- package/dist/markdown/internals.js +24 -3
- package/dist/markdown/renderBlock.js +121 -25
- package/dist/markdown/renderParagraph.d.ts +13 -1
- package/dist/markdown/renderParagraph.js +85 -38
- package/dist/markdown/renderRuns.d.ts +10 -1
- package/dist/markdown/renderRuns.js +323 -69
- package/dist/markdown/renderTable.js +24 -12
- package/dist/markdown/trailers.js +2 -2
- package/dist/markdown/types.d.ts +29 -7
- package/dist/paged-layout/incrementalMeasure.d.ts +1 -2
- package/dist/paged-layout/incrementalMeasure.js +1 -9
- package/dist/paged-layout/transactionDirtyRange.d.ts +1 -3
- package/dist/paged-layout/transactionDirtyRange.js +29 -41
- package/dist/panel-layout.d.ts +83 -0
- package/dist/panel-layout.js +96 -0
- package/dist/prosemirror/anchoredTextBoxes.d.ts +37 -0
- package/dist/prosemirror/anchoredTextBoxes.js +156 -0
- package/dist/prosemirror/attrs/index.d.ts +6 -2
- package/dist/prosemirror/attrs/index.js +172 -1
- package/dist/prosemirror/clearRunColor.d.ts +6 -0
- package/dist/prosemirror/clearRunColor.js +46 -0
- package/dist/prosemirror/commands/comments.d.ts +7 -8
- package/dist/prosemirror/commands/comments.js +281 -212
- package/dist/prosemirror/commands/contentControls.d.ts +1 -1
- package/dist/prosemirror/commands/formatPainter.d.ts +1 -1
- package/dist/prosemirror/commands/formatPainter.js +1 -1
- package/dist/prosemirror/commands/formatting.d.ts +1 -1
- package/dist/prosemirror/commands/hyperlink.js +2 -1
- package/dist/prosemirror/commands/index.d.ts +2 -2
- package/dist/prosemirror/commands/index.js +2 -2
- package/dist/prosemirror/commands/paragraph.d.ts +7 -1
- package/dist/prosemirror/commands/paragraph.js +9 -1
- package/dist/prosemirror/commands/paragraphBookmarkJoin.d.ts +13 -0
- package/dist/prosemirror/commands/paragraphBookmarkJoin.js +22 -0
- package/dist/prosemirror/commands/pastePlainText.d.ts +1 -1
- package/dist/prosemirror/commands/propertyChangeScope.d.ts +3 -2
- package/dist/prosemirror/commands/propertyChangeScope.js +24 -3
- package/dist/prosemirror/commands/resolveAllTableChanges.d.ts +40 -0
- package/dist/prosemirror/commands/resolveAllTableChanges.js +620 -0
- package/dist/prosemirror/commands/resolveNodePropertyChangeAttrs.d.ts +15 -0
- package/dist/prosemirror/commands/resolveNodePropertyChangeAttrs.js +46 -0
- package/dist/prosemirror/commands/resolveParagraphProperties.d.ts +16 -0
- package/dist/prosemirror/commands/resolveParagraphProperties.js +73 -0
- package/dist/prosemirror/commands/sectionBreak.js +2 -1
- package/dist/prosemirror/commands/tableCellMergeResolution.d.ts +15 -2
- package/dist/prosemirror/commands/tableCellMergeResolution.js +23 -7
- package/dist/prosemirror/containerFinalParagraph.d.ts +11 -5
- package/dist/prosemirror/containerFinalParagraph.js +7 -6
- package/dist/prosemirror/contentControlRevisions.d.ts +1 -1
- package/dist/prosemirror/conversion/fromProseDoc.d.ts +2 -13
- package/dist/prosemirror/conversion/fromProseDoc.js +177 -605
- package/dist/prosemirror/conversion/toProseDoc.d.ts +4 -11
- package/dist/prosemirror/conversion/toProseDoc.js +70 -154
- package/dist/prosemirror/documentSchema.d.ts +8 -0
- package/dist/prosemirror/documentSchema.js +18 -0
- package/dist/prosemirror/emptyFieldResultRuns.d.ts +18 -0
- package/dist/prosemirror/emptyFieldResultRuns.js +33 -0
- package/dist/prosemirror/extensions/ExtensionManager.d.ts +1 -1
- package/dist/prosemirror/extensions/ExtensionManager.js +3 -1
- package/dist/prosemirror/extensions/StarterKit.js +5 -1
- package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +116 -63
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +4 -1
- package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.js +24 -3
- package/dist/prosemirror/extensions/features/JoinedRunStyleExtension.d.ts +20 -0
- package/dist/prosemirror/extensions/features/JoinedRunStyleExtension.js +43 -0
- package/dist/prosemirror/extensions/features/ListExtension.js +167 -128
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +19 -2
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +33 -20
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +31 -2
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +270 -99
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +3 -2
- package/dist/prosemirror/extensions/features/pasteCleanup.js +2 -1
- package/dist/prosemirror/extensions/features/pastedHeadingStyles.js +1 -1
- package/dist/prosemirror/extensions/features/pastedHtmlLists.d.ts +12 -0
- package/dist/prosemirror/extensions/features/pastedHtmlLists.js +124 -0
- package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +33 -11
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +8 -4
- package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +21 -18
- package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +37 -17
- package/dist/prosemirror/extensions/marks/StrikeExtension.js +2 -2
- package/dist/prosemirror/extensions/marks/SubscriptExtension.js +2 -2
- package/dist/prosemirror/extensions/marks/SuperscriptExtension.js +2 -2
- package/dist/prosemirror/extensions/marks/TextColorExtension.js +4 -3
- package/dist/prosemirror/extensions/marks/markUtils.d.ts +15 -8
- package/dist/prosemirror/extensions/marks/markUtils.js +25 -10
- package/dist/prosemirror/extensions/marks/noteReferenceDeletion.d.ts +12 -0
- package/dist/prosemirror/extensions/marks/noteReferenceDeletion.js +46 -0
- package/dist/prosemirror/extensions/nodes/BlockCustomXmlExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/nodes/BlockCustomXmlExtension.js +52 -0
- package/dist/prosemirror/extensions/nodes/CommentReferenceExtension.js +2 -2
- package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +3 -3
- package/dist/prosemirror/extensions/nodes/FieldExtension.js +50 -15
- package/dist/prosemirror/extensions/nodes/HardBreakExtension.js +5 -3
- package/dist/prosemirror/extensions/nodes/PreservedBlockExtension.js +4 -1
- package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +1 -1
- package/dist/prosemirror/extensions/nodes/TableExtension.js +121 -226
- package/dist/prosemirror/extensions/types.d.ts +11 -1
- package/dist/prosemirror/findReplaceSelection.js +1 -1
- package/dist/prosemirror/hyperlinkRemoval.d.ts +9 -0
- package/dist/prosemirror/hyperlinkRemoval.js +129 -0
- package/dist/prosemirror/index.d.ts +5 -3
- package/dist/prosemirror/index.js +5 -3
- package/dist/prosemirror/indexedNodeLookup.d.ts +17 -0
- package/dist/prosemirror/indexedNodeLookup.js +103 -0
- package/dist/prosemirror/listAutoformatMarkers.d.ts +19 -0
- package/dist/prosemirror/listAutoformatMarkers.js +98 -0
- package/dist/prosemirror/listInstanceReferences.d.ts +12 -0
- package/dist/prosemirror/listInstanceReferences.js +72 -0
- package/dist/prosemirror/listLabels.d.ts +24 -0
- package/dist/prosemirror/listLabels.js +111 -0
- package/dist/prosemirror/listNumbering.d.ts +92 -0
- package/dist/prosemirror/listNumbering.js +330 -0
- package/dist/prosemirror/listRendering.d.ts +27 -0
- package/dist/prosemirror/listRendering.js +27 -0
- package/dist/prosemirror/listRenderingAttrs.d.ts +11 -2
- package/dist/prosemirror/listRenderingAttrs.js +8 -1
- package/dist/prosemirror/markupViewNotes.d.ts +8 -0
- package/dist/prosemirror/markupViewNotes.js +49 -0
- package/dist/prosemirror/markupViewProjection.d.ts +97 -0
- package/dist/prosemirror/markupViewProjection.js +88 -0
- package/dist/prosemirror/noteReferenceReview.d.ts +77 -0
- package/dist/prosemirror/noteReferenceReview.js +332 -0
- package/dist/prosemirror/numberingAttr.d.ts +9 -1
- package/dist/prosemirror/numberingAttr.js +9 -1
- package/dist/prosemirror/outlineLevelAttr.js +1 -1
- package/dist/prosemirror/paragraphIndentation.d.ts +10 -1
- package/dist/prosemirror/paragraphIndentation.js +32 -7
- package/dist/prosemirror/paragraphMarkJoin.d.ts +21 -0
- package/dist/prosemirror/paragraphMarkJoin.js +26 -0
- package/dist/prosemirror/paragraphPropertyCarry.d.ts +64 -0
- package/dist/prosemirror/paragraphPropertyCarry.js +158 -0
- package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +1 -1
- package/dist/prosemirror/plugins/documentNumbering.d.ts +27 -1
- package/dist/prosemirror/plugins/documentNumbering.js +97 -11
- package/dist/prosemirror/plugins/documentStyleState.d.ts +26 -0
- package/dist/prosemirror/plugins/documentStyleState.js +32 -0
- package/dist/prosemirror/plugins/documentStyles.d.ts +3 -13
- package/dist/prosemirror/plugins/documentStyles.js +67 -17
- package/dist/prosemirror/plugins/index.d.ts +2 -1
- package/dist/prosemirror/plugins/index.js +2 -1
- package/dist/prosemirror/plugins/paragraphStyleResolution.d.ts +15 -0
- package/dist/prosemirror/plugins/paragraphStyleResolution.js +230 -0
- package/dist/prosemirror/plugins/suggestionMode.d.ts +27 -3
- package/dist/prosemirror/plugins/suggestionMode.js +490 -63
- package/dist/prosemirror/plugins/templateDirectives.d.ts +1 -1
- package/dist/prosemirror/plugins/transactionInvariants.d.ts +32 -0
- package/dist/prosemirror/plugins/transactionInvariants.js +86 -0
- package/dist/prosemirror/positionSweep.d.ts +24 -0
- package/dist/prosemirror/positionSweep.js +222 -0
- package/dist/prosemirror/rebaseParagraphRunFormatting.d.ts +23 -3
- package/dist/prosemirror/rebaseParagraphRunFormatting.js +39 -13
- package/dist/prosemirror/rebaseParagraphRuns.d.ts +36 -0
- package/dist/prosemirror/rebaseParagraphRuns.js +99 -0
- package/dist/prosemirror/rejoinRunCarriers.d.ts +1 -1
- package/dist/prosemirror/replacedAnnotations.d.ts +33 -1
- package/dist/prosemirror/replacedAnnotations.js +170 -1
- package/dist/prosemirror/runFormattingFromMarks.d.ts +18 -0
- package/dist/prosemirror/runFormattingFromMarks.js +567 -0
- package/dist/prosemirror/runFormattingInlineCarriers.d.ts +1 -1
- package/dist/prosemirror/runFormattingReconciliation.js +10 -9
- package/dist/prosemirror/schema/index.d.ts +2 -2
- package/dist/prosemirror/schema/index.js +3 -0
- package/dist/prosemirror/schema/nodes.d.ts +44 -11
- package/dist/prosemirror/sectionMarkEdits.d.ts +20 -0
- package/dist/prosemirror/sectionMarkEdits.js +59 -0
- package/dist/prosemirror/storyListNumbering.d.ts +17 -0
- package/dist/prosemirror/storyListNumbering.js +102 -0
- package/dist/prosemirror/styles/paragraphStyleCascade.d.ts +59 -0
- package/dist/prosemirror/styles/paragraphStyleCascade.js +145 -0
- package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +21 -2
- package/dist/prosemirror/styles/resolvedStyleAttrs.js +38 -1
- package/dist/prosemirror/styles/tableStyleRegions.d.ts +31 -0
- package/dist/prosemirror/styles/tableStyleRegions.js +55 -0
- package/dist/prosemirror/tableCellPaste.d.ts +74 -0
- package/dist/prosemirror/tableCellPaste.js +525 -0
- package/dist/prosemirror/tableGridMutation.d.ts +87 -2
- package/dist/prosemirror/tableGridMutation.js +255 -2
- package/dist/prosemirror/tableRunIn.d.ts +51 -0
- package/dist/prosemirror/tableRunIn.js +165 -0
- package/dist/prosemirror/textInput.js +11 -2
- package/dist/prosemirror/trackedRevisionPath.d.ts +17 -0
- package/dist/prosemirror/trackedRevisionPath.js +32 -0
- package/dist/prosemirror/validation.js +5 -1
- package/dist/redline.js +93 -9
- package/dist/render-dom/BodySelectionOverlay.d.ts +4 -1
- package/dist/render-dom/BodySelectionOverlay.js +3 -2
- package/dist/server.d.ts +2 -2
- package/dist/utils/findReplace.js +2 -2
- package/dist/utils/mergeDocumentContent.js +1 -1
- package/dist/utils/noteReferenceLabels.d.ts +36 -0
- package/dist/utils/noteReferenceLabels.js +32 -0
- package/dist/utils/replaceText.js +1 -1
- package/dist/version-comparison.d.ts +1 -0
- package/dist/version-comparison.js +1 -0
- package/package.json +6 -5
- package/dist/internal/headlessRevisionResolution.d.ts +0 -23
|
@@ -4,12 +4,9 @@ import { PARSE_WARNING_CODES } from "@stll/docx-core/model";
|
|
|
4
4
|
const DANGLING_HEADER_REFERENCE_WARNING = PARSE_WARNING_CODES.danglingHeaderReference;
|
|
5
5
|
const DANGLING_FOOTER_REFERENCE_WARNING = PARSE_WARNING_CODES.danglingFooterReference;
|
|
6
6
|
const normalizeHeaderFooterReferences = ({ documentBody, headers, footers }) => {
|
|
7
|
-
const seenSectionProperties = /* @__PURE__ */ new Set();
|
|
8
7
|
let removedDanglingHeaderReferences = 0;
|
|
9
8
|
let removedDanglingFooterReferences = 0;
|
|
10
9
|
const normalizeSectionProperties = (sectionProperties) => {
|
|
11
|
-
if (!sectionProperties || seenSectionProperties.has(sectionProperties)) return;
|
|
12
|
-
seenSectionProperties.add(sectionProperties);
|
|
13
10
|
const headerResult = removeDanglingReferences(sectionProperties.headerReferences, headers);
|
|
14
11
|
if (headerResult.changed) {
|
|
15
12
|
removedDanglingHeaderReferences += headerResult.removed;
|
|
@@ -23,34 +20,62 @@ const normalizeHeaderFooterReferences = ({ documentBody, headers, footers }) =>
|
|
|
23
20
|
else delete sectionProperties.footerReferences;
|
|
24
21
|
}
|
|
25
22
|
};
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
forEachSectionProperties(documentBody, normalizeSectionProperties);
|
|
24
|
+
return {
|
|
25
|
+
removedDanglingHeaderReferences,
|
|
26
|
+
removedDanglingFooterReferences
|
|
28
27
|
};
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Visit every distinct section record once, in section order: the paragraph
|
|
31
|
+
* carriers in document order, then the body's final `w:sectPr`.
|
|
32
|
+
*/
|
|
33
|
+
const forEachSectionProperties = (documentBody, visit) => {
|
|
34
|
+
const seen = /* @__PURE__ */ new Set();
|
|
35
|
+
const visitOnce = (sectionProperties) => {
|
|
36
|
+
if (!sectionProperties || seen.has(sectionProperties)) return;
|
|
37
|
+
seen.add(sectionProperties);
|
|
38
|
+
visit(sectionProperties);
|
|
31
39
|
};
|
|
32
|
-
const
|
|
33
|
-
if (block.type === "paragraph")
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
if (block.type === "table") {
|
|
38
|
-
normalizeTable(block);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
if (block.type !== "blockSdt") return;
|
|
42
|
-
normalizeBlocks(block.content);
|
|
40
|
+
const visitBlocks = (blocks) => {
|
|
41
|
+
for (const block of blocks) if (block.type === "paragraph") visitOnce(block.sectionProperties);
|
|
42
|
+
else if (block.type === "table") visitTable(block);
|
|
43
|
+
else if (block.type === "blockSdt" || block.type === "blockCustomXml") visitBlocks(block.content);
|
|
43
44
|
};
|
|
44
|
-
const
|
|
45
|
-
for (const
|
|
45
|
+
const visitTable = (table) => {
|
|
46
|
+
for (const row of table.rows) for (const cell of row.cells) visitBlocks(cell.content);
|
|
46
47
|
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
for (const section of documentBody.sections ?? [])
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
visitBlocks(documentBody.content);
|
|
49
|
+
visitOnce(documentBody.finalSectionProperties);
|
|
50
|
+
for (const section of documentBody.sections ?? []) visitOnce(section.properties);
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Give each header and footer part the role a section reference states for
|
|
54
|
+
* it.
|
|
55
|
+
*
|
|
56
|
+
* A part says nothing about which pages it serves: the `w:type` of the
|
|
57
|
+
* `w:headerReference` / `w:footerReference` naming it does (ECMA-376 Part 1
|
|
58
|
+
* §17.10.5, `ST_HdrFtr`). The parts are read from the document's
|
|
59
|
+
* relationships, before any section is consulted, so each is read as a
|
|
60
|
+
* default part and takes its role here, from the first section that
|
|
61
|
+
* references it. A part no section references stays default; one several
|
|
62
|
+
* sections reference in different roles keeps the first, and a reader that
|
|
63
|
+
* needs every role reads the section references themselves.
|
|
64
|
+
*/
|
|
65
|
+
const assignHeaderFooterRoles = ({ documentBody, headers, footers }) => {
|
|
66
|
+
const assigned = /* @__PURE__ */ new Set();
|
|
67
|
+
const assign = (references, parts) => {
|
|
68
|
+
for (const { type, rId } of references ?? []) {
|
|
69
|
+
const part = parts?.get(rId);
|
|
70
|
+
if (!part || assigned.has(part)) continue;
|
|
71
|
+
assigned.add(part);
|
|
72
|
+
part.hdrFtrType = type;
|
|
73
|
+
}
|
|
53
74
|
};
|
|
75
|
+
forEachSectionProperties(documentBody, (sectionProperties) => {
|
|
76
|
+
assign(sectionProperties.headerReferences, headers);
|
|
77
|
+
assign(sectionProperties.footerReferences, footers);
|
|
78
|
+
});
|
|
54
79
|
};
|
|
55
80
|
const removeDanglingReferences = (references, validParts) => {
|
|
56
81
|
if (!references || !validParts) return {
|
|
@@ -66,4 +91,4 @@ const removeDanglingReferences = (references, validParts) => {
|
|
|
66
91
|
};
|
|
67
92
|
};
|
|
68
93
|
//#endregion
|
|
69
|
-
export { DANGLING_FOOTER_REFERENCE_WARNING, DANGLING_HEADER_REFERENCE_WARNING, normalizeHeaderFooterReferences };
|
|
94
|
+
export { DANGLING_FOOTER_REFERENCE_WARNING, DANGLING_HEADER_REFERENCE_WARNING, assignHeaderFooterRoles, normalizeHeaderFooterReferences };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { document_d_exports } from "../types/document.js";
|
|
2
2
|
import { XmlElement } from "./xmlParser.js";
|
|
3
|
+
import { ChildReader } from "./containerChildren.js";
|
|
3
4
|
import { PreviewLedger } from "./previewBudget.js";
|
|
4
5
|
import { StyleMap } from "./styleParser.js";
|
|
5
|
-
import { ChildReader } from "./containerChildren.js";
|
|
6
6
|
//#region src/docx/hyperlinkParser.d.ts
|
|
7
7
|
/**
|
|
8
8
|
* Parse a hyperlink element (w:hyperlink)
|
package/dist/docx/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getCachedNumberingMap } from "./numberingParser.js";
|
|
2
|
+
import { NO_NUMBERING_NUM_ID, NO_PARAGRAPH_NUMBERING, ParagraphNumberingOverride, ParagraphNumberingSlots, ResolvedParagraphNumbering, isNumberingReference, mergeParagraphNumbering, paragraphNumberingFromSlots, paragraphNumberingLevel, paragraphNumberingReferenceId, paragraphNumberingSlots, readParagraphNumbering, resolveParagraphNumbering, sameEffectiveParagraphNumbering, sameStatedParagraphNumbering } from "./numberingReference.js";
|
|
2
3
|
import { DOCX_ENCRYPTION_ERROR_CODES, DocxEncryptionError, DocxEncryptionErrorCode, isDocxEncryptionError } from "./encryption/errors.js";
|
|
3
4
|
import { DecryptDocxOptions, DecryptDocxResult, decryptDocxIfNeeded, openDocxBuffer } from "./encryption/openEncryptedDocx.js";
|
|
4
|
-
import { NO_NUMBERING_NUM_ID, NO_PARAGRAPH_NUMBERING, ParagraphNumberingOverride, ParagraphNumberingSlots, ResolvedParagraphNumbering, isNumberingReference, mergeParagraphNumbering, paragraphNumberingFromSlots, paragraphNumberingLevel, paragraphNumberingReferenceId, paragraphNumberingSlots, readParagraphNumbering, resolveParagraphNumbering, sameEffectiveParagraphNumbering, sameStatedParagraphNumbering } from "./numberingReference.js";
|
|
5
5
|
import { FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, FolioDocumentMetadataProperty, FolioDocumentPrivacyArchiveError, FolioDocumentPrivacyOptions, FolioDocumentPrivacyReport, FolioDocumentPrivacyTransform, InvalidFolioDocumentPrivacyOptionsError, RewriteDocxMetadataPrivacyResult, isFolioDocumentPrivacyTransform, rewriteDocxMetadataPrivacy } from "./metadataPrivacy.js";
|
|
6
6
|
export { DOCX_ENCRYPTION_ERROR_CODES, type DecryptDocxOptions, type DecryptDocxResult, DocxEncryptionError, type DocxEncryptionErrorCode, FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, type FolioDocumentMetadataProperty, FolioDocumentPrivacyArchiveError, type FolioDocumentPrivacyOptions, type FolioDocumentPrivacyReport, type FolioDocumentPrivacyTransform, InvalidFolioDocumentPrivacyOptionsError, NO_NUMBERING_NUM_ID, NO_PARAGRAPH_NUMBERING, type ParagraphNumberingOverride, type ParagraphNumberingSlots, type ResolvedParagraphNumbering, type RewriteDocxMetadataPrivacyResult, decryptDocxIfNeeded, getCachedNumberingMap, isDocxEncryptionError, isFolioDocumentPrivacyTransform, isNumberingReference, mergeParagraphNumbering, openDocxBuffer, paragraphNumberingFromSlots, paragraphNumberingLevel, paragraphNumberingReferenceId, paragraphNumberingSlots, readParagraphNumbering, resolveParagraphNumbering, rewriteDocxMetadataPrivacy, sameEffectiveParagraphNumbering, sameStatedParagraphNumbering };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { document_d_exports } from "../types/document.js";
|
|
2
|
+
//#region src/docx/listNumberingInstances.d.ts
|
|
3
|
+
/** The two kinds of list a command can create. */
|
|
4
|
+
declare const LIST_KINDS: readonly ["bullet", "numbered"];
|
|
5
|
+
type ListKind = (typeof LIST_KINDS)[number];
|
|
6
|
+
/** What a numbered list's first level counts in and how its marker reads. */
|
|
7
|
+
type ListLevelFormat = {
|
|
8
|
+
numFmt: document_d_exports.NumberFormat;
|
|
9
|
+
/** `w:lvlText` for level 0, e.g. `%1.` or `%1)`. */
|
|
10
|
+
lvlText: string;
|
|
11
|
+
};
|
|
12
|
+
/** The first-level appearance and start a new list is minted with. */
|
|
13
|
+
type NewListDefinition = {
|
|
14
|
+
kind: ListKind;
|
|
15
|
+
/** Level-0 format of a numbered list; the template's `%1.` decimal otherwise. */
|
|
16
|
+
format?: ListLevelFormat | undefined;
|
|
17
|
+
/** The value the first item shows, stated as a level-0 `w:startOverride`. */
|
|
18
|
+
start?: number | undefined;
|
|
19
|
+
};
|
|
20
|
+
type MintedListInstance = {
|
|
21
|
+
definitions: document_d_exports.NumberingDefinitions;
|
|
22
|
+
numId: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Define a new list: a new `w:abstractNum` of the requested kind and the
|
|
26
|
+
* `w:num` naming it. `definitions` must already hold every instance the
|
|
27
|
+
* document references (see {@link completeListNumbering}), so the new ids
|
|
28
|
+
* collide with none of them.
|
|
29
|
+
*/
|
|
30
|
+
declare const mintListInstance: (definitions: document_d_exports.NumberingDefinitions | null | undefined, { kind, format, start }: NewListDefinition) => MintedListInstance;
|
|
31
|
+
type RestartListInstanceOptions = {
|
|
32
|
+
abstractNumId: number;
|
|
33
|
+
ilvl: number;
|
|
34
|
+
start: number;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* A new `w:num` over an existing `w:abstractNum`, with a `w:startOverride` at
|
|
38
|
+
* `ilvl`: *Restart Numbering* and *Set Numbering Value*. The override is what
|
|
39
|
+
* makes a consumer count the instance on its own rather than continue the
|
|
40
|
+
* other instances of the same definition.
|
|
41
|
+
*/
|
|
42
|
+
declare const restartListInstance: (definitions: document_d_exports.NumberingDefinitions | null | undefined, { abstractNumId, ilvl, start }: RestartListInstanceOptions) => MintedListInstance;
|
|
43
|
+
/** One paragraph's numbering reference and the rendering it resolved to. */
|
|
44
|
+
type ListInstanceReference = {
|
|
45
|
+
numId: number;
|
|
46
|
+
ilvl: number;
|
|
47
|
+
rendering: document_d_exports.ListRendering;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Define every instance `references` name that `definitions` does not.
|
|
51
|
+
*
|
|
52
|
+
* A reference the editor resolved carries its rendering, and a rendering is
|
|
53
|
+
* what a minted instance leaves behind; a reference without one (a dangling
|
|
54
|
+
* id read from a file) has no rendering and so is never defined here. Returns
|
|
55
|
+
* `definitions` itself when nothing is missing.
|
|
56
|
+
*/
|
|
57
|
+
declare const completeListNumbering: (definitions: document_d_exports.NumberingDefinitions | undefined, references: Iterable<ListInstanceReference>) => document_d_exports.NumberingDefinitions | undefined;
|
|
58
|
+
//#endregion
|
|
59
|
+
export { LIST_KINDS, ListInstanceReference, ListKind, ListLevelFormat, completeListNumbering, mintListInstance, restartListInstance };
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { NUMBER_FORMATS } from "@stll/docx-core/model";
|
|
2
|
+
//#region src/docx/listNumberingInstances.ts
|
|
3
|
+
/**
|
|
4
|
+
* Numbering instances the editor defines itself.
|
|
5
|
+
*
|
|
6
|
+
* A list command in a document with no list of the requested kind has nothing
|
|
7
|
+
* to reference: the package may have no numbering part at all. The command
|
|
8
|
+
* then defines one, an `w:abstractNum` built from {@link defaultListLevels}
|
|
9
|
+
* plus the `w:num` naming it, as a word processor does when a list is
|
|
10
|
+
* started in a document without lists.
|
|
11
|
+
*
|
|
12
|
+
* The definition lives in two places without being stored twice. While the
|
|
13
|
+
* document is edited, the paragraphs that reference the instance carry the
|
|
14
|
+
* rendering it resolved to (`listAbstractNumId`, `listNumFmt`,
|
|
15
|
+
* `listMarkerTemplate`, `listStartOverride`, …), and those attrs travel with
|
|
16
|
+
* the paragraph through undo, collaboration and every save path.
|
|
17
|
+
* {@link completeListNumbering} turns them back into the definition wherever
|
|
18
|
+
* the package's own numbering has no entry for the id. Because a minted
|
|
19
|
+
* definition is the template plus level-0 facts that the rendering states, the
|
|
20
|
+
* definition it rebuilds is the one the command minted.
|
|
21
|
+
*/
|
|
22
|
+
/** The two kinds of list a command can create. */
|
|
23
|
+
const LIST_KINDS = ["bullet", "numbered"];
|
|
24
|
+
const INDENT_STEP_TWIPS = 720;
|
|
25
|
+
const HANGING_TWIPS = 360;
|
|
26
|
+
const ROMAN_HANGING_TWIPS = 180;
|
|
27
|
+
const LEVEL_COUNT = 9;
|
|
28
|
+
const levelIndent = (ilvl, hanging) => ({
|
|
29
|
+
indentLeft: INDENT_STEP_TWIPS * (ilvl + 1),
|
|
30
|
+
indentFirstLine: -hanging,
|
|
31
|
+
hangingIndent: true
|
|
32
|
+
});
|
|
33
|
+
/** The customary numbered-list cycle: `1.`, `a.`, `i.`, then again one level deeper. */
|
|
34
|
+
const NUMBERED_CYCLE = [
|
|
35
|
+
{
|
|
36
|
+
numFmt: "decimal",
|
|
37
|
+
lvlJc: "left",
|
|
38
|
+
hanging: HANGING_TWIPS
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
numFmt: "lowerLetter",
|
|
42
|
+
lvlJc: "left",
|
|
43
|
+
hanging: HANGING_TWIPS
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
numFmt: "lowerRoman",
|
|
47
|
+
lvlJc: "right",
|
|
48
|
+
hanging: ROMAN_HANGING_TWIPS
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
/** The customary bullet cycle: a round bullet, an open circle, a square. */
|
|
52
|
+
const BULLET_CYCLE = [
|
|
53
|
+
{
|
|
54
|
+
text: "•",
|
|
55
|
+
font: null
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
text: "o",
|
|
59
|
+
font: "Courier New"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
text: "▪",
|
|
63
|
+
font: null
|
|
64
|
+
}
|
|
65
|
+
];
|
|
66
|
+
const cycleEntry = (cycle, ilvl) => cycle.at(ilvl % cycle.length) ?? cycle[0];
|
|
67
|
+
const numberedLevel = (ilvl) => {
|
|
68
|
+
const { numFmt, lvlJc, hanging } = cycleEntry(NUMBERED_CYCLE, ilvl);
|
|
69
|
+
return {
|
|
70
|
+
ilvl,
|
|
71
|
+
start: 1,
|
|
72
|
+
numFmt,
|
|
73
|
+
lvlText: `%${ilvl + 1}.`,
|
|
74
|
+
lvlJc,
|
|
75
|
+
pPr: levelIndent(ilvl, hanging)
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
const bulletLevel = (ilvl) => {
|
|
79
|
+
const { text, font } = cycleEntry(BULLET_CYCLE, ilvl);
|
|
80
|
+
return {
|
|
81
|
+
ilvl,
|
|
82
|
+
start: 1,
|
|
83
|
+
numFmt: "bullet",
|
|
84
|
+
lvlText: text,
|
|
85
|
+
lvlJc: "left",
|
|
86
|
+
pPr: levelIndent(ilvl, HANGING_TWIPS),
|
|
87
|
+
...font === null ? {} : { rPr: { fontFamily: {
|
|
88
|
+
ascii: font,
|
|
89
|
+
hAnsi: font
|
|
90
|
+
} } }
|
|
91
|
+
};
|
|
92
|
+
};
|
|
93
|
+
/** The nine levels a list of `kind` is minted with. */
|
|
94
|
+
const defaultListLevels = (kind) => Array.from({ length: LEVEL_COUNT }, (_, ilvl) => kind === "bullet" ? bulletLevel(ilvl) : numberedLevel(ilvl));
|
|
95
|
+
const mintAbstractNumbering = ({ abstractNumId, kind, format }) => {
|
|
96
|
+
const levels = defaultListLevels(kind);
|
|
97
|
+
const first = levels[0];
|
|
98
|
+
if (first && kind === "numbered" && format) levels[0] = {
|
|
99
|
+
...first,
|
|
100
|
+
numFmt: format.numFmt,
|
|
101
|
+
lvlText: format.lvlText
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
abstractNumId,
|
|
105
|
+
multiLevelType: "hybridMultilevel",
|
|
106
|
+
levels
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
/** The template counts from one, so only another first value needs an override. */
|
|
110
|
+
const levelZeroStart = (start) => start === void 0 || start === 1 ? void 0 : [{
|
|
111
|
+
ilvl: 0,
|
|
112
|
+
startOverride: start
|
|
113
|
+
}];
|
|
114
|
+
const EMPTY_DEFINITIONS = {
|
|
115
|
+
abstractNums: [],
|
|
116
|
+
nums: []
|
|
117
|
+
};
|
|
118
|
+
const nextId = (ids, floor) => {
|
|
119
|
+
let next = floor;
|
|
120
|
+
for (const id of ids) next = Math.max(next, id + 1);
|
|
121
|
+
return next;
|
|
122
|
+
};
|
|
123
|
+
/** A fresh `w:numId` for `definitions`; zero is reserved for "no numbering". */
|
|
124
|
+
const nextNumId = (definitions) => nextId((definitions?.nums ?? []).map(({ numId }) => numId), 1);
|
|
125
|
+
/** A fresh `w:abstractNumId` for `definitions`. */
|
|
126
|
+
const nextAbstractNumId = (definitions) => nextId((definitions?.abstractNums ?? []).map(({ abstractNumId }) => abstractNumId), 0);
|
|
127
|
+
/**
|
|
128
|
+
* Define a new list: a new `w:abstractNum` of the requested kind and the
|
|
129
|
+
* `w:num` naming it. `definitions` must already hold every instance the
|
|
130
|
+
* document references (see {@link completeListNumbering}), so the new ids
|
|
131
|
+
* collide with none of them.
|
|
132
|
+
*/
|
|
133
|
+
const mintListInstance = (definitions, { kind, format, start }) => {
|
|
134
|
+
const current = definitions ?? EMPTY_DEFINITIONS;
|
|
135
|
+
const numId = nextNumId(current);
|
|
136
|
+
const abstractNumId = nextAbstractNumId(current);
|
|
137
|
+
const levelOverrides = levelZeroStart(start);
|
|
138
|
+
const instance = {
|
|
139
|
+
numId,
|
|
140
|
+
abstractNumId,
|
|
141
|
+
...levelOverrides ? { levelOverrides } : {}
|
|
142
|
+
};
|
|
143
|
+
return {
|
|
144
|
+
numId,
|
|
145
|
+
definitions: {
|
|
146
|
+
...current,
|
|
147
|
+
abstractNums: [...current.abstractNums, mintAbstractNumbering({
|
|
148
|
+
abstractNumId,
|
|
149
|
+
kind,
|
|
150
|
+
format
|
|
151
|
+
})],
|
|
152
|
+
nums: [...current.nums, instance]
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* A new `w:num` over an existing `w:abstractNum`, with a `w:startOverride` at
|
|
158
|
+
* `ilvl`: *Restart Numbering* and *Set Numbering Value*. The override is what
|
|
159
|
+
* makes a consumer count the instance on its own rather than continue the
|
|
160
|
+
* other instances of the same definition.
|
|
161
|
+
*/
|
|
162
|
+
const restartListInstance = (definitions, { abstractNumId, ilvl, start }) => {
|
|
163
|
+
const current = definitions ?? EMPTY_DEFINITIONS;
|
|
164
|
+
const numId = nextNumId(current);
|
|
165
|
+
const instance = {
|
|
166
|
+
numId,
|
|
167
|
+
abstractNumId,
|
|
168
|
+
levelOverrides: [{
|
|
169
|
+
ilvl,
|
|
170
|
+
startOverride: start
|
|
171
|
+
}]
|
|
172
|
+
};
|
|
173
|
+
return {
|
|
174
|
+
numId,
|
|
175
|
+
definitions: {
|
|
176
|
+
...current,
|
|
177
|
+
nums: [...current.nums, instance]
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
const NUMBER_FORMAT_SET = new Set(NUMBER_FORMATS);
|
|
182
|
+
const isNumberFormat = (format) => format !== void 0 && NUMBER_FORMAT_SET.has(format);
|
|
183
|
+
const levelZeroFormat = (references) => {
|
|
184
|
+
const first = references.find(({ ilvl }) => ilvl === 0)?.rendering;
|
|
185
|
+
const numFmt = first?.numFmt ?? references.find(({ rendering }) => rendering.levelNumFmts?.[0])?.rendering.levelNumFmts?.[0];
|
|
186
|
+
if (!isNumberFormat(numFmt)) return;
|
|
187
|
+
return {
|
|
188
|
+
numFmt,
|
|
189
|
+
lvlText: first?.markerTemplate ?? "%1."
|
|
190
|
+
};
|
|
191
|
+
};
|
|
192
|
+
const startOverridesOf = (references) => {
|
|
193
|
+
const byLevel = /* @__PURE__ */ new Map();
|
|
194
|
+
for (const { ilvl, rendering } of references) if (rendering.startOverride !== void 0 && !byLevel.has(ilvl)) byLevel.set(ilvl, rendering.startOverride);
|
|
195
|
+
return [...byLevel.entries()].toSorted(([left], [right]) => left - right).map(([ilvl, startOverride]) => ({
|
|
196
|
+
ilvl,
|
|
197
|
+
startOverride
|
|
198
|
+
}));
|
|
199
|
+
};
|
|
200
|
+
/**
|
|
201
|
+
* Define every instance `references` name that `definitions` does not.
|
|
202
|
+
*
|
|
203
|
+
* A reference the editor resolved carries its rendering, and a rendering is
|
|
204
|
+
* what a minted instance leaves behind; a reference without one (a dangling
|
|
205
|
+
* id read from a file) has no rendering and so is never defined here. Returns
|
|
206
|
+
* `definitions` itself when nothing is missing.
|
|
207
|
+
*/
|
|
208
|
+
const completeListNumbering = (definitions, references) => {
|
|
209
|
+
const definedNums = new Set((definitions?.nums ?? []).map(({ numId }) => numId));
|
|
210
|
+
const missing = /* @__PURE__ */ new Map();
|
|
211
|
+
for (const reference of references) {
|
|
212
|
+
if (definedNums.has(reference.numId)) continue;
|
|
213
|
+
const group = missing.get(reference.numId);
|
|
214
|
+
if (group) group.push(reference);
|
|
215
|
+
else missing.set(reference.numId, [reference]);
|
|
216
|
+
}
|
|
217
|
+
if (missing.size === 0) return definitions;
|
|
218
|
+
const current = definitions ?? EMPTY_DEFINITIONS;
|
|
219
|
+
const abstractIds = new Set(current.abstractNums.map(({ abstractNumId }) => abstractNumId));
|
|
220
|
+
const statedAbstractIds = [...missing.values()].flatMap((group) => group.flatMap(({ rendering }) => rendering.abstractNumId === void 0 ? [] : [rendering.abstractNumId]));
|
|
221
|
+
let freeAbstractId = nextId([...abstractIds, ...statedAbstractIds], 0);
|
|
222
|
+
const abstractNums = [];
|
|
223
|
+
const nums = [];
|
|
224
|
+
for (const [numId, group] of missing) {
|
|
225
|
+
const abstractNumId = group.find(({ rendering }) => rendering.abstractNumId !== void 0)?.rendering.abstractNumId ?? freeAbstractId++;
|
|
226
|
+
if (!abstractIds.has(abstractNumId)) {
|
|
227
|
+
abstractIds.add(abstractNumId);
|
|
228
|
+
const kind = group.some(({ rendering }) => rendering.isBullet) ? "bullet" : "numbered";
|
|
229
|
+
abstractNums.push(mintAbstractNumbering({
|
|
230
|
+
abstractNumId,
|
|
231
|
+
kind,
|
|
232
|
+
format: levelZeroFormat(group)
|
|
233
|
+
}));
|
|
234
|
+
}
|
|
235
|
+
const levelOverrides = startOverridesOf(group);
|
|
236
|
+
nums.push({
|
|
237
|
+
numId,
|
|
238
|
+
abstractNumId,
|
|
239
|
+
...levelOverrides.length > 0 ? { levelOverrides } : {}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
return {
|
|
243
|
+
...current,
|
|
244
|
+
abstractNums: [...current.abstractNums, ...abstractNums],
|
|
245
|
+
nums: [...current.nums, ...nums]
|
|
246
|
+
};
|
|
247
|
+
};
|
|
248
|
+
//#endregion
|
|
249
|
+
export { LIST_KINDS, completeListNumbering, mintListInstance, restartListInstance };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { countCentralDirectoryRecords, createInflationBudget, inflateEntryWithinLimits } from "./archiveInflation.js";
|
|
1
2
|
import { elementToXml, getLocalName, parseXmlDocument } from "./xmlParser.js";
|
|
2
3
|
import { TaggedError } from "better-result";
|
|
3
4
|
import JSZip from "jszip";
|
|
@@ -63,6 +64,10 @@ const loadPrivacyArchive = async (buffer) => {
|
|
|
63
64
|
message: "Document privacy input exceeded the compressed-size limit",
|
|
64
65
|
reason: "input-too-large"
|
|
65
66
|
});
|
|
67
|
+
if (countCentralDirectoryRecords(new Uint8Array(buffer), MAX_ARCHIVE_ENTRIES) > MAX_ARCHIVE_ENTRIES) throw new FolioDocumentPrivacyArchiveError({
|
|
68
|
+
message: "Document privacy input exceeded the package-entry limit",
|
|
69
|
+
reason: "too-many-entries"
|
|
70
|
+
});
|
|
66
71
|
let zip;
|
|
67
72
|
try {
|
|
68
73
|
zip = await JSZip.loadAsync(buffer);
|
|
@@ -109,6 +114,24 @@ const rewriteCorePropertiesPrivacy = (xml, transforms) => {
|
|
|
109
114
|
removedMetadataProperties: FOLIO_DOCUMENT_METADATA_PROPERTIES.filter((property) => removedPropertySet.has(property))
|
|
110
115
|
};
|
|
111
116
|
};
|
|
117
|
+
/**
|
|
118
|
+
* Read the core-properties part within its size limit. The declared size was
|
|
119
|
+
* checked when the archive loaded, but only the inflation itself can show that
|
|
120
|
+
* the part is no larger than it claims.
|
|
121
|
+
*/
|
|
122
|
+
const readCoreProperties = async (entry) => {
|
|
123
|
+
const result = await inflateEntryWithinLimits({
|
|
124
|
+
entry,
|
|
125
|
+
maxEntryBytes: MAX_CORE_PROPERTIES_BYTES,
|
|
126
|
+
maxCompressionRatio: 200,
|
|
127
|
+
budget: createInflationBudget(MAX_CORE_PROPERTIES_BYTES)
|
|
128
|
+
});
|
|
129
|
+
if (!result.ok) throw new FolioDocumentPrivacyArchiveError({
|
|
130
|
+
message: "Document privacy core properties exceeded the part-size limit",
|
|
131
|
+
reason: "core-properties-too-large"
|
|
132
|
+
});
|
|
133
|
+
return new TextDecoder("utf-8", { ignoreBOM: true }).decode(result.bytes);
|
|
134
|
+
};
|
|
112
135
|
/** Rewrite selected package metadata fields without changing other package parts. */
|
|
113
136
|
const rewriteDocxMetadataPrivacy = async (buffer, { transforms }) => {
|
|
114
137
|
const appliedTransforms = resolveFolioDocumentPrivacyTransforms(transforms);
|
|
@@ -121,7 +144,7 @@ const rewriteDocxMetadataPrivacy = async (buffer, { transforms }) => {
|
|
|
121
144
|
removedMetadataProperties: []
|
|
122
145
|
}
|
|
123
146
|
};
|
|
124
|
-
const rewritten = rewriteCorePropertiesPrivacy(await coreProperties
|
|
147
|
+
const rewritten = rewriteCorePropertiesPrivacy(await readCoreProperties(coreProperties), appliedTransforms);
|
|
125
148
|
if (rewritten.removedMetadataProperties.length === 0) return {
|
|
126
149
|
buffer,
|
|
127
150
|
privacyReport: {
|
|
@@ -52,7 +52,8 @@ const normalizeCellBlock = (block, styles) => {
|
|
|
52
52
|
switch (block.type) {
|
|
53
53
|
case "paragraph": return normalizeParagraph(block, styles);
|
|
54
54
|
case "table": return normalizeTable(block, styles);
|
|
55
|
-
case "blockSdt":
|
|
55
|
+
case "blockSdt":
|
|
56
|
+
case "blockCustomXml": return {
|
|
56
57
|
...block,
|
|
57
58
|
content: block.content.map((child) => normalizeCellBlock(child, styles))
|
|
58
59
|
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { document_d_exports } from "../types/document.js";
|
|
2
|
+
//#region src/docx/noteReferenceMark.d.ts
|
|
3
|
+
type NoteKind = "footnote" | "endnote";
|
|
4
|
+
/** The run carrying a note's in-note reference mark, in the note reference style. */
|
|
5
|
+
declare const noteReferenceMarkRun: (kind: NoteKind) => document_d_exports.Run;
|
|
6
|
+
/**
|
|
7
|
+
* A note's content with its reference mark run at the start of its first
|
|
8
|
+
* paragraph, added when the note has none.
|
|
9
|
+
*/
|
|
10
|
+
declare const withNoteReferenceMark: (kind: NoteKind, content: readonly document_d_exports.BlockContent[]) => document_d_exports.BlockContent[];
|
|
11
|
+
/** A new note, as an editor adds one: its content led by its own reference mark. */
|
|
12
|
+
declare function createNote(kind: "footnote", id: number, content: readonly document_d_exports.BlockContent[]): document_d_exports.Footnote;
|
|
13
|
+
declare function createNote(kind: "endnote", id: number, content: readonly document_d_exports.BlockContent[]): document_d_exports.Endnote;
|
|
14
|
+
//#endregion
|
|
15
|
+
export { createNote, noteReferenceMarkRun, withNoteReferenceMark };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { cloneParagraphWithPropertySource } from "./paragraphPropertySource.js";
|
|
2
|
+
//#region src/docx/noteReferenceMark.ts
|
|
3
|
+
const MARK_ELEMENT = /<(?:[\w.-]+:)?(?:footnote|endnote)Ref[\s/>]/u;
|
|
4
|
+
/** The run carrying a note's in-note reference mark, in the note reference style. */
|
|
5
|
+
const noteReferenceMarkRun = (kind) => ({
|
|
6
|
+
type: "run",
|
|
7
|
+
formatting: { styleId: kind === "footnote" ? "FootnoteReference" : "EndnoteReference" },
|
|
8
|
+
content: [{
|
|
9
|
+
type: "preservedXml",
|
|
10
|
+
xml: `<w:${kind}Ref/>`,
|
|
11
|
+
text: ""
|
|
12
|
+
}]
|
|
13
|
+
});
|
|
14
|
+
const holdsReferenceMark = (value) => {
|
|
15
|
+
if (Array.isArray(value)) return value.some(holdsReferenceMark);
|
|
16
|
+
if (typeof value !== "object" || value === null) return false;
|
|
17
|
+
const record = value;
|
|
18
|
+
if (record["type"] === "preservedXml" && typeof record["xml"] === "string") return MARK_ELEMENT.test(record["xml"]);
|
|
19
|
+
return Object.values(record).some(holdsReferenceMark);
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* A note's content with its reference mark run at the start of its first
|
|
23
|
+
* paragraph, added when the note has none.
|
|
24
|
+
*/
|
|
25
|
+
const withNoteReferenceMark = (kind, content) => {
|
|
26
|
+
if (holdsReferenceMark(content)) return [...content];
|
|
27
|
+
const index = content.findIndex((block) => block.type === "paragraph");
|
|
28
|
+
const mark = noteReferenceMarkRun(kind);
|
|
29
|
+
if (index === -1) return [{
|
|
30
|
+
type: "paragraph",
|
|
31
|
+
content: [mark]
|
|
32
|
+
}, ...content];
|
|
33
|
+
const paragraph = content[index];
|
|
34
|
+
return content.map((block, position) => position === index ? cloneParagraphWithPropertySource(paragraph, { content: [mark, ...paragraph.content] }) : block);
|
|
35
|
+
};
|
|
36
|
+
function createNote(kind, id, content) {
|
|
37
|
+
return kind === "footnote" ? {
|
|
38
|
+
type: "footnote",
|
|
39
|
+
id,
|
|
40
|
+
content: withNoteReferenceMark(kind, content)
|
|
41
|
+
} : {
|
|
42
|
+
type: "endnote",
|
|
43
|
+
id,
|
|
44
|
+
content: withNoteReferenceMark(kind, content)
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
//#endregion
|
|
48
|
+
export { createNote, noteReferenceMarkRun, withNoteReferenceMark };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region src/docx/opaqueCarrier.d.ts
|
|
2
|
+
declare const OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC = "[Unsupported block-level tracked-change content]";
|
|
3
|
+
declare const opaqueRevisionCarrierName: (xml: string) => string | undefined;
|
|
4
|
+
declare const countOpaqueRevisionWrappers: (xml: string) => number;
|
|
5
|
+
declare const isOpaqueNestedRowMarkup: (xml: string) => boolean;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC, countOpaqueRevisionWrappers, isOpaqueNestedRowMarkup, opaqueRevisionCarrierName };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { OOXML_NAMESPACE_SCOPE, WORDPROCESSINGML_NAMESPACE_URIS, getChildElements, getLocalName, parseXml } from "./xmlParser.js";
|
|
2
|
+
//#region src/docx/opaqueCarrier.ts
|
|
3
|
+
const OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC = "[Unsupported block-level tracked-change content]";
|
|
4
|
+
const REVISION_WRAPPERS = /* @__PURE__ */ new Set([
|
|
5
|
+
"ins",
|
|
6
|
+
"del",
|
|
7
|
+
"moveFrom",
|
|
8
|
+
"moveTo"
|
|
9
|
+
]);
|
|
10
|
+
const opaqueRevisionCarrierName = (xml) => {
|
|
11
|
+
const visit = (element) => {
|
|
12
|
+
const localName = getLocalName(element.name);
|
|
13
|
+
if (WORDPROCESSINGML_NAMESPACE_URIS.has(element.namespaceUri ?? "") && REVISION_WRAPPERS.has(localName)) return `w:${localName}`;
|
|
14
|
+
for (const child of getChildElements(element)) {
|
|
15
|
+
const match = visit(child);
|
|
16
|
+
if (match !== void 0) return match;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
for (const root of getChildElements(parseXml(xml, OOXML_NAMESPACE_SCOPE))) {
|
|
20
|
+
const match = visit(root);
|
|
21
|
+
if (match !== void 0) return match;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const countOpaqueRevisionWrappers = (xml) => {
|
|
25
|
+
const count = (element) => {
|
|
26
|
+
const localName = getLocalName(element.name);
|
|
27
|
+
let total = WORDPROCESSINGML_NAMESPACE_URIS.has(element.namespaceUri ?? "") && REVISION_WRAPPERS.has(localName) ? 1 : 0;
|
|
28
|
+
for (const child of getChildElements(element)) total += count(child);
|
|
29
|
+
return total;
|
|
30
|
+
};
|
|
31
|
+
return getChildElements(parseXml(xml, OOXML_NAMESPACE_SCOPE)).reduce((total, element) => total + count(element), 0);
|
|
32
|
+
};
|
|
33
|
+
const isOpaqueNestedRowMarkup = (xml) => {
|
|
34
|
+
const element = getChildElements(parseXml(xml, OOXML_NAMESPACE_SCOPE)).at(0);
|
|
35
|
+
return element !== void 0 && getLocalName(element.name) === "tr" && WORDPROCESSINGML_NAMESPACE_URIS.has(element.namespaceUri ?? "");
|
|
36
|
+
};
|
|
37
|
+
//#endregion
|
|
38
|
+
export { OPAQUE_REVISION_CARRIER_READER_DIAGNOSTIC, countOpaqueRevisionWrappers, isOpaqueNestedRowMarkup, opaqueRevisionCarrierName };
|
|
@@ -58,7 +58,10 @@ const isPresent = (present, partPath) => present.has(normalizePartPath(partPath)
|
|
|
58
58
|
const relationshipTarget = (element, relsPath) => {
|
|
59
59
|
if (TARGET_MODE_ATTRIBUTE.exec(element)?.groups?.["value"] === "External") return null;
|
|
60
60
|
const target = TARGET_ATTRIBUTE.exec(element)?.groups?.["value"];
|
|
61
|
-
|
|
61
|
+
if (target === void 0) return null;
|
|
62
|
+
const fragment = target.indexOf("#");
|
|
63
|
+
if (fragment === 0) return owningPartPath(relsPath) ?? "";
|
|
64
|
+
return resolveRelativePath(relsPath, fragment > 0 ? target.slice(0, fragment) : target);
|
|
62
65
|
};
|
|
63
66
|
/**
|
|
64
67
|
* Every `.rels` part with its text. Read one at a time rather than through
|