@stll/folio-core 0.0.1-placeholder.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE.md +29 -0
- package/README.md +41 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/ai-edits/apply.d.ts +35 -0
- package/dist/ai-edits/apply.js +683 -0
- package/dist/ai-edits/clean-text.d.ts +28 -0
- package/dist/ai-edits/clean-text.js +23 -0
- package/dist/ai-edits/headless.d.ts +225 -0
- package/dist/ai-edits/headless.js +513 -0
- package/dist/ai-edits/index.d.ts +6 -0
- package/dist/ai-edits/index.js +5 -0
- package/dist/ai-edits/inline-emphasis.d.ts +38 -0
- package/dist/ai-edits/inline-emphasis.js +78 -0
- package/dist/ai-edits/snapshot.d.ts +9 -0
- package/dist/ai-edits/snapshot.js +195 -0
- package/dist/ai-edits/types.d.ts +156 -0
- package/dist/ai-edits/types.js +0 -0
- package/dist/ai-edits/word-diff.d.ts +20 -0
- package/dist/ai-edits/word-diff.js +77 -0
- package/dist/ai-suggestions/apply.d.ts +17 -0
- package/dist/ai-suggestions/apply.js +64 -0
- package/dist/ai-suggestions/conflict.d.ts +22 -0
- package/dist/ai-suggestions/conflict.js +67 -0
- package/dist/ai-suggestions/text-positions.d.ts +21 -0
- package/dist/ai-suggestions/text-positions.js +48 -0
- package/dist/ai-suggestions/types.d.ts +199 -0
- package/dist/ai-suggestions/types.js +59 -0
- package/dist/content-controls/errors.d.ts +52 -0
- package/dist/content-controls/errors.js +36 -0
- package/dist/content-controls/findContentControls.d.ts +55 -0
- package/dist/content-controls/findContentControls.js +75 -0
- package/dist/content-controls/index.d.ts +4 -0
- package/dist/content-controls/index.js +4 -0
- package/dist/content-controls/mutateContentControls.d.ts +51 -0
- package/dist/content-controls/mutateContentControls.js +377 -0
- package/dist/controller/folioEditor.d.ts +21 -0
- package/dist/controller/folioEditor.js +29 -0
- package/dist/controller/folioEditorEvents.d.ts +23 -0
- package/dist/controller/folioEditorEvents.js +24 -0
- package/dist/controller/hiddenEditorApi.d.ts +35 -0
- package/dist/controller/hiddenEditorApi.js +112 -0
- package/dist/controller/hiddenEditorManager.d.ts +93 -0
- package/dist/controller/hiddenEditorManager.js +308 -0
- package/dist/controller/layoutPipeline.d.ts +63 -0
- package/dist/controller/layoutPipeline.js +406 -0
- package/dist/controller/layoutScheduler.d.ts +41 -0
- package/dist/controller/layoutScheduler.js +59 -0
- package/dist/controller/layoutSession.d.ts +24 -0
- package/dist/controller/layoutSession.js +13 -0
- package/dist/docx/blockContentParser.d.ts +13 -0
- package/dist/docx/blockContentParser.js +289 -0
- package/dist/docx/bookmarkParser.d.ts +178 -0
- package/dist/docx/bookmarkParser.js +246 -0
- package/dist/docx/bookmarkPlacement.d.ts +10 -0
- package/dist/docx/bookmarkPlacement.js +50 -0
- package/dist/docx/bulletMarkers.d.ts +4 -0
- package/dist/docx/bulletMarkers.js +42 -0
- package/dist/docx/commentParser.d.ts +34 -0
- package/dist/docx/commentParser.js +127 -0
- package/dist/docx/commentReferenceNormalization.d.ts +25 -0
- package/dist/docx/commentReferenceNormalization.js +97 -0
- package/dist/docx/commentReplyMarkers.d.ts +20 -0
- package/dist/docx/commentReplyMarkers.js +123 -0
- package/dist/docx/compatibility.d.ts +12 -0
- package/dist/docx/compatibility.js +77 -0
- package/dist/docx/documentParser.d.ts +65 -0
- package/dist/docx/documentParser.js +209 -0
- package/dist/docx/drawingUtils.d.ts +56 -0
- package/dist/docx/drawingUtils.js +305 -0
- package/dist/docx/fieldParser.d.ts +228 -0
- package/dist/docx/fieldParser.js +559 -0
- package/dist/docx/footnoteParser.d.ts +109 -0
- package/dist/docx/footnoteParser.js +270 -0
- package/dist/docx/headerFooterParser.d.ts +119 -0
- package/dist/docx/headerFooterParser.js +266 -0
- package/dist/docx/headerFooterRefParser.d.ts +22 -0
- package/dist/docx/headerFooterRefParser.js +52 -0
- package/dist/docx/headerFooterReferenceNormalization.d.ts +19 -0
- package/dist/docx/headerFooterReferenceNormalization.js +64 -0
- package/dist/docx/hyperlinkParser.d.ts +108 -0
- package/dist/docx/hyperlinkParser.js +230 -0
- package/dist/docx/imageParser.d.ts +93 -0
- package/dist/docx/imageParser.js +522 -0
- package/dist/docx/mathToMathml.d.ts +15 -0
- package/dist/docx/mathToMathml.js +357 -0
- package/dist/docx/modelValidation.d.ts +13 -0
- package/dist/docx/modelValidation.js +21 -0
- package/dist/docx/normalizeBaseDirection.d.ts +12 -0
- package/dist/docx/normalizeBaseDirection.js +81 -0
- package/dist/docx/notePropertiesParser.d.ts +16 -0
- package/dist/docx/notePropertiesParser.js +99 -0
- package/dist/docx/numberingParser.d.ts +86 -0
- package/dist/docx/numberingParser.js +735 -0
- package/dist/docx/numberingReferenceNormalization.d.ts +25 -0
- package/dist/docx/numberingReferenceNormalization.js +22 -0
- package/dist/docx/paragraphParser.d.ts +86 -0
- package/dist/docx/paragraphParser.js +1132 -0
- package/dist/docx/paragraphTraversal.d.ts +19 -0
- package/dist/docx/paragraphTraversal.js +76 -0
- package/dist/docx/parser.d.ts +67 -0
- package/dist/docx/parser.js +391 -0
- package/dist/docx/parserEnums.d.ts +45 -0
- package/dist/docx/parserEnums.js +70 -0
- package/dist/docx/relsParser.d.ts +160 -0
- package/dist/docx/relsParser.js +235 -0
- package/dist/docx/replyToComment.d.ts +29 -0
- package/dist/docx/replyToComment.js +73 -0
- package/dist/docx/rezip.d.ts +166 -0
- package/dist/docx/rezip.js +1194 -0
- package/dist/docx/runConsolidator.d.ts +57 -0
- package/dist/docx/runConsolidator.js +224 -0
- package/dist/docx/runParser.d.ts +78 -0
- package/dist/docx/runParser.js +661 -0
- package/dist/docx/sdtProperties.d.ts +15 -0
- package/dist/docx/sdtProperties.js +290 -0
- package/dist/docx/sdtPropertiesPatch.d.ts +16 -0
- package/dist/docx/sdtPropertiesPatch.js +144 -0
- package/dist/docx/sectionParser.d.ts +95 -0
- package/dist/docx/sectionParser.js +534 -0
- package/dist/docx/selectiveSave.d.ts +25 -0
- package/dist/docx/selectiveSave.js +247 -0
- package/dist/docx/selectiveSaveFlags.d.ts +33 -0
- package/dist/docx/selectiveSaveFlags.js +11 -0
- package/dist/docx/selectiveSaveTripwire.d.ts +33 -0
- package/dist/docx/selectiveSaveTripwire.js +79 -0
- package/dist/docx/selectiveXmlPatch.d.ts +103 -0
- package/dist/docx/selectiveXmlPatch.js +493 -0
- package/dist/docx/serializer/blockSdtSerializer.d.ts +6 -0
- package/dist/docx/serializer/blockSdtSerializer.js +88 -0
- package/dist/docx/serializer/borderSerializer.d.ts +25 -0
- package/dist/docx/serializer/borderSerializer.js +44 -0
- package/dist/docx/serializer/commentSerializer.d.ts +31 -0
- package/dist/docx/serializer/commentSerializer.js +184 -0
- package/dist/docx/serializer/documentSerializer.d.ts +65 -0
- package/dist/docx/serializer/documentSerializer.js +199 -0
- package/dist/docx/serializer/headerFooterSerializer.d.ts +12 -0
- package/dist/docx/serializer/headerFooterSerializer.js +84 -0
- package/dist/docx/serializer/noteSerializer.d.ts +19 -0
- package/dist/docx/serializer/noteSerializer.js +70 -0
- package/dist/docx/serializer/numberingSerializer.d.ts +12 -0
- package/dist/docx/serializer/numberingSerializer.js +93 -0
- package/dist/docx/serializer/paragraphSerializer.d.ts +48 -0
- package/dist/docx/serializer/paragraphSerializer.js +559 -0
- package/dist/docx/serializer/runSerializer.d.ts +56 -0
- package/dist/docx/serializer/runSerializer.js +621 -0
- package/dist/docx/serializer/sectionPropertiesSerializer.d.ts +6 -0
- package/dist/docx/serializer/sectionPropertiesSerializer.js +187 -0
- package/dist/docx/serializer/tableSerializer.d.ts +79 -0
- package/dist/docx/serializer/tableSerializer.js +422 -0
- package/dist/docx/serializer/xmlUtils.d.ts +20 -0
- package/dist/docx/serializer/xmlUtils.js +25 -0
- package/dist/docx/settingsParser.d.ts +8 -0
- package/dist/docx/settingsParser.js +36 -0
- package/dist/docx/shapeParser.d.ts +20 -0
- package/dist/docx/shapeParser.js +272 -0
- package/dist/docx/styleParser.d.ts +50 -0
- package/dist/docx/styleParser.js +905 -0
- package/dist/docx/tableParser.d.ts +202 -0
- package/dist/docx/tableParser.js +811 -0
- package/dist/docx/textBoxParser.d.ts +117 -0
- package/dist/docx/textBoxParser.js +262 -0
- package/dist/docx/themeParser.d.ts +77 -0
- package/dist/docx/themeParser.js +330 -0
- package/dist/docx/trackedMoveRangeNormalization.d.ts +22 -0
- package/dist/docx/trackedMoveRangeNormalization.js +100 -0
- package/dist/docx/unzip.d.ts +118 -0
- package/dist/docx/unzip.js +383 -0
- package/dist/docx/vmlImageParser.d.ts +16 -0
- package/dist/docx/vmlImageParser.js +100 -0
- package/dist/docx/watermarkParser.d.ts +45 -0
- package/dist/docx/watermarkParser.js +348 -0
- package/dist/docx/wrapTypes.d.ts +29 -0
- package/dist/docx/wrapTypes.js +48 -0
- package/dist/docx/xmlParser.d.ts +297 -0
- package/dist/docx/xmlParser.js +527 -0
- package/dist/fields/bookmarkPages.d.ts +13 -0
- package/dist/fields/bookmarkPages.js +66 -0
- package/dist/fields/bookmarkText.d.ts +16 -0
- package/dist/fields/bookmarkText.js +61 -0
- package/dist/fields/evaluateField.d.ts +23 -0
- package/dist/fields/evaluateField.js +77 -0
- package/dist/fields/fieldContext.d.ts +21 -0
- package/dist/fields/fieldContext.js +0 -0
- package/dist/fields/resolveFieldValues.d.ts +44 -0
- package/dist/fields/resolveFieldValues.js +204 -0
- package/dist/fields/sectionPageCounts.d.ts +11 -0
- package/dist/fields/sectionPageCounts.js +16 -0
- package/dist/fields/seqValues.d.ts +14 -0
- package/dist/fields/seqValues.js +36 -0
- package/dist/fonts/embeddedFontTable.d.ts +42 -0
- package/dist/fonts/embeddedFontTable.js +80 -0
- package/dist/fonts/embeddedFonts.d.ts +46 -0
- package/dist/fonts/embeddedFonts.js +112 -0
- package/dist/fonts/fontDeobfuscation.d.ts +30 -0
- package/dist/fonts/fontDeobfuscation.js +57 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +23 -0
- package/dist/layout-bridge/convert/footnoteLayout.d.ts +57 -0
- package/dist/layout-bridge/convert/footnoteLayout.js +316 -0
- package/dist/layout-bridge/convert/headerFooterLayout.d.ts +74 -0
- package/dist/layout-bridge/convert/headerFooterLayout.js +432 -0
- package/dist/layout-bridge/convert/templatePreviewFlow.d.ts +36 -0
- package/dist/layout-bridge/convert/templatePreviewFlow.js +176 -0
- package/dist/layout-bridge/convert/toFlowBlocks.d.ts +65 -0
- package/dist/layout-bridge/convert/toFlowBlocks.js +1309 -0
- package/dist/layout-bridge/convert/wrapEditorViewAsSurface.d.ts +17 -0
- package/dist/layout-bridge/convert/wrapEditorViewAsSurface.js +36 -0
- package/dist/layout-bridge/dom/clickToPositionDom.d.ts +66 -0
- package/dist/layout-bridge/dom/clickToPositionDom.js +304 -0
- package/dist/layout-bridge/dom/findBodyPmSpans.d.ts +7 -0
- package/dist/layout-bridge/dom/findBodyPmSpans.js +17 -0
- package/dist/layout-bridge/dom/findHfPmSpans.d.ts +62 -0
- package/dist/layout-bridge/dom/findHfPmSpans.js +197 -0
- package/dist/layout-bridge/engine/clickToPosition.d.ts +66 -0
- package/dist/layout-bridge/engine/clickToPosition.js +403 -0
- package/dist/layout-bridge/engine/hitTest.d.ts +135 -0
- package/dist/layout-bridge/engine/hitTest.js +375 -0
- package/dist/layout-bridge/engine/measuring/index.d.ts +10 -0
- package/dist/layout-bridge/engine/measuring/index.js +9 -0
- package/dist/layout-bridge/engine/selectionRects.d.ts +59 -0
- package/dist/layout-bridge/engine/selectionRects.js +485 -0
- package/dist/layout-bridge/engine/tableWidthUtils.d.ts +7 -0
- package/dist/layout-bridge/engine/tableWidthUtils.js +25 -0
- package/dist/layout-engine/index.d.ts +44 -0
- package/dist/layout-engine/index.js +691 -0
- package/dist/layout-engine/keep-together.d.ts +43 -0
- package/dist/layout-engine/keep-together.js +98 -0
- package/dist/layout-engine/layoutInstrumentation.d.ts +50 -0
- package/dist/layout-engine/layoutInstrumentation.js +43 -0
- package/dist/layout-engine/lineFlow.d.ts +8 -0
- package/dist/layout-engine/lineFlow.js +17 -0
- package/dist/layout-engine/measure/cache.d.ts +93 -0
- package/dist/layout-engine/measure/cache.js +245 -0
- package/dist/layout-engine/measure/clampFloatingWrapMargins.d.ts +20 -0
- package/dist/layout-engine/measure/clampFloatingWrapMargins.js +29 -0
- package/dist/layout-engine/measure/featureFlags.d.ts +44 -0
- package/dist/layout-engine/measure/featureFlags.js +19 -0
- package/dist/layout-engine/measure/floatingZones.d.ts +89 -0
- package/dist/layout-engine/measure/floatingZones.js +152 -0
- package/dist/layout-engine/measure/font-metrics.worker.d.ts +17 -0
- package/dist/layout-engine/measure/font-metrics.worker.js +104 -0
- package/dist/layout-engine/measure/index.d.ts +9 -0
- package/dist/layout-engine/measure/index.js +8 -0
- package/dist/layout-engine/measure/listMarkerWidth.d.ts +40 -0
- package/dist/layout-engine/measure/listMarkerWidth.js +76 -0
- package/dist/layout-engine/measure/measureBlocks.d.ts +25 -0
- package/dist/layout-engine/measure/measureBlocks.js +450 -0
- package/dist/layout-engine/measure/measureContainer.d.ts +24 -0
- package/dist/layout-engine/measure/measureContainer.js +280 -0
- package/dist/layout-engine/measure/measureHelpers.d.ts +82 -0
- package/dist/layout-engine/measure/measureHelpers.js +156 -0
- package/dist/layout-engine/measure/measureParagraph.d.ts +61 -0
- package/dist/layout-engine/measure/measureParagraph.js +724 -0
- package/dist/layout-engine/measure/measureProvider.d.ts +23 -0
- package/dist/layout-engine/measure/measureProvider.js +35 -0
- package/dist/layout-engine/measure/measureTypes.d.ts +61 -0
- package/dist/layout-engine/measure/measureTypes.js +0 -0
- package/dist/layout-engine/measure/measureWorker.d.ts +54 -0
- package/dist/layout-engine/measure/measureWorker.js +249 -0
- package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +88 -0
- package/dist/layout-engine/measure/measureWorkerProtocol.js +20 -0
- package/dist/layout-engine/measure/tableCellFloating.d.ts +26 -0
- package/dist/layout-engine/measure/tableCellFloating.js +99 -0
- package/dist/layout-engine/paginator.d.ts +84 -0
- package/dist/layout-engine/paginator.js +348 -0
- package/dist/layout-engine/paragraphFragmentRange.d.ts +9 -0
- package/dist/layout-engine/paragraphFragmentRange.js +40 -0
- package/dist/layout-engine/section-breaks.d.ts +78 -0
- package/dist/layout-engine/section-breaks.js +182 -0
- package/dist/layout-engine/tableRowBreak.d.ts +23 -0
- package/dist/layout-engine/tableRowBreak.js +147 -0
- package/dist/layout-engine/textBoxFlow.d.ts +50 -0
- package/dist/layout-engine/textBoxFlow.js +160 -0
- package/dist/layout-engine/types.d.ts +1031 -0
- package/dist/layout-engine/types.js +100 -0
- package/dist/layout-painter/documentColors.d.ts +4 -0
- package/dist/layout-painter/documentColors.js +40 -0
- package/dist/layout-painter/index.d.ts +110 -0
- package/dist/layout-painter/index.js +182 -0
- package/dist/layout-painter/registry/modules/image.d.ts +6 -0
- package/dist/layout-painter/registry/modules/image.js +17 -0
- package/dist/layout-painter/registry/modules/paragraph.d.ts +6 -0
- package/dist/layout-painter/registry/modules/paragraph.js +18 -0
- package/dist/layout-painter/registry/modules/table.d.ts +6 -0
- package/dist/layout-painter/registry/modules/table.js +16 -0
- package/dist/layout-painter/registry/modules/textBox.d.ts +6 -0
- package/dist/layout-painter/registry/modules/textBox.js +13 -0
- package/dist/layout-painter/registry/modules.d.ts +6 -0
- package/dist/layout-painter/registry/modules.js +26 -0
- package/dist/layout-painter/registry/registry.d.ts +24 -0
- package/dist/layout-painter/registry/registry.js +53 -0
- package/dist/layout-painter/registry/types.d.ts +61 -0
- package/dist/layout-painter/registry/types.js +0 -0
- package/dist/layout-painter/renderFragment.d.ts +32 -0
- package/dist/layout-painter/renderFragment.js +114 -0
- package/dist/layout-painter/renderImage.d.ts +88 -0
- package/dist/layout-painter/renderImage.js +130 -0
- package/dist/layout-painter/renderPage.d.ts +264 -0
- package/dist/layout-painter/renderPage.js +1795 -0
- package/dist/layout-painter/renderParagraph.d.ts +93 -0
- package/dist/layout-painter/renderParagraph.js +1300 -0
- package/dist/layout-painter/renderTable.d.ts +36 -0
- package/dist/layout-painter/renderTable.js +432 -0
- package/dist/layout-painter/renderTextBox.d.ts +22 -0
- package/dist/layout-painter/renderTextBox.js +67 -0
- package/dist/layout-painter/renderUtils.d.ts +42 -0
- package/dist/layout-painter/renderUtils.js +30 -0
- package/dist/layout-painter/renderWatermark.d.ts +16 -0
- package/dist/layout-painter/renderWatermark.js +61 -0
- package/dist/layout-painter/sdtBoundary.d.ts +6 -0
- package/dist/layout-painter/sdtBoundary.js +28 -0
- package/dist/managers/ContextMenuManager.d.ts +28 -0
- package/dist/managers/ContextMenuManager.js +48 -0
- package/dist/managers/DocumentLoaderManager.d.ts +47 -0
- package/dist/managers/DocumentLoaderManager.js +69 -0
- package/dist/managers/EditorModeManager.d.ts +28 -0
- package/dist/managers/EditorModeManager.js +50 -0
- package/dist/managers/ErrorManager.d.ts +26 -0
- package/dist/managers/ErrorManager.js +85 -0
- package/dist/managers/FindReplaceManager.d.ts +54 -0
- package/dist/managers/FindReplaceManager.js +104 -0
- package/dist/managers/HistoryManager.d.ts +92 -0
- package/dist/managers/HistoryManager.js +193 -0
- package/dist/managers/Subscribable.d.ts +34 -0
- package/dist/managers/Subscribable.js +46 -0
- package/dist/managers/TableSelectionManager.d.ts +74 -0
- package/dist/managers/TableSelectionManager.js +225 -0
- package/dist/managers/editorShortcuts.d.ts +42 -0
- package/dist/managers/editorShortcuts.js +60 -0
- package/dist/managers/types.d.ts +41 -0
- package/dist/managers/types.js +0 -0
- package/dist/markdown/annotations.d.ts +14 -0
- package/dist/markdown/annotations.js +42 -0
- package/dist/markdown/escape.d.ts +36 -0
- package/dist/markdown/escape.js +59 -0
- package/dist/markdown/fromMarkdown.d.ts +11 -0
- package/dist/markdown/fromMarkdown.js +223 -0
- package/dist/markdown/headings.d.ts +13 -0
- package/dist/markdown/headings.js +20 -0
- package/dist/markdown/images.d.ts +13 -0
- package/dist/markdown/images.js +63 -0
- package/dist/markdown/index.d.ts +18 -0
- package/dist/markdown/index.js +33 -0
- package/dist/markdown/internals.d.ts +15 -0
- package/dist/markdown/internals.js +35 -0
- package/dist/markdown/renderBlock.d.ts +7 -0
- package/dist/markdown/renderBlock.js +68 -0
- package/dist/markdown/renderParagraph.d.ts +11 -0
- package/dist/markdown/renderParagraph.js +64 -0
- package/dist/markdown/renderRuns.d.ts +11 -0
- package/dist/markdown/renderRuns.js +265 -0
- package/dist/markdown/renderTable.d.ts +8 -0
- package/dist/markdown/renderTable.js +229 -0
- package/dist/markdown/trailers.d.ts +13 -0
- package/dist/markdown/trailers.js +54 -0
- package/dist/markdown/types.d.ts +118 -0
- package/dist/markdown/types.js +0 -0
- package/dist/model.d.ts +13 -0
- package/dist/model.js +4 -0
- package/dist/paged-layout/LayoutSelectionGate.d.ts +80 -0
- package/dist/paged-layout/LayoutSelectionGate.js +131 -0
- package/dist/paged-layout/headerFooterMargins.d.ts +73 -0
- package/dist/paged-layout/headerFooterMargins.js +120 -0
- package/dist/paged-layout/hiddenEditorScroll.d.ts +4 -0
- package/dist/paged-layout/hiddenEditorScroll.js +4 -0
- package/dist/paged-layout/incrementalMeasure.d.ts +33 -0
- package/dist/paged-layout/incrementalMeasure.js +56 -0
- package/dist/paged-layout/rangeProjection.d.ts +51 -0
- package/dist/paged-layout/rangeProjection.js +153 -0
- package/dist/paged-layout/readOnlyEditAttempt.d.ts +5 -0
- package/dist/paged-layout/readOnlyEditAttempt.js +22 -0
- package/dist/paged-layout/scrollNavigation.d.ts +23 -0
- package/dist/paged-layout/scrollNavigation.js +31 -0
- package/dist/paged-layout/scrollPageInfo.d.ts +41 -0
- package/dist/paged-layout/scrollPageInfo.js +34 -0
- package/dist/paged-layout/scrollToPmPosition.d.ts +17 -0
- package/dist/paged-layout/scrollToPmPosition.js +95 -0
- package/dist/paged-layout/sectionBlockWidths.d.ts +35 -0
- package/dist/paged-layout/sectionBlockWidths.js +52 -0
- package/dist/paged-layout/sectionGeometry.d.ts +21 -0
- package/dist/paged-layout/sectionGeometry.js +36 -0
- package/dist/paged-layout/selectionViewportRect.d.ts +29 -0
- package/dist/paged-layout/selectionViewportRect.js +55 -0
- package/dist/paged-layout/tableColumnResize.d.ts +19 -0
- package/dist/paged-layout/tableColumnResize.js +28 -0
- package/dist/paged-layout/tableInsertButtonGeometry.d.ts +15 -0
- package/dist/paged-layout/tableInsertButtonGeometry.js +15 -0
- package/dist/paged-layout/transactionDirtyRange.d.ts +7 -0
- package/dist/paged-layout/transactionDirtyRange.js +27 -0
- package/dist/paged-layout/zoomScrollAnchor.d.ts +40 -0
- package/dist/paged-layout/zoomScrollAnchor.js +25 -0
- package/dist/prosemirror/attrs/index.d.ts +80 -0
- package/dist/prosemirror/attrs/index.js +1218 -0
- package/dist/prosemirror/autospacingBase.d.ts +11 -0
- package/dist/prosemirror/autospacingBase.js +16 -0
- package/dist/prosemirror/commands/comments.d.ts +93 -0
- package/dist/prosemirror/commands/comments.js +435 -0
- package/dist/prosemirror/commands/contentControls.d.ts +45 -0
- package/dist/prosemirror/commands/contentControls.js +294 -0
- package/dist/prosemirror/commands/contentControlsBlockFill.d.ts +15 -0
- package/dist/prosemirror/commands/contentControlsBlockFill.js +19 -0
- package/dist/prosemirror/commands/formatPainter.d.ts +31 -0
- package/dist/prosemirror/commands/formatPainter.js +130 -0
- package/dist/prosemirror/commands/formatting.d.ts +32 -0
- package/dist/prosemirror/commands/formatting.js +45 -0
- package/dist/prosemirror/commands/hyperlink.d.ts +31 -0
- package/dist/prosemirror/commands/hyperlink.js +79 -0
- package/dist/prosemirror/commands/image.d.ts +59 -0
- package/dist/prosemirror/commands/image.js +219 -0
- package/dist/prosemirror/commands/index.d.ts +13 -0
- package/dist/prosemirror/commands/index.js +13 -0
- package/dist/prosemirror/commands/pageBreak.d.ts +10 -0
- package/dist/prosemirror/commands/pageBreak.js +47 -0
- package/dist/prosemirror/commands/paragraph.d.ts +39 -0
- package/dist/prosemirror/commands/paragraph.js +64 -0
- package/dist/prosemirror/commands/pastePlainText.d.ts +39 -0
- package/dist/prosemirror/commands/pastePlainText.js +67 -0
- package/dist/prosemirror/commands/table.d.ts +83 -0
- package/dist/prosemirror/commands/table.js +105 -0
- package/dist/prosemirror/conversion/fromProseDoc.d.ts +27 -0
- package/dist/prosemirror/conversion/fromProseDoc.js +1550 -0
- package/dist/prosemirror/conversion/index.d.ts +4 -0
- package/dist/prosemirror/conversion/index.js +4 -0
- package/dist/prosemirror/conversion/runShadingMark.d.ts +16 -0
- package/dist/prosemirror/conversion/runShadingMark.js +39 -0
- package/dist/prosemirror/conversion/toProseDoc.d.ts +39 -0
- package/dist/prosemirror/conversion/toProseDoc.js +1404 -0
- package/dist/prosemirror/extensions/ExtensionManager.d.ts +43 -0
- package/dist/prosemirror/extensions/ExtensionManager.js +86 -0
- package/dist/prosemirror/extensions/StarterKit.d.ts +16 -0
- package/dist/prosemirror/extensions/StarterKit.js +132 -0
- package/dist/prosemirror/extensions/core/DocExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/core/DocExtension.js +12 -0
- package/dist/prosemirror/extensions/core/HistoryExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/core/HistoryExtension.js +28 -0
- package/dist/prosemirror/extensions/core/ParagraphExtension.d.ts +25 -0
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +619 -0
- package/dist/prosemirror/extensions/core/TextExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/core/TextExtension.js +12 -0
- package/dist/prosemirror/extensions/create.d.ts +17 -0
- package/dist/prosemirror/extensions/create.js +129 -0
- package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +106 -0
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.d.ts +8 -0
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +172 -0
- package/dist/prosemirror/extensions/features/BidiShortcutExtension.d.ts +16 -0
- package/dist/prosemirror/extensions/features/BidiShortcutExtension.js +38 -0
- package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.d.ts +16 -0
- package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.js +21 -0
- package/dist/prosemirror/extensions/features/DropCursorExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/features/DropCursorExtension.js +20 -0
- package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.d.ts +8 -0
- package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.js +44 -0
- package/dist/prosemirror/extensions/features/GapCursorExtension.d.ts +19 -0
- package/dist/prosemirror/extensions/features/GapCursorExtension.js +24 -0
- package/dist/prosemirror/extensions/features/ImageDragExtension.d.ts +15 -0
- package/dist/prosemirror/extensions/features/ImageDragExtension.js +66 -0
- package/dist/prosemirror/extensions/features/ImagePasteExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/features/ImagePasteExtension.js +91 -0
- package/dist/prosemirror/extensions/features/ListExtension.d.ts +14 -0
- package/dist/prosemirror/extensions/features/ListExtension.js +340 -0
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +60 -0
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +35 -0
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +188 -0
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +20 -0
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +34 -0
- package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.d.ts +20 -0
- package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.js +145 -0
- package/dist/prosemirror/extensions/features/SelectionTrackerExtension.d.ts +10 -0
- package/dist/prosemirror/extensions/features/SelectionTrackerExtension.js +17 -0
- package/dist/prosemirror/extensions/features/bidiShortcutController.d.ts +31 -0
- package/dist/prosemirror/extensions/features/bidiShortcutController.js +27 -0
- package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +31 -0
- package/dist/prosemirror/extensions/features/pasteCleanup.js +159 -0
- package/dist/prosemirror/extensions/marks/AllCapsExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/AllCapsExtension.js +24 -0
- package/dist/prosemirror/extensions/marks/BoldExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/BoldExtension.js +41 -0
- package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.d.ts +14 -0
- package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.js +64 -0
- package/dist/prosemirror/extensions/marks/CharacterStyleExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/marks/CharacterStyleExtension.js +47 -0
- package/dist/prosemirror/extensions/marks/CommentExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/marks/CommentExtension.js +38 -0
- package/dist/prosemirror/extensions/marks/FontFamilyExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/FontFamilyExtension.js +55 -0
- package/dist/prosemirror/extensions/marks/FontSizeExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/FontSizeExtension.js +47 -0
- package/dist/prosemirror/extensions/marks/FootnoteRefExtension.d.ts +11 -0
- package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +92 -0
- package/dist/prosemirror/extensions/marks/HiddenTextExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/marks/HiddenTextExtension.js +35 -0
- package/dist/prosemirror/extensions/marks/HighlightExtension.d.ts +10 -0
- package/dist/prosemirror/extensions/marks/HighlightExtension.js +115 -0
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +146 -0
- package/dist/prosemirror/extensions/marks/ItalicExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/ItalicExtension.js +34 -0
- package/dist/prosemirror/extensions/marks/RtlExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/RtlExtension.js +21 -0
- package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.d.ts +11 -0
- package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.js +75 -0
- package/dist/prosemirror/extensions/marks/RunShadingExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/RunShadingExtension.js +38 -0
- package/dist/prosemirror/extensions/marks/SmallCapsExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SmallCapsExtension.js +24 -0
- package/dist/prosemirror/extensions/marks/StrikeExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/StrikeExtension.js +33 -0
- package/dist/prosemirror/extensions/marks/SubscriptExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SubscriptExtension.js +25 -0
- package/dist/prosemirror/extensions/marks/SuperscriptExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SuperscriptExtension.js +25 -0
- package/dist/prosemirror/extensions/marks/TextColorExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/TextColorExtension.js +50 -0
- package/dist/prosemirror/extensions/marks/TextEffectExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/TextEffectExtension.js +35 -0
- package/dist/prosemirror/extensions/marks/TextEffectsExtensions.d.ts +31 -0
- package/dist/prosemirror/extensions/marks/TextEffectsExtensions.js +134 -0
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.d.ts +22 -0
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +113 -0
- package/dist/prosemirror/extensions/marks/UnderlineExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/UnderlineExtension.js +60 -0
- package/dist/prosemirror/extensions/marks/markUtils.d.ts +34 -0
- package/dist/prosemirror/extensions/marks/markUtils.js +233 -0
- package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +22 -0
- package/dist/prosemirror/extensions/nodes/BlockSdtExtension.js +122 -0
- package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/nodes/FieldExtension.js +87 -0
- package/dist/prosemirror/extensions/nodes/HardBreakExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/HardBreakExtension.js +38 -0
- package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.js +18 -0
- package/dist/prosemirror/extensions/nodes/ImageExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/ImageExtension.js +132 -0
- package/dist/prosemirror/extensions/nodes/MathExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/nodes/MathExtension.js +56 -0
- package/dist/prosemirror/extensions/nodes/PageBreakExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/PageBreakExtension.js +20 -0
- package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/nodes/SdtExtension.js +107 -0
- package/dist/prosemirror/extensions/nodes/ShapeExtension.d.ts +30 -0
- package/dist/prosemirror/extensions/nodes/ShapeExtension.js +502 -0
- package/dist/prosemirror/extensions/nodes/TabExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/TabExtension.js +27 -0
- package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +34 -0
- package/dist/prosemirror/extensions/nodes/TableExtension.js +1972 -0
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.d.ts +34 -0
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +150 -0
- package/dist/prosemirror/extensions/types.d.ts +101 -0
- package/dist/prosemirror/extensions/types.js +10 -0
- package/dist/prosemirror/findReplaceSelection.d.ts +23 -0
- package/dist/prosemirror/findReplaceSelection.js +86 -0
- package/dist/prosemirror/index.d.ts +25 -0
- package/dist/prosemirror/index.js +23 -0
- package/dist/prosemirror/insertOperations.d.ts +12 -0
- package/dist/prosemirror/insertOperations.js +19 -0
- package/dist/prosemirror/paragraphDirection.d.ts +42 -0
- package/dist/prosemirror/paragraphDirection.js +33 -0
- package/dist/prosemirror/plugins/aiCitationDecorations.d.ts +40 -0
- package/dist/prosemirror/plugins/aiCitationDecorations.js +90 -0
- package/dist/prosemirror/plugins/aiSuggestionDecorations.d.ts +42 -0
- package/dist/prosemirror/plugins/aiSuggestionDecorations.js +135 -0
- package/dist/prosemirror/plugins/anonymizationDecorations.d.ts +60 -0
- package/dist/prosemirror/plugins/anonymizationDecorations.js +120 -0
- package/dist/prosemirror/plugins/autocompleteSuggestion.d.ts +123 -0
- package/dist/prosemirror/plugins/autocompleteSuggestion.js +283 -0
- package/dist/prosemirror/plugins/contentControlWidgets.d.ts +56 -0
- package/dist/prosemirror/plugins/contentControlWidgets.js +192 -0
- package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +37 -0
- package/dist/prosemirror/plugins/createDocScanPlugin.js +55 -0
- package/dist/prosemirror/plugins/documentStyles.d.ts +18 -0
- package/dist/prosemirror/plugins/documentStyles.js +46 -0
- package/dist/prosemirror/plugins/index.d.ts +3 -0
- package/dist/prosemirror/plugins/index.js +3 -0
- package/dist/prosemirror/plugins/pmTextScan.d.ts +19 -0
- package/dist/prosemirror/plugins/pmTextScan.js +39 -0
- package/dist/prosemirror/plugins/selectionTracker.d.ts +43 -0
- package/dist/prosemirror/plugins/selectionTracker.js +179 -0
- package/dist/prosemirror/plugins/suggestionMode.d.ts +70 -0
- package/dist/prosemirror/plugins/suggestionMode.js +489 -0
- package/dist/prosemirror/plugins/templateDirectives.d.ts +25 -0
- package/dist/prosemirror/plugins/templateDirectives.js +67 -0
- package/dist/prosemirror/plugins/templatePreviewValues.d.ts +49 -0
- package/dist/prosemirror/plugins/templatePreviewValues.js +117 -0
- package/dist/prosemirror/plugins/templateSlashMenu.d.ts +57 -0
- package/dist/prosemirror/plugins/templateSlashMenu.js +184 -0
- package/dist/prosemirror/schema/index.d.ts +15 -0
- package/dist/prosemirror/schema/index.js +20 -0
- package/dist/prosemirror/schema/marks.d.ts +118 -0
- package/dist/prosemirror/schema/marks.js +0 -0
- package/dist/prosemirror/schema/nodes.d.ts +389 -0
- package/dist/prosemirror/schema/nodes.js +0 -0
- package/dist/prosemirror/selectionState.d.ts +23 -0
- package/dist/prosemirror/selectionState.js +111 -0
- package/dist/prosemirror/styles/index.d.ts +2 -0
- package/dist/prosemirror/styles/index.js +2 -0
- package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +32 -0
- package/dist/prosemirror/styles/resolvedStyleAttrs.js +108 -0
- package/dist/prosemirror/styles/styleResolver.d.ts +94 -0
- package/dist/prosemirror/styles/styleResolver.js +200 -0
- package/dist/prosemirror/utils/findParagraphByParaId.d.ts +26 -0
- package/dist/prosemirror/utils/findParagraphByParaId.js +37 -0
- package/dist/prosemirror/utils/tabCalculator.d.ts +110 -0
- package/dist/prosemirror/utils/tabCalculator.js +137 -0
- package/dist/prosemirror/validation.d.ts +20 -0
- package/dist/prosemirror/validation.js +177 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.js +6 -0
- package/dist/style-engine/index.d.ts +3 -0
- package/dist/style-engine/index.js +2 -0
- package/dist/style-engine/styleEngine.d.ts +67 -0
- package/dist/style-engine/styleEngine.js +70 -0
- package/dist/types/block-id.d.ts +58 -0
- package/dist/types/block-id.js +61 -0
- package/dist/types/colors.d.ts +2 -0
- package/dist/types/colors.js +0 -0
- package/dist/types/content.d.ts +2 -0
- package/dist/types/content.js +0 -0
- package/dist/types/document.d.ts +7 -0
- package/dist/types/document.js +0 -0
- package/dist/types/documentEnumValues.d.ts +89 -0
- package/dist/types/documentEnumValues.js +693 -0
- package/dist/types/formatting.d.ts +2 -0
- package/dist/types/formatting.js +0 -0
- package/dist/types/index.d.ts +107 -0
- package/dist/types/index.js +0 -0
- package/dist/utils/authorColors.d.ts +16 -0
- package/dist/utils/authorColors.js +30 -0
- package/dist/utils/baseDirection.d.ts +23 -0
- package/dist/utils/baseDirection.js +34 -0
- package/dist/utils/clipboard.d.ts +126 -0
- package/dist/utils/clipboard.js +622 -0
- package/dist/utils/colorResolver.d.ts +158 -0
- package/dist/utils/colorResolver.js +557 -0
- package/dist/utils/createDocument.d.ts +50 -0
- package/dist/utils/createDocument.js +262 -0
- package/dist/utils/documentLoaderBehavior.d.ts +22 -0
- package/dist/utils/documentLoaderBehavior.js +14 -0
- package/dist/utils/docxInput.d.ts +22 -0
- package/dist/utils/docxInput.js +16 -0
- package/dist/utils/domGuards.d.ts +59 -0
- package/dist/utils/domGuards.js +82 -0
- package/dist/utils/fontFamilyMerge.d.ts +7 -0
- package/dist/utils/fontFamilyMerge.js +31 -0
- package/dist/utils/fontLoader.d.ts +50 -0
- package/dist/utils/fontLoader.js +177 -0
- package/dist/utils/fontResolver.d.ts +61 -0
- package/dist/utils/fontResolver.js +651 -0
- package/dist/utils/fontWeights.d.ts +4 -0
- package/dist/utils/fontWeights.js +4 -0
- package/dist/utils/formatToStyle.d.ts +103 -0
- package/dist/utils/formatToStyle.js +289 -0
- package/dist/utils/headerFooter.d.ts +74 -0
- package/dist/utils/headerFooter.js +257 -0
- package/dist/utils/headingCollector.d.ts +22 -0
- package/dist/utils/headingCollector.js +36 -0
- package/dist/utils/hexId.d.ts +33 -0
- package/dist/utils/hexId.js +37 -0
- package/dist/utils/imageValidation.d.ts +5 -0
- package/dist/utils/imageValidation.js +31 -0
- package/dist/utils/paragraphFormattingMerge.d.ts +14 -0
- package/dist/utils/paragraphFormattingMerge.js +68 -0
- package/dist/utils/replaceText.d.ts +17 -0
- package/dist/utils/replaceText.js +161 -0
- package/dist/utils/rotationBoundingBox.d.ts +12 -0
- package/dist/utils/rotationBoundingBox.js +36 -0
- package/dist/utils/scriptSegments.d.ts +36 -0
- package/dist/utils/scriptSegments.js +52 -0
- package/dist/utils/tableOperations.d.ts +87 -0
- package/dist/utils/tableOperations.js +259 -0
- package/dist/utils/textFormattingMerge.d.ts +6 -0
- package/dist/utils/textFormattingMerge.js +31 -0
- package/dist/utils/tiffConverter.d.ts +18 -0
- package/dist/utils/tiffConverter.js +83 -0
- package/dist/utils/units.d.ts +99 -0
- package/dist/utils/units.js +139 -0
- package/dist/utils/urlSecurity.d.ts +7 -0
- package/dist/utils/urlSecurity.js +65 -0
- package/dist/watermark/index.d.ts +39 -0
- package/dist/watermark/index.js +149 -0
- package/package.json +122 -2
|
@@ -0,0 +1,489 @@
|
|
|
1
|
+
import { splitBlockClearBorders } from "../extensions/features/BaseKeymapExtension.js";
|
|
2
|
+
import { Plugin, PluginKey, TextSelection } from "prosemirror-state";
|
|
3
|
+
import { isHistoryTransaction } from "prosemirror-history";
|
|
4
|
+
//#region src/prosemirror/plugins/suggestionMode.ts
|
|
5
|
+
/**
|
|
6
|
+
* Suggestion Mode Plugin
|
|
7
|
+
*
|
|
8
|
+
* When active, intercepts all text insertions and deletions,
|
|
9
|
+
* wrapping them in tracked change marks (insertion/deletion)
|
|
10
|
+
* instead of modifying the document directly.
|
|
11
|
+
*
|
|
12
|
+
* - Typed text is marked as insertion (green underline)
|
|
13
|
+
* - Deleted text is NOT removed — it's marked as deletion (red strikethrough)
|
|
14
|
+
* - Text already marked as insertion by the current author is deleted normally
|
|
15
|
+
* (retracting your own suggestion)
|
|
16
|
+
*/
|
|
17
|
+
const suggestionModeKey = new PluginKey("suggestionMode");
|
|
18
|
+
const SUGGESTION_META = "suggestionModeApplied";
|
|
19
|
+
const SUGGESTION_BYPASS_META = "suggestionModeBypass";
|
|
20
|
+
let nextRevisionId = Date.now();
|
|
21
|
+
function makeMarkAttrs(pluginState) {
|
|
22
|
+
return {
|
|
23
|
+
revisionId: nextRevisionId++,
|
|
24
|
+
author: pluginState.author,
|
|
25
|
+
date: (/* @__PURE__ */ new Date()).toISOString()
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function makeRevisionInfo(state) {
|
|
29
|
+
const pluginState = suggestionModeKey.getState(state);
|
|
30
|
+
if (!pluginState?.active) return null;
|
|
31
|
+
const attrs = makeMarkAttrs(pluginState);
|
|
32
|
+
return {
|
|
33
|
+
id: attrs.revisionId,
|
|
34
|
+
author: attrs.author,
|
|
35
|
+
date: attrs.date
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function makeParagraphMarkInfo(pluginState) {
|
|
39
|
+
const attrs = makeMarkAttrs(pluginState);
|
|
40
|
+
return {
|
|
41
|
+
id: attrs.revisionId,
|
|
42
|
+
author: attrs.author,
|
|
43
|
+
date: attrs.date
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Find an adjacent mark of the same type by the same author.
|
|
48
|
+
* Reuses its revisionId so consecutive edits group into one change.
|
|
49
|
+
*/
|
|
50
|
+
function findAdjacentRevision(doc, pos, markTypeName, author) {
|
|
51
|
+
try {
|
|
52
|
+
const $pos = doc.resolve(pos);
|
|
53
|
+
for (const node of [$pos.nodeBefore, $pos.nodeAfter]) if (node?.isText) {
|
|
54
|
+
const mark = node.marks.find((m) => m.type.name === markTypeName && m.attrs["author"] === author);
|
|
55
|
+
if (mark) return mark.attrs;
|
|
56
|
+
}
|
|
57
|
+
} catch {}
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Find an adjacent revision at either edge of a range.
|
|
62
|
+
* This keeps consecutive backspaces grouped even though the cursor moves left.
|
|
63
|
+
*/
|
|
64
|
+
function findAdjacentRevisionForRange(doc, from, to, markTypeName, author) {
|
|
65
|
+
return findAdjacentRevision(doc, from, markTypeName, author) ?? findAdjacentRevision(doc, to, markTypeName, author);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Walk a text range and either mark as deletion or retract own insertions.
|
|
69
|
+
* Processes in reverse order to maintain position validity.
|
|
70
|
+
*/
|
|
71
|
+
function markRangeAsDeleted(tr, doc, from, to, insertionType, deletionType, pluginState) {
|
|
72
|
+
const ranges = [];
|
|
73
|
+
doc.nodesBetween(from, to, (node, pos) => {
|
|
74
|
+
if (!node.isText && !(node.isInline && node.type.allowsMarkType(deletionType))) return;
|
|
75
|
+
const start = Math.max(pos, from);
|
|
76
|
+
const end = Math.min(pos + node.nodeSize, to);
|
|
77
|
+
if (start >= end) return;
|
|
78
|
+
const isOwnInsert = node.marks.some((m) => m.type === insertionType && m.attrs["author"] === pluginState.author);
|
|
79
|
+
ranges.push({
|
|
80
|
+
from: start,
|
|
81
|
+
to: end,
|
|
82
|
+
isOwnInsert
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
if (ranges.length === 0) return;
|
|
86
|
+
const delAttrs = findAdjacentRevisionForRange(doc, from, to, "deletion", pluginState.author) || makeMarkAttrs(pluginState);
|
|
87
|
+
for (let i = ranges.length - 1; i >= 0; i--) {
|
|
88
|
+
const range = ranges[i];
|
|
89
|
+
if (range.isOwnInsert) tr.delete(range.from, range.to);
|
|
90
|
+
else tr.addMark(range.from, range.to, deletionType.create(delAttrs));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Add the insertion mark to every inline node in `[from, to)` that can carry
|
|
95
|
+
* it and does not already carry a tracked-change mark. Mirrors the catch-all's
|
|
96
|
+
* node-by-node walk: a leaf text node's own `markSet` is empty so
|
|
97
|
+
* `allowsMarkType` is false, hence the explicit `isText` arm; content already
|
|
98
|
+
* carrying an insertion/deletion is left untouched so another author's revision
|
|
99
|
+
* isn't overwritten. eigenpal/docx-editor#784.
|
|
100
|
+
*/
|
|
101
|
+
function markRangeAsInserted(tr, doc, from, to, insertionType, deletionType, attrs) {
|
|
102
|
+
doc.nodesBetween(from, to, (node, pos) => {
|
|
103
|
+
if (!node.isText && !(node.isInline && node.type.allowsMarkType(insertionType))) return;
|
|
104
|
+
if (node.marks.some((m) => m.type === insertionType || m.type === deletionType)) return;
|
|
105
|
+
const start = Math.max(pos, from);
|
|
106
|
+
const end = Math.min(pos + node.nodeSize, to);
|
|
107
|
+
if (start >= end) return;
|
|
108
|
+
tr.addMark(start, end, insertionType.create(attrs));
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* With track changes on, pasting over a non-empty text selection marks the
|
|
113
|
+
* replaced text as a tracked deletion and the pasted slice as a tracked
|
|
114
|
+
* insertion (so they read as one replacement), matching typing over a
|
|
115
|
+
* selection. Returns false for a collapsed cursor or non-text selection so the
|
|
116
|
+
* default paste + the `appendTransaction` catch-all marks a plain insertion
|
|
117
|
+
* (eigenpal/docx-editor#784).
|
|
118
|
+
*/
|
|
119
|
+
function handleSuggestionPaste(view, slice, pluginState) {
|
|
120
|
+
const { selection } = view.state;
|
|
121
|
+
if (!(selection instanceof TextSelection) || selection.empty) return false;
|
|
122
|
+
const insertionType = view.state.schema.marks["insertion"];
|
|
123
|
+
const deletionType = view.state.schema.marks["deletion"];
|
|
124
|
+
if (!insertionType || !deletionType) return false;
|
|
125
|
+
const { from, to } = selection;
|
|
126
|
+
const tr = view.state.tr;
|
|
127
|
+
tr.setMeta(SUGGESTION_META, true);
|
|
128
|
+
markRangeAsDeleted(tr, view.state.doc, from, to, insertionType, deletionType, pluginState);
|
|
129
|
+
const insertFrom = tr.mapping.map(to);
|
|
130
|
+
const sizeBefore = tr.doc.content.size;
|
|
131
|
+
tr.replaceRange(insertFrom, insertFrom, slice);
|
|
132
|
+
const insertTo = insertFrom + (tr.doc.content.size - sizeBefore);
|
|
133
|
+
tr.removeMark(insertFrom, insertTo, deletionType);
|
|
134
|
+
const insertAttrs = findAdjacentRevision(view.state.doc, from, "insertion", pluginState.author) || makeMarkAttrs(pluginState);
|
|
135
|
+
markRangeAsInserted(tr, tr.doc, insertFrom, insertTo, insertionType, deletionType, insertAttrs);
|
|
136
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(insertTo)));
|
|
137
|
+
view.dispatch(tr.scrollIntoView());
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Insert text as a tracked insertion, optionally marking replaced selection as deletion.
|
|
142
|
+
*/
|
|
143
|
+
function applySuggestionInsert(view, from, to, text, pluginState) {
|
|
144
|
+
const insertionType = view.state.schema.marks["insertion"];
|
|
145
|
+
if (!insertionType) return false;
|
|
146
|
+
const tr = view.state.tr;
|
|
147
|
+
tr.setMeta(SUGGESTION_META, true);
|
|
148
|
+
const insertAttrs = findAdjacentRevision(view.state.doc, from, "insertion", pluginState.author) || makeMarkAttrs(pluginState);
|
|
149
|
+
if (from !== to) {
|
|
150
|
+
const deletionType = view.state.schema.marks["deletion"];
|
|
151
|
+
if (deletionType) markRangeAsDeleted(tr, view.state.doc, from, to, insertionType, deletionType, pluginState);
|
|
152
|
+
}
|
|
153
|
+
const insertAt = tr.mapping.map(to);
|
|
154
|
+
tr.insertText(text, insertAt, insertAt);
|
|
155
|
+
const deletionType = view.state.schema.marks["deletion"];
|
|
156
|
+
if (deletionType) tr.removeMark(insertAt, insertAt + text.length, deletionType);
|
|
157
|
+
tr.addMark(insertAt, insertAt + text.length, insertionType.create(insertAttrs));
|
|
158
|
+
view.dispatch(tr.scrollIntoView());
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Track-changes Enter: split the paragraph and stamp `pPrMark = 'ins'` on the
|
|
163
|
+
* FIRST half of the split (the upper paragraph), per ECMA-376 §17.13.5. The
|
|
164
|
+
* actual splitting reuses `splitBlockClearBorders` so border/style/stored-mark
|
|
165
|
+
* behavior stays identical to ordinary editing.
|
|
166
|
+
*
|
|
167
|
+
* If the source paragraph already carries a `pPrMark`, leave it alone — a
|
|
168
|
+
* prior author's revision must not be silently overwritten.
|
|
169
|
+
*/
|
|
170
|
+
function handleSuggestionEnter(view, pluginState) {
|
|
171
|
+
const { $from } = view.state.selection;
|
|
172
|
+
if ($from.parent.type.name !== "paragraph") return false;
|
|
173
|
+
const sourcePos = $from.before();
|
|
174
|
+
const sourceAttrs = $from.parent.attrs;
|
|
175
|
+
const captured = { tr: null };
|
|
176
|
+
if (!splitBlockClearBorders(view.state, (tr) => {
|
|
177
|
+
captured.tr = tr;
|
|
178
|
+
}, view) || !captured.tr) return false;
|
|
179
|
+
const tr = captured.tr;
|
|
180
|
+
if (sourceAttrs["pPrMark"] == null) {
|
|
181
|
+
if (tr.doc.nodeAt(sourcePos)?.type.name === "paragraph") {
|
|
182
|
+
const markInfo = {
|
|
183
|
+
kind: "ins",
|
|
184
|
+
info: makeParagraphMarkInfo(pluginState)
|
|
185
|
+
};
|
|
186
|
+
tr.setNodeAttribute(sourcePos, "pPrMark", markInfo);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
view.dispatch(tr.scrollIntoView());
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Detect a caret-at-paragraph-boundary scenario where Backspace/Delete should
|
|
194
|
+
* record a tracked paragraph-mark deletion instead of joining paragraphs.
|
|
195
|
+
*
|
|
196
|
+
* Returns the position of the paragraph whose `pPrMark` should be set, or
|
|
197
|
+
* `null` if the caret is mid-paragraph (let the normal text-delete path run).
|
|
198
|
+
*
|
|
199
|
+
* - Backspace-at-paragraph-start → previous sibling paragraph.
|
|
200
|
+
* - Delete-at-paragraph-end → current paragraph.
|
|
201
|
+
*
|
|
202
|
+
* Returns `null` when there is no adjacent sibling paragraph (the join would
|
|
203
|
+
* not produce paragraph-mark merging — e.g. doc start, doc end, or sibling
|
|
204
|
+
* is a table). The default merge path then runs unchanged.
|
|
205
|
+
*/
|
|
206
|
+
function paragraphBoundaryTarget(state, direction) {
|
|
207
|
+
const { $from, empty } = state.selection;
|
|
208
|
+
if (!empty) return null;
|
|
209
|
+
if ($from.parent.type.name !== "paragraph") return null;
|
|
210
|
+
const paragraphStart = $from.before();
|
|
211
|
+
const paragraphEnd = $from.after();
|
|
212
|
+
if (direction === "backward") {
|
|
213
|
+
if ($from.parentOffset !== 0) return null;
|
|
214
|
+
if (paragraphStart === 0) return null;
|
|
215
|
+
const prev = state.doc.resolve(paragraphStart).nodeBefore;
|
|
216
|
+
if (!prev || prev.type.name !== "paragraph") return null;
|
|
217
|
+
return paragraphStart - prev.nodeSize;
|
|
218
|
+
}
|
|
219
|
+
if ($from.parentOffset !== $from.parent.content.size) return null;
|
|
220
|
+
if (paragraphEnd >= state.doc.content.size) return null;
|
|
221
|
+
const next = state.doc.resolve(paragraphEnd).nodeAfter;
|
|
222
|
+
if (!next || next.type.name !== "paragraph") return null;
|
|
223
|
+
return paragraphStart;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Mark a paragraph break as a tracked deletion. `target` is the position of
|
|
227
|
+
* the paragraph whose closing mark is being deleted (per OOXML, that's the
|
|
228
|
+
* previous paragraph for Backspace-at-start and the current paragraph for
|
|
229
|
+
* Delete-at-end). If the existing mark is the current author's insertion,
|
|
230
|
+
* retract it by joining the paragraphs back together.
|
|
231
|
+
*/
|
|
232
|
+
function applyPPrDel(view, targetParagraphPos, pluginState) {
|
|
233
|
+
const targetNode = view.state.doc.nodeAt(targetParagraphPos);
|
|
234
|
+
if (!targetNode || targetNode.type.name !== "paragraph") return false;
|
|
235
|
+
const existingMark = targetNode.attrs["pPrMark"];
|
|
236
|
+
if (isCurrentAuthorParagraphInsertion(existingMark, pluginState.author)) {
|
|
237
|
+
const tr = view.state.tr;
|
|
238
|
+
tr.setMeta(SUGGESTION_META, true);
|
|
239
|
+
const joinPos = targetParagraphPos + targetNode.nodeSize;
|
|
240
|
+
try {
|
|
241
|
+
tr.join(joinPos);
|
|
242
|
+
tr.setNodeAttribute(targetParagraphPos, "pPrMark", null);
|
|
243
|
+
view.dispatch(tr.scrollIntoView());
|
|
244
|
+
} catch {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
if (existingMark != null) return true;
|
|
250
|
+
const tr = view.state.tr;
|
|
251
|
+
tr.setMeta(SUGGESTION_META, true);
|
|
252
|
+
const markInfo = {
|
|
253
|
+
kind: "del",
|
|
254
|
+
info: makeParagraphMarkInfo(pluginState)
|
|
255
|
+
};
|
|
256
|
+
tr.setNodeAttribute(targetParagraphPos, "pPrMark", markInfo);
|
|
257
|
+
view.dispatch(tr.scrollIntoView());
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
function isCurrentAuthorParagraphInsertion(value, author) {
|
|
261
|
+
if (typeof value !== "object" || value === null) return false;
|
|
262
|
+
const mark = value;
|
|
263
|
+
if (mark.kind !== "ins" || typeof mark.info !== "object" || mark.info === null) return false;
|
|
264
|
+
return mark.info.author === author;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Handle delete (forward or backward) in suggestion mode.
|
|
268
|
+
*/
|
|
269
|
+
function handleSuggestionDelete(state, dispatch, direction) {
|
|
270
|
+
const pluginState = suggestionModeKey.getState(state);
|
|
271
|
+
if (!pluginState?.active) return false;
|
|
272
|
+
const { $from, $to, empty } = state.selection;
|
|
273
|
+
const insertionType = state.schema.marks["insertion"];
|
|
274
|
+
const deletionType = state.schema.marks["deletion"];
|
|
275
|
+
if (!insertionType || !deletionType) return false;
|
|
276
|
+
if (!dispatch) return true;
|
|
277
|
+
const tr = state.tr;
|
|
278
|
+
tr.setMeta(SUGGESTION_META, true);
|
|
279
|
+
if (!empty) {
|
|
280
|
+
markRangeAsDeleted(tr, state.doc, $from.pos, $to.pos, insertionType, deletionType, pluginState);
|
|
281
|
+
const cursorPos = tr.mapping.map($to.pos);
|
|
282
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(cursorPos)));
|
|
283
|
+
dispatch(tr.scrollIntoView());
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
const isBackward = direction === "backward";
|
|
287
|
+
const deletePos = isBackward ? $from.pos - 1 : $from.pos;
|
|
288
|
+
const deleteEnd = isBackward ? $from.pos : $from.pos + 1;
|
|
289
|
+
if (deletePos < 0 || deleteEnd > state.doc.content.size) return true;
|
|
290
|
+
const nodeAfter = state.doc.resolve(deletePos).nodeAfter;
|
|
291
|
+
if (!nodeAfter || !(nodeAfter.isText || nodeAfter.isInline && nodeAfter.type.allowsMarkType(deletionType))) return false;
|
|
292
|
+
const hasOwnInsertion = nodeAfter.marks.some((m) => m.type === insertionType && m.attrs["author"] === pluginState.author);
|
|
293
|
+
if (nodeAfter.marks.some((m) => m.type === deletionType)) {
|
|
294
|
+
const newPos = isBackward ? deletePos : deleteEnd;
|
|
295
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(newPos)));
|
|
296
|
+
} else if (hasOwnInsertion) tr.delete(deletePos, deleteEnd);
|
|
297
|
+
else {
|
|
298
|
+
const delAttrs = findAdjacentRevisionForRange(state.doc, deletePos, deleteEnd, "deletion", pluginState.author) || makeMarkAttrs(pluginState);
|
|
299
|
+
tr.addMark(deletePos, deleteEnd, deletionType.create(delAttrs));
|
|
300
|
+
const newPos = isBackward ? deletePos : deleteEnd;
|
|
301
|
+
tr.setSelection(TextSelection.near(tr.doc.resolve(newPos)));
|
|
302
|
+
}
|
|
303
|
+
dispatch(tr.scrollIntoView());
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Mark the text committed by an IME composition as a tracked insertion.
|
|
308
|
+
*
|
|
309
|
+
* Invoked from `compositionend` (deferred to a microtask) rather than from the
|
|
310
|
+
* `appendTransaction` catch-all. ProseMirror commits composed text as part of
|
|
311
|
+
* its own composition-end flush; adding the insertion mark *synchronously*
|
|
312
|
+
* during that flush re-wraps the very text node the IME just finalized, which
|
|
313
|
+
* corrupts CJK (Japanese / Chinese / Korean) input — characters duplicate or
|
|
314
|
+
* garble. Running one tick later, after the composition has settled, wraps the
|
|
315
|
+
* committed range safely. `markRangeAsInserted` skips nodes that already carry a
|
|
316
|
+
* tracked-change mark, so this is idempotent. eigenpal/docx-editor#938.
|
|
317
|
+
*/
|
|
318
|
+
function markComposedAsInsertion(view, from, pluginState) {
|
|
319
|
+
const insertionType = view.state.schema.marks["insertion"];
|
|
320
|
+
const deletionType = view.state.schema.marks["deletion"];
|
|
321
|
+
if (!insertionType || !deletionType) return;
|
|
322
|
+
const to = view.state.selection.to;
|
|
323
|
+
if (to <= from) return;
|
|
324
|
+
const tr = view.state.tr;
|
|
325
|
+
tr.setMeta(SUGGESTION_META, true);
|
|
326
|
+
const markAttrs = findAdjacentRevisionForRange(view.state.doc, from, to, "insertion", pluginState.author) || makeMarkAttrs(pluginState);
|
|
327
|
+
markRangeAsInserted(tr, view.state.doc, from, to, insertionType, deletionType, markAttrs);
|
|
328
|
+
if (tr.steps.length === 0) return;
|
|
329
|
+
const caret = tr.mapping.map(to);
|
|
330
|
+
tr.setSelection(TextSelection.create(tr.doc, caret));
|
|
331
|
+
view.dispatch(tr);
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Create the suggestion mode plugin.
|
|
335
|
+
* When active, text edits become tracked changes.
|
|
336
|
+
*/
|
|
337
|
+
function createSuggestionModePlugin(initialActive = false, author = "User") {
|
|
338
|
+
let composing = false;
|
|
339
|
+
let compositionFrom = null;
|
|
340
|
+
return new Plugin({
|
|
341
|
+
key: suggestionModeKey,
|
|
342
|
+
state: {
|
|
343
|
+
init() {
|
|
344
|
+
return {
|
|
345
|
+
active: initialActive,
|
|
346
|
+
author
|
|
347
|
+
};
|
|
348
|
+
},
|
|
349
|
+
apply(tr, state) {
|
|
350
|
+
const meta = tr.getMeta(suggestionModeKey);
|
|
351
|
+
if (meta) return {
|
|
352
|
+
...state,
|
|
353
|
+
...meta
|
|
354
|
+
};
|
|
355
|
+
return state;
|
|
356
|
+
}
|
|
357
|
+
},
|
|
358
|
+
props: {
|
|
359
|
+
handleDOMEvents: {
|
|
360
|
+
compositionstart(view) {
|
|
361
|
+
const pluginState = suggestionModeKey.getState(view.state);
|
|
362
|
+
if (!pluginState?.active) return false;
|
|
363
|
+
composing = true;
|
|
364
|
+
const { from, to } = view.state.selection;
|
|
365
|
+
if (from !== to) {
|
|
366
|
+
const insertionType = view.state.schema.marks["insertion"];
|
|
367
|
+
const deletionType = view.state.schema.marks["deletion"];
|
|
368
|
+
if (insertionType && deletionType) {
|
|
369
|
+
const tr = view.state.tr;
|
|
370
|
+
tr.setMeta(SUGGESTION_META, true);
|
|
371
|
+
markRangeAsDeleted(tr, view.state.doc, from, to, insertionType, deletionType, pluginState);
|
|
372
|
+
const caret = tr.mapping.map(to);
|
|
373
|
+
tr.setSelection(TextSelection.create(tr.doc, caret));
|
|
374
|
+
view.dispatch(tr);
|
|
375
|
+
compositionFrom = caret;
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
compositionFrom = from;
|
|
380
|
+
return false;
|
|
381
|
+
},
|
|
382
|
+
compositionend(view) {
|
|
383
|
+
const pluginState = suggestionModeKey.getState(view.state);
|
|
384
|
+
const from = compositionFrom;
|
|
385
|
+
compositionFrom = null;
|
|
386
|
+
if (!pluginState?.active || from == null) {
|
|
387
|
+
composing = false;
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
queueMicrotask(() => {
|
|
391
|
+
try {
|
|
392
|
+
const current = suggestionModeKey.getState(view.state);
|
|
393
|
+
if (current?.active) markComposedAsInsertion(view, from, current);
|
|
394
|
+
} finally {
|
|
395
|
+
composing = false;
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
return false;
|
|
399
|
+
},
|
|
400
|
+
beforeinput(view, event) {
|
|
401
|
+
const pluginState = suggestionModeKey.getState(view.state);
|
|
402
|
+
if (!pluginState?.active) return false;
|
|
403
|
+
if (composing || event.isComposing) return false;
|
|
404
|
+
if (event.inputType === "insertText" && event.data) {
|
|
405
|
+
event.preventDefault();
|
|
406
|
+
const { from, to } = view.state.selection;
|
|
407
|
+
return applySuggestionInsert(view, from, to, event.data, pluginState);
|
|
408
|
+
}
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
handleKeyDown(view, event) {
|
|
413
|
+
const pluginState = suggestionModeKey.getState(view.state);
|
|
414
|
+
if (!pluginState?.active) return false;
|
|
415
|
+
if (event.key === "Enter") return handleSuggestionEnter(view, pluginState);
|
|
416
|
+
if (event.key === "Backspace" || event.key === "Delete") {
|
|
417
|
+
const boundaryTarget = paragraphBoundaryTarget(view.state, event.key === "Backspace" ? "backward" : "forward");
|
|
418
|
+
if (boundaryTarget !== null) return applyPPrDel(view, boundaryTarget, pluginState);
|
|
419
|
+
const direction = event.key === "Backspace" ? "backward" : "forward";
|
|
420
|
+
return handleSuggestionDelete(view.state, view.dispatch, direction);
|
|
421
|
+
}
|
|
422
|
+
return false;
|
|
423
|
+
},
|
|
424
|
+
handleTextInput(view, from, to, text) {
|
|
425
|
+
const pluginState = suggestionModeKey.getState(view.state);
|
|
426
|
+
if (!pluginState?.active) return false;
|
|
427
|
+
if (composing || view.composing) return false;
|
|
428
|
+
return applySuggestionInsert(view, from, to, text, pluginState);
|
|
429
|
+
},
|
|
430
|
+
handlePaste(view, _event, slice) {
|
|
431
|
+
const pluginState = suggestionModeKey.getState(view.state);
|
|
432
|
+
if (!pluginState?.active) return false;
|
|
433
|
+
return handleSuggestionPaste(view, slice, pluginState);
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
appendTransaction(transactions, _oldState, newState) {
|
|
437
|
+
const pluginState = suggestionModeKey.getState(newState);
|
|
438
|
+
if (!pluginState?.active) return null;
|
|
439
|
+
if (composing) return null;
|
|
440
|
+
const userTr = transactions.find((tr) => tr.docChanged && !tr.getMeta("suggestionModeApplied") && !tr.getMeta("suggestionModeBypass") && !isHistoryTransaction(tr));
|
|
441
|
+
if (!userTr) return null;
|
|
442
|
+
const insertionType = newState.schema.marks["insertion"];
|
|
443
|
+
if (!insertionType) return null;
|
|
444
|
+
const markAttrs = makeMarkAttrs(pluginState);
|
|
445
|
+
const tr = newState.tr;
|
|
446
|
+
tr.setMeta(SUGGESTION_META, true);
|
|
447
|
+
const deletionType = newState.schema.marks["deletion"];
|
|
448
|
+
for (const step of userTr.steps) step.getMap().forEach((_oldFrom, _oldTo, newFrom, newTo) => {
|
|
449
|
+
if (newTo > newFrom) newState.doc.nodesBetween(newFrom, newTo, (node, pos) => {
|
|
450
|
+
if (!node.isText && !(node.isInline && node.type.allowsMarkType(insertionType))) return;
|
|
451
|
+
if (!node.marks.some((m) => m.type === insertionType || deletionType && m.type === deletionType)) {
|
|
452
|
+
const nodeStart = Math.max(pos, newFrom);
|
|
453
|
+
const nodeEnd = Math.min(pos + node.nodeSize, newTo);
|
|
454
|
+
tr.addMark(nodeStart, nodeEnd, insertionType.create(markAttrs));
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
return tr.steps.length > 0 ? tr : null;
|
|
459
|
+
}
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Toggle suggestion mode on/off.
|
|
464
|
+
*/
|
|
465
|
+
function toggleSuggestionMode(state, dispatch) {
|
|
466
|
+
const current = suggestionModeKey.getState(state);
|
|
467
|
+
if (!current) return false;
|
|
468
|
+
if (dispatch) dispatch(state.tr.setMeta(suggestionModeKey, { active: !current.active }));
|
|
469
|
+
return true;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Set suggestion mode active state and author.
|
|
473
|
+
*/
|
|
474
|
+
function setSuggestionMode(active, state, dispatch, author) {
|
|
475
|
+
if (dispatch) {
|
|
476
|
+
const meta = { active };
|
|
477
|
+
if (author !== void 0) meta.author = author;
|
|
478
|
+
dispatch(state.tr.setMeta(suggestionModeKey, meta));
|
|
479
|
+
}
|
|
480
|
+
return true;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Check if suggestion mode is currently active.
|
|
484
|
+
*/
|
|
485
|
+
function isSuggestionModeActive(state) {
|
|
486
|
+
return suggestionModeKey.getState(state)?.active ?? false;
|
|
487
|
+
}
|
|
488
|
+
//#endregion
|
|
489
|
+
export { SUGGESTION_BYPASS_META, SUGGESTION_META, createSuggestionModePlugin, handleSuggestionEnter, handleSuggestionPaste, isSuggestionModeActive, makeRevisionInfo, paragraphBoundaryTarget, setSuggestionMode, suggestionModeKey, toggleSuggestionMode };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DocScanState } from "./createDocScanPlugin.js";
|
|
2
|
+
import { EditorState, PluginKey } from "prosemirror-state";
|
|
3
|
+
import { Node } from "prosemirror-model";
|
|
4
|
+
import { DirectiveKind } from "@stll/template-conditions";
|
|
5
|
+
|
|
6
|
+
//#region src/prosemirror/plugins/templateDirectives.d.ts
|
|
7
|
+
type DirectiveRange = {
|
|
8
|
+
/** Inclusive PM doc position of the marker start. */from: number; /** Exclusive PM doc position of the marker end. */
|
|
9
|
+
to: number;
|
|
10
|
+
kind: DirectiveKind; /** Field path, clause name, or condition/loop expression. */
|
|
11
|
+
expr: string; /** Clause-slot version selector, e.g. "v3" or "latest". */
|
|
12
|
+
clauseVersion?: string; /** True for block directives that occupy their own paragraph. */
|
|
13
|
+
block: boolean;
|
|
14
|
+
};
|
|
15
|
+
declare const scanDirectives: (doc: Node) => DirectiveRange[];
|
|
16
|
+
declare const templateDirectivesKey: PluginKey<DocScanState<undefined, DirectiveRange>>;
|
|
17
|
+
type TemplateDirectivesPluginOptions = {
|
|
18
|
+
onRangesChange?: (ranges: readonly DirectiveRange[]) => void;
|
|
19
|
+
};
|
|
20
|
+
declare const createTemplateDirectivesPlugin: ({
|
|
21
|
+
onRangesChange
|
|
22
|
+
}?: TemplateDirectivesPluginOptions) => import("prosemirror-state").Plugin<DocScanState<undefined, DirectiveRange>>;
|
|
23
|
+
declare const getTemplateDirectives: (state: EditorState) => readonly DirectiveRange[];
|
|
24
|
+
//#endregion
|
|
25
|
+
export { type DirectiveKind, DirectiveRange, TemplateDirectivesPluginOptions, createTemplateDirectivesPlugin, getTemplateDirectives, scanDirectives, templateDirectivesKey };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { collectBlockChunks, joinChunks, offsetToDocPos } from "./pmTextScan.js";
|
|
2
|
+
import { createDocScanPlugin, getDocScanRanges } from "./createDocScanPlugin.js";
|
|
3
|
+
import { PluginKey } from "prosemirror-state";
|
|
4
|
+
import { assertNever, isBlockDirectiveKind, scanMarkers } from "@stll/template-conditions";
|
|
5
|
+
//#region src/prosemirror/plugins/templateDirectives.ts
|
|
6
|
+
/** The display expression for a marker (field path, clause name, key, condition). */
|
|
7
|
+
const directiveExpr = (meta) => {
|
|
8
|
+
switch (meta.kind) {
|
|
9
|
+
case "placeholder": return meta.expr;
|
|
10
|
+
case "clause": return meta.name;
|
|
11
|
+
case "num":
|
|
12
|
+
case "ref": return meta.key;
|
|
13
|
+
case "if":
|
|
14
|
+
case "elseif":
|
|
15
|
+
case "each": return meta.expr;
|
|
16
|
+
case "index":
|
|
17
|
+
case "count":
|
|
18
|
+
case "else":
|
|
19
|
+
case "endif":
|
|
20
|
+
case "endeach": return "";
|
|
21
|
+
default: return assertNever(meta);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const scanDirectives = (doc) => {
|
|
25
|
+
const ranges = [];
|
|
26
|
+
for (const chunks of collectBlockChunks(doc)) {
|
|
27
|
+
const joined = joinChunks(chunks);
|
|
28
|
+
const trimmed = joined.trim();
|
|
29
|
+
const lineMarkers = scanMarkers(trimmed);
|
|
30
|
+
const sole = lineMarkers.length === 1 ? lineMarkers[0] : void 0;
|
|
31
|
+
if (sole && sole.raw === trimmed && isBlockDirectiveKind(sole.meta.kind)) {
|
|
32
|
+
const last = chunks.at(-1);
|
|
33
|
+
ranges.push({
|
|
34
|
+
from: chunks[0]?.start ?? 0,
|
|
35
|
+
to: last ? last.start + last.text.length : 0,
|
|
36
|
+
kind: sole.meta.kind,
|
|
37
|
+
expr: directiveExpr(sole.meta),
|
|
38
|
+
block: true
|
|
39
|
+
});
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
for (const marker of scanMarkers(joined)) {
|
|
43
|
+
const clauseVersion = marker.meta.kind === "clause" ? marker.meta.version : void 0;
|
|
44
|
+
ranges.push({
|
|
45
|
+
from: offsetToDocPos(chunks, marker.start),
|
|
46
|
+
to: offsetToDocPos(chunks, marker.end),
|
|
47
|
+
kind: marker.meta.kind,
|
|
48
|
+
expr: directiveExpr(marker.meta),
|
|
49
|
+
block: false,
|
|
50
|
+
...clauseVersion !== void 0 ? { clauseVersion } : {}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return ranges;
|
|
55
|
+
};
|
|
56
|
+
const KEY_HOLDER_SYMBOL = Symbol.for("stll.folio.templateDirectivesKey");
|
|
57
|
+
const keyHolder = globalThis;
|
|
58
|
+
const templateDirectivesKey = keyHolder[KEY_HOLDER_SYMBOL] ?? (keyHolder[KEY_HOLDER_SYMBOL] = new PluginKey("templateDirectives"));
|
|
59
|
+
const createTemplateDirectivesPlugin = ({ onRangesChange } = {}) => createDocScanPlugin({
|
|
60
|
+
key: templateDirectivesKey,
|
|
61
|
+
initialConfig: void 0,
|
|
62
|
+
scan: (doc) => scanDirectives(doc),
|
|
63
|
+
...onRangesChange ? { onRangesChange } : {}
|
|
64
|
+
});
|
|
65
|
+
const getTemplateDirectives = (state) => getDocScanRanges(templateDirectivesKey, state);
|
|
66
|
+
//#endregion
|
|
67
|
+
export { createTemplateDirectivesPlugin, getTemplateDirectives, scanDirectives, templateDirectivesKey };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Plugin, PluginKey } from "prosemirror-state";
|
|
2
|
+
import { DecorationSet, EditorView } from "prosemirror-view";
|
|
3
|
+
|
|
4
|
+
//#region src/prosemirror/plugins/templatePreviewValues.d.ts
|
|
5
|
+
/** One formatted span of a rich preview value. The flags layer over the
|
|
6
|
+
* marker's host formatting: a host-bold marker keeps its bold, a span's
|
|
7
|
+
* own bold/italic ORs in on top. */
|
|
8
|
+
type TemplatePreviewSpan = {
|
|
9
|
+
text: string;
|
|
10
|
+
bold?: boolean;
|
|
11
|
+
italic?: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** A preview value: plain text, or formatted spans when the value carries
|
|
14
|
+
* its own bold/italic (e.g. a registry lookup's formatted rendering). */
|
|
15
|
+
type TemplatePreviewValue = string | {
|
|
16
|
+
runs: TemplatePreviewSpan[];
|
|
17
|
+
};
|
|
18
|
+
/** Concatenated plain text of a preview value. */
|
|
19
|
+
declare const templatePreviewValueText: (value: TemplatePreviewValue) => string;
|
|
20
|
+
/** Stable identity of a preview value (text + formatting), for decoration
|
|
21
|
+
* keys and change detection. Distinguishes a plain string from a rich
|
|
22
|
+
* value with the same text. */
|
|
23
|
+
declare const templatePreviewValueFingerprint: (value: TemplatePreviewValue) => string;
|
|
24
|
+
type TemplatePreviewValues = {
|
|
25
|
+
/** Field path → value to display in place of `{{path}}` markers. */values: Record<string, TemplatePreviewValue>; /** `highlighted` marks substitutions with the preview accent. */
|
|
26
|
+
mode: "highlighted" | "plain";
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* One `{{path}}` marker matched by an active preview value. Exposed on
|
|
30
|
+
* the plugin state so the paged editor (whose visible pages never see
|
|
31
|
+
* PM decorations) can project the same substitutions onto its overlay.
|
|
32
|
+
*/
|
|
33
|
+
type TemplatePreviewEntry = {
|
|
34
|
+
/** Inclusive PM doc position of the marker start. */from: number; /** Exclusive PM doc position of the marker end. */
|
|
35
|
+
to: number; /** Field path the marker resolves to. */
|
|
36
|
+
expr: string; /** The typed value displayed in place of the marker. */
|
|
37
|
+
value: TemplatePreviewValue;
|
|
38
|
+
};
|
|
39
|
+
type TemplatePreviewState = {
|
|
40
|
+
preview: TemplatePreviewValues | null;
|
|
41
|
+
entries: TemplatePreviewEntry[];
|
|
42
|
+
decorationSet: DecorationSet;
|
|
43
|
+
};
|
|
44
|
+
declare const templatePreviewValuesKey: PluginKey<TemplatePreviewState>;
|
|
45
|
+
declare function createTemplatePreviewValuesPlugin(): Plugin<TemplatePreviewState>;
|
|
46
|
+
/** Push (or clear, with `null`) the live fill preview into the editor. */
|
|
47
|
+
declare const setTemplatePreviewValues: (view: EditorView, preview: TemplatePreviewValues | null) => void;
|
|
48
|
+
//#endregion
|
|
49
|
+
export { TemplatePreviewEntry, TemplatePreviewSpan, TemplatePreviewValue, TemplatePreviewValues, createTemplatePreviewValuesPlugin, setTemplatePreviewValues, templatePreviewValueFingerprint, templatePreviewValueText, templatePreviewValuesKey };
|