@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,377 @@
|
|
|
1
|
+
import { formatDate } from "../docx/fieldParser.js";
|
|
2
|
+
import { ContentControlBoundError, ContentControlLockedError, ContentControlTypeError } from "./errors.js";
|
|
3
|
+
//#region src/content-controls/mutateContentControls.ts
|
|
4
|
+
/**
|
|
5
|
+
* Pure (immutable) write helpers for block-level content controls.
|
|
6
|
+
*
|
|
7
|
+
* Each helper returns a brand-new `Document` with the requested mutation
|
|
8
|
+
* applied; the original document is never touched. Locked controls and
|
|
9
|
+
* type-incompatible operations throw a tagged error unless `{ force: true }`
|
|
10
|
+
* is passed. `w15:repeatingSection` controls cannot be unwrapped — doing so
|
|
11
|
+
* would orphan their w15 row items.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Format an ISO 8601 date string using the SDT's modeled `dateFormat`. The
|
|
15
|
+
* w:dateFormat tokens (yyyy/MM/dd/MMMM/HH/mm/ss/AM/PM, etc.) match what
|
|
16
|
+
* `formatDate` already implements for the fields engine; reusing it keeps
|
|
17
|
+
* both surfaces consistent.
|
|
18
|
+
*
|
|
19
|
+
* Returns the ISO input unchanged if the input does not parse as a date or
|
|
20
|
+
* the format is missing — degrading gracefully is better than corrupting
|
|
21
|
+
* the body.
|
|
22
|
+
*/
|
|
23
|
+
function formatDateForSdtBody(isoDate, dateFormat) {
|
|
24
|
+
if (!dateFormat) return isoDate;
|
|
25
|
+
const parsed = parseSdtDate(isoDate);
|
|
26
|
+
if (!parsed) return isoDate;
|
|
27
|
+
return formatDate(parsed, dateFormat);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Parse an OOXML SDT date string. `new Date(iso)` parses the input as UTC
|
|
31
|
+
* (a Pacific user would see the previous calendar day via local
|
|
32
|
+
* accessors), so we instead read the ISO components into a local-midnight
|
|
33
|
+
* Date so `formatDate`'s local-time accessors return the same calendar
|
|
34
|
+
* date / wall-clock time in every timezone.
|
|
35
|
+
*
|
|
36
|
+
* Supports date-only (`YYYY-MM-DD`) and date+time (`YYYY-MM-DDTHH:mm[:ss]`)
|
|
37
|
+
* inputs. The trailing `Z` / offset is intentionally ignored — for a date
|
|
38
|
+
* SDT, what the user picked is the displayed wall time, not a moment in
|
|
39
|
+
* UTC.
|
|
40
|
+
*/
|
|
41
|
+
const SDT_DATE_RE = /^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})(?:[Tt](?<hours>\d{2}):(?<minutes>\d{2})(?::(?<seconds>\d{2})(?:\.\d+)?)?)?(?:[Zz]|[+-]\d{2}:?\d{2})?$/u;
|
|
42
|
+
function parseSdtDate(iso) {
|
|
43
|
+
const match = SDT_DATE_RE.exec(iso);
|
|
44
|
+
if (match?.groups) {
|
|
45
|
+
const groups = match.groups;
|
|
46
|
+
const year = Number(groups["year"]);
|
|
47
|
+
const month = Number(groups["month"]);
|
|
48
|
+
const day = Number(groups["day"]);
|
|
49
|
+
const hours = groups["hours"] ? Number(groups["hours"]) : 0;
|
|
50
|
+
const minutes = groups["minutes"] ? Number(groups["minutes"]) : 0;
|
|
51
|
+
const seconds = groups["seconds"] ? Number(groups["seconds"]) : 0;
|
|
52
|
+
const candidate = new Date(year, month - 1, day, hours, minutes, seconds);
|
|
53
|
+
if (candidate.getFullYear() !== year || candidate.getMonth() !== month - 1 || candidate.getDate() !== day || candidate.getHours() !== hours || candidate.getMinutes() !== minutes || candidate.getSeconds() !== seconds) return null;
|
|
54
|
+
return candidate;
|
|
55
|
+
}
|
|
56
|
+
const parsed = new Date(iso);
|
|
57
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed;
|
|
58
|
+
}
|
|
59
|
+
function throwLocked(control, lock) {
|
|
60
|
+
throw new ContentControlLockedError({
|
|
61
|
+
message: `Control "${control.properties.tag ?? control.properties.alias ?? "(unnamed)"}" has w:lock=${lock}.`,
|
|
62
|
+
lock,
|
|
63
|
+
...control.properties.tag !== void 0 ? { tag: control.properties.tag } : {},
|
|
64
|
+
...control.properties.alias !== void 0 ? { alias: control.properties.alias } : {}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Refuse content mutations (setContentControlContent /
|
|
69
|
+
* setContentControlValue) when `w:lock` forbids them.
|
|
70
|
+
*
|
|
71
|
+
* Per OOXML §17.5.2.16:
|
|
72
|
+
* - `contentLocked` blocks content edits but allows the container to be
|
|
73
|
+
* removed.
|
|
74
|
+
* - `sdtContentLocked` blocks both.
|
|
75
|
+
* - `sdtLocked` blocks only container removal, NOT content edits.
|
|
76
|
+
*/
|
|
77
|
+
function ensureContentNotLocked(control, force) {
|
|
78
|
+
if (force) return;
|
|
79
|
+
const lock = control.properties.lock;
|
|
80
|
+
if (lock === "contentLocked" || lock === "sdtContentLocked") throwLocked(control, lock);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Refuse container removal (removeContentControl) when `w:lock` forbids it.
|
|
84
|
+
*
|
|
85
|
+
* - `sdtLocked` blocks container removal but allows content edits.
|
|
86
|
+
* - `sdtContentLocked` blocks both.
|
|
87
|
+
* - `contentLocked` blocks only content edits, NOT container removal.
|
|
88
|
+
*/
|
|
89
|
+
function ensureSdtNotLocked(control, force) {
|
|
90
|
+
if (force) return;
|
|
91
|
+
const lock = control.properties.lock;
|
|
92
|
+
if (lock === "sdtLocked" || lock === "sdtContentLocked") throwLocked(control, lock);
|
|
93
|
+
}
|
|
94
|
+
function isRepeatingSection(control) {
|
|
95
|
+
const raw = control.properties.rawPropertiesXml;
|
|
96
|
+
return raw !== void 0 && REPEATING_SECTION_RE.test(raw);
|
|
97
|
+
}
|
|
98
|
+
const REPEATING_SECTION_RE = /<\w+:repeatingSection\b/u;
|
|
99
|
+
const DATA_BINDING_RE = /<\w+:dataBinding\b(?<attrs>[^>]*)\/?>/iu;
|
|
100
|
+
/**
|
|
101
|
+
* Detect a `<w:dataBinding w:xpath="…"/>` (or alt-prefix variant) inside
|
|
102
|
+
* the captured rawPropertiesXml + extract the xpath / storeItemID for
|
|
103
|
+
* the error payload. Returns null when no binding is present.
|
|
104
|
+
*/
|
|
105
|
+
function readDataBinding(control) {
|
|
106
|
+
const raw = control.properties.rawPropertiesXml;
|
|
107
|
+
if (raw === void 0) return null;
|
|
108
|
+
const match = DATA_BINDING_RE.exec(raw);
|
|
109
|
+
if (!match) return null;
|
|
110
|
+
const attrs = match.groups?.["attrs"] ?? "";
|
|
111
|
+
const xpathMatch = /\bxpath="(?<xpath>[^"]*)"/iu.exec(attrs);
|
|
112
|
+
if (!xpathMatch) return null;
|
|
113
|
+
const xpath = xpathMatch.groups?.["xpath"] ?? "";
|
|
114
|
+
const storeMatch = /\bstoreItemID="(?<storeItemID>[^"]*)"/iu.exec(attrs);
|
|
115
|
+
if (storeMatch) return {
|
|
116
|
+
xpath,
|
|
117
|
+
storeItemID: storeMatch.groups?.["storeItemID"] ?? ""
|
|
118
|
+
};
|
|
119
|
+
return { xpath };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Refuse content mutations on bound SDTs unless the caller passes
|
|
123
|
+
* `{ force: true }`. When force is set, return the rawPropertiesXml
|
|
124
|
+
* with the `<w:dataBinding>` element stripped so the caller's write
|
|
125
|
+
* actually sticks on next Word open. See `ContentControlBoundError`
|
|
126
|
+
* for the rationale.
|
|
127
|
+
*/
|
|
128
|
+
function ensureContentNotBound(control, force) {
|
|
129
|
+
const binding = readDataBinding(control);
|
|
130
|
+
if (!binding) return { strippedRawPropertiesXml: void 0 };
|
|
131
|
+
if (!force) throw new ContentControlBoundError({
|
|
132
|
+
message: `Control "${control.properties.tag ?? control.properties.alias ?? "(unnamed)"}" is bound to ${binding.xpath}. Word regenerates the body from the bound XML on open; pass { force: true } to strip the binding inline, or remove it explicitly before writing.`,
|
|
133
|
+
xpath: binding.xpath,
|
|
134
|
+
...binding.storeItemID !== void 0 ? { storeItemID: binding.storeItemID } : {},
|
|
135
|
+
...control.properties.tag !== void 0 ? { tag: control.properties.tag } : {},
|
|
136
|
+
...control.properties.alias !== void 0 ? { alias: control.properties.alias } : {}
|
|
137
|
+
});
|
|
138
|
+
const raw = control.properties.rawPropertiesXml;
|
|
139
|
+
if (raw === void 0) return { strippedRawPropertiesXml: void 0 };
|
|
140
|
+
return { strippedRawPropertiesXml: raw.replaceAll(/<\w+:dataBinding\b[^>]*\/?>(?:[\s\S]*?<\/\w+:dataBinding>)?/giu, "") };
|
|
141
|
+
}
|
|
142
|
+
function mapBlock(block, match) {
|
|
143
|
+
if (block.type === "blockSdt") {
|
|
144
|
+
const replaced = match(block);
|
|
145
|
+
if (replaced !== void 0) return replaced;
|
|
146
|
+
const nextContent = transformBlocks(block.content, match);
|
|
147
|
+
const guarded = nextContent.length === 0 && block.content.length > 0 ? [makeParagraphFromText("")] : nextContent;
|
|
148
|
+
return {
|
|
149
|
+
...block,
|
|
150
|
+
content: guarded
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
if (block.type === "table") {
|
|
154
|
+
const rows = block.rows.map((row) => ({
|
|
155
|
+
...row,
|
|
156
|
+
cells: row.cells.map((cell) => {
|
|
157
|
+
const transformed = transformBlocks(cell.content, match);
|
|
158
|
+
const cellContent = [];
|
|
159
|
+
for (const child of transformed) if (child.type === "paragraph" || child.type === "table") cellContent.push(child);
|
|
160
|
+
return {
|
|
161
|
+
...cell,
|
|
162
|
+
content: cellContent
|
|
163
|
+
};
|
|
164
|
+
})
|
|
165
|
+
}));
|
|
166
|
+
return {
|
|
167
|
+
...block,
|
|
168
|
+
rows
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
return block;
|
|
172
|
+
}
|
|
173
|
+
function transformBlocks(blocks, match) {
|
|
174
|
+
const out = [];
|
|
175
|
+
for (const block of blocks) {
|
|
176
|
+
const mapped = mapBlock(block, match);
|
|
177
|
+
if (mapped === null) continue;
|
|
178
|
+
if (Array.isArray(mapped)) out.push(...mapped);
|
|
179
|
+
else out.push(mapped);
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Apply the same SDT match callback to every footnote and endnote body
|
|
185
|
+
* and return the updated note arrays. Without this, citation slots and
|
|
186
|
+
* bound metadata inside notes can't be reached through `setContentControl*`
|
|
187
|
+
* by tag / alias / id even though `findContentControls` surfaces them.
|
|
188
|
+
*/
|
|
189
|
+
function applyMatchToNotes(doc, match) {
|
|
190
|
+
const result = {};
|
|
191
|
+
if (doc.package.footnotes) result.footnotes = doc.package.footnotes.map((note) => ({
|
|
192
|
+
...note,
|
|
193
|
+
content: transformBlocks(note.content, match)
|
|
194
|
+
}));
|
|
195
|
+
if (doc.package.endnotes) result.endnotes = doc.package.endnotes.map((note) => ({
|
|
196
|
+
...note,
|
|
197
|
+
content: transformBlocks(note.content, match)
|
|
198
|
+
}));
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
function withUpdatedBodyAndNotes(doc, content, notes) {
|
|
202
|
+
return {
|
|
203
|
+
...doc,
|
|
204
|
+
package: {
|
|
205
|
+
...doc.package,
|
|
206
|
+
document: {
|
|
207
|
+
...doc.package.document,
|
|
208
|
+
content
|
|
209
|
+
},
|
|
210
|
+
...notes.footnotes !== void 0 ? { footnotes: notes.footnotes } : {},
|
|
211
|
+
...notes.endnotes !== void 0 ? { endnotes: notes.endnotes } : {}
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function controlMatchesFilter(control, filter) {
|
|
216
|
+
if (filter.pmPos !== void 0) return false;
|
|
217
|
+
if (filter.tag !== void 0 && control.properties.tag !== filter.tag) return false;
|
|
218
|
+
if (filter.alias !== void 0 && control.properties.alias !== filter.alias) return false;
|
|
219
|
+
if (filter.id !== void 0 && control.properties.id !== filter.id) return false;
|
|
220
|
+
if (filter.sdtType !== void 0 && control.properties.sdtType !== filter.sdtType) return false;
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
function makeParagraphFromText(text) {
|
|
224
|
+
return {
|
|
225
|
+
type: "paragraph",
|
|
226
|
+
content: text.length === 0 ? [] : [{
|
|
227
|
+
type: "run",
|
|
228
|
+
content: [{
|
|
229
|
+
type: "text",
|
|
230
|
+
text
|
|
231
|
+
}]
|
|
232
|
+
}]
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function cloneBlock(block) {
|
|
236
|
+
return structuredClone(block);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Replace a control's inner content. Plain text becomes one paragraph; an
|
|
240
|
+
* explicit `BlockContent[]` is deep-cloned to preserve immutability. The
|
|
241
|
+
* `showingPlcHdr` flag is cleared so the new content is not styled as
|
|
242
|
+
* placeholder.
|
|
243
|
+
*
|
|
244
|
+
* Applies to SDTs in the main body AND inside `doc.package.footnotes` /
|
|
245
|
+
* `doc.package.endnotes`. NOTE: save-path propagation for note SDTs is a
|
|
246
|
+
* known follow-up — `repackDocxFromRaw` currently replays
|
|
247
|
+
* `word/footnotes.xml` and `word/endnotes.xml` verbatim from the source
|
|
248
|
+
* zip, so changes to note SDTs land on the in-memory model but the
|
|
249
|
+
* saved DOCX still contains the original note text. Read APIs
|
|
250
|
+
* (`findContentControls`, `getFootnoteText`) reflect the update in the
|
|
251
|
+
* same session; persisting requires extending the selective-save layer
|
|
252
|
+
* to re-serialize note parts.
|
|
253
|
+
*/
|
|
254
|
+
function setContentControlContent(doc, filter, input, options = {}) {
|
|
255
|
+
const match = (control) => {
|
|
256
|
+
if (!controlMatchesFilter(control, filter)) return;
|
|
257
|
+
ensureContentNotLocked(control, options.force);
|
|
258
|
+
const { strippedRawPropertiesXml } = ensureContentNotBound(control, options.force);
|
|
259
|
+
const blocks = typeof input === "string" ? [makeParagraphFromText(input)] : input.map(cloneBlock);
|
|
260
|
+
const properties = { ...control.properties };
|
|
261
|
+
properties.showingPlaceholder = false;
|
|
262
|
+
if (strippedRawPropertiesXml !== void 0) properties.rawPropertiesXml = strippedRawPropertiesXml;
|
|
263
|
+
return {
|
|
264
|
+
...control,
|
|
265
|
+
properties,
|
|
266
|
+
content: blocks
|
|
267
|
+
};
|
|
268
|
+
};
|
|
269
|
+
return withUpdatedBodyAndNotes(doc, transformBlocks(doc.package.document.content, match), applyMatchToNotes(doc, match));
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Set a structured value on a typed control. Dropdown / checkbox / date
|
|
273
|
+
* each get their own input shape so the input is type-checked at the
|
|
274
|
+
* call site.
|
|
275
|
+
*/
|
|
276
|
+
function setContentControlValue(doc, filter, input, options = {}) {
|
|
277
|
+
const match = (control) => {
|
|
278
|
+
if (!controlMatchesFilter(control, filter)) return;
|
|
279
|
+
ensureContentNotLocked(control, options.force);
|
|
280
|
+
const { strippedRawPropertiesXml } = ensureContentNotBound(control, options.force);
|
|
281
|
+
const sdtType = control.properties.sdtType;
|
|
282
|
+
if (input.kind === "dropdown") {
|
|
283
|
+
if (sdtType !== "dropdown" && sdtType !== "comboBox") throw new ContentControlTypeError({
|
|
284
|
+
message: `Cannot set dropdown value on a ${sdtType} control.`,
|
|
285
|
+
sdtType,
|
|
286
|
+
reason: "kind=dropdown requires sdtType=dropdown|comboBox",
|
|
287
|
+
...control.properties.tag !== void 0 ? { tag: control.properties.tag } : {},
|
|
288
|
+
...control.properties.alias !== void 0 ? { alias: control.properties.alias } : {}
|
|
289
|
+
});
|
|
290
|
+
const item = (control.properties.listItems ?? []).find((i) => i.value === input.value);
|
|
291
|
+
if (!item && !options.force) throw new ContentControlTypeError({
|
|
292
|
+
message: `Value "${input.value}" not in the control's list items.`,
|
|
293
|
+
sdtType,
|
|
294
|
+
reason: "value not in listItems",
|
|
295
|
+
...control.properties.tag !== void 0 ? { tag: control.properties.tag } : {},
|
|
296
|
+
...control.properties.alias !== void 0 ? { alias: control.properties.alias } : {}
|
|
297
|
+
});
|
|
298
|
+
const display = item?.displayText ?? input.value;
|
|
299
|
+
return {
|
|
300
|
+
...control,
|
|
301
|
+
properties: {
|
|
302
|
+
...control.properties,
|
|
303
|
+
dropdownLastValue: input.value,
|
|
304
|
+
showingPlaceholder: false,
|
|
305
|
+
...strippedRawPropertiesXml !== void 0 ? { rawPropertiesXml: strippedRawPropertiesXml } : {}
|
|
306
|
+
},
|
|
307
|
+
content: [makeParagraphFromText(display)]
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
if (input.kind === "checkbox") {
|
|
311
|
+
if (sdtType !== "checkbox") throw new ContentControlTypeError({
|
|
312
|
+
message: `Cannot toggle checkbox on a ${sdtType} control.`,
|
|
313
|
+
sdtType,
|
|
314
|
+
reason: "kind=checkbox requires sdtType=checkbox",
|
|
315
|
+
...control.properties.tag !== void 0 ? { tag: control.properties.tag } : {},
|
|
316
|
+
...control.properties.alias !== void 0 ? { alias: control.properties.alias } : {}
|
|
317
|
+
});
|
|
318
|
+
const glyph = input.checked ? "☒" : "☐";
|
|
319
|
+
return {
|
|
320
|
+
...control,
|
|
321
|
+
properties: {
|
|
322
|
+
...control.properties,
|
|
323
|
+
checked: input.checked,
|
|
324
|
+
showingPlaceholder: false,
|
|
325
|
+
...strippedRawPropertiesXml !== void 0 ? { rawPropertiesXml: strippedRawPropertiesXml } : {}
|
|
326
|
+
},
|
|
327
|
+
content: [makeParagraphFromText(glyph)]
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
if (sdtType !== "date") throw new ContentControlTypeError({
|
|
331
|
+
message: `Cannot set date on a ${sdtType} control.`,
|
|
332
|
+
sdtType,
|
|
333
|
+
reason: "kind=date requires sdtType=date",
|
|
334
|
+
...control.properties.tag !== void 0 ? { tag: control.properties.tag } : {},
|
|
335
|
+
...control.properties.alias !== void 0 ? { alias: control.properties.alias } : {}
|
|
336
|
+
});
|
|
337
|
+
const display = formatDateForSdtBody(input.date, control.properties.dateFormat);
|
|
338
|
+
return {
|
|
339
|
+
...control,
|
|
340
|
+
properties: {
|
|
341
|
+
...control.properties,
|
|
342
|
+
dateValueISO: input.date,
|
|
343
|
+
showingPlaceholder: false,
|
|
344
|
+
...strippedRawPropertiesXml !== void 0 ? { rawPropertiesXml: strippedRawPropertiesXml } : {}
|
|
345
|
+
},
|
|
346
|
+
content: [makeParagraphFromText(display)]
|
|
347
|
+
};
|
|
348
|
+
};
|
|
349
|
+
return withUpdatedBodyAndNotes(doc, transformBlocks(doc.package.document.content, match), applyMatchToNotes(doc, match));
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Remove a control. With `{ keepContent: true }` the inner blocks survive
|
|
353
|
+
* in-place; otherwise the control and its children are dropped. Refuses to
|
|
354
|
+
* unwrap a `w15:repeatingSection` (would orphan w15 row items).
|
|
355
|
+
*/
|
|
356
|
+
function removeContentControl(doc, filter, options = {}) {
|
|
357
|
+
const match = (control) => {
|
|
358
|
+
if (!controlMatchesFilter(control, filter)) return;
|
|
359
|
+
ensureSdtNotLocked(control, options.force);
|
|
360
|
+
if (options.keepContent) {
|
|
361
|
+
if (isRepeatingSection(control) && !options.force) throw new ContentControlTypeError({
|
|
362
|
+
message: "Refusing to unwrap a w15:repeatingSection — would orphan its w15 row items.",
|
|
363
|
+
sdtType: control.properties.sdtType,
|
|
364
|
+
reason: "repeatingSection unwrap orphans items",
|
|
365
|
+
...control.properties.tag !== void 0 ? { tag: control.properties.tag } : {},
|
|
366
|
+
...control.properties.alias !== void 0 ? { alias: control.properties.alias } : {}
|
|
367
|
+
});
|
|
368
|
+
return control.content;
|
|
369
|
+
}
|
|
370
|
+
return null;
|
|
371
|
+
};
|
|
372
|
+
const nextContent = transformBlocks(doc.package.document.content, match);
|
|
373
|
+
if (nextContent.length === 0) nextContent.push(makeParagraphFromText(""));
|
|
374
|
+
return withUpdatedBodyAndNotes(doc, nextContent, applyMatchToNotes(doc, match));
|
|
375
|
+
}
|
|
376
|
+
//#endregion
|
|
377
|
+
export { removeContentControl, setContentControlContent, setContentControlValue };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Layout } from "../layout-engine/types.js";
|
|
2
|
+
import { FolioEditorEmitter } from "./folioEditorEvents.js";
|
|
3
|
+
import { HiddenEditorApi } from "./hiddenEditorApi.js";
|
|
4
|
+
import { LayoutRunOptions } from "./layoutScheduler.js";
|
|
5
|
+
import { EditorState } from "prosemirror-state";
|
|
6
|
+
|
|
7
|
+
//#region src/controller/folioEditor.d.ts
|
|
8
|
+
type FolioEditorDeps = {
|
|
9
|
+
getEditorApi: () => HiddenEditorApi | null;
|
|
10
|
+
getLayout: () => Layout | null;
|
|
11
|
+
runLayout: (state: EditorState, options: LayoutRunOptions) => void;
|
|
12
|
+
emitter: FolioEditorEmitter;
|
|
13
|
+
};
|
|
14
|
+
type FolioEditor = HiddenEditorApi & {
|
|
15
|
+
getLayout: () => Layout | null; /** Re-run layout for the current editor state (no-op if there is no view). */
|
|
16
|
+
relayout: () => void;
|
|
17
|
+
on: FolioEditorEmitter["on"];
|
|
18
|
+
};
|
|
19
|
+
declare const createFolioEditor: (deps: FolioEditorDeps) => FolioEditor;
|
|
20
|
+
//#endregion
|
|
21
|
+
export { FolioEditor, FolioEditorDeps, createFolioEditor };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/controller/folioEditor.ts
|
|
2
|
+
const createFolioEditor = (deps) => ({
|
|
3
|
+
ensureView: () => deps.getEditorApi()?.ensureView(),
|
|
4
|
+
isViewRequested: () => deps.getEditorApi()?.isViewRequested() ?? false,
|
|
5
|
+
getState: () => deps.getEditorApi()?.getState() ?? null,
|
|
6
|
+
getView: () => deps.getEditorApi()?.getView() ?? null,
|
|
7
|
+
getDocument: () => deps.getEditorApi()?.getDocument() ?? null,
|
|
8
|
+
focus: () => deps.getEditorApi()?.focus(),
|
|
9
|
+
blur: () => deps.getEditorApi()?.blur(),
|
|
10
|
+
isFocused: () => deps.getEditorApi()?.isFocused() ?? false,
|
|
11
|
+
dispatch: (tr) => deps.getEditorApi()?.dispatch(tr),
|
|
12
|
+
executeCommand: (command) => deps.getEditorApi()?.executeCommand(command) ?? false,
|
|
13
|
+
undo: () => deps.getEditorApi()?.undo() ?? false,
|
|
14
|
+
redo: () => deps.getEditorApi()?.redo() ?? false,
|
|
15
|
+
canUndo: () => deps.getEditorApi()?.canUndo() ?? false,
|
|
16
|
+
canRedo: () => deps.getEditorApi()?.canRedo() ?? false,
|
|
17
|
+
setSelection: (anchor, head) => deps.getEditorApi()?.setSelection(anchor, head),
|
|
18
|
+
setNodeSelection: (pos) => deps.getEditorApi()?.setNodeSelection(pos),
|
|
19
|
+
setCellSelection: (anchorCellPos, headCellPos) => deps.getEditorApi()?.setCellSelection(anchorCellPos, headCellPos),
|
|
20
|
+
scrollToSelection: () => deps.getEditorApi()?.scrollToSelection(),
|
|
21
|
+
getLayout: () => deps.getLayout(),
|
|
22
|
+
relayout: () => {
|
|
23
|
+
const state = deps.getEditorApi()?.getState();
|
|
24
|
+
if (state) deps.runLayout(state, { reason: "manual" });
|
|
25
|
+
},
|
|
26
|
+
on: (event, listener) => deps.emitter.on(event, listener)
|
|
27
|
+
});
|
|
28
|
+
//#endregion
|
|
29
|
+
export { createFolioEditor };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { document_d_exports } from "../types/document.js";
|
|
2
|
+
import { Layout } from "../layout-engine/types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/controller/folioEditorEvents.d.ts
|
|
5
|
+
type FolioSelectionEvent = {
|
|
6
|
+
from: number;
|
|
7
|
+
to: number;
|
|
8
|
+
};
|
|
9
|
+
type FolioEditorEventMap = {
|
|
10
|
+
selectionChange: FolioSelectionEvent;
|
|
11
|
+
docChange: document_d_exports.Document;
|
|
12
|
+
layoutComplete: Layout;
|
|
13
|
+
};
|
|
14
|
+
type FolioEditorEventName = keyof FolioEditorEventMap;
|
|
15
|
+
type FolioEditorEventListener<K extends FolioEditorEventName> = (payload: FolioEditorEventMap[K]) => void;
|
|
16
|
+
type FolioEditorEmitter = {
|
|
17
|
+
/** Subscribe to an event. Returns an unsubscribe function. */on: <K extends FolioEditorEventName>(event: K, listener: FolioEditorEventListener<K>) => () => void; /** Emit an event to all current listeners. */
|
|
18
|
+
emit: <K extends FolioEditorEventName>(event: K, payload: FolioEditorEventMap[K]) => void; /** Drop all listeners (call on controller teardown). */
|
|
19
|
+
clear: () => void;
|
|
20
|
+
};
|
|
21
|
+
declare const createFolioEditorEmitter: () => FolioEditorEmitter;
|
|
22
|
+
//#endregion
|
|
23
|
+
export { FolioEditorEmitter, FolioEditorEventListener, FolioEditorEventMap, FolioEditorEventName, FolioSelectionEvent, createFolioEditorEmitter };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/controller/folioEditorEvents.ts
|
|
2
|
+
const createFolioEditorEmitter = () => {
|
|
3
|
+
const channels = {
|
|
4
|
+
selectionChange: /* @__PURE__ */ new Set(),
|
|
5
|
+
docChange: /* @__PURE__ */ new Set(),
|
|
6
|
+
layoutComplete: /* @__PURE__ */ new Set()
|
|
7
|
+
};
|
|
8
|
+
return {
|
|
9
|
+
on: (event, listener) => {
|
|
10
|
+
channels[event].add(listener);
|
|
11
|
+
return () => {
|
|
12
|
+
channels[event].delete(listener);
|
|
13
|
+
};
|
|
14
|
+
},
|
|
15
|
+
emit: (event, payload) => {
|
|
16
|
+
for (const listener of [...channels[event]]) listener(payload);
|
|
17
|
+
},
|
|
18
|
+
clear: () => {
|
|
19
|
+
for (const channel of Object.values(channels)) channel.clear();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { createFolioEditorEmitter };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { document_d_exports } from "../types/document.js";
|
|
2
|
+
import { Command, EditorState, Transaction } from "prosemirror-state";
|
|
3
|
+
import { EditorView } from "prosemirror-view";
|
|
4
|
+
|
|
5
|
+
//#region src/controller/hiddenEditorApi.d.ts
|
|
6
|
+
type HiddenEditorApi = {
|
|
7
|
+
/** Request the off-screen EditorView (idempotent; creates it when possible). */ensureView: () => void; /** Whether view creation has been requested. */
|
|
8
|
+
isViewRequested: () => boolean; /** Get the ProseMirror EditorState */
|
|
9
|
+
getState: () => EditorState | null; /** Get the ProseMirror EditorView */
|
|
10
|
+
getView: () => EditorView | null; /** Get the current Document from PM state */
|
|
11
|
+
getDocument: () => document_d_exports.Document | null; /** Focus the hidden editor */
|
|
12
|
+
focus: () => void; /** Blur the hidden editor */
|
|
13
|
+
blur: () => void; /** Check if focused */
|
|
14
|
+
isFocused: () => boolean; /** Dispatch a transaction */
|
|
15
|
+
dispatch: (tr: Transaction) => void; /** Execute a ProseMirror command */
|
|
16
|
+
executeCommand: (command: Command) => boolean; /** Undo */
|
|
17
|
+
undo: () => boolean; /** Redo */
|
|
18
|
+
redo: () => boolean; /** Check if undo is available */
|
|
19
|
+
canUndo: () => boolean; /** Check if redo is available */
|
|
20
|
+
canRedo: () => boolean; /** Set selection by PM position */
|
|
21
|
+
setSelection: (anchor: number, head?: number) => void; /** Set node selection at a PM position (for images, etc.) */
|
|
22
|
+
setNodeSelection: (pos: number) => void; /** Set cell selection between two positions inside table cells */
|
|
23
|
+
setCellSelection: (anchorCellPos: number, headCellPos: number) => void; /** Scroll the PM view to selection (no-op since hidden) */
|
|
24
|
+
scrollToSelection: () => void;
|
|
25
|
+
};
|
|
26
|
+
type HiddenEditorApiDeps = {
|
|
27
|
+
getView: () => EditorView | null;
|
|
28
|
+
getDocumentContext: () => document_d_exports.Document | null;
|
|
29
|
+
isDestroying: () => boolean;
|
|
30
|
+
ensureView: () => void;
|
|
31
|
+
isViewRequested: () => boolean;
|
|
32
|
+
};
|
|
33
|
+
declare const createHiddenEditorApi: (deps: HiddenEditorApiDeps) => HiddenEditorApi;
|
|
34
|
+
//#endregion
|
|
35
|
+
export { HiddenEditorApi, HiddenEditorApiDeps, createHiddenEditorApi };
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { fromProseDoc } from "../prosemirror/conversion/fromProseDoc.js";
|
|
2
|
+
import { NodeSelection, Selection, TextSelection } from "prosemirror-state";
|
|
3
|
+
import { redo, undo } from "prosemirror-history";
|
|
4
|
+
import { CellSelection } from "prosemirror-tables";
|
|
5
|
+
//#region src/controller/hiddenEditorApi.ts
|
|
6
|
+
/**
|
|
7
|
+
* Hidden-editor imperative API
|
|
8
|
+
*
|
|
9
|
+
* Framework-agnostic method surface for the off-screen ProseMirror editor.
|
|
10
|
+
* Operates on an injected view accessor plus the document context and
|
|
11
|
+
* destruction guard, so the same imperative handle can be driven from the
|
|
12
|
+
* React component or a headless controller without depending on React.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Convert PM state to Document
|
|
16
|
+
*/
|
|
17
|
+
const stateToDocument = (state, originalDoc) => {
|
|
18
|
+
if (!originalDoc) return null;
|
|
19
|
+
return fromProseDoc(state.doc, originalDoc);
|
|
20
|
+
};
|
|
21
|
+
const createHiddenEditorApi = (deps) => {
|
|
22
|
+
const dispatchTr = (view, tr) => {
|
|
23
|
+
if (!deps.isDestroying()) view.dispatch(tr);
|
|
24
|
+
};
|
|
25
|
+
const setSelection = (anchor, head) => {
|
|
26
|
+
const view = deps.getView();
|
|
27
|
+
if (!view) return;
|
|
28
|
+
const { state } = view;
|
|
29
|
+
const docEnd = state.doc.content.size;
|
|
30
|
+
const clampedAnchor = Math.max(0, Math.min(anchor, docEnd));
|
|
31
|
+
const clampedHead = head === void 0 ? clampedAnchor : Math.max(0, Math.min(head, docEnd));
|
|
32
|
+
const $anchor = state.doc.resolve(clampedAnchor);
|
|
33
|
+
const $head = state.doc.resolve(clampedHead);
|
|
34
|
+
const selection = head === void 0 ? Selection.near($anchor) : TextSelection.between($anchor, $head);
|
|
35
|
+
dispatchTr(view, state.tr.setSelection(selection));
|
|
36
|
+
};
|
|
37
|
+
return {
|
|
38
|
+
ensureView: deps.ensureView,
|
|
39
|
+
isViewRequested: deps.isViewRequested,
|
|
40
|
+
getState: () => deps.getView()?.state ?? null,
|
|
41
|
+
getView: () => deps.getView() ?? null,
|
|
42
|
+
getDocument: () => {
|
|
43
|
+
const view = deps.getView();
|
|
44
|
+
if (!view) return null;
|
|
45
|
+
return stateToDocument(view.state, deps.getDocumentContext());
|
|
46
|
+
},
|
|
47
|
+
focus: () => {
|
|
48
|
+
deps.getView()?.focus();
|
|
49
|
+
},
|
|
50
|
+
blur: () => {
|
|
51
|
+
const view = deps.getView();
|
|
52
|
+
const dom = view?.dom;
|
|
53
|
+
if (view?.hasFocus() && dom instanceof HTMLElement) dom.blur();
|
|
54
|
+
},
|
|
55
|
+
isFocused: () => deps.getView()?.hasFocus() ?? false,
|
|
56
|
+
dispatch: (tr) => {
|
|
57
|
+
const view = deps.getView();
|
|
58
|
+
if (view) dispatchTr(view, tr);
|
|
59
|
+
},
|
|
60
|
+
executeCommand: (command) => {
|
|
61
|
+
const view = deps.getView();
|
|
62
|
+
if (!view) return false;
|
|
63
|
+
return command(view.state, (tr) => dispatchTr(view, tr), view);
|
|
64
|
+
},
|
|
65
|
+
undo: () => {
|
|
66
|
+
const view = deps.getView();
|
|
67
|
+
if (!view) return false;
|
|
68
|
+
return undo(view.state, (tr) => dispatchTr(view, tr));
|
|
69
|
+
},
|
|
70
|
+
redo: () => {
|
|
71
|
+
const view = deps.getView();
|
|
72
|
+
if (!view) return false;
|
|
73
|
+
return redo(view.state, (tr) => dispatchTr(view, tr));
|
|
74
|
+
},
|
|
75
|
+
canUndo: () => {
|
|
76
|
+
const view = deps.getView();
|
|
77
|
+
if (!view) return false;
|
|
78
|
+
return undo(view.state);
|
|
79
|
+
},
|
|
80
|
+
canRedo: () => {
|
|
81
|
+
const view = deps.getView();
|
|
82
|
+
if (!view) return false;
|
|
83
|
+
return redo(view.state);
|
|
84
|
+
},
|
|
85
|
+
setSelection,
|
|
86
|
+
setNodeSelection: (pos) => {
|
|
87
|
+
const view = deps.getView();
|
|
88
|
+
if (!view) return;
|
|
89
|
+
const { state } = view;
|
|
90
|
+
try {
|
|
91
|
+
const selection = NodeSelection.create(state.doc, pos);
|
|
92
|
+
dispatchTr(view, state.tr.setSelection(selection));
|
|
93
|
+
} catch {
|
|
94
|
+
setSelection(pos);
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
setCellSelection: (anchorCellPos, headCellPos) => {
|
|
98
|
+
const view = deps.getView();
|
|
99
|
+
if (!view) return;
|
|
100
|
+
const { state } = view;
|
|
101
|
+
try {
|
|
102
|
+
const cellSel = CellSelection.create(state.doc, anchorCellPos, headCellPos);
|
|
103
|
+
dispatchTr(view, state.tr.setSelection(cellSel));
|
|
104
|
+
} catch {
|
|
105
|
+
setSelection(anchorCellPos, headCellPos);
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
scrollToSelection: () => {}
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
//#endregion
|
|
112
|
+
export { createHiddenEditorApi };
|