@stll/folio-core 0.52.0 → 0.53.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 +1519 -105
- package/dist/ai-edits/batch-claims.d.ts +130 -0
- package/dist/ai-edits/batch-claims.js +244 -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 +71 -7
- package/dist/ai-edits/headless.js +381 -41
- 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 +1 -1
- package/dist/ai-edits/read.js +56 -43
- package/dist/ai-edits/result-validation.d.ts +29 -0
- package/dist/ai-edits/result-validation.js +164 -0
- package/dist/ai-edits/snapshot.d.ts +36 -3
- package/dist/ai-edits/snapshot.js +177 -23
- package/dist/ai-edits/table-cell-mutations.d.ts +1 -1
- package/dist/ai-edits/table-cell-mutations.js +4 -1
- package/dist/ai-edits/table-geometry.d.ts +1 -1
- package/dist/ai-edits/table-row-column-mutations.d.ts +38 -16
- package/dist/ai-edits/table-row-column-mutations.js +61 -26
- 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.js +13 -2
- 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/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 +62 -9
- 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/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/normalizeBaseDirection.js +2 -1
- 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 +91 -24
- package/dist/docx/paragraphPropertySource.d.ts +4 -2
- package/dist/docx/paragraphPropertySource.js +7 -1
- package/dist/docx/paragraphTraversal.js +1 -0
- package/dist/docx/parseWarningMessage.js +4 -1
- package/dist/docx/parser.js +173 -20
- package/dist/docx/rezip.js +27 -5
- 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.js +106 -37
- 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/createBilingualDocument.js +3 -3
- 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 +2 -1
- package/dist/docx/unzip.js +1 -1
- package/dist/docx/wordprocessingPrefixes.d.ts +78 -0
- package/dist/docx/wordprocessingPrefixes.js +286 -0
- package/dist/i18n/messages/catalogs.gen.d.ts +136 -0
- package/dist/i18n/messages/catalogs.gen.js +153 -17
- package/dist/i18n/messages/messages.gen.d.ts +8 -0
- 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 +530 -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/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/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/fromMarkdown.js +2 -1
- package/dist/markdown/internals.d.ts +11 -1
- package/dist/markdown/internals.js +24 -3
- package/dist/markdown/renderBlock.js +39 -9
- package/dist/markdown/renderParagraph.d.ts +13 -1
- package/dist/markdown/renderParagraph.js +85 -38
- package/dist/markdown/renderRuns.js +3 -10
- 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/commands/comments.d.ts +7 -8
- package/dist/prosemirror/commands/comments.js +241 -207
- package/dist/prosemirror/commands/contentControls.d.ts +1 -1
- package/dist/prosemirror/commands/formatPainter.d.ts +1 -1
- package/dist/prosemirror/commands/formatting.d.ts +1 -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/resolveAllTableChanges.d.ts +40 -0
- package/dist/prosemirror/commands/resolveAllTableChanges.js +615 -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 +59 -0
- package/dist/prosemirror/commands/sectionBreak.js +2 -1
- package/dist/prosemirror/commands/tableCellMergeResolution.d.ts +8 -2
- package/dist/prosemirror/commands/tableCellMergeResolution.js +1 -1
- package/dist/prosemirror/contentControlRevisions.d.ts +1 -1
- package/dist/prosemirror/conversion/fromProseDoc.js +181 -31
- package/dist/prosemirror/conversion/toProseDoc.js +39 -4
- 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 +3 -1
- package/dist/prosemirror/extensions/core/DocExtension.js +1 -1
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +12 -0
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +3 -0
- package/dist/prosemirror/extensions/features/ListExtension.js +161 -123
- 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/pastedHtmlLists.d.ts +12 -0
- package/dist/prosemirror/extensions/features/pastedHtmlLists.js +126 -0
- package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +21 -5
- package/dist/prosemirror/extensions/marks/RunIdentityExtension.d.ts +21 -18
- package/dist/prosemirror/extensions/marks/RunIdentityExtension.js +37 -17
- package/dist/prosemirror/extensions/marks/markUtils.d.ts +7 -2
- package/dist/prosemirror/extensions/marks/markUtils.js +8 -2
- package/dist/prosemirror/extensions/marks/noteReferenceDeletion.d.ts +10 -0
- package/dist/prosemirror/extensions/marks/noteReferenceDeletion.js +35 -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/FieldExtension.d.ts +3 -3
- package/dist/prosemirror/extensions/nodes/FieldExtension.js +50 -15
- 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 +19 -18
- package/dist/prosemirror/extensions/types.d.ts +4 -1
- package/dist/prosemirror/findReplaceSelection.js +1 -1
- package/dist/prosemirror/index.d.ts +3 -2
- package/dist/prosemirror/index.js +3 -2
- 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 +110 -0
- package/dist/prosemirror/listNumbering.js +345 -0
- package/dist/prosemirror/listRenderingAttrs.d.ts +11 -2
- package/dist/prosemirror/listRenderingAttrs.js +8 -1
- package/dist/prosemirror/markupViewProjection.d.ts +95 -0
- package/dist/prosemirror/markupViewProjection.js +83 -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 +29 -7
- package/dist/prosemirror/paragraphMarkJoin.d.ts +19 -0
- package/dist/prosemirror/paragraphMarkJoin.js +24 -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/documentStyles.d.ts +10 -1
- package/dist/prosemirror/plugins/documentStyles.js +14 -1
- package/dist/prosemirror/plugins/suggestionMode.d.ts +16 -2
- package/dist/prosemirror/plugins/suggestionMode.js +116 -52
- 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 +1 -1
- 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/runFormattingInlineCarriers.d.ts +1 -1
- package/dist/prosemirror/schema/index.d.ts +2 -2
- package/dist/prosemirror/schema/index.js +3 -0
- package/dist/prosemirror/schema/nodes.d.ts +42 -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/tableGridMutation.d.ts +48 -2
- package/dist/prosemirror/tableGridMutation.js +106 -1
- 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/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 +3 -2
- package/dist/internal/headlessRevisionResolution.d.ts +0 -23
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Node } from "prosemirror-model";
|
|
2
|
+
import { Transaction } from "prosemirror-state";
|
|
3
|
+
//#region src/prosemirror/anchoredTextBoxes.d.ts
|
|
4
|
+
/** The id a text box anchor names, or `undefined` for anything else. */
|
|
5
|
+
declare const textBoxAnchorIdOf: (node: Node) => string | undefined;
|
|
6
|
+
/** The anchor ids of the text boxes drawn in `node`. */
|
|
7
|
+
declare const textBoxAnchorIdsIn: (node: Node) => Set<string>;
|
|
8
|
+
/** The anchor id of a text box block drawn in a paragraph, or `undefined`. */
|
|
9
|
+
declare const anchoredTextBoxId: (node: Node) => string | undefined;
|
|
10
|
+
/**
|
|
11
|
+
* Where the paragraph at `position` ends together with the text boxes drawn
|
|
12
|
+
* in it that follow it: the place for a block inserted after the paragraph.
|
|
13
|
+
*/
|
|
14
|
+
declare const endOfParagraphWithItsTextBoxes: (doc: Node, position: number) => number;
|
|
15
|
+
/** Anchor ids `before` holds and `after` does not. */
|
|
16
|
+
declare const droppedTextBoxAnchorIds: (before: Node, after: Node) => Set<string>;
|
|
17
|
+
/**
|
|
18
|
+
* Delete the text box blocks whose anchors are in `anchorIds`. Returns whether
|
|
19
|
+
* any went.
|
|
20
|
+
*/
|
|
21
|
+
declare const deleteTextBoxesAnchoredAt: (tr: Transaction, anchorIds: ReadonlySet<string>) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Put every text box drawn in the paragraph at `position` right after it,
|
|
24
|
+
* keeping the boxes' order. For a paragraph just split: the boxes follow the
|
|
25
|
+
* second half, and those anchored in the first half move up to it.
|
|
26
|
+
*/
|
|
27
|
+
declare const gatherTextBoxesAfterParagraph: (tr: Transaction, position: number) => void;
|
|
28
|
+
/** The anchor ids of the text boxes drawn between `from` and `to`. */
|
|
29
|
+
declare const textBoxAnchorIdsBetween: (doc: Node, from: number, to: number) => Set<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Before the paragraph at `position` joins the one after it: move the text
|
|
32
|
+
* boxes drawn in it, which stand between the two, past that paragraph, where
|
|
33
|
+
* they follow the joined one. Returns whether any moved.
|
|
34
|
+
*/
|
|
35
|
+
declare const moveTextBoxesPastNextParagraph: (tr: Transaction, position: number) => boolean;
|
|
36
|
+
//#endregion
|
|
37
|
+
export { anchoredTextBoxId, deleteTextBoxesAnchoredAt, droppedTextBoxAnchorIds, endOfParagraphWithItsTextBoxes, gatherTextBoxesAfterParagraph, moveTextBoxesPastNextParagraph, textBoxAnchorIdOf, textBoxAnchorIdsBetween, textBoxAnchorIdsIn };
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { expectTextBoxAttrs } from "./attrs/index.js";
|
|
2
|
+
import "./extensions/nodes/TextBoxAnchorExtension.js";
|
|
3
|
+
import { readTextBoxAnchorAttrs } from "./textBoxAnchorAttrs.js";
|
|
4
|
+
import { Fragment } from "prosemirror-model";
|
|
5
|
+
//#region src/prosemirror/anchoredTextBoxes.ts
|
|
6
|
+
/**
|
|
7
|
+
* A text box and the paragraph it is drawn in.
|
|
8
|
+
*
|
|
9
|
+
* In DOCX a text box is run content: a `w:drawing` in a run of its paragraph.
|
|
10
|
+
* The editor lifts it out into a `textBox` block after that paragraph and
|
|
11
|
+
* leaves a zero-width `textBoxAnchor` where the run was; the save puts the box
|
|
12
|
+
* back at its anchor, wherever the block has ended up. So the anchor, not the
|
|
13
|
+
* block's position, says which paragraph owns the box, and two rules follow:
|
|
14
|
+
*
|
|
15
|
+
* - The box follows its anchor. A paragraph deleted, or its anchor deleted,
|
|
16
|
+
* takes the box with it: a drawing is content of the paragraph it is in.
|
|
17
|
+
* Left behind, the block was saved into whatever paragraph came before it.
|
|
18
|
+
* - The box sits right after its paragraph. The reader lists the box's
|
|
19
|
+
* paragraphs where the block is, and a reopened package puts the block
|
|
20
|
+
* right after the paragraph holding its anchor, so a block written between
|
|
21
|
+
* the two is read in a different order once saved.
|
|
22
|
+
*
|
|
23
|
+
* Only a box placed `inlineWithPrevious` has an anchor: a `standalone` one
|
|
24
|
+
* stands in for a paragraph that held nothing else.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Add the anchor id of `node`, when it is an anchor that names one. An anchor
|
|
28
|
+
* naming none ties no box to its paragraph.
|
|
29
|
+
*/
|
|
30
|
+
const collectAnchorId = (node, ids) => {
|
|
31
|
+
const anchorId = textBoxAnchorIdOf(node);
|
|
32
|
+
if (anchorId !== void 0) ids.add(anchorId);
|
|
33
|
+
};
|
|
34
|
+
/** The id a text box anchor names, or `undefined` for anything else. */
|
|
35
|
+
const textBoxAnchorIdOf = (node) => {
|
|
36
|
+
if (node.type.name !== "textBoxAnchor") return;
|
|
37
|
+
const attrs = readTextBoxAnchorAttrs(node);
|
|
38
|
+
return attrs.ok ? attrs.value.anchorId : void 0;
|
|
39
|
+
};
|
|
40
|
+
/** The anchor ids of the text boxes drawn in `node`. */
|
|
41
|
+
const textBoxAnchorIdsIn = (node) => {
|
|
42
|
+
const ids = /* @__PURE__ */ new Set();
|
|
43
|
+
node.descendants((child) => {
|
|
44
|
+
collectAnchorId(child, ids);
|
|
45
|
+
return true;
|
|
46
|
+
});
|
|
47
|
+
return ids;
|
|
48
|
+
};
|
|
49
|
+
/** The anchor id of a text box block drawn in a paragraph, or `undefined`. */
|
|
50
|
+
const anchoredTextBoxId = (node) => {
|
|
51
|
+
if (node.type.name !== "textBox") return;
|
|
52
|
+
const attrs = expectTextBoxAttrs(node);
|
|
53
|
+
return attrs._docxPlacement === "inlineWithPrevious" ? attrs._docxAnchorId : void 0;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Where the paragraph at `position` ends together with the text boxes drawn
|
|
57
|
+
* in it that follow it: the place for a block inserted after the paragraph.
|
|
58
|
+
*/
|
|
59
|
+
const endOfParagraphWithItsTextBoxes = (doc, position) => {
|
|
60
|
+
const paragraph = doc.nodeAt(position);
|
|
61
|
+
if (!paragraph) return position;
|
|
62
|
+
let end = position + paragraph.nodeSize;
|
|
63
|
+
const anchors = textBoxAnchorIdsIn(paragraph);
|
|
64
|
+
if (anchors.size === 0) return end;
|
|
65
|
+
const after = doc.resolve(end);
|
|
66
|
+
for (let index = after.index(); index < after.parent.childCount; index += 1) {
|
|
67
|
+
const sibling = after.parent.child(index);
|
|
68
|
+
const anchorId = anchoredTextBoxId(sibling);
|
|
69
|
+
if (anchorId === void 0 || !anchors.has(anchorId)) break;
|
|
70
|
+
end += sibling.nodeSize;
|
|
71
|
+
}
|
|
72
|
+
return end;
|
|
73
|
+
};
|
|
74
|
+
/** Anchor ids `before` holds and `after` does not. */
|
|
75
|
+
const droppedTextBoxAnchorIds = (before, after) => {
|
|
76
|
+
const dropped = textBoxAnchorIdsIn(before);
|
|
77
|
+
if (dropped.size === 0) return dropped;
|
|
78
|
+
for (const anchorId of textBoxAnchorIdsIn(after)) dropped.delete(anchorId);
|
|
79
|
+
return dropped;
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Delete the text box blocks whose anchors are in `anchorIds`. Returns whether
|
|
83
|
+
* any went.
|
|
84
|
+
*/
|
|
85
|
+
const deleteTextBoxesAnchoredAt = (tr, anchorIds) => {
|
|
86
|
+
if (anchorIds.size === 0) return false;
|
|
87
|
+
const ranges = [];
|
|
88
|
+
tr.doc.descendants((node, position) => {
|
|
89
|
+
const anchorId = anchoredTextBoxId(node);
|
|
90
|
+
if (anchorId !== void 0 && anchorIds.has(anchorId)) {
|
|
91
|
+
ranges.push({
|
|
92
|
+
from: position,
|
|
93
|
+
to: position + node.nodeSize
|
|
94
|
+
});
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
return !node.isTextblock;
|
|
98
|
+
});
|
|
99
|
+
for (const { from, to } of ranges.toReversed()) tr.delete(from, to);
|
|
100
|
+
return ranges.length > 0;
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Put every text box drawn in the paragraph at `position` right after it,
|
|
104
|
+
* keeping the boxes' order. For a paragraph just split: the boxes follow the
|
|
105
|
+
* second half, and those anchored in the first half move up to it.
|
|
106
|
+
*/
|
|
107
|
+
const gatherTextBoxesAfterParagraph = (tr, position) => {
|
|
108
|
+
const paragraph = tr.doc.nodeAt(position);
|
|
109
|
+
if (!paragraph) return;
|
|
110
|
+
const anchors = textBoxAnchorIdsIn(paragraph);
|
|
111
|
+
if (anchors.size === 0) return;
|
|
112
|
+
const boxesEnd = endOfParagraphWithItsTextBoxes(tr.doc, position);
|
|
113
|
+
const at = tr.doc.resolve(boxesEnd);
|
|
114
|
+
const moved = [];
|
|
115
|
+
let offset = boxesEnd;
|
|
116
|
+
for (let index = at.index(); index < at.parent.childCount; index += 1) {
|
|
117
|
+
const sibling = at.parent.child(index);
|
|
118
|
+
const anchorId = anchoredTextBoxId(sibling);
|
|
119
|
+
if (anchorId !== void 0 && anchors.has(anchorId)) moved.push({
|
|
120
|
+
node: sibling,
|
|
121
|
+
from: offset
|
|
122
|
+
});
|
|
123
|
+
offset += sibling.nodeSize;
|
|
124
|
+
}
|
|
125
|
+
if (moved.length === 0) return;
|
|
126
|
+
for (const { node, from } of moved.toReversed()) tr.delete(from, from + node.nodeSize);
|
|
127
|
+
tr.insert(boxesEnd, Fragment.fromArray(moved.map(({ node }) => node)));
|
|
128
|
+
};
|
|
129
|
+
/** The anchor ids of the text boxes drawn between `from` and `to`. */
|
|
130
|
+
const textBoxAnchorIdsBetween = (doc, from, to) => {
|
|
131
|
+
const ids = /* @__PURE__ */ new Set();
|
|
132
|
+
doc.nodesBetween(from, to, (node) => {
|
|
133
|
+
collectAnchorId(node, ids);
|
|
134
|
+
return true;
|
|
135
|
+
});
|
|
136
|
+
return ids;
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Before the paragraph at `position` joins the one after it: move the text
|
|
140
|
+
* boxes drawn in it, which stand between the two, past that paragraph, where
|
|
141
|
+
* they follow the joined one. Returns whether any moved.
|
|
142
|
+
*/
|
|
143
|
+
const moveTextBoxesPastNextParagraph = (tr, position) => {
|
|
144
|
+
const paragraph = tr.doc.nodeAt(position);
|
|
145
|
+
if (!paragraph) return false;
|
|
146
|
+
const paragraphEnd = position + paragraph.nodeSize;
|
|
147
|
+
const boxesEnd = endOfParagraphWithItsTextBoxes(tr.doc, position);
|
|
148
|
+
const next = boxesEnd > paragraphEnd ? tr.doc.nodeAt(boxesEnd) : null;
|
|
149
|
+
if (!next || next.type !== paragraph.type) return false;
|
|
150
|
+
const boxes = tr.doc.slice(paragraphEnd, boxesEnd).content;
|
|
151
|
+
tr.delete(paragraphEnd, boxesEnd);
|
|
152
|
+
tr.insert(paragraphEnd + next.nodeSize, boxes);
|
|
153
|
+
return true;
|
|
154
|
+
};
|
|
155
|
+
//#endregion
|
|
156
|
+
export { anchoredTextBoxId, deleteTextBoxesAnchoredAt, droppedTextBoxAnchorIds, endOfParagraphWithItsTextBoxes, gatherTextBoxesAfterParagraph, moveTextBoxesPastNextParagraph, textBoxAnchorIdOf, textBoxAnchorIdsBetween, textBoxAnchorIdsIn };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CharacterSpacingAttrs, CharacterStyleAttrs, CommentAttrs, EmphasisMarkAttrs, FontFamilyAttrs, FontSizeAttrs, FootnoteRefAttrs, HighlightAttrs, HyperlinkAttrs, InlineWrapperAttrs, InlineWrapperLayer, LanguageAttrs, RunFormattingOverrideAttrs, RunIdentityMarkAttrs, RunPropertyChangeMarkAttrs, RunShadingAttrs, StrikeAttrs, TextColorAttrs, TextEffectAttrs, TrackedChangeMarkAttrs, TrackedRevisionAncestor, UnderlineAttrs } from "../schema/marks.js";
|
|
2
|
-
import { BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, MathAttrs, PageBreakRunAttrs, ParagraphAttrs, PreservedBlockAttrs, PreservedXmlAttrs, SdtAttrs, ShapeAttrs, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAttrs } from "../schema/nodes.js";
|
|
2
|
+
import { BlockCustomXmlAttrs, BlockSdtAttrs, FieldAttrs, HardBreakAttrs, ImageAttrs, MathAttrs, PageBreakRunAttrs, ParagraphAttrs, PreservedBlockAttrs, PreservedXmlAttrs, SdtAttrs, ShapeAttrs, SymbolAttrs, TabAttrs, TableAttrs, TableCellAttrs, TableRowAttrs, TextBoxAttrs } from "../schema/nodes.js";
|
|
3
3
|
import "../schema/index.js";
|
|
4
4
|
import { Mark, Node } from "prosemirror-model";
|
|
5
5
|
//#region src/prosemirror/attrs/index.d.ts
|
|
@@ -36,12 +36,16 @@ declare const readTableCellAttrs: (node: Node) => ReadProseMirrorAttrsResult<Tab
|
|
|
36
36
|
declare const expectTableCellAttrs: (node: Node) => TableCellAttrs;
|
|
37
37
|
declare const readImageAttrs: (node: Node) => ReadProseMirrorAttrsResult<ImageAttrs>;
|
|
38
38
|
declare const expectImageAttrs: (node: Node) => ImageAttrs;
|
|
39
|
+
declare const isValidEmptyFieldResultRuns: (value: unknown) => value is NonNullable<FieldAttrs["_docxEmptyResultRuns"]>;
|
|
40
|
+
declare const isValidFieldCode: (value: unknown) => value is NonNullable<FieldAttrs["_docxFieldCode"]>;
|
|
39
41
|
declare const readFieldAttrs: (node: Node) => ReadProseMirrorAttrsResult<FieldAttrs>;
|
|
40
42
|
declare const expectFieldAttrs: (node: Node) => FieldAttrs;
|
|
41
43
|
declare const readMathAttrs: (node: Node) => ReadProseMirrorAttrsResult<MathAttrs>;
|
|
42
44
|
declare const expectMathAttrs: (node: Node) => MathAttrs;
|
|
43
45
|
declare const readSdtAttrs: (node: Node) => ReadProseMirrorAttrsResult<SdtAttrs>;
|
|
44
46
|
declare const expectSdtAttrs: (node: Node) => SdtAttrs;
|
|
47
|
+
declare const readBlockCustomXmlAttrs: (node: Node) => ReadProseMirrorAttrsResult<BlockCustomXmlAttrs>;
|
|
48
|
+
declare const expectBlockCustomXmlAttrs: (node: Node) => BlockCustomXmlAttrs;
|
|
45
49
|
declare const readBlockSdtAttrs: (node: Node) => ReadProseMirrorAttrsResult<BlockSdtAttrs>;
|
|
46
50
|
declare const expectBlockSdtAttrs: (node: Node) => BlockSdtAttrs;
|
|
47
51
|
declare const readShapeAttrs: (node: Node) => ReadProseMirrorAttrsResult<ShapeAttrs>;
|
|
@@ -119,4 +123,4 @@ declare const mergeTableRowAttrs: (node: Node, patch: NodeAttrPatch<TableRowAttr
|
|
|
119
123
|
*/
|
|
120
124
|
declare const mergeTableCellAttrs: (node: Node, patch: NodeAttrPatch<TableCellAttrs>) => TableCellAttrs;
|
|
121
125
|
//#endregion
|
|
122
|
-
export { ProseMirrorAttrIssue, ReadProseMirrorAttrsResult, expectBlockSdtAttrs, expectCharacterSpacingMarkAttrs, expectCharacterStyleMarkAttrs, expectCommentMarkAttrs, expectEmphasisMarkAttrs, expectFieldAttrs, expectFontFamilyMarkAttrs, expectFontSizeMarkAttrs, expectFootnoteRefMarkAttrs, expectHardBreakAttrs, expectHighlightMarkAttrs, expectHyperlinkMarkAttrs, expectImageAttrs, expectInlineWrapperMarkAttrs, expectLanguageMarkAttrs, expectMathAttrs, expectPageBreakRunAttrs, expectParagraphAttrs, expectPreservedBlockAttrs, expectPreservedXmlAttrs, expectRunFormattingOverrideMarkAttrs, expectRunIdentityMarkAttrs, expectRunPropertyChangeMarkAttrs, expectRunShadingMarkAttrs, expectSdtAttrs, expectShapeAttrs, expectStrikeMarkAttrs, expectSymbolAttrs, expectTabAttrs, expectTableAttrs, expectTableCellAttrs, expectTableRowAttrs, expectTextBoxAttrs, expectTextColorMarkAttrs, expectTextEffectMarkAttrs, expectTrackedChangeMarkAttrs, expectUnderlineMarkAttrs, isTrackedRevisionAncestorArray, mergeImageAttrs, mergeParagraphAttrs, mergeTableAttrs, mergeTableCellAttrs, mergeTableRowAttrs, readBlockSdtAttrs, readCharacterSpacingMarkAttrs, readCharacterStyleMarkAttrs, readCommentMarkAttrs, readEmphasisMarkAttrs, readFieldAttrs, readFontFamilyMarkAttrs, readFontSizeMarkAttrs, readFootnoteRefMarkAttrs, readHardBreakAttrs, readHighlightMarkAttrs, readHyperlinkMarkAttrs, readImageAttrs, readInlineWrapperMarkAttrs, readInlineWrapperStack, readLanguageMarkAttrs, readMathAttrs, readPageBreakRunAttrs, readParagraphAttrs, readPreservedBlockAttrs, readPreservedXmlAttrs, readRunFormattingOverrideMarkAttrs, readRunIdentityMarkAttrs, readRunPropertyChangeMarkAttrs, readRunShadingMarkAttrs, readSdtAttrs, readShapeAttrs, readStrikeMarkAttrs, readSymbolAttrs, readTabAttrs, readTableAttrs, readTableCellAttrs, readTableRowAttrs, readTextBoxAttrs, readTextColorMarkAttrs, readTextEffectMarkAttrs, readTrackedChangeMarkAttrs, readUnderlineMarkAttrs };
|
|
126
|
+
export { ProseMirrorAttrIssue, ReadProseMirrorAttrsResult, expectBlockCustomXmlAttrs, expectBlockSdtAttrs, expectCharacterSpacingMarkAttrs, expectCharacterStyleMarkAttrs, expectCommentMarkAttrs, expectEmphasisMarkAttrs, expectFieldAttrs, expectFontFamilyMarkAttrs, expectFontSizeMarkAttrs, expectFootnoteRefMarkAttrs, expectHardBreakAttrs, expectHighlightMarkAttrs, expectHyperlinkMarkAttrs, expectImageAttrs, expectInlineWrapperMarkAttrs, expectLanguageMarkAttrs, expectMathAttrs, expectPageBreakRunAttrs, expectParagraphAttrs, expectPreservedBlockAttrs, expectPreservedXmlAttrs, expectRunFormattingOverrideMarkAttrs, expectRunIdentityMarkAttrs, expectRunPropertyChangeMarkAttrs, expectRunShadingMarkAttrs, expectSdtAttrs, expectShapeAttrs, expectStrikeMarkAttrs, expectSymbolAttrs, expectTabAttrs, expectTableAttrs, expectTableCellAttrs, expectTableRowAttrs, expectTextBoxAttrs, expectTextColorMarkAttrs, expectTextEffectMarkAttrs, expectTrackedChangeMarkAttrs, expectUnderlineMarkAttrs, isTrackedRevisionAncestorArray, isValidEmptyFieldResultRuns, isValidFieldCode, mergeImageAttrs, mergeParagraphAttrs, mergeTableAttrs, mergeTableCellAttrs, mergeTableRowAttrs, readBlockCustomXmlAttrs, readBlockSdtAttrs, readCharacterSpacingMarkAttrs, readCharacterStyleMarkAttrs, readCommentMarkAttrs, readEmphasisMarkAttrs, readFieldAttrs, readFontFamilyMarkAttrs, readFontSizeMarkAttrs, readFootnoteRefMarkAttrs, readHardBreakAttrs, readHighlightMarkAttrs, readHyperlinkMarkAttrs, readImageAttrs, readInlineWrapperMarkAttrs, readInlineWrapperStack, readLanguageMarkAttrs, readMathAttrs, readPageBreakRunAttrs, readParagraphAttrs, readPreservedBlockAttrs, readPreservedXmlAttrs, readRunFormattingOverrideMarkAttrs, readRunIdentityMarkAttrs, readRunPropertyChangeMarkAttrs, readRunShadingMarkAttrs, readSdtAttrs, readShapeAttrs, readStrikeMarkAttrs, readSymbolAttrs, readTabAttrs, readTableAttrs, readTableCellAttrs, readTableRowAttrs, readTextBoxAttrs, readTextColorMarkAttrs, readTextEffectMarkAttrs, readTrackedChangeMarkAttrs, readUnderlineMarkAttrs };
|
|
@@ -374,6 +374,7 @@ const readPreservedBlockAttrs = (node) => {
|
|
|
374
374
|
const issues = [];
|
|
375
375
|
expectNodeType(node, "preservedBlock", issues);
|
|
376
376
|
requiredString(attrs, "xml", "preservedBlock.attrs.xml", issues);
|
|
377
|
+
optionalString(attrs, "readerText", "preservedBlock.attrs.readerText", issues);
|
|
377
378
|
return attrsResult(attrs, issues);
|
|
378
379
|
};
|
|
379
380
|
const expectPreservedBlockAttrs = (node) => expectCachedNodeAttrs(node, preservedBlockAttrsCache, readPreservedBlockAttrs, "preservedBlock attrs");
|
|
@@ -402,6 +403,7 @@ const readTableAttrsUncached = (node) => {
|
|
|
402
403
|
optionalRecord(attrs, "_originalFormatting", "table.attrs._originalFormatting", issues);
|
|
403
404
|
optionalPositionedBookmarks(attrs, "table.attrs._bookmarks", issues);
|
|
404
405
|
optionalTablePreservedMarkup(attrs, "_preserved", "table.attrs._preserved", issues);
|
|
406
|
+
optionalTableContentCarriers(attrs, "carrierStack", "table.attrs.carrierStack", issues);
|
|
405
407
|
return attrsResult(attrs, issues);
|
|
406
408
|
};
|
|
407
409
|
const readTableAttrs = memoizeNodeAttrsReader(readTableAttrsUncached);
|
|
@@ -426,6 +428,7 @@ const readTableRowAttrsUncached = (node) => {
|
|
|
426
428
|
optionalPreservedAttributes(attrs, "_preservedAttributes", "tableRow.attrs._preservedAttributes", issues);
|
|
427
429
|
optionalPositionedBookmarks(attrs, "tableRow.attrs._bookmarks", issues);
|
|
428
430
|
optionalContentControls(attrs, "tableRow.attrs.contentControls", issues);
|
|
431
|
+
optionalTableContentCarriers(attrs, "carrierStack", "tableRow.attrs.carrierStack", issues);
|
|
429
432
|
optionalTablePreservedMarkup(attrs, "_preserved", "tableRow.attrs._preserved", issues);
|
|
430
433
|
return attrsResult(attrs, issues);
|
|
431
434
|
};
|
|
@@ -461,6 +464,7 @@ const readTableCellAttrs = (node) => {
|
|
|
461
464
|
optionalRecord(attrs, "_originalFormatting", "tableCell.attrs._originalFormatting", issues);
|
|
462
465
|
optionalTableCellRevision(attrs, issues);
|
|
463
466
|
optionalContentControls(attrs, "tableCell.attrs.contentControls", issues);
|
|
467
|
+
optionalTableContentCarriers(attrs, "carrierStack", "tableCell.attrs.carrierStack", issues);
|
|
464
468
|
optionalBoolean(attrs, "_preserveVMergeRestart", "tableCell.attrs._preserveVMergeRestart", issues);
|
|
465
469
|
return attrsResult(attrs, issues);
|
|
466
470
|
};
|
|
@@ -529,6 +533,81 @@ const readImageAttrs = (node) => {
|
|
|
529
533
|
return attrsResult(attrs, issues);
|
|
530
534
|
};
|
|
531
535
|
const expectImageAttrs = (node) => expectCachedNodeAttrs(node, imageAttrsCache, readImageAttrs, "image attrs");
|
|
536
|
+
const validateEmptyFieldResultRuns = (value, issues) => {
|
|
537
|
+
if (!Array.isArray(value) || value.length === 0) {
|
|
538
|
+
issues.push({
|
|
539
|
+
path: "field.attrs._docxEmptyResultRuns",
|
|
540
|
+
message: "Expected a nonempty array of empty runs."
|
|
541
|
+
});
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
for (const [index, run] of value.entries()) {
|
|
545
|
+
const path = `field.attrs._docxEmptyResultRuns[${index}]`;
|
|
546
|
+
if (!isRecord(run) || run["type"] !== "run") {
|
|
547
|
+
issues.push({
|
|
548
|
+
path,
|
|
549
|
+
message: "Expected a run."
|
|
550
|
+
});
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
const content = run["content"];
|
|
554
|
+
if (!Array.isArray(content) || !content.every((item) => isRecord(item) && item["type"] === "text" && item["text"] === "")) issues.push({
|
|
555
|
+
path: `${path}.content`,
|
|
556
|
+
message: "Expected only empty text."
|
|
557
|
+
});
|
|
558
|
+
const formatting = run["formatting"];
|
|
559
|
+
if (formatting !== void 0) if (!isRecord(formatting)) issues.push({
|
|
560
|
+
path: `${path}.formatting`,
|
|
561
|
+
message: "Expected formatting object."
|
|
562
|
+
});
|
|
563
|
+
else validateTextFormatting(formatting, `${path}.formatting`, issues);
|
|
564
|
+
optionalPropertyChanges(run, "propertyChanges", `${path}.propertyChanges`, issues, ["runPropertyChange"]);
|
|
565
|
+
optionalPreservedAttributes(run, "preservedAttributes", `${path}.preservedAttributes`, issues);
|
|
566
|
+
}
|
|
567
|
+
};
|
|
568
|
+
const isValidEmptyFieldResultRuns = (value) => {
|
|
569
|
+
const issues = [];
|
|
570
|
+
validateEmptyFieldResultRuns(value, issues);
|
|
571
|
+
return issues.length === 0;
|
|
572
|
+
};
|
|
573
|
+
const isFieldCodeContent = (value) => {
|
|
574
|
+
if (!isRecord(value)) return false;
|
|
575
|
+
switch (value["type"]) {
|
|
576
|
+
case "text":
|
|
577
|
+
case "instrText": return typeof value["text"] === "string";
|
|
578
|
+
case "fieldChar": return value["charType"] === "begin" || value["charType"] === "separate" || value["charType"] === "end";
|
|
579
|
+
case "preservedXml": return typeof value["xml"] === "string" && isSafePreservedChildXml(value["xml"]) && typeof value["text"] === "string";
|
|
580
|
+
case "symbol": return typeof value["font"] === "string" && typeof value["char"] === "string";
|
|
581
|
+
case "footnoteRef":
|
|
582
|
+
case "endnoteRef": return typeof value["id"] === "number";
|
|
583
|
+
case "drawing": return isRecord(value["image"]);
|
|
584
|
+
case "shape": return isRecord(value["shape"]);
|
|
585
|
+
case "tab":
|
|
586
|
+
case "break":
|
|
587
|
+
case "softHyphen":
|
|
588
|
+
case "noBreakHyphen":
|
|
589
|
+
case "renderedPageBreak": return true;
|
|
590
|
+
default: return false;
|
|
591
|
+
}
|
|
592
|
+
};
|
|
593
|
+
const isValidFieldCode = (value) => {
|
|
594
|
+
if (!isRecord(value) || typeof value["instruction"] !== "string") return false;
|
|
595
|
+
const runs = value["runs"];
|
|
596
|
+
if (!Array.isArray(runs) || runs.length === 0) return false;
|
|
597
|
+
const issues = [];
|
|
598
|
+
for (const [index, run] of runs.entries()) {
|
|
599
|
+
if (!isRecord(run) || run["type"] !== "run" || !Array.isArray(run["content"])) return false;
|
|
600
|
+
if (!run["content"].every(isFieldCodeContent)) return false;
|
|
601
|
+
const path = `field.attrs._docxFieldCode.runs[${index}]`;
|
|
602
|
+
if (run["formatting"] !== void 0) {
|
|
603
|
+
if (!isRecord(run["formatting"])) return false;
|
|
604
|
+
validateTextFormatting(run["formatting"], `${path}.formatting`, issues);
|
|
605
|
+
}
|
|
606
|
+
optionalPropertyChanges(run, "propertyChanges", `${path}.propertyChanges`, issues, ["runPropertyChange"]);
|
|
607
|
+
optionalPreservedAttributes(run, "preservedAttributes", `${path}.preservedAttributes`, issues);
|
|
608
|
+
}
|
|
609
|
+
return issues.length === 0;
|
|
610
|
+
};
|
|
532
611
|
const readFieldAttrs = (node) => {
|
|
533
612
|
const attrs = attrsRecord(node.attrs);
|
|
534
613
|
const issues = [];
|
|
@@ -541,6 +620,34 @@ const readFieldAttrs = (node) => {
|
|
|
541
620
|
optionalBoolean(attrs, "fldLock", "field.attrs.fldLock", issues);
|
|
542
621
|
optionalBoolean(attrs, "dirty", "field.attrs.dirty", issues);
|
|
543
622
|
optionalBoolean(attrs, "fieldResultIsFallback", "field.attrs.fieldResultIsFallback", issues);
|
|
623
|
+
optionalString(attrs, "formFieldDataXml", "field.attrs.formFieldDataXml", issues);
|
|
624
|
+
if (attrs["fieldKind"] === "simple") {
|
|
625
|
+
if (attrs["fieldResultIsFallback"] !== void 0 && attrs["fieldResultIsFallback"] !== null) issues.push({
|
|
626
|
+
path: "field.attrs.fieldResultIsFallback",
|
|
627
|
+
message: "Simple fields cannot have a synthesized complex-field result."
|
|
628
|
+
});
|
|
629
|
+
if (attrs["formFieldDataXml"] !== void 0 && attrs["formFieldDataXml"] !== null) issues.push({
|
|
630
|
+
path: "field.attrs.formFieldDataXml",
|
|
631
|
+
message: "Simple fields cannot carry complex-field form data."
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
const emptyResultRuns = attrs["_docxEmptyResultRuns"];
|
|
635
|
+
if (emptyResultRuns !== void 0 && emptyResultRuns !== null) validateEmptyFieldResultRuns(emptyResultRuns, issues);
|
|
636
|
+
const fieldCode = attrs["_docxFieldCode"];
|
|
637
|
+
if (fieldCode !== void 0 && fieldCode !== null && !isValidFieldCode(fieldCode)) issues.push({
|
|
638
|
+
path: "field.attrs._docxFieldCode",
|
|
639
|
+
message: "Expected source field code runs."
|
|
640
|
+
});
|
|
641
|
+
if (attrs["fieldKind"] === "simple") {
|
|
642
|
+
if (fieldCode !== void 0 && fieldCode !== null) issues.push({
|
|
643
|
+
path: "field.attrs._docxFieldCode",
|
|
644
|
+
message: "Simple fields cannot carry complex-field code runs."
|
|
645
|
+
});
|
|
646
|
+
if (attrs["fieldResultIsFallback"] !== void 0 && attrs["fieldResultIsFallback"] !== null) issues.push({
|
|
647
|
+
path: "field.attrs.fieldResultIsFallback",
|
|
648
|
+
message: "Simple fields cannot have a synthesized complex-field result."
|
|
649
|
+
});
|
|
650
|
+
}
|
|
544
651
|
return attrsResult(attrs, issues);
|
|
545
652
|
};
|
|
546
653
|
const expectFieldAttrs = (node) => expectCachedNodeAttrs(node, fieldAttrsCache, readFieldAttrs, "field attrs");
|
|
@@ -563,6 +670,17 @@ const readSdtAttrs = (node) => {
|
|
|
563
670
|
};
|
|
564
671
|
const expectSdtAttrs = (node) => expectCachedNodeAttrs(node, sdtAttrsCache, readSdtAttrs, "sdt attrs");
|
|
565
672
|
const blockSdtAttrsCache = /* @__PURE__ */ new WeakMap();
|
|
673
|
+
const blockCustomXmlAttrsCache = /* @__PURE__ */ new WeakMap();
|
|
674
|
+
const readBlockCustomXmlAttrs = (node) => {
|
|
675
|
+
const attrs = attrsRecord(node.attrs);
|
|
676
|
+
const issues = [];
|
|
677
|
+
expectNodeType(node, "blockCustomXml", issues);
|
|
678
|
+
requiredString(attrs, "openingXml", "blockCustomXml.attrs.openingXml", issues);
|
|
679
|
+
requiredString(attrs, "closingXml", "blockCustomXml.attrs.closingXml", issues);
|
|
680
|
+
optionalBoolean(attrs, "_originallyEmpty", "blockCustomXml.attrs._originallyEmpty", issues);
|
|
681
|
+
return attrsResult(attrs, issues);
|
|
682
|
+
};
|
|
683
|
+
const expectBlockCustomXmlAttrs = (node) => expectCachedNodeAttrs(node, blockCustomXmlAttrsCache, readBlockCustomXmlAttrs, "blockCustomXml attrs");
|
|
566
684
|
const readBlockSdtAttrs = (node) => {
|
|
567
685
|
const attrs = attrsRecord(node.attrs);
|
|
568
686
|
const issues = [];
|
|
@@ -1724,6 +1842,57 @@ const optionalContentControls = (attrs, path, issues) => {
|
|
|
1724
1842
|
requiredString(entry, "sdtType", `${entryPath}.sdtType`, issues);
|
|
1725
1843
|
}
|
|
1726
1844
|
};
|
|
1845
|
+
const optionalTableContentCarriers = (attrs, key, path, issues) => {
|
|
1846
|
+
const value = attrs[key];
|
|
1847
|
+
if (value === void 0 || value === null) return;
|
|
1848
|
+
if (!Array.isArray(value)) {
|
|
1849
|
+
issues.push({
|
|
1850
|
+
path,
|
|
1851
|
+
message: "Expected an array."
|
|
1852
|
+
});
|
|
1853
|
+
return;
|
|
1854
|
+
}
|
|
1855
|
+
for (const [index, carrier] of value.entries()) {
|
|
1856
|
+
const carrierPath = `${path}[${index}]`;
|
|
1857
|
+
if (!isRecord(carrier)) {
|
|
1858
|
+
issues.push({
|
|
1859
|
+
path: carrierPath,
|
|
1860
|
+
message: "Expected an object."
|
|
1861
|
+
});
|
|
1862
|
+
continue;
|
|
1863
|
+
}
|
|
1864
|
+
if (carrier["type"] === "customXml") {
|
|
1865
|
+
const wrapper = carrier["wrapper"];
|
|
1866
|
+
if (!isRecord(wrapper)) {
|
|
1867
|
+
issues.push({
|
|
1868
|
+
path: `${carrierPath}.wrapper`,
|
|
1869
|
+
message: "Expected an object."
|
|
1870
|
+
});
|
|
1871
|
+
continue;
|
|
1872
|
+
}
|
|
1873
|
+
requiredNumber(wrapper, "id", `${carrierPath}.wrapper.id`, issues);
|
|
1874
|
+
requiredString(wrapper, "openingXml", `${carrierPath}.wrapper.openingXml`, issues);
|
|
1875
|
+
requiredString(wrapper, "closingXml", `${carrierPath}.wrapper.closingXml`, issues);
|
|
1876
|
+
continue;
|
|
1877
|
+
}
|
|
1878
|
+
if (carrier["type"] === "sdt") {
|
|
1879
|
+
const properties = carrier["properties"];
|
|
1880
|
+
if (!isRecord(properties)) {
|
|
1881
|
+
issues.push({
|
|
1882
|
+
path: `${carrierPath}.properties`,
|
|
1883
|
+
message: "Expected an object."
|
|
1884
|
+
});
|
|
1885
|
+
continue;
|
|
1886
|
+
}
|
|
1887
|
+
requiredString(properties, "sdtType", `${carrierPath}.properties.sdtType`, issues);
|
|
1888
|
+
continue;
|
|
1889
|
+
}
|
|
1890
|
+
issues.push({
|
|
1891
|
+
path: `${carrierPath}.type`,
|
|
1892
|
+
message: "Expected \"customXml\" or \"sdt\"."
|
|
1893
|
+
});
|
|
1894
|
+
}
|
|
1895
|
+
};
|
|
1727
1896
|
/** A table sink entry may itself sit inside a row- or cell-level control. */
|
|
1728
1897
|
const optionalTablePreservedMarkup = (attrs, key, path, issues) => {
|
|
1729
1898
|
optionalPreservedMarkup(attrs, key, path, issues);
|
|
@@ -1821,6 +1990,7 @@ const optionalPreservedMarkup = (attrs, key, path, issues) => {
|
|
|
1821
1990
|
}
|
|
1822
1991
|
requiredNumber(entry, "index", `${entryPath}.index`, issues);
|
|
1823
1992
|
requiredString(entry, "xml", `${entryPath}.xml`, issues);
|
|
1993
|
+
optionalTableContentCarriers(entry, "carrierStack", `${entryPath}.carrierStack`, issues);
|
|
1824
1994
|
const xml = entry["xml"];
|
|
1825
1995
|
if (typeof xml === "string" && !isSafePreservedChildXml(xml)) issues.push({
|
|
1826
1996
|
path: `${entryPath}.xml`,
|
|
@@ -1855,6 +2025,7 @@ const optionalPositionedBookmarks = (attrs, path, issues) => {
|
|
|
1855
2025
|
continue;
|
|
1856
2026
|
}
|
|
1857
2027
|
validateNonNegativeSafeInteger(entry["index"], `${entryPath}.index`, issues);
|
|
2028
|
+
optionalTableContentCarriers(entry, "carrierStack", `${entryPath}.carrierStack`, issues);
|
|
1858
2029
|
const marker = entry["marker"];
|
|
1859
2030
|
if (!isRecord(marker)) {
|
|
1860
2031
|
issues.push({
|
|
@@ -2839,4 +3010,4 @@ const optionalEmptyHyperlinkArray = (value, issues) => {
|
|
|
2839
3010
|
}
|
|
2840
3011
|
};
|
|
2841
3012
|
//#endregion
|
|
2842
|
-
export { expectBlockSdtAttrs, expectCharacterSpacingMarkAttrs, expectCharacterStyleMarkAttrs, expectCommentMarkAttrs, expectEmphasisMarkAttrs, expectFieldAttrs, expectFontFamilyMarkAttrs, expectFontSizeMarkAttrs, expectFootnoteRefMarkAttrs, expectHardBreakAttrs, expectHighlightMarkAttrs, expectHyperlinkMarkAttrs, expectImageAttrs, expectInlineWrapperMarkAttrs, expectLanguageMarkAttrs, expectMathAttrs, expectPageBreakRunAttrs, expectParagraphAttrs, expectPreservedBlockAttrs, expectPreservedXmlAttrs, expectRunFormattingOverrideMarkAttrs, expectRunIdentityMarkAttrs, expectRunPropertyChangeMarkAttrs, expectRunShadingMarkAttrs, expectSdtAttrs, expectShapeAttrs, expectStrikeMarkAttrs, expectSymbolAttrs, expectTabAttrs, expectTableAttrs, expectTableCellAttrs, expectTableRowAttrs, expectTextBoxAttrs, expectTextColorMarkAttrs, expectTextEffectMarkAttrs, expectTrackedChangeMarkAttrs, expectUnderlineMarkAttrs, isTrackedRevisionAncestorArray, mergeImageAttrs, mergeParagraphAttrs, mergeTableAttrs, mergeTableCellAttrs, mergeTableRowAttrs, readBlockSdtAttrs, readCharacterSpacingMarkAttrs, readCharacterStyleMarkAttrs, readCommentMarkAttrs, readEmphasisMarkAttrs, readFieldAttrs, readFontFamilyMarkAttrs, readFontSizeMarkAttrs, readFootnoteRefMarkAttrs, readHardBreakAttrs, readHighlightMarkAttrs, readHyperlinkMarkAttrs, readImageAttrs, readInlineWrapperMarkAttrs, readInlineWrapperStack, readLanguageMarkAttrs, readMathAttrs, readPageBreakRunAttrs, readParagraphAttrs, readPreservedBlockAttrs, readPreservedXmlAttrs, readRunFormattingOverrideMarkAttrs, readRunIdentityMarkAttrs, readRunPropertyChangeMarkAttrs, readRunShadingMarkAttrs, readSdtAttrs, readShapeAttrs, readStrikeMarkAttrs, readSymbolAttrs, readTabAttrs, readTableAttrs, readTableCellAttrs, readTableRowAttrs, readTextBoxAttrs, readTextColorMarkAttrs, readTextEffectMarkAttrs, readTrackedChangeMarkAttrs, readUnderlineMarkAttrs };
|
|
3013
|
+
export { expectBlockCustomXmlAttrs, expectBlockSdtAttrs, expectCharacterSpacingMarkAttrs, expectCharacterStyleMarkAttrs, expectCommentMarkAttrs, expectEmphasisMarkAttrs, expectFieldAttrs, expectFontFamilyMarkAttrs, expectFontSizeMarkAttrs, expectFootnoteRefMarkAttrs, expectHardBreakAttrs, expectHighlightMarkAttrs, expectHyperlinkMarkAttrs, expectImageAttrs, expectInlineWrapperMarkAttrs, expectLanguageMarkAttrs, expectMathAttrs, expectPageBreakRunAttrs, expectParagraphAttrs, expectPreservedBlockAttrs, expectPreservedXmlAttrs, expectRunFormattingOverrideMarkAttrs, expectRunIdentityMarkAttrs, expectRunPropertyChangeMarkAttrs, expectRunShadingMarkAttrs, expectSdtAttrs, expectShapeAttrs, expectStrikeMarkAttrs, expectSymbolAttrs, expectTabAttrs, expectTableAttrs, expectTableCellAttrs, expectTableRowAttrs, expectTextBoxAttrs, expectTextColorMarkAttrs, expectTextEffectMarkAttrs, expectTrackedChangeMarkAttrs, expectUnderlineMarkAttrs, isTrackedRevisionAncestorArray, isValidEmptyFieldResultRuns, isValidFieldCode, mergeImageAttrs, mergeParagraphAttrs, mergeTableAttrs, mergeTableCellAttrs, mergeTableRowAttrs, readBlockCustomXmlAttrs, readBlockSdtAttrs, readCharacterSpacingMarkAttrs, readCharacterStyleMarkAttrs, readCommentMarkAttrs, readEmphasisMarkAttrs, readFieldAttrs, readFontFamilyMarkAttrs, readFontSizeMarkAttrs, readFootnoteRefMarkAttrs, readHardBreakAttrs, readHighlightMarkAttrs, readHyperlinkMarkAttrs, readImageAttrs, readInlineWrapperMarkAttrs, readInlineWrapperStack, readLanguageMarkAttrs, readMathAttrs, readPageBreakRunAttrs, readParagraphAttrs, readPreservedBlockAttrs, readPreservedXmlAttrs, readRunFormattingOverrideMarkAttrs, readRunIdentityMarkAttrs, readRunPropertyChangeMarkAttrs, readRunShadingMarkAttrs, readSdtAttrs, readShapeAttrs, readStrikeMarkAttrs, readSymbolAttrs, readTabAttrs, readTableAttrs, readTableCellAttrs, readTableRowAttrs, readTextBoxAttrs, readTextColorMarkAttrs, readTextEffectMarkAttrs, readTrackedChangeMarkAttrs, readUnderlineMarkAttrs };
|
|
@@ -32,7 +32,8 @@ declare function acceptChange(from: number, to: number): Command;
|
|
|
32
32
|
*/
|
|
33
33
|
declare function rejectChange(from: number, to: number): Command;
|
|
34
34
|
/**
|
|
35
|
-
* Accept all tracked changes in the document.
|
|
35
|
+
* Accept all tracked changes in the document. Returns `false` while pending
|
|
36
|
+
* suggestions are present because this command cannot restage them.
|
|
36
37
|
*/
|
|
37
38
|
declare function acceptAllChanges(): Command;
|
|
38
39
|
/**
|
|
@@ -42,15 +43,11 @@ declare function rejectAllChanges(): Command;
|
|
|
42
43
|
/**
|
|
43
44
|
* Resolve a complete state synchronously for a headless reader or writer.
|
|
44
45
|
*
|
|
45
|
-
*
|
|
46
|
-
* it is deliberately not an editor command and must not be transported or
|
|
47
|
-
* mapped through concurrent edits.
|
|
46
|
+
* Uses the same single-step resolver as the interactive editor command.
|
|
48
47
|
*/
|
|
49
48
|
declare function resolveAllChangesInHeadlessState(state: EditorState, mode: ResolveMode): EditorState;
|
|
50
49
|
/**
|
|
51
|
-
* Resolve
|
|
52
|
-
* the reviewed document back to the tracked source. The bulk resolver is
|
|
53
|
-
* faster, but deliberately replaces inline content without retaining mapping.
|
|
50
|
+
* Resolve a story and retain its position map for callers addressing the tracked source.
|
|
54
51
|
*/
|
|
55
52
|
declare const resolveAllChangesInHeadlessStateWithMapping: (state: EditorState, mode: ResolveMode) => {
|
|
56
53
|
state: EditorState;
|
|
@@ -109,6 +106,8 @@ type FolioSuggestion = {
|
|
|
109
106
|
* accepting it applies (tracked vs direct).
|
|
110
107
|
*/
|
|
111
108
|
declare function getSuggestions(state: EditorState): FolioSuggestion[];
|
|
109
|
+
/** The suggestion a revision belongs to, or `null` for an ordinary tracked change. */
|
|
110
|
+
declare function suggestionIdOfRevision(state: EditorState, revisionId: number): string | null;
|
|
112
111
|
/**
|
|
113
112
|
* The document range covering every mark belonging to `suggestionId`, plus the
|
|
114
113
|
* revision ids those marks carry. Returns null when the suggestion is absent
|
|
@@ -184,4 +183,4 @@ declare function findNextChange(state: EditorState, startPos: number): ChangeRan
|
|
|
184
183
|
*/
|
|
185
184
|
declare function findPreviousChange(state: EditorState, startPos: number): ChangeRange | null;
|
|
186
185
|
//#endregion
|
|
187
|
-
export { AcceptSuggestionOptions, FolioSuggestion, ParagraphBoundaryChange, SuggestionAppliedAs, SuggestionKind, acceptAIEditRevision, acceptAllChanges, acceptAllSuggestions, acceptChange, acceptSuggestion, addCommentMark, findAIEditRevisionRange, findChangeAtPosition, findNextChange, findParagraphBoundaryChangeAtPosition, findPreviousChange, findSuggestionRange, getSuggestions, rejectAIEditRevision, rejectAllChanges, rejectAllSuggestions, rejectChange, rejectSuggestion, removeCommentMark, resolveAllChangesInHeadlessState, resolveAllChangesInHeadlessStateWithMapping };
|
|
186
|
+
export { AcceptSuggestionOptions, FolioSuggestion, ParagraphBoundaryChange, SuggestionAppliedAs, SuggestionKind, acceptAIEditRevision, acceptAllChanges, acceptAllSuggestions, acceptChange, acceptSuggestion, addCommentMark, findAIEditRevisionRange, findChangeAtPosition, findNextChange, findParagraphBoundaryChangeAtPosition, findPreviousChange, findSuggestionRange, getSuggestions, rejectAIEditRevision, rejectAllChanges, rejectAllSuggestions, rejectChange, rejectSuggestion, removeCommentMark, resolveAllChangesInHeadlessState, resolveAllChangesInHeadlessStateWithMapping, suggestionIdOfRevision };
|