edytor 1.0.0-rc.3 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -39
- package/dist/block/block.svelte.d.ts +11 -84
- package/dist/block/block.svelte.js +30 -134
- package/dist/block/colors.d.ts +0 -9
- package/dist/block/colors.js +1 -18
- package/dist/block/contentRange.d.ts +5 -1
- package/dist/block/contentRange.js +15 -16
- package/dist/block/inlineBlock.svelte.d.ts +11 -9
- package/dist/block/inlineBlock.svelte.js +18 -21
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.js +7 -7
- package/dist/clipboard/insertClipboardFragment.js +5 -4
- package/dist/clipboard/moveText.js +16 -8
- package/dist/clipboard/serializeClipboardFragment.d.ts +2 -0
- package/dist/clipboard/serializeClipboardFragment.js +32 -28
- package/dist/cloudflare/DocumentRoom.d.ts +4 -17
- package/dist/cloudflare/DocumentRoom.js +3 -5
- package/dist/cloudflare/move.d.ts +1 -18
- package/dist/cloudflare/move.js +2 -48
- package/dist/cloudflare/room/admission.d.ts +1 -60
- package/dist/cloudflare/room/admission.js +25 -29
- package/dist/cloudflare/room/comments.d.ts +1 -3
- package/dist/cloudflare/room/comments.js +6 -6
- package/dist/cloudflare/room/context.d.ts +25 -82
- package/dist/cloudflare/room/context.js +8 -8
- package/dist/cloudflare/room/forged.d.ts +1 -1
- package/dist/cloudflare/room/forged.js +2 -12
- package/dist/cloudflare/room/frames.d.ts +1 -1
- package/dist/cloudflare/room/frames.js +1 -1
- package/dist/cloudflare/room/history.d.ts +1 -25
- package/dist/cloudflare/room/history.js +39 -54
- package/dist/cloudflare/room/moves.d.ts +1 -13
- package/dist/cloudflare/room/moves.js +33 -57
- package/dist/cloudflare/room/presence.d.ts +1 -11
- package/dist/cloudflare/room/presence.js +4 -4
- package/dist/cloudflare/room/purge.d.ts +1 -2
- package/dist/cloudflare/room/purge.js +2 -2
- package/dist/cloudflare/room/replicas.d.ts +1 -7
- package/dist/cloudflare/room/replicas.js +2 -2
- package/dist/cloudflare/room/storage.d.ts +3 -32
- package/dist/cloudflare/room/storage.js +33 -108
- package/dist/cloudflare/room/updates.d.ts +4 -4
- package/dist/cloudflare/room/updates.js +17 -24
- package/dist/cloudflare/room/validation.d.ts +1 -5
- package/dist/cloudflare/room/validation.js +16 -37
- package/dist/collaboration/RemoteSelections.svelte +13 -17
- package/dist/collaboration/awarenessSelection.d.ts +22 -1
- package/dist/collaboration/awarenessSelection.js +42 -0
- package/dist/collaboration/comments/client.d.ts +2 -2
- package/dist/collaboration/comments/client.js +1 -1
- package/dist/collaboration/history/index.d.ts +5 -5
- package/dist/collaboration/history/index.js +5 -5
- package/dist/collaboration/history/panel.svelte.d.ts +91 -0
- package/dist/collaboration/history/panel.svelte.js +223 -0
- package/dist/collaboration/providers.d.ts +12 -3
- package/dist/collaboration/providers.js +5 -4
- package/dist/components/Block.svelte +42 -56
- package/dist/components/Block.svelte.d.ts +7 -5
- package/dist/components/Content.svelte +1 -5
- package/dist/components/Edytor.svelte +82 -99
- package/dist/components/Edytor.svelte.d.ts +16 -13
- package/dist/components/InlineBlock.svelte +1 -1
- package/dist/components/Ranges.svelte +96 -0
- package/dist/components/Ranges.svelte.d.ts +19 -0
- package/dist/components/Suggestion.svelte +3 -2
- package/dist/components/Text.svelte +2 -5
- package/dist/components/Text.svelte.d.ts +1 -1
- package/dist/crdt/admission.d.ts +2 -9
- package/dist/crdt/admission.js +3 -9
- package/dist/crdt/attribution/attribution.d.ts +11 -72
- package/dist/crdt/attribution/attribution.js +5 -52
- package/dist/crdt/attribution/block.d.ts +0 -78
- package/dist/crdt/attribution/block.js +1 -144
- package/dist/crdt/data.d.ts +18 -13
- package/dist/crdt/data.js +49 -71
- package/dist/crdt/doc/anchors.js +4 -4
- package/dist/crdt/doc/content.d.ts +5 -1
- package/dist/crdt/doc/content.js +3 -1
- package/dist/crdt/doc/delete.d.ts +1 -0
- package/dist/crdt/doc/funnel.d.ts +0 -23
- package/dist/crdt/doc/funnel.js +34 -85
- package/dist/crdt/doc/gate.d.ts +8 -9
- package/dist/crdt/doc/gate.js +7 -17
- package/dist/crdt/doc/history.d.ts +87 -14
- package/dist/crdt/doc/history.js +334 -149
- package/dist/crdt/doc/layout.d.ts +0 -1
- package/dist/crdt/doc/layout.js +2 -3
- package/dist/crdt/doc/meta.d.ts +4 -4
- package/dist/crdt/doc/meta.js +10 -21
- package/dist/crdt/doc/moves.d.ts +4 -4
- package/dist/crdt/doc/moves.js +5 -5
- package/dist/crdt/doc/plan.d.ts +2 -0
- package/dist/crdt/doc/plan.js +2 -0
- package/dist/crdt/doc/reads.d.ts +8 -5
- package/dist/crdt/doc/reads.js +49 -50
- package/dist/crdt/doc/seed.d.ts +15 -6
- package/dist/crdt/doc/seed.js +27 -26
- package/dist/crdt/doc/split-merge.d.ts +1 -3
- package/dist/crdt/doc/split-merge.js +4 -5
- package/dist/crdt/doc/steps.d.ts +3 -7
- package/dist/crdt/doc/steps.js +20 -9
- package/dist/crdt/doc/types.d.ts +0 -10
- package/dist/crdt/document.d.ts +32 -115
- package/dist/crdt/document.js +216 -302
- package/dist/crdt/edytor-doc.d.ts +689 -90
- package/dist/crdt/edytor-doc.js +74 -149
- package/dist/crdt/engine-api.d.ts +15 -47
- package/dist/crdt/engine.d.ts +7 -17
- package/dist/crdt/engine.js +9 -19
- package/dist/crdt/flow.d.ts +9 -37
- package/dist/crdt/flow.js +260 -238
- package/dist/crdt/index.d.ts +32 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +8 -17
- package/dist/crdt/placement/display.d.ts +0 -2
- package/dist/crdt/placement/display.js +0 -15
- package/dist/crdt/placement/model.d.ts +160 -12
- package/dist/crdt/placement/model.js +413 -414
- package/dist/crdt/placement/rank.d.ts +1 -5
- package/dist/crdt/placement/rank.js +28 -38
- package/dist/crdt/props.d.ts +32 -0
- package/dist/crdt/props.js +172 -0
- package/dist/crdt/protocol.d.ts +4 -5
- package/dist/crdt/protocol.js +3 -4
- package/dist/crdt/protocols/awareness.d.ts +3 -7
- package/dist/crdt/protocols/awareness.js +17 -33
- package/dist/crdt/protocols/envelope.d.ts +9 -29
- package/dist/crdt/protocols/envelope.js +8 -25
- package/dist/crdt/protocols/sync.d.ts +15 -30
- package/dist/crdt/protocols/sync.js +27 -89
- package/dist/crdt/providers/bound.d.ts +3 -1
- package/dist/crdt/providers/bound.js +3 -1
- package/dist/crdt/providers/container.d.ts +11 -17
- package/dist/crdt/providers/container.js +39 -27
- package/dist/crdt/providers/index.d.ts +34 -6
- package/dist/crdt/providers/index.js +106 -111
- package/dist/crdt/providers/indexeddb.d.ts +2 -12
- package/dist/crdt/providers/indexeddb.js +29 -90
- package/dist/crdt/providers/room.d.ts +58 -2
- package/dist/crdt/providers/room.js +38 -21
- package/dist/crdt/providers/websocket.d.ts +1 -1
- package/dist/crdt/providers/websocket.js +3 -4
- package/dist/crdt/purge.d.ts +2 -2
- package/dist/crdt/purge.js +69 -6
- package/dist/crdt/rangeDelete.d.ts +4 -42
- package/dist/crdt/rangeDelete.js +7 -6
- package/dist/crdt/restore.d.ts +21 -1
- package/dist/crdt/restore.js +54 -59
- package/dist/crdt/schema.d.ts +2 -2
- package/dist/crdt/schema.js +4 -5
- package/dist/crdt/semantics.d.ts +10 -15
- package/dist/crdt/semantics.js +22 -21
- package/dist/crdt/storage.d.ts +7 -13
- package/dist/crdt/storage.js +10 -24
- package/dist/crdt/structs.d.ts +42 -47
- package/dist/crdt/structs.js +76 -67
- package/dist/crdt/tables.d.ts +9 -0
- package/dist/crdt/tables.js +20 -0
- package/dist/crdt/text/delete-index.d.ts +0 -13
- package/dist/crdt/text/delete-index.js +7 -14
- package/dist/crdt/text/deletes.d.ts +9 -22
- package/dist/crdt/text/deletes.js +11 -74
- package/dist/crdt/text/index/cache.js +3 -3
- package/dist/crdt/text/index/fold.d.ts +1 -2
- package/dist/crdt/text/index/fold.js +15 -10
- package/dist/crdt/text/index/layout.d.ts +0 -10
- package/dist/crdt/text/index/layout.js +6 -20
- package/dist/crdt/text/index/records.js +2 -1
- package/dist/crdt/text/index/report.js +5 -6
- package/dist/crdt/text/index/shared.d.ts +11 -4
- package/dist/crdt/text/index/shared.js +8 -7
- package/dist/crdt/text/index/state.d.ts +3 -33
- package/dist/crdt/text/index/state.js +2 -4
- package/dist/crdt/text/model.d.ts +82 -2
- package/dist/crdt/text/model.js +344 -354
- package/dist/crdt/text/rows.d.ts +0 -2
- package/dist/crdt/text/rows.js +0 -11
- package/dist/crdt/text/runs.d.ts +6 -3
- package/dist/crdt/text/runs.js +132 -137
- package/dist/crdt/text/streams.d.ts +1 -1
- package/dist/crdt/text/streams.js +1 -1
- package/dist/crdt/vendor/yjs/API-NOTES.md +25 -8
- package/dist/crdt/vendor/yjs/UPSTREAM.md +288 -8
- package/dist/crdt/vendor/yjs/dts/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/dts/index.d.ts +10 -15
- package/dist/crdt/vendor/yjs/dts/structs/AbstractStruct.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/structs/Item.d.ts +14 -219
- package/dist/crdt/vendor/yjs/dts/structs/Skip.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/BlockSet.d.ts +2 -2
- package/dist/crdt/vendor/yjs/dts/utils/Doc.d.ts +12 -123
- package/dist/crdt/vendor/yjs/dts/utils/ID.d.ts +1 -1
- package/dist/crdt/vendor/yjs/dts/utils/RangeCursor.d.ts +37 -58
- package/dist/crdt/vendor/yjs/dts/utils/Transaction.d.ts +3 -78
- package/dist/crdt/vendor/yjs/dts/utils/UpdateDecoder.d.ts +2 -81
- package/dist/crdt/vendor/yjs/dts/utils/UpdateEncoder.d.ts +2 -74
- package/dist/crdt/vendor/yjs/dts/utils/encoding-helpers.d.ts +4 -4
- package/dist/crdt/vendor/yjs/dts/utils/encoding.d.ts +6 -18
- package/dist/crdt/vendor/yjs/dts/utils/ids.d.ts +12 -237
- package/dist/crdt/vendor/yjs/dts/utils/positions.d.ts +5 -0
- package/dist/crdt/vendor/yjs/dts/utils/redo.d.ts +3 -0
- package/dist/crdt/vendor/yjs/dts/utils/transaction-helpers.d.ts +1 -3
- package/dist/crdt/vendor/yjs/dts/utils/updates.d.ts +6 -23
- package/dist/crdt/vendor/yjs/dts/ynode.d.ts +73 -498
- package/dist/crdt/vendor/yjs/global.d.ts +5 -26
- package/dist/crdt/vendor/yjs/src/index.js +11 -25
- package/dist/crdt/vendor/yjs/src/structs/AbstractStruct.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/GC.js +1 -1
- package/dist/crdt/vendor/yjs/src/structs/Item.js +10 -372
- package/dist/crdt/vendor/yjs/src/structs/Skip.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/BlockSet.js +2 -2
- package/dist/crdt/vendor/yjs/src/utils/Doc.js +14 -170
- package/dist/crdt/vendor/yjs/src/utils/ID.js +1 -1
- package/dist/crdt/vendor/yjs/src/utils/RangeCursor.js +61 -128
- package/dist/crdt/vendor/yjs/src/utils/StructStore.js +0 -22
- package/dist/crdt/vendor/yjs/src/utils/Transaction.js +17 -282
- package/dist/crdt/vendor/yjs/src/utils/UpdateDecoder.js +3 -130
- package/dist/crdt/vendor/yjs/src/utils/UpdateEncoder.js +2 -132
- package/dist/crdt/vendor/yjs/src/utils/encoding-helpers.js +4 -4
- package/dist/crdt/vendor/yjs/src/utils/encoding.js +49 -146
- package/dist/crdt/vendor/yjs/src/utils/ids.js +23 -900
- package/dist/crdt/vendor/yjs/src/utils/positions.js +115 -0
- package/dist/crdt/vendor/yjs/src/utils/redo.js +143 -0
- package/dist/crdt/vendor/yjs/src/utils/transaction-helpers.js +10 -127
- package/dist/crdt/vendor/yjs/src/utils/updates.js +7 -50
- package/dist/crdt/vendor/yjs/src/ynode.js +261 -2226
- package/dist/dnd/autoScroll.js +1 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.d.ts +2 -2
- package/dist/{plugins/blockHandles → dnd}/dropIndicator.js +52 -60
- package/dist/{plugins/blockHandles → dnd}/geometry.d.ts +4 -3
- package/dist/{plugins/blockHandles → dnd}/geometry.js +6 -6
- package/dist/dnd/placement.d.ts +200 -0
- package/dist/dnd/placement.js +426 -0
- package/dist/dnd/pragmatic.d.ts +4 -22
- package/dist/dnd/pragmatic.js +7 -26
- package/dist/dnd/track.d.ts +14 -0
- package/dist/dnd/track.js +55 -0
- package/dist/dnd/vendor/pragmatic/UPSTREAM.md +103 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind-all.js +46 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/bind.js +7 -0
- package/dist/dnd/vendor/pragmatic/bind-event-listener/index.js +2 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter-native-data-key.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.d.ts +57 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/adapter/element-adapter.js +306 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.d.ts +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/adapter.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/element/set-custom-native-drag-preview.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/entry-point/types.d.ts +1 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/get-element-from-point-without-honey-pot.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/honey-pot-data-attribute.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/is-honey-pot-element.js +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/honey-pot-fix/make-honey-pot-fix.js +333 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/internal-types.d.ts +350 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/dispatch-consumer-event.js +128 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/lifecycle-manager.js +340 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/ledger/usage-ledger.js +32 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-adapter.js +59 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-drop-target.js +288 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/make-adapter/make-monitor.js +85 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/combine.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.d.ts +36 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/set-custom-native-drag-preview.js +153 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/element/custom-native-drag-preview/types.d.ts +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/public-utils/once.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/add-attribute.js +7 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/android.js +10 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/count-events-for-safari.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-from-another-window.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window-in-safari.js +12 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/changing-window/is-leaving-window.js +55 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/detect-broken-drag.js +48 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/get-input.js +14 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-firefox.js +13 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/is-safari.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/max-z-index.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/text-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/media-types/url-media-type.js +6 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/popover-reset-styles.js +40 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop/util/supports-popover.js +16 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/LICENSE.md +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.d.ts +4 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/entry-point/element.js +8 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/internal-types.d.ts +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/data-attributes.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/get-scroll-by.js +117 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/make-api.js +90 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/over-element/try-scroll.js +183 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/axis.js +22 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/can-scroll-on-edge.js +17 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/configuration.js +49 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/edges.js +9 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/engagement-history.js +43 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-over-element-hitbox.js +50 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-percentage-in-range.js +19 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/get-scroll-change.js +106 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-axis-allowed.js +3 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/is-within.js +11 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/scheduler.js +104 -0
- package/dist/dnd/vendor/pragmatic/pragmatic-drag-and-drop-auto-scroll/shared/side.js +6 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/LICENSE +21 -0
- package/dist/dnd/vendor/pragmatic/raf-schd/raf-schd.esm.js +34 -0
- package/dist/edytor.svelte.d.ts +46 -63
- package/dist/edytor.svelte.js +126 -181
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -181
- package/dist/events/beforeInputDeleteCommands.d.ts +20 -1
- package/dist/events/beforeInputDeleteCommands.js +153 -204
- package/dist/events/domTextOffset.d.ts +9 -9
- package/dist/events/domTextOffset.js +20 -48
- package/dist/events/events.utils.d.ts +0 -2
- package/dist/events/events.utils.js +0 -4
- package/dist/events/nativeInteractiveControl.d.ts +13 -13
- package/dist/events/nativeInteractiveControl.js +28 -56
- package/dist/events/onBeforeInput.d.ts +6 -1
- package/dist/events/onBeforeInput.js +207 -331
- package/dist/events/onCopy.js +1 -5
- package/dist/events/onDrop.d.ts +7 -1
- package/dist/events/onDrop.js +64 -78
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +45 -67
- package/dist/events/onInput.d.ts +8 -4
- package/dist/events/onInput.js +34 -147
- package/dist/events/onKeyDown.js +55 -122
- package/dist/events/onPaste.d.ts +14 -1
- package/dist/events/onPaste.js +51 -76
- package/dist/index.d.ts +11 -15
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +83 -320
- package/dist/labels.js +181 -408
- package/dist/plugins/Chrome.svelte +29 -0
- package/dist/plugins/Chrome.svelte.d.ts +32 -0
- package/dist/plugins/Control.svelte +23 -0
- package/dist/plugins/Control.svelte.d.ts +30 -0
- package/dist/plugins/anchored.svelte.d.ts +47 -0
- package/dist/plugins/anchored.svelte.js +73 -0
- package/dist/plugins/arrowMove/arrowMove.d.ts +2 -1
- package/dist/plugins/arrowMove/arrowMove.js +9 -5
- package/dist/plugins/bands.svelte.d.ts +57 -0
- package/dist/plugins/bands.svelte.js +95 -0
- package/dist/plugins/blockHandles/BlockHandle.svelte +14 -154
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +21 -196
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +158 -573
- package/dist/plugins/blockHandles/BlockHandles.svelte +15 -23
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +25 -39
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -185
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +18 -16
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +28 -38
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +116 -183
- package/dist/plugins/blockMenu/blockMenuPlugin.d.ts +1 -3
- package/dist/plugins/blockMenu/blockMenuPlugin.js +12 -29
- package/dist/plugins/brand.d.ts +8 -0
- package/dist/plugins/brand.js +8 -0
- package/dist/plugins/chrome.d.ts +45 -38
- package/dist/plugins/chrome.js +59 -36
- package/dist/plugins/code/CodeHeader.svelte +8 -38
- package/dist/plugins/code/CodePlugin.svelte +53 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +16 -125
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +2 -1
- package/dist/plugins/code/code.css +5 -117
- package/dist/plugins/code/header.svelte.d.ts +2 -11
- package/dist/plugins/code/header.svelte.js +11 -38
- package/dist/plugins/code/languageMenu.svelte.d.ts +12 -32
- package/dist/plugins/code/languageMenu.svelte.js +30 -160
- package/dist/plugins/code/languages.d.ts +9 -22
- package/dist/plugins/code/languages.js +39 -128
- package/dist/plugins/columns/ColumnResize.svelte +16 -27
- package/dist/plugins/columns/ColumnResize.svelte.d.ts +1 -1
- package/dist/plugins/columns/ColumnsPlugin.svelte +46 -78
- package/dist/plugins/columns/ColumnsPlugin.svelte.d.ts +0 -12
- package/dist/plugins/columns/columns.css +7 -26
- package/dist/plugins/columns/gaps.d.ts +7 -5
- package/dist/plugins/columns/gaps.js +11 -6
- package/dist/plugins/columns/resize.svelte.d.ts +17 -54
- package/dist/plugins/columns/resize.svelte.js +80 -173
- package/dist/plugins/comments/CommentsController.svelte.d.ts +1 -4
- package/dist/plugins/comments/CommentsController.svelte.js +14 -25
- package/dist/plugins/comments/CommentsSidebar.svelte +82 -431
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +4 -2
- package/dist/plugins/comments/commentsPlugin.d.ts +25 -9
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +16 -130
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +1 -2
- package/dist/plugins/equation/EquationPlugin.svelte +109 -172
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +3 -2
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.css +7 -0
- package/dist/plugins/equation/equation.svelte.d.ts +37 -24
- package/dist/plugins/equation/equation.svelte.js +20 -94
- package/dist/plugins/equation/katex.js +6 -9
- package/dist/plugins/fileDrop.d.ts +28 -0
- package/dist/plugins/fileDrop.js +116 -0
- package/dist/plugins/find/FindController.svelte.d.ts +8 -13
- package/dist/plugins/find/FindController.svelte.js +34 -55
- package/dist/plugins/find/findPlugin.d.ts +4 -8
- package/dist/plugins/find/findPlugin.js +29 -9
- package/dist/plugins/image/ImageChrome.svelte +6 -167
- package/dist/plugins/image/ImageChrome.svelte.d.ts +0 -2
- package/dist/plugins/image/ImagePlugin.svelte +71 -151
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +12 -41
- package/dist/plugins/image/ImageToolbarHost.svelte +37 -0
- package/dist/plugins/image/ImageToolbarHost.svelte.d.ts +9 -0
- package/dist/plugins/image/controls.svelte.d.ts +6 -36
- package/dist/plugins/image/controls.svelte.js +43 -212
- package/dist/plugins/image/image.css +17 -0
- package/dist/plugins/image/image.d.ts +0 -5
- package/dist/plugins/image/image.js +0 -3
- package/dist/plugins/image/toolbar.svelte.d.ts +69 -0
- package/dist/plugins/image/toolbar.svelte.js +145 -0
- package/dist/plugins/index.d.ts +30 -26
- package/dist/plugins/index.js +28 -22
- package/dist/plugins/list.svelte.d.ts +128 -0
- package/dist/plugins/list.svelte.js +217 -0
- package/dist/plugins/markdownShortcuts.d.ts +1 -1
- package/dist/plugins/markdownShortcuts.js +10 -9
- package/dist/plugins/marquee/MarqueeBox.svelte +3 -20
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +1 -1
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +0 -2
- package/dist/plugins/marquee/MarqueeController.svelte.js +20 -23
- package/dist/plugins/marquee/marquee.js +4 -21
- package/dist/plugins/marquee/marqueePlugin.d.ts +4 -3
- package/dist/plugins/marquee/marqueePlugin.js +16 -15
- package/dist/plugins/media/AudioPlugin.svelte +13 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +11 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +113 -120
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +10 -15
- package/dist/plugins/media/EmbedPlugin.svelte +82 -86
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +11 -17
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +45 -113
- package/dist/plugins/media/FilePlugin.svelte.d.ts +21 -4
- package/dist/plugins/media/MediaEmpty.svelte +51 -90
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +200 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +34 -0
- package/dist/plugins/media/UploadPreview.svelte +32 -0
- package/dist/plugins/media/UploadPreview.svelte.d.ts +11 -0
- package/dist/plugins/media/VideoPlugin.svelte +14 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +12 -5
- package/dist/plugins/media/empty.svelte.d.ts +47 -46
- package/dist/plugins/media/empty.svelte.js +67 -60
- package/dist/plugins/media/media.d.ts +97 -44
- package/dist/plugins/media/media.js +77 -99
- package/dist/plugins/media/upload.css +23 -0
- package/dist/plugins/media/urlPaste.svelte.d.ts +6 -37
- package/dist/plugins/media/urlPaste.svelte.js +32 -102
- package/dist/plugins/mention/MentionPlugin.svelte +84 -126
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +17 -27
- package/dist/plugins/mention/mention.css +6 -0
- package/dist/plugins/page/PageLink.svelte +54 -38
- package/dist/plugins/page/PagePlugin.svelte +20 -18
- package/dist/plugins/page/PagePlugin.svelte.d.ts +2 -4
- package/dist/plugins/page/page.d.ts +35 -9
- package/dist/plugins/page/page.js +3 -4
- package/dist/plugins/pageLink/PageLinkPlugin.svelte +154 -109
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +19 -26
- package/dist/plugins/pageLink/pageLink.css +6 -0
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +13 -26
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +13 -20
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +174 -183
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +34 -34
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.js +2 -2
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +50 -55
- package/dist/plugins/richtext/calloutIcons.svelte.js +86 -174
- package/dist/plugins/richtext/callouts.d.ts +15 -0
- package/dist/plugins/richtext/callouts.js +23 -0
- package/dist/plugins/richtext/controls.svelte.d.ts +110 -0
- package/dist/plugins/richtext/controls.svelte.js +126 -0
- package/dist/plugins/richtext/richTextOperations.js +37 -28
- package/dist/plugins/richtext/richtext.css +6 -0
- package/dist/plugins/slashMenu/SlashMenuController.svelte.d.ts +2 -14
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +34 -71
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +9 -26
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +27 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -18
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +40 -124
- package/dist/plugins/table/TablePlugin.svelte +106 -168
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +38 -141
- package/dist/plugins/table/chrome.svelte.js +340 -589
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +16 -152
- package/dist/plugins/table/table.d.ts +15 -14
- package/dist/plugins/table/table.js +22 -16
- package/dist/plugins/toc/TableOfContents.svelte +32 -38
- package/dist/plugins/toc/TableOfContents.svelte.d.ts +1 -5
- package/dist/plugins/toc/TocPlugin.svelte +22 -22
- package/dist/plugins/toc/TocPlugin.svelte.d.ts +4 -6
- package/dist/plugins/toc/toc.d.ts +41 -10
- package/dist/plugins/toc/toc.js +2 -3
- package/dist/plugins/toolbar/ToolbarController.svelte.d.ts +4 -68
- package/dist/plugins/toolbar/ToolbarController.svelte.js +63 -89
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +8 -18
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +4 -68
- package/dist/plugins/triggers/TriggerController.svelte.js +48 -129
- package/dist/plugins/triggers/place.d.ts +0 -9
- package/dist/plugins/triggers/place.js +1 -17
- package/dist/plugins/triggers/triggers.d.ts +31 -9
- package/dist/plugins/triggers/triggers.js +82 -62
- package/dist/plugins/uploads.svelte.d.ts +55 -24
- package/dist/plugins/uploads.svelte.js +123 -50
- package/dist/plugins.d.ts +187 -66
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +8 -10
- package/dist/selection/pointer.svelte.js +32 -73
- package/dist/selection/replaceSelection.d.ts +21 -22
- package/dist/selection/replaceSelection.js +60 -69
- package/dist/selection/selection.svelte.d.ts +5 -73
- package/dist/selection/selection.svelte.js +224 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +3 -8
- package/dist/selection/visibility.js +7 -5
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +43 -39
- package/dist/session/attempt.js +62 -55
- package/dist/session/bindings.js +117 -145
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +208 -208
- package/dist/session/composition.svelte.d.ts +2 -4
- package/dist/session/composition.svelte.js +55 -65
- package/dist/session/editing/text.d.ts +6 -0
- package/dist/session/editing/text.js +17 -3
- package/dist/session/handles.d.ts +10 -1
- package/dist/session/handles.js +28 -0
- package/dist/session/history.d.ts +0 -4
- package/dist/session/history.js +16 -21
- package/dist/session/inputRules.d.ts +6 -3
- package/dist/session/inputRules.js +78 -83
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +43 -10
- package/dist/session/moves.js +101 -59
- package/dist/session/navigation.d.ts +10 -2
- package/dist/session/navigation.js +140 -172
- package/dist/session/ports.d.ts +2 -7
- package/dist/session/props.d.ts +25 -25
- package/dist/session/props.js +62 -159
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +5 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +42 -47
- package/dist/session/uploads.d.ts +29 -0
- package/dist/session/uploads.js +10 -0
- package/dist/session/virtual.d.ts +3 -3
- package/dist/session/virtual.js +18 -40
- package/dist/surface/attributes.d.ts +1 -0
- package/dist/surface/attributes.js +3 -26
- package/dist/surface/cells.d.ts +5 -0
- package/dist/surface/cells.js +5 -0
- package/dist/surface/lines.d.ts +2 -2
- package/dist/surface/lines.js +1 -1
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +52 -72
- package/dist/surface/overlay.d.ts +41 -3
- package/dist/surface/overlay.js +92 -37
- package/dist/surface/pin.svelte.d.ts +5 -0
- package/dist/surface/pin.svelte.js +5 -0
- package/dist/surface/projector.svelte.d.ts +4 -6
- package/dist/surface/projector.svelte.js +42 -69
- package/dist/text/text.svelte.d.ts +14 -40
- package/dist/text/text.svelte.js +35 -51
- package/dist/text/wordBoundary.d.ts +19 -0
- package/dist/text/wordBoundary.js +29 -44
- package/dist/themes/notion.css +272 -106
- package/dist/utils/json.d.ts +3 -1
- package/dist/utils/json.js +52 -51
- package/dist/utils/listen.d.ts +8 -0
- package/dist/utils/listen.js +19 -0
- package/package.json +4 -5
- package/dist/block/block.utils.d.ts +0 -340
- package/dist/block/block.utils.js +0 -356
- package/dist/collaboration/history/HistoryPanel.svelte +0 -554
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -61
- package/dist/collaboration/history/panel.js +0 -3
- package/dist/components/SuggestionRanges.svelte +0 -58
- package/dist/components/SuggestionRanges.svelte.d.ts +0 -7
- package/dist/crdt/doc/table.d.ts +0 -21
- package/dist/crdt/doc/table.js +0 -288
- package/dist/crdt/migration/generation.d.ts +0 -58
- package/dist/crdt/migration/generation.js +0 -70
- package/dist/crdt/migration/legacy-schema.d.ts +0 -61
- package/dist/crdt/migration/legacy-schema.js +0 -151
- package/dist/crdt/migration/migrate.d.ts +0 -56
- package/dist/crdt/migration/migrate.js +0 -227
- package/dist/crdt/nodes.d.ts +0 -121
- package/dist/crdt/nodes.js +0 -56
- package/dist/crdt/text/index/checks.d.ts +0 -15
- package/dist/crdt/text/index/checks.js +0 -156
- package/dist/crdt/vendor/yjs/dts/utils/EventHandler.d.ts +0 -17
- package/dist/crdt/vendor/yjs/dts/utils/RelativePosition.d.ts +0 -80
- package/dist/crdt/vendor/yjs/dts/utils/UndoManager.d.ts +0 -205
- package/dist/crdt/vendor/yjs/dts/utils/YEvent.d.ts +0 -93
- package/dist/crdt/vendor/yjs/dts/utils/meta.d.ts +0 -25
- package/dist/crdt/vendor/yjs/dts/utils/renderer-helpers.d.ts +0 -98
- package/dist/crdt/vendor/yjs/dts/utils/schemas.d.ts +0 -2
- package/dist/crdt/vendor/yjs/src/utils/EventHandler.js +0 -75
- package/dist/crdt/vendor/yjs/src/utils/RelativePosition.js +0 -301
- package/dist/crdt/vendor/yjs/src/utils/UndoManager.js +0 -554
- package/dist/crdt/vendor/yjs/src/utils/YEvent.js +0 -158
- package/dist/crdt/vendor/yjs/src/utils/meta.js +0 -74
- package/dist/crdt/vendor/yjs/src/utils/renderer-helpers.js +0 -186
- package/dist/crdt/vendor/yjs/src/utils/schemas.js +0 -3
- package/dist/edytor.utils.d.ts +0 -50
- package/dist/edytor.utils.js +0 -67
- package/dist/plugins/blockMenu/BlockMenu.svelte +0 -335
- package/dist/plugins/blockMenu/BlockMenu.svelte.d.ts +0 -9
- package/dist/plugins/find/FindBar.svelte +0 -170
- package/dist/plugins/find/FindBar.svelte.d.ts +0 -9
- package/dist/plugins/find/FindHighlights.svelte +0 -75
- package/dist/plugins/find/FindHighlights.svelte.d.ts +0 -9
- package/dist/plugins/icons.d.ts +0 -2
- package/dist/plugins/icons.js +0 -63
- package/dist/plugins/image/ImageEmpty.svelte +0 -93
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -15
- package/dist/plugins/image/empty.svelte.d.ts +0 -56
- package/dist/plugins/image/empty.svelte.js +0 -83
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -92
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/CalloutIconMenu.svelte +0 -98
- package/dist/plugins/richtext/CalloutIconMenu.svelte.d.ts +0 -9
- package/dist/plugins/richtext/labels.d.ts +0 -9
- package/dist/plugins/richtext/labels.js +0 -7
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -276
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/table/dragPreview.d.ts +0 -29
- package/dist/plugins/table/dragPreview.js +0 -103
- package/dist/plugins/toolbar/LinkCard.svelte +0 -122
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -9
- package/dist/plugins/toolbar/Toolbar.svelte +0 -349
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -135
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/text/deltas.d.ts +0 -22
- package/dist/text/deltas.js +0 -46
- package/dist/text/text.utils.d.ts +0 -45
- package/dist/text/text.utils.js +0 -199
- /package/dist/{plugins/columns → dnd}/stacking.d.ts +0 -0
- /package/dist/{plugins/columns → dnd}/stacking.js +0 -0
package/dist/session/commands.js
CHANGED
|
@@ -1,33 +1,35 @@
|
|
|
1
|
+
import { refused } from '../crdt/doc/plan.js';
|
|
2
|
+
import { viewOf } from '../selection/visibility.js';
|
|
3
|
+
import { reveal } from '../selection/replaceSelection.js';
|
|
1
4
|
import { DEV } from 'esm-env';
|
|
2
5
|
import { PreventionError, vetoable } from '../utils.js';
|
|
3
6
|
import { kindOf } from './attempt.js';
|
|
7
|
+
import { insertionMarksAt } from './editing/text.js';
|
|
8
|
+
/** A command the view refused (readonly, a read-only document) or a hook prevented. */
|
|
9
|
+
const PREVENTED = refused('view');
|
|
4
10
|
/**
|
|
5
11
|
* The undo policy, owned here: a user command (`run`) applies it
|
|
6
12
|
* by its kind, and an operation dispatched outside one (a menu action, a
|
|
7
|
-
* plugin, a headless call) by its name.
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* insertion
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
13
|
+
* plugin, a headless call) by its name. Every kind cuts the capture before
|
|
14
|
+
* it writes — deletions, paste, drop, formatting and structural operations,
|
|
15
|
+
* and any kind this table does not list (`run('myConvert')`), so a plugin's
|
|
16
|
+
* write never joins the typing before it — except an insertion
|
|
17
|
+
* (`insertion`), which coalesces within `captureTimeout` when it continues
|
|
18
|
+
* the step before it (that step is an insertion's, `inserts`, and it starts
|
|
19
|
+
* where that step left this view's selection, `history.continues`), else it
|
|
20
|
+
* cuts: an insertion after the caret moved is its own step whatever the
|
|
21
|
+
* pause, so the grouping never depends on timing alone. The kinds listed
|
|
22
|
+
* here also cut after them. A conversion (a markdown or slash trigger with
|
|
23
|
+
* the kind it completes, `lead`) is its own step, so undo gives the typed
|
|
24
|
+
* trigger back. A composition session groups like an insertion and is one
|
|
25
|
+
* capture group: `session/composition` holds it open between its writes,
|
|
20
26
|
* and no operation cuts while it is live.
|
|
21
27
|
*/
|
|
22
28
|
const CUT = {
|
|
29
|
+
// A paragraph split.
|
|
23
30
|
insertParagraph: 'both',
|
|
24
|
-
insertFromPaste: 'before',
|
|
25
|
-
insertFromPasteAsQuotation: 'before',
|
|
26
|
-
insertFromDrop: 'before',
|
|
27
31
|
// A text drag's drop: typing after it is a step of its own.
|
|
28
32
|
moveText: 'both',
|
|
29
|
-
insertBlock: 'before',
|
|
30
|
-
format: 'before',
|
|
31
33
|
// An accepted suggestion: typing after it is a step of its own.
|
|
32
34
|
acceptSuggestion: 'both',
|
|
33
35
|
// A DOM change no input occurrence owns (a foreign script): its own step.
|
|
@@ -36,20 +38,10 @@ const CUT = {
|
|
|
36
38
|
/** The origin of `Dispatcher.outside`'s transactions: no history tracks it. */
|
|
37
39
|
const OUTSIDE_HISTORY = Symbol('edytor.outsideHistory');
|
|
38
40
|
/**
|
|
39
|
-
* The kinds that may continue a step: the
|
|
40
|
-
* `
|
|
41
|
-
* structural or formatting input type, a kind the table does not list
|
|
42
|
-
* (`run('myConvert')`) — cuts before it writes.
|
|
41
|
+
* The kinds that may continue a step: the input types that insert text
|
|
42
|
+
* (`insertText`, the operation too), a soft break, an atom and a link.
|
|
43
43
|
*/
|
|
44
|
-
const
|
|
45
|
-
'insertText',
|
|
46
|
-
'addInlineBlock',
|
|
47
|
-
'insertReplacementText',
|
|
48
|
-
'insertLineBreak',
|
|
49
|
-
'insertFromYank',
|
|
50
|
-
'insertTranspose',
|
|
51
|
-
'insertLink'
|
|
52
|
-
]);
|
|
44
|
+
const insertion = (kind) => kindOf(kind) === 'text' || ['insertLineBreak', 'insertInline', 'insertLink'].includes(kind);
|
|
53
45
|
/**
|
|
54
46
|
* Whether a `kind` command's writes are text editing an insertion may
|
|
55
47
|
* continue (`history.continues`): the insertions, a composition and a text
|
|
@@ -57,42 +49,25 @@ const INSERTIONS = new Set([
|
|
|
57
49
|
* Anything else — a paste, a structural edit, a data write such as a
|
|
58
50
|
* column resize — ends the step for the typing after it.
|
|
59
51
|
*/
|
|
60
|
-
const inserts = (kind, led) => !led && (kind.includes('Composition') ||
|
|
61
|
-
const policyOf = (kind) => CUT[kind] ??
|
|
62
|
-
(kind.includes('Composition') ? undefined : INSERTIONS.has(kind) ? 'continue' : 'before');
|
|
52
|
+
const inserts = (kind, led) => !led && (kind.includes('Composition') || insertion(kind) || kindOf(kind) === 'delete');
|
|
53
|
+
const policyOf = (kind) => CUT[kind] ?? (kind.includes('Composition') ? undefined : insertion(kind) ? 'continue' : 'before');
|
|
63
54
|
/** The one place a `prevent()` is recognized; anything else propagates. */
|
|
64
55
|
const prevented = (error) => {
|
|
65
56
|
if (error instanceof PreventionError)
|
|
66
57
|
return error;
|
|
67
58
|
throw error;
|
|
68
59
|
};
|
|
69
|
-
const isText = (part) => 'insertAt' in part;
|
|
70
|
-
/** The text part showing display offset `offset` of `block`: its index and local offset. */
|
|
71
|
-
const partAt = (block, offset) => {
|
|
72
|
-
let at = 0;
|
|
73
|
-
const parts = block.content;
|
|
74
|
-
for (let index = 0; index < parts.length; index++) {
|
|
75
|
-
const part = parts[index];
|
|
76
|
-
if (isText(part) && offset <= at + part.length)
|
|
77
|
-
return { index, offset: offset - at, part };
|
|
78
|
-
at += isText(part) ? part.length : 1;
|
|
79
|
-
}
|
|
80
|
-
// Past the end (a later step of the plan writes there): its last text's end.
|
|
81
|
-
const index = parts.findLastIndex(isText);
|
|
82
|
-
const part = parts[index];
|
|
83
|
-
return part ? { index, offset: part.length, part } : null;
|
|
84
|
-
};
|
|
85
60
|
/**
|
|
86
61
|
* What a text `patchData` writes, or `null`: only a patch setting strings can
|
|
87
62
|
* be typing into a bound field; a flag, a number, a delete or an object is a
|
|
88
63
|
* discrete edit, its own step.
|
|
89
64
|
*/
|
|
90
|
-
const textPatch = (
|
|
91
|
-
const
|
|
65
|
+
const textPatch = (args) => {
|
|
66
|
+
const [target, ops] = args;
|
|
92
67
|
if (!Array.isArray(ops) || ops.length === 0 || ops.some((o) => typeof o?.value !== 'string'))
|
|
93
68
|
return null;
|
|
94
69
|
return {
|
|
95
|
-
key: JSON.stringify([
|
|
70
|
+
key: JSON.stringify([target, ops.map((o) => o.path)]),
|
|
96
71
|
values: ops.map((o) => o.value)
|
|
97
72
|
};
|
|
98
73
|
};
|
|
@@ -119,15 +94,38 @@ const continuesTyping = (previous, patch) => patch !== null &&
|
|
|
119
94
|
patch.values.every((value, i) => typedFrom(previous.values[i], value));
|
|
120
95
|
/** Passes one normalizer may take on one block per command: the first and 50 re-requests. */
|
|
121
96
|
const MAX_PASSES = 51;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
97
|
+
/**
|
|
98
|
+
* The block a write's first argument names: a block, a list's first, a
|
|
99
|
+
* destination's parent, a position's or a target's block (`null`: the root).
|
|
100
|
+
*/
|
|
101
|
+
const subjectOf = (arg) => {
|
|
102
|
+
if (typeof arg === 'string')
|
|
103
|
+
return arg;
|
|
104
|
+
if (Array.isArray(arg))
|
|
105
|
+
return subjectOf(arg[0]);
|
|
106
|
+
if (arg === null || typeof arg !== 'object')
|
|
107
|
+
return null;
|
|
108
|
+
const at = arg;
|
|
109
|
+
return subjectOf(at.block ?? at.parent ?? at.replace ?? at.slot);
|
|
110
|
+
};
|
|
111
|
+
/** A planned step as the operation it performs, with that operation's arguments. */
|
|
112
|
+
const ARGS = {
|
|
113
|
+
insertBlocks: (w) => [{ parent: w.parent, index: w.index }, w.specs],
|
|
114
|
+
moveBlocks: (w) => [w.ids, { parent: w.parent, index: w.index }],
|
|
115
|
+
deleteBlock: (w, keepChildren) => [w.id, { keepChildren }],
|
|
116
|
+
splitBlock: (w) => [w.id, w.offset, w.newId, w.tail],
|
|
117
|
+
mergeBlocks: (w) => [w.from, w.into],
|
|
118
|
+
setBlockType: (w) => [w.id, w.type],
|
|
119
|
+
patchData: (w) => [
|
|
120
|
+
w.inlineId !== undefined ? { block: w.id, atom: w.inlineId } : (w.id ?? null),
|
|
121
|
+
w.ops
|
|
122
|
+
],
|
|
123
|
+
insertText: (w) => [w.id, w.offset, w.text, w.marks],
|
|
124
|
+
insertInline: (w) => [w.id, w.offset, w.atom],
|
|
125
|
+
deleteText: (w) => [w.id, w.offset, w.length],
|
|
126
|
+
removeInline: (w) => [w.id, w.inlineId],
|
|
127
|
+
formatRange: (w) => [w.id, w.offset, w.length, w.marks]
|
|
128
|
+
};
|
|
131
129
|
export class Dispatcher {
|
|
132
130
|
edytor;
|
|
133
131
|
#last = null;
|
|
@@ -157,11 +155,6 @@ export class Dispatcher {
|
|
|
157
155
|
kind = null;
|
|
158
156
|
/** The running user command's last step that applied. */
|
|
159
157
|
applied = null;
|
|
160
|
-
/**
|
|
161
|
-
* The result the last top-level `dispatch` produced (its own `last`), for
|
|
162
|
-
* `answer`: a replacement that ran the same operation recorded another.
|
|
163
|
-
*/
|
|
164
|
-
#produced = null;
|
|
165
158
|
/** Open prevention scopes: a veto inside one aborts it. */
|
|
166
159
|
depth = 0;
|
|
167
160
|
/** Extensions whose replacement is running (a command is replaced at most once per extension). */
|
|
@@ -169,9 +162,7 @@ export class Dispatcher {
|
|
|
169
162
|
/** Requested normalization passes: (block id, normalizer). */
|
|
170
163
|
queue = [];
|
|
171
164
|
current = null;
|
|
172
|
-
|
|
173
|
-
entering = false;
|
|
174
|
-
draining = false;
|
|
165
|
+
#draining = false;
|
|
175
166
|
/** A plan the next dispatched operation composes before its own (`lead`). */
|
|
176
167
|
leading = null;
|
|
177
168
|
/** The next dispatched operation is a step of its own, as a led one is (`alone`). */
|
|
@@ -193,12 +184,13 @@ export class Dispatcher {
|
|
|
193
184
|
* placed. That step's undo withdraws the block, URL included
|
|
194
185
|
* (`hist.undo.withdraw`), and its redo shows it again, so the paste stays
|
|
195
186
|
* one step whatever the upload's delay, and the typing around it groups
|
|
196
|
-
* as if it never came.
|
|
197
|
-
* already open: its writes would take that transaction's
|
|
198
|
-
* its step (call it from a later task, as an upload's
|
|
187
|
+
* as if it never came. In development, throws, writing nothing, when a
|
|
188
|
+
* transaction is already open: its writes would take that transaction's
|
|
189
|
+
* origin and join its step (call it from a later task, as an upload's
|
|
190
|
+
* answer is).
|
|
199
191
|
*/
|
|
200
192
|
outside = (body) => {
|
|
201
|
-
if (this.edytor.doc._transaction)
|
|
193
|
+
if (DEV && this.edytor.doc._transaction)
|
|
202
194
|
throw new Error('dispatcher.outside: called inside a transaction, where its writes would join that step');
|
|
203
195
|
const outer = this.untracked;
|
|
204
196
|
this.untracked = true;
|
|
@@ -278,7 +270,7 @@ export class Dispatcher {
|
|
|
278
270
|
if (this.running)
|
|
279
271
|
return body();
|
|
280
272
|
if (!this.permits())
|
|
281
|
-
return this
|
|
273
|
+
return void this.#refused(kind);
|
|
282
274
|
this.cut(kind);
|
|
283
275
|
this.applied = null;
|
|
284
276
|
const out = this.scope(() => {
|
|
@@ -323,7 +315,7 @@ export class Dispatcher {
|
|
|
323
315
|
const led = !!lead || this.#alone;
|
|
324
316
|
this.#alone = false;
|
|
325
317
|
if (!this.permits()) {
|
|
326
|
-
this.#
|
|
318
|
+
this.#refused(operation);
|
|
327
319
|
return undefined;
|
|
328
320
|
}
|
|
329
321
|
const original = payload;
|
|
@@ -361,11 +353,10 @@ export class Dispatcher {
|
|
|
361
353
|
continue;
|
|
362
354
|
}
|
|
363
355
|
stop.by = plugin;
|
|
364
|
-
|
|
356
|
+
this.#refused(operation);
|
|
365
357
|
if (this.depth > 0)
|
|
366
358
|
throw stop;
|
|
367
359
|
this.replace(stop);
|
|
368
|
-
this.#produced = refused;
|
|
369
360
|
return undefined;
|
|
370
361
|
}
|
|
371
362
|
if (!out)
|
|
@@ -386,16 +377,14 @@ export class Dispatcher {
|
|
|
386
377
|
}
|
|
387
378
|
// Refused at preparation, and no extension replaced it.
|
|
388
379
|
if (plan && !('writes' in plan)) {
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
this.#produced = refused;
|
|
392
|
-
return out;
|
|
380
|
+
this.#refused(operation);
|
|
381
|
+
return body(payload, plan);
|
|
393
382
|
}
|
|
394
383
|
const version = this.edytor.facade.version;
|
|
395
384
|
// A text patch typing into the strings the previous command set on the
|
|
396
385
|
// same paths (a bound field) continues its step, within the capture
|
|
397
386
|
// window, as typing does; another value of them is its own step.
|
|
398
|
-
const patch = operation === 'patchData' ? textPatch(
|
|
387
|
+
const patch = operation === 'patchData' ? textPatch(payload) : null;
|
|
399
388
|
const again = continuesTyping(this.patched, patch) && this.last?.operation === operation;
|
|
400
389
|
// A write outside the history continues nothing and leaves the typing's record.
|
|
401
390
|
if (!this.untracked)
|
|
@@ -434,35 +423,112 @@ export class Dispatcher {
|
|
|
434
423
|
this.#last = own;
|
|
435
424
|
if (this.running && own.status === 'applied')
|
|
436
425
|
this.applied = own;
|
|
437
|
-
const
|
|
426
|
+
const effect = plan && 'writes' in plan ? plan.effect : undefined;
|
|
427
|
+
const change = { operation, payload: original, ...context, effect };
|
|
438
428
|
for (const plugin of this.edytor.plugins)
|
|
439
429
|
plugin.onAfterOperation?.(change);
|
|
440
|
-
this.#produced = own;
|
|
441
430
|
return result;
|
|
442
431
|
};
|
|
443
432
|
/**
|
|
444
|
-
*
|
|
445
|
-
*
|
|
446
|
-
*
|
|
447
|
-
*
|
|
448
|
-
*
|
|
433
|
+
* Dispatch `operation` as the plan `prepare` makes of `payload` (a hook's
|
|
434
|
+
* replacement payload is prepared again), about `block` (the root by
|
|
435
|
+
* default): hooks see it and each planned step before any write; one
|
|
436
|
+
* transaction; the blocks it touched normalized and the blocks it moved
|
|
437
|
+
* shown (closed toggles open); the caret it decides (`plan.at`: a range
|
|
438
|
+
* deletion, a placed flow) selected. Answers its result: `refused` when
|
|
439
|
+
* the document refused it, `refused` with the reason `'view'` when the
|
|
440
|
+
* view did (readonly, a read-only document) or a hook prevented it.
|
|
441
|
+
*/
|
|
442
|
+
plan = (operation, payload, prepare, block, text) => {
|
|
443
|
+
let at;
|
|
444
|
+
const out = this.dispatch(operation, payload, { block: block ?? this.edytor.root, ...(text && { text }) }, (p, plan = prepare(p)) => {
|
|
445
|
+
at = 'writes' in plan ? plan.at : undefined;
|
|
446
|
+
return this.write(plan);
|
|
447
|
+
}, prepare);
|
|
448
|
+
if (at && !this.active && out && out.status !== 'refused')
|
|
449
|
+
this.caret(at);
|
|
450
|
+
return out ?? PREVENTED;
|
|
451
|
+
};
|
|
452
|
+
/**
|
|
453
|
+
* Dispatch the document write `operation` with `args` (`edytor.<op>(…)`):
|
|
454
|
+
* the view's own arguments filled in — an insertion without marks takes
|
|
455
|
+
* the insertion's (`marksForInsertion`), a range or a flow is read in
|
|
456
|
+
* this view (`viewOf`) — then {@link plan}.
|
|
449
457
|
* @internal
|
|
450
458
|
*/
|
|
451
|
-
|
|
452
|
-
const
|
|
453
|
-
this
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
459
|
+
operate = (operation, args) => {
|
|
460
|
+
const { edytor } = this;
|
|
461
|
+
// The property writes queued in this task go first (`session/props`).
|
|
462
|
+
edytor.dataWrites.flush();
|
|
463
|
+
const own = edytor.facade.prepare[operation];
|
|
464
|
+
const prepare = (a) => {
|
|
465
|
+
if (operation === 'insertText' && a[3] === undefined)
|
|
466
|
+
return own(a[0], a[1], a[2], insertionMarksAt(edytor, a[0], a[1]));
|
|
467
|
+
if (/^(deleteRange|replaceRange|insertFlow)$/.test(operation) && a[2] === undefined)
|
|
468
|
+
return own(a[0], a[1], viewOf(edytor));
|
|
469
|
+
return own(...a);
|
|
470
|
+
};
|
|
471
|
+
const block = edytor.idToBlock.block(subjectOf(args[0]) ?? 'root');
|
|
472
|
+
const text = typeof args[0] === 'string' && typeof args[1] === 'number'
|
|
473
|
+
? block.textAtOffset(args[1])?.text
|
|
474
|
+
: undefined;
|
|
475
|
+
return this.plan(operation, args, prepare, block, text);
|
|
457
476
|
};
|
|
458
|
-
/**
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
477
|
+
/**
|
|
478
|
+
* Write `plan` in the running command's transaction (a composed command's
|
|
479
|
+
* body writes its stages here): request the normalization of what its
|
|
480
|
+
* steps touch (read before the write), apply it, and show the blocks it
|
|
481
|
+
* moved. The caret's pending marks are a text insertion's at the caret,
|
|
482
|
+
* which consumes them; an atom inserted at the caret passes them to the
|
|
483
|
+
* caret after it. A refusal passes through.
|
|
484
|
+
* @internal
|
|
485
|
+
*/
|
|
486
|
+
write = (plan) => {
|
|
487
|
+
if (!('writes' in plan))
|
|
488
|
+
return plan;
|
|
489
|
+
const { facade, idToBlock, selection } = this.edytor;
|
|
490
|
+
const touched = plan.writes.flatMap((w) => this.#touched(w));
|
|
491
|
+
const { caret, pending } = selection;
|
|
492
|
+
const at = (op) => !!pending &&
|
|
493
|
+
!!caret &&
|
|
494
|
+
plan.writes.some((w) => w.op === op && w.id === caret.block.id && w.offset === caret.offset);
|
|
495
|
+
const [typed, atom] = [at('insertText'), at('insertInline')];
|
|
496
|
+
const result = facade.apply(plan);
|
|
497
|
+
for (const [id, hook] of touched)
|
|
498
|
+
this.request(id, hook);
|
|
499
|
+
if (typed)
|
|
500
|
+
selection.stage(undefined);
|
|
501
|
+
const after = atom ? caret.block.textAtOffset(caret.offset + 1) : null;
|
|
502
|
+
const value = after ? selection.textValue(after.text, after.offset) : null;
|
|
503
|
+
if (value?.kind === 'text')
|
|
504
|
+
selection.select(Object.freeze({ ...value, pending }));
|
|
505
|
+
for (const id of plan.effect.moves) {
|
|
506
|
+
const block = idToBlock.get(id);
|
|
507
|
+
if (block)
|
|
508
|
+
reveal(block);
|
|
509
|
+
}
|
|
510
|
+
return result;
|
|
511
|
+
};
|
|
512
|
+
/** The normalization a step asks for: the blocks whose content it writes, the parents whose children it changes. */
|
|
513
|
+
#touched(w) {
|
|
514
|
+
const { facade } = this.edytor;
|
|
515
|
+
const parent = (id) => facade.parentOf(id);
|
|
516
|
+
const children = (...ids) => ids.map((id) => [id ?? 'root', 'normalizeChildren']);
|
|
517
|
+
if (w.op === 'insertBlocks')
|
|
518
|
+
return [...children(w.parent), ...w.specs.map(({ id }) => [id, 'normalizeContent'])];
|
|
519
|
+
if (w.op === 'moveBlocks')
|
|
520
|
+
return children(w.parent, ...w.ids.map(parent));
|
|
521
|
+
if (w.op === 'deleteBlock')
|
|
522
|
+
return children(parent(w.id));
|
|
523
|
+
if (w.op === 'splitBlock')
|
|
524
|
+
return [[w.id, 'normalizeContent'], ...children(w.parent, parent(w.id))];
|
|
525
|
+
if (w.op === 'mergeBlocks')
|
|
526
|
+
return [[w.into, 'normalizeContent'], ...children(parent(w.from))];
|
|
527
|
+
if (w.op === 'setBlockType')
|
|
528
|
+
return [[w.id, 'normalizeContent'], ...children(w.id)];
|
|
529
|
+
if (w.op === 'patchData')
|
|
530
|
+
return w.id === undefined ? [] : [[w.id, 'normalizeContent']];
|
|
531
|
+
return [[w.id, 'normalizeContent']];
|
|
466
532
|
}
|
|
467
533
|
/**
|
|
468
534
|
* Run `body` with `lead` (a plan prepared now) composed into the first
|
|
@@ -515,8 +581,9 @@ export class Dispatcher {
|
|
|
515
581
|
}
|
|
516
582
|
const ops = rest[0];
|
|
517
583
|
const caret = target;
|
|
518
|
-
// `{ block, offset }`: block offsets, mapped to the text segment that shows the offset.
|
|
519
|
-
const
|
|
584
|
+
// `{ block, offset }`: block offsets (a handle or an id), mapped to the text segment that shows the offset.
|
|
585
|
+
const block = typeof caret?.block === 'string' ? this.edytor.idToBlock.get(caret.block) : caret?.block;
|
|
586
|
+
const at = block?.textAtOffset(Math.max(0, caret.offset));
|
|
520
587
|
return this.#caret(at?.text, at?.offset ?? 0, ops);
|
|
521
588
|
};
|
|
522
589
|
#caret = (text, offset, ops) => {
|
|
@@ -533,42 +600,22 @@ export class Dispatcher {
|
|
|
533
600
|
finally {
|
|
534
601
|
this.authoring = outer;
|
|
535
602
|
}
|
|
536
|
-
if (
|
|
603
|
+
if (out.status === 'refused')
|
|
537
604
|
return out;
|
|
538
605
|
}
|
|
539
606
|
if (!text || !value || value.kind === 'none')
|
|
540
607
|
return out;
|
|
541
|
-
selection.clearModelSelectionPreservation();
|
|
542
608
|
selection.select(value);
|
|
543
609
|
// Declared before its operations: gone with them after all, the seam.
|
|
544
610
|
if (!selection.projection.start)
|
|
545
611
|
selection.restoreDeadSelectionEndpoints();
|
|
546
|
-
this.#
|
|
612
|
+
if (this.#last)
|
|
613
|
+
this.#last = { ...this.#last, selection: selection.value };
|
|
547
614
|
return out;
|
|
548
615
|
};
|
|
549
616
|
/**
|
|
550
|
-
*
|
|
551
|
-
*
|
|
552
|
-
* the end of the command's transaction. Answers whether the request was
|
|
553
|
-
* queued.
|
|
554
|
-
* @internal
|
|
555
|
-
*/
|
|
556
|
-
defer = (block, normalize) => {
|
|
557
|
-
const [id, fn] = this.current ?? [];
|
|
558
|
-
if (this.entering && id === block.id && fn === normalize)
|
|
559
|
-
return (this.entering = false);
|
|
560
|
-
if (!this.active)
|
|
561
|
-
return false;
|
|
562
|
-
this.request(block.id, normalize);
|
|
563
|
-
return true;
|
|
564
|
-
};
|
|
565
|
-
/**
|
|
566
|
-
* A normalizer's work: part of the command's transaction (its operations are steps).
|
|
567
|
-
* @internal
|
|
568
|
-
*/
|
|
569
|
-
write = (work) => this.edytor.transact(work);
|
|
570
|
-
/**
|
|
571
|
-
* Request a normalization pass of block `id` (deduped against the pending ones).
|
|
617
|
+
* Request a normalization pass of block `id` (deduped against the pending
|
|
618
|
+
* ones): it runs at the end of the command's transaction, inside it.
|
|
572
619
|
* @internal
|
|
573
620
|
*/
|
|
574
621
|
request = (id, normalize) => {
|
|
@@ -578,15 +625,18 @@ export class Dispatcher {
|
|
|
578
625
|
};
|
|
579
626
|
/**
|
|
580
627
|
* Run the requested normalization at the end of the outermost transaction,
|
|
581
|
-
* inside it, also when the transaction's callback threw: its writes stay.
|
|
582
|
-
*
|
|
583
|
-
*
|
|
628
|
+
* inside it, also when the transaction's callback threw: its writes stay.
|
|
629
|
+
* A pass is the block's kind's normalizer, over handles that read the
|
|
630
|
+
* index, so it sees what the command (and the previous pass) wrote; the
|
|
631
|
+
* work it answers runs in the same transaction (its operations are
|
|
632
|
+
* steps), and the block is normalized again, at most {@link MAX_PASSES}
|
|
633
|
+
* times.
|
|
584
634
|
* @internal
|
|
585
635
|
*/
|
|
586
636
|
drain = () => {
|
|
587
|
-
if (this
|
|
637
|
+
if (this.#draining)
|
|
588
638
|
return;
|
|
589
|
-
this
|
|
639
|
+
this.#draining = true;
|
|
590
640
|
const passes = new Map();
|
|
591
641
|
const { edytor } = this;
|
|
592
642
|
try {
|
|
@@ -605,25 +655,27 @@ export class Dispatcher {
|
|
|
605
655
|
counts.set(id, count);
|
|
606
656
|
if (count > MAX_PASSES) {
|
|
607
657
|
if (count === MAX_PASSES + 1)
|
|
608
|
-
console.warn(`edytor: ${normalize
|
|
658
|
+
console.warn(`edytor: ${normalize} on block "${id}" exceeded ${MAX_PASSES - 1} passes — a plugin normalizer is not converging; skipping further passes`);
|
|
609
659
|
continue;
|
|
610
660
|
}
|
|
611
661
|
this.current = entry;
|
|
612
|
-
this.entering = true;
|
|
613
662
|
this.active = true;
|
|
614
663
|
try {
|
|
615
|
-
|
|
664
|
+
const work = edytor.definitionOf(block.type)[normalize]?.({ block });
|
|
665
|
+
if (work) {
|
|
666
|
+
edytor.transact(work);
|
|
667
|
+
this.request(id, normalize);
|
|
668
|
+
}
|
|
616
669
|
}
|
|
617
670
|
finally {
|
|
618
671
|
this.active = false;
|
|
619
|
-
this.entering = false;
|
|
620
672
|
}
|
|
621
673
|
}
|
|
622
674
|
}
|
|
623
675
|
finally {
|
|
624
676
|
this.queue = [];
|
|
625
677
|
this.current = null;
|
|
626
|
-
this
|
|
678
|
+
this.#draining = false;
|
|
627
679
|
}
|
|
628
680
|
};
|
|
629
681
|
/**
|
|
@@ -646,10 +698,6 @@ export class Dispatcher {
|
|
|
646
698
|
const { history, selection } = this.edytor;
|
|
647
699
|
return history.continues(selection.value) ? undefined : 'before';
|
|
648
700
|
}
|
|
649
|
-
refuse(operation) {
|
|
650
|
-
this.#refused(operation);
|
|
651
|
-
return undefined;
|
|
652
|
-
}
|
|
653
701
|
/** Record `operation` as refused; answers that result. */
|
|
654
702
|
#refused(operation) {
|
|
655
703
|
return (this.#last = { operation, status: 'refused' });
|
|
@@ -689,76 +737,28 @@ export class Dispatcher {
|
|
|
689
737
|
}
|
|
690
738
|
}
|
|
691
739
|
/**
|
|
692
|
-
* The planned steps as hooks see them
|
|
693
|
-
*
|
|
694
|
-
*
|
|
695
|
-
*
|
|
696
|
-
*
|
|
697
|
-
* yet: no mapping. A document data patch shows on the root.)
|
|
740
|
+
* The planned steps as hooks see them: each as the operation it performs,
|
|
741
|
+
* with that operation's arguments (`ARGS`), about the block it writes
|
|
742
|
+
* (the root for the document's data). A step that is the command itself
|
|
743
|
+
* (same name, same block) is not repeated; a write into a block the plan
|
|
744
|
+
* creates is part of that creation.
|
|
698
745
|
*/
|
|
699
746
|
steps(writes, creates, command) {
|
|
700
|
-
const { idToBlock, root } = this.edytor;
|
|
747
|
+
const { idToBlock, root, facade } = this.edytor;
|
|
701
748
|
const created = new Set(creates);
|
|
702
|
-
const block = (id) => (id === null ? root : idToBlock.get(id));
|
|
703
|
-
const path = (parent, index) => parent === null ? [index] : [...(block(parent)?.path ?? []), index];
|
|
704
749
|
const out = [];
|
|
705
|
-
const show = (operation, block, payload, text) => out.push({ operation, block, payload, ...(text ? { text } : {}) });
|
|
706
750
|
for (const w of writes) {
|
|
707
|
-
const
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
? w.from
|
|
713
|
-
: w.parent;
|
|
714
|
-
const b = block(target);
|
|
715
|
-
if ((target !== null && created.has(target)) || !b)
|
|
751
|
+
const keeps = w.op === 'deleteBlock' && facade.childrenIds(w.id).some((c) => !w.removes.includes(c));
|
|
752
|
+
const args = ARGS[w.op](w, keeps);
|
|
753
|
+
const target = subjectOf(args[0]);
|
|
754
|
+
const block = target === null ? root : idToBlock.get(target);
|
|
755
|
+
if ((target !== null && created.has(target)) || !block)
|
|
716
756
|
continue;
|
|
717
|
-
|
|
718
|
-
// A text step shows on a text: a block without one shows none.
|
|
719
|
-
const t = 'offset' in w && w.offset !== undefined ? at(w.offset) : undefined;
|
|
720
|
-
const text = t?.part;
|
|
721
|
-
if (/^(insertText|insertInline|splitBlock)$/.test(w.op) && !text)
|
|
757
|
+
if (w.op === command.operation && block === command.block)
|
|
722
758
|
continue;
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
else if (w.op === 'moveBlocks' && w.ids.length === 1)
|
|
726
|
-
show('moveBlock', block(w.ids[0]), { path: path(w.parent, w.index) });
|
|
727
|
-
else if (w.op === 'moveBlocks')
|
|
728
|
-
show('moveBlocks', block(w.ids[0]), {
|
|
729
|
-
blocks: w.ids.map(block),
|
|
730
|
-
path: path(w.parent, w.index)
|
|
731
|
-
});
|
|
732
|
-
else if (w.op === 'deleteBlock')
|
|
733
|
-
show('removeBlock', b, {
|
|
734
|
-
keepChildren: b.children.some((child) => !w.removes.includes(child.id))
|
|
735
|
-
});
|
|
736
|
-
else if (w.op === 'splitBlock')
|
|
737
|
-
show('splitBlock', b, { index: t.offset, text });
|
|
738
|
-
else if (w.op === 'mergeBlocks')
|
|
739
|
-
show('mergeBlockBackward', b, {});
|
|
740
|
-
else if (w.op === 'setBlockType')
|
|
741
|
-
show('setBlock', b, { value: { type: w.type } });
|
|
742
|
-
else if (w.op === 'patchData')
|
|
743
|
-
show('patchData', b, { ops: w.ops, ...(w.inlineId !== undefined && { atom: w.inlineId }) });
|
|
744
|
-
else if (w.op === 'insertText') {
|
|
745
|
-
const [start, end, value, marks] = [t.offset, t.offset, w.text, w.marks];
|
|
746
|
-
show('insertText', b, { value, start, end, marks }, text);
|
|
747
|
-
}
|
|
748
|
-
else if (w.op === 'insertInline')
|
|
749
|
-
show('addInlineBlock', b, {
|
|
750
|
-
index: t.offset,
|
|
751
|
-
text,
|
|
752
|
-
block: { ...w.atom, data: w.atom.data ?? {} }
|
|
753
|
-
});
|
|
754
|
-
else if (w.op === 'deleteText') {
|
|
755
|
-
const end = at(w.offset + w.length);
|
|
756
|
-
show('deleteContentAtRange', b, {
|
|
757
|
-
start: [t.index, t.offset],
|
|
758
|
-
end: [end.index, end.offset]
|
|
759
|
-
});
|
|
760
|
-
}
|
|
759
|
+
const text = typeof args[1] === 'number' ? block.textAtOffset(args[1])?.text : undefined;
|
|
760
|
+
out.push({ operation: w.op, block, payload: args, ...(text && { text }) });
|
|
761
761
|
}
|
|
762
|
-
return out
|
|
762
|
+
return out;
|
|
763
763
|
}
|
|
764
764
|
}
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
* — until the next non-composition occurrence, or `TAIL_MS` compared at use.
|
|
53
53
|
*
|
|
54
54
|
* The facts a display gate reads: `host` (the text whose element a live
|
|
55
|
-
* session owns
|
|
56
|
-
* writes: where the catch-up display runs).
|
|
55
|
+
* session owns; the pin answers which nodes it holds) and `ended(fn)` (the
|
|
56
|
+
* session end, after its writes: where the catch-up display runs).
|
|
57
57
|
*/
|
|
58
58
|
import type { DocChange } from '../crdt/index.js';
|
|
59
59
|
import type { Edytor } from '../edytor.svelte.js';
|
|
@@ -87,8 +87,6 @@ export declare class Composition {
|
|
|
87
87
|
swallows: number;
|
|
88
88
|
constructor(edytor: Edytor);
|
|
89
89
|
get live(): boolean;
|
|
90
|
-
/** `node` lies inside the element a live session owns (the pinned element). */
|
|
91
|
-
owns: (node: Node | null | undefined) => boolean;
|
|
92
90
|
/** Run `fn` once the live session has ended (after its writes), or now when none is live. */
|
|
93
91
|
ended: (fn: () => void) => void;
|
|
94
92
|
/**
|