edytor 1.0.0-rc.2 → 1.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 +65 -25
- package/dist/block/block.svelte.d.ts +10 -85
- package/dist/block/block.svelte.js +47 -141
- 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 +8 -10
- package/dist/block/inlineBlock.svelte.js +14 -22
- package/dist/clipboard/createClipboardFragment.js +22 -64
- package/dist/clipboard/fragmentData.js +17 -42
- package/dist/clipboard/htmlFlow.d.ts +6 -1
- package/dist/clipboard/htmlFlow.js +26 -13
- 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 +22 -17
- package/dist/cloudflare/DocumentRoom.js +10 -5
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.js +1 -1
- 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 +20 -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 +9 -30
- package/dist/cloudflare/room/storage.js +52 -104
- 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/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 +160 -119
- package/dist/components/Block.svelte.d.ts +8 -3
- package/dist/components/Content.svelte +91 -44
- package/dist/components/CustomMark.svelte +46 -0
- package/dist/components/CustomMark.svelte.d.ts +11 -0
- package/dist/components/Edytor.svelte +80 -95
- package/dist/components/Edytor.svelte.d.ts +8 -12
- package/dist/components/InlineBlock.svelte +4 -9
- package/dist/components/Mark.svelte +46 -35
- package/dist/components/Mark.svelte.d.ts +7 -0
- 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 +48 -14
- 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 +8 -13
- package/dist/crdt/data.js +30 -70
- 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 +1 -5
- package/dist/crdt/doc/reads.js +38 -49
- 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 +24 -115
- package/dist/crdt/document.js +207 -305
- package/dist/crdt/edytor-doc.d.ts +671 -90
- package/dist/crdt/edytor-doc.js +73 -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 +26 -85
- package/dist/crdt/index.js +21 -47
- package/dist/crdt/operations.d.ts +24 -33
- package/dist/crdt/operations.js +7 -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/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/{plugins/blockHandles → dnd}/autoScroll.d.ts +2 -1
- package/dist/{plugins/blockHandles → dnd}/autoScroll.js +3 -3
- 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 +34 -64
- package/dist/edytor.svelte.js +118 -180
- package/dist/events/beforeInputCommands.d.ts +6 -11
- package/dist/events/beforeInputCommands.js +189 -184
- 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 +33 -72
- package/dist/events/onFocus.d.ts +9 -4
- package/dist/events/onFocus.js +92 -72
- 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 +13 -1
- package/dist/events/onPaste.js +46 -76
- package/dist/index.d.ts +10 -13
- package/dist/index.js +3 -3
- package/dist/kinds.d.ts +4 -6
- package/dist/kinds.js +28 -27
- package/dist/labels.d.ts +91 -314
- package/dist/labels.js +180 -396
- 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 -151
- package/dist/plugins/blockHandles/BlockHandle.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/BlockHandleController.svelte.d.ts +63 -97
- package/dist/plugins/blockHandles/BlockHandleController.svelte.js +247 -268
- package/dist/plugins/blockHandles/BlockHandles.svelte +46 -29
- package/dist/plugins/blockHandles/BlockHandles.svelte.d.ts +2 -2
- package/dist/plugins/blockHandles/blockHandlesPlugin.d.ts +29 -23
- package/dist/plugins/blockHandles/blockHandlesPlugin.js +130 -162
- package/dist/plugins/blockHandles/dragPreview.d.ts +8 -6
- package/dist/plugins/blockHandles/dragPreview.js +20 -17
- package/dist/plugins/blockHandles/dropIndicator.js +52 -60
- package/dist/plugins/blockHandles/geometry.d.ts +46 -1
- package/dist/plugins/blockHandles/geometry.js +51 -4
- package/dist/plugins/blockMenu/BlockMenuController.svelte.d.ts +59 -28
- package/dist/plugins/blockMenu/BlockMenuController.svelte.js +180 -105
- 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 +79 -0
- package/dist/plugins/chrome.js +87 -0
- package/dist/plugins/code/CodeHeader.svelte +12 -58
- package/dist/plugins/code/CodeHeader.svelte.d.ts +1 -0
- package/dist/plugins/code/CodePlugin.svelte +75 -56
- package/dist/plugins/code/CodePlugin.svelte.d.ts +0 -2
- package/dist/plugins/code/LanguageMenu.svelte +25 -0
- package/dist/plugins/code/LanguageMenu.svelte.d.ts +9 -0
- package/dist/plugins/code/code.css +5 -100
- package/dist/plugins/code/header.svelte.d.ts +47 -0
- package/dist/plugins/code/header.svelte.js +141 -0
- package/dist/plugins/code/languageMenu.svelte.d.ts +84 -0
- package/dist/plugins/code/languageMenu.svelte.js +199 -0
- package/dist/plugins/code/languages.d.ts +21 -10
- package/dist/plugins/code/languages.js +39 -126
- package/dist/plugins/columns/ColumnResize.svelte +13 -25
- 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/resize.svelte.d.ts +14 -51
- package/dist/plugins/columns/resize.svelte.js +70 -164
- 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 -430
- package/dist/plugins/comments/CommentsSidebar.svelte.d.ts +6 -7
- package/dist/plugins/comments/commentsPlugin.d.ts +31 -10
- package/dist/plugins/comments/commentsPlugin.js +12 -10
- package/dist/plugins/equation/EquationEditor.svelte +18 -129
- package/dist/plugins/equation/EquationEditor.svelte.d.ts +2 -1
- package/dist/plugins/equation/EquationPlugin.svelte +123 -168
- package/dist/plugins/equation/EquationPlugin.svelte.d.ts +5 -3
- package/dist/plugins/equation/EquationView.svelte +20 -11
- package/dist/plugins/equation/equation.svelte.d.ts +74 -36
- package/dist/plugins/equation/equation.svelte.js +74 -66
- package/dist/plugins/equation/importUrl.d.ts +6 -0
- package/dist/plugins/equation/importUrl.js +6 -0
- package/dist/plugins/equation/katex.d.ts +8 -0
- package/dist/plugins/equation/katex.js +77 -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 +5 -151
- package/dist/plugins/image/ImagePlugin.svelte +49 -117
- package/dist/plugins/image/ImagePlugin.svelte.d.ts +1 -24
- 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 -57
- package/dist/plugins/image/controls.svelte.js +51 -174
- 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 +39 -24
- package/dist/plugins/index.js +30 -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 +6 -5
- package/dist/plugins/marquee/MarqueeBox.svelte +15 -0
- package/dist/plugins/marquee/MarqueeBox.svelte.d.ts +9 -0
- package/dist/plugins/marquee/MarqueeController.svelte.d.ts +46 -0
- package/dist/plugins/marquee/MarqueeController.svelte.js +243 -0
- package/dist/plugins/marquee/marquee.d.ts +33 -0
- package/dist/plugins/marquee/marquee.js +89 -0
- package/dist/plugins/marquee/marqueePlugin.d.ts +32 -0
- package/dist/plugins/marquee/marqueePlugin.js +68 -0
- package/dist/plugins/media/AudioPlugin.svelte +3 -88
- package/dist/plugins/media/AudioPlugin.svelte.d.ts +1 -4
- package/dist/plugins/media/BookmarkPlugin.svelte +124 -112
- package/dist/plugins/media/BookmarkPlugin.svelte.d.ts +20 -7
- package/dist/plugins/media/EmbedPlugin.svelte +93 -77
- package/dist/plugins/media/EmbedPlugin.svelte.d.ts +21 -9
- package/dist/plugins/media/EmptySlot.svelte +44 -0
- package/dist/plugins/media/EmptySlot.svelte.d.ts +25 -0
- package/dist/plugins/media/FilePlugin.svelte +35 -111
- package/dist/plugins/media/FilePlugin.svelte.d.ts +12 -4
- package/dist/plugins/media/MediaEmpty.svelte +55 -112
- package/dist/plugins/media/MediaEmpty.svelte.d.ts +26 -10
- package/dist/plugins/media/SourceBlock.svelte +164 -0
- package/dist/plugins/media/SourceBlock.svelte.d.ts +33 -0
- package/dist/plugins/media/VideoPlugin.svelte +4 -97
- package/dist/plugins/media/VideoPlugin.svelte.d.ts +2 -5
- package/dist/plugins/media/empty.svelte.d.ts +69 -0
- package/dist/plugins/media/empty.svelte.js +111 -0
- package/dist/plugins/media/media.d.ts +93 -30
- package/dist/plugins/media/media.js +79 -86
- package/dist/plugins/media/urlPaste.svelte.d.ts +9 -32
- package/dist/plugins/media/urlPaste.svelte.js +46 -75
- package/dist/plugins/mention/MentionPlugin.svelte +47 -124
- package/dist/plugins/mention/MentionPlugin.svelte.d.ts +11 -23
- 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 +52 -108
- package/dist/plugins/pageLink/PageLinkPlugin.svelte.d.ts +11 -23
- package/dist/plugins/planned.d.ts +10 -0
- package/dist/plugins/planned.js +12 -0
- package/dist/plugins/richtext/CalloutIcon.svelte +25 -0
- package/dist/plugins/richtext/CalloutIcon.svelte.d.ts +9 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte +26 -0
- package/dist/plugins/richtext/CalloutIconPicker.svelte.d.ts +9 -0
- package/dist/plugins/richtext/EmptyBody.svelte +25 -0
- package/dist/plugins/richtext/EmptyBody.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextControl.svelte +39 -0
- package/dist/plugins/richtext/RichTextControl.svelte.d.ts +8 -0
- package/dist/plugins/richtext/RichTextPlugin.svelte +272 -148
- package/dist/plugins/richtext/RichTextPlugin.svelte.d.ts +37 -18
- package/dist/plugins/richtext/TodoCheckbox.svelte +10 -21
- package/dist/plugins/richtext/TodoCheckbox.svelte.d.ts +0 -2
- package/dist/plugins/richtext/body.d.ts +9 -0
- package/dist/plugins/richtext/body.js +16 -0
- package/dist/plugins/richtext/calloutIcons.svelte.d.ts +97 -0
- package/dist/plugins/richtext/calloutIcons.svelte.js +214 -0
- 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/slashMenu/SlashMenuController.svelte.d.ts +18 -11
- package/dist/plugins/slashMenu/SlashMenuController.svelte.js +93 -35
- package/dist/plugins/slashMenu/slashMenuPlugin.d.ts +11 -24
- package/dist/plugins/slashMenu/slashMenuPlugin.js +27 -68
- package/dist/plugins/suggestions/SuggestionBars.svelte +32 -84
- package/dist/plugins/suggestions/SuggestionBars.svelte.d.ts +9 -3
- package/dist/plugins/suggestions/suggestionsPlugin.d.ts +10 -16
- package/dist/plugins/suggestions/suggestionsPlugin.js +9 -24
- package/dist/plugins/table/TableChrome.svelte +96 -127
- package/dist/plugins/table/TableChrome.svelte.d.ts +5 -1
- package/dist/plugins/table/TablePlugin.svelte +116 -171
- package/dist/plugins/table/TablePlugin.svelte.d.ts +0 -4
- package/dist/plugins/table/chrome.svelte.d.ts +110 -117
- package/dist/plugins/table/chrome.svelte.js +643 -289
- package/dist/plugins/table/ops.d.ts +47 -0
- package/dist/plugins/table/ops.js +233 -0
- package/dist/plugins/table/table.css +55 -134
- package/dist/plugins/table/table.d.ts +26 -7
- package/dist/plugins/table/table.js +23 -49
- 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 +29 -66
- package/dist/plugins/toolbar/ToolbarController.svelte.js +151 -76
- package/dist/plugins/toolbar/toolbarPlugin.d.ts +14 -13
- package/dist/plugins/toolbar/toolbarPlugin.js +28 -43
- package/dist/plugins/triggers/TriggerController.svelte.d.ts +6 -45
- package/dist/plugins/triggers/TriggerController.svelte.js +51 -96
- 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 +38 -20
- package/dist/plugins/uploads.svelte.js +39 -32
- package/dist/plugins.d.ts +167 -60
- package/dist/selection/domSelection.d.ts +13 -4
- package/dist/selection/domSelection.js +110 -183
- package/dist/selection/pointer.svelte.d.ts +12 -10
- package/dist/selection/pointer.svelte.js +154 -71
- 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 +263 -542
- package/dist/selection/selection.utils.d.ts +34 -11
- package/dist/selection/selection.utils.js +128 -247
- package/dist/selection/visibility.d.ts +11 -8
- package/dist/selection/visibility.js +23 -8
- package/dist/session/announcer.svelte.d.ts +2 -1
- package/dist/session/announcer.svelte.js +7 -3
- package/dist/session/attempt.d.ts +33 -39
- package/dist/session/attempt.js +61 -53
- package/dist/session/bindings.js +108 -139
- package/dist/session/commands.d.ts +47 -22
- package/dist/session/commands.js +206 -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 +15 -21
- package/dist/session/inputRules.js +75 -84
- package/dist/session/keymap.d.ts +1 -6
- package/dist/session/keymap.js +17 -20
- package/dist/session/moves.d.ts +10 -10
- package/dist/session/moves.js +31 -59
- package/dist/session/navigation.d.ts +18 -3
- package/dist/session/navigation.js +194 -153
- package/dist/session/ports.d.ts +7 -0
- package/dist/session/selection.d.ts +4 -3
- package/dist/session/selection.js +8 -0
- package/dist/session/suggestions.svelte.d.ts +1 -1
- package/dist/session/suggestions.svelte.js +64 -47
- 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 +32 -0
- package/dist/surface/lines.js +43 -0
- package/dist/surface/observer.svelte.d.ts +3 -20
- package/dist/surface/observer.svelte.js +73 -77
- package/dist/surface/overlay.d.ts +48 -6
- package/dist/surface/overlay.js +133 -23
- 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 +315 -126
- 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 -525
- package/dist/collaboration/history/HistoryPanel.svelte.d.ts +0 -7
- package/dist/collaboration/history/panel.d.ts +0 -43
- 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 -447
- 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 -116
- package/dist/plugins/image/ImageEmpty.svelte.d.ts +0 -12
- package/dist/plugins/keepInView.d.ts +0 -4
- package/dist/plugins/keepInView.js +0 -6
- package/dist/plugins/media/UrlPasteMenu.svelte +0 -83
- package/dist/plugins/media/UrlPasteMenu.svelte.d.ts +0 -7
- package/dist/plugins/richtext/labels.d.ts +0 -5
- package/dist/plugins/richtext/labels.js +0 -3
- package/dist/plugins/slashMenu/SlashMenu.svelte +0 -360
- package/dist/plugins/slashMenu/SlashMenu.svelte.d.ts +0 -11
- package/dist/plugins/toolbar/LinkCard.svelte +0 -118
- package/dist/plugins/toolbar/LinkCard.svelte.d.ts +0 -7
- package/dist/plugins/toolbar/Toolbar.svelte +0 -400
- package/dist/plugins/toolbar/Toolbar.svelte.d.ts +0 -9
- package/dist/plugins/triggers/TriggerMenu.svelte +0 -144
- package/dist/plugins/triggers/TriggerMenu.svelte.d.ts +0 -7
- package/dist/session/props.d.ts +0 -28
- package/dist/session/props.js +0 -162
- 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/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,110 @@ 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
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
459
|
+
operate = (operation, args) => {
|
|
460
|
+
const { edytor } = this;
|
|
461
|
+
const own = edytor.facade.prepare[operation];
|
|
462
|
+
const prepare = (a) => {
|
|
463
|
+
if (operation === 'insertText' && a[3] === undefined)
|
|
464
|
+
return own(a[0], a[1], a[2], insertionMarksAt(edytor, a[0], a[1]));
|
|
465
|
+
if (/^(deleteRange|replaceRange|insertFlow)$/.test(operation) && a[2] === undefined)
|
|
466
|
+
return own(a[0], a[1], viewOf(edytor));
|
|
467
|
+
return own(...a);
|
|
468
|
+
};
|
|
469
|
+
const block = edytor.idToBlock.block(subjectOf(args[0]) ?? 'root');
|
|
470
|
+
const text = typeof args[0] === 'string' && typeof args[1] === 'number'
|
|
471
|
+
? block.textAtOffset(args[1])?.text
|
|
472
|
+
: undefined;
|
|
473
|
+
return this.plan(operation, args, prepare, block, text);
|
|
457
474
|
};
|
|
458
|
-
/**
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
475
|
+
/**
|
|
476
|
+
* Write `plan` in the running command's transaction (a composed command's
|
|
477
|
+
* body writes its stages here): request the normalization of what its
|
|
478
|
+
* steps touch (read before the write), apply it, and show the blocks it
|
|
479
|
+
* moved. The caret's pending marks are a text insertion's at the caret,
|
|
480
|
+
* which consumes them; an atom inserted at the caret passes them to the
|
|
481
|
+
* caret after it. A refusal passes through.
|
|
482
|
+
* @internal
|
|
483
|
+
*/
|
|
484
|
+
write = (plan) => {
|
|
485
|
+
if (!('writes' in plan))
|
|
486
|
+
return plan;
|
|
487
|
+
const { facade, idToBlock, selection } = this.edytor;
|
|
488
|
+
const touched = plan.writes.flatMap((w) => this.#touched(w));
|
|
489
|
+
const { caret, pending } = selection;
|
|
490
|
+
const at = (op) => !!pending &&
|
|
491
|
+
!!caret &&
|
|
492
|
+
plan.writes.some((w) => w.op === op && w.id === caret.block.id && w.offset === caret.offset);
|
|
493
|
+
const [typed, atom] = [at('insertText'), at('insertInline')];
|
|
494
|
+
const result = facade.apply(plan);
|
|
495
|
+
for (const [id, hook] of touched)
|
|
496
|
+
this.request(id, hook);
|
|
497
|
+
if (typed)
|
|
498
|
+
selection.stage(undefined);
|
|
499
|
+
const after = atom ? caret.block.textAtOffset(caret.offset + 1) : null;
|
|
500
|
+
const value = after ? selection.textValue(after.text, after.offset) : null;
|
|
501
|
+
if (value?.kind === 'text')
|
|
502
|
+
selection.select(Object.freeze({ ...value, pending }));
|
|
503
|
+
for (const id of plan.effect.moves) {
|
|
504
|
+
const block = idToBlock.get(id);
|
|
505
|
+
if (block)
|
|
506
|
+
reveal(block);
|
|
507
|
+
}
|
|
508
|
+
return result;
|
|
509
|
+
};
|
|
510
|
+
/** The normalization a step asks for: the blocks whose content it writes, the parents whose children it changes. */
|
|
511
|
+
#touched(w) {
|
|
512
|
+
const { facade } = this.edytor;
|
|
513
|
+
const parent = (id) => facade.parentOf(id);
|
|
514
|
+
const children = (...ids) => ids.map((id) => [id ?? 'root', 'normalizeChildren']);
|
|
515
|
+
if (w.op === 'insertBlocks')
|
|
516
|
+
return [...children(w.parent), ...w.specs.map(({ id }) => [id, 'normalizeContent'])];
|
|
517
|
+
if (w.op === 'moveBlocks')
|
|
518
|
+
return children(w.parent, ...w.ids.map(parent));
|
|
519
|
+
if (w.op === 'deleteBlock')
|
|
520
|
+
return children(parent(w.id));
|
|
521
|
+
if (w.op === 'splitBlock')
|
|
522
|
+
return [[w.id, 'normalizeContent'], ...children(w.parent, parent(w.id))];
|
|
523
|
+
if (w.op === 'mergeBlocks')
|
|
524
|
+
return [[w.into, 'normalizeContent'], ...children(parent(w.from))];
|
|
525
|
+
if (w.op === 'setBlockType')
|
|
526
|
+
return [[w.id, 'normalizeContent'], ...children(w.id)];
|
|
527
|
+
if (w.op === 'patchData')
|
|
528
|
+
return w.id === undefined ? [] : [[w.id, 'normalizeContent']];
|
|
529
|
+
return [[w.id, 'normalizeContent']];
|
|
466
530
|
}
|
|
467
531
|
/**
|
|
468
532
|
* Run `body` with `lead` (a plan prepared now) composed into the first
|
|
@@ -515,8 +579,9 @@ export class Dispatcher {
|
|
|
515
579
|
}
|
|
516
580
|
const ops = rest[0];
|
|
517
581
|
const caret = target;
|
|
518
|
-
// `{ block, offset }`: block offsets, mapped to the text segment that shows the offset.
|
|
519
|
-
const
|
|
582
|
+
// `{ block, offset }`: block offsets (a handle or an id), mapped to the text segment that shows the offset.
|
|
583
|
+
const block = typeof caret?.block === 'string' ? this.edytor.idToBlock.get(caret.block) : caret?.block;
|
|
584
|
+
const at = block?.textAtOffset(Math.max(0, caret.offset));
|
|
520
585
|
return this.#caret(at?.text, at?.offset ?? 0, ops);
|
|
521
586
|
};
|
|
522
587
|
#caret = (text, offset, ops) => {
|
|
@@ -533,42 +598,22 @@ export class Dispatcher {
|
|
|
533
598
|
finally {
|
|
534
599
|
this.authoring = outer;
|
|
535
600
|
}
|
|
536
|
-
if (
|
|
601
|
+
if (out.status === 'refused')
|
|
537
602
|
return out;
|
|
538
603
|
}
|
|
539
604
|
if (!text || !value || value.kind === 'none')
|
|
540
605
|
return out;
|
|
541
|
-
selection.clearModelSelectionPreservation();
|
|
542
606
|
selection.select(value);
|
|
543
607
|
// Declared before its operations: gone with them after all, the seam.
|
|
544
608
|
if (!selection.projection.start)
|
|
545
609
|
selection.restoreDeadSelectionEndpoints();
|
|
546
|
-
this.#
|
|
610
|
+
if (this.#last)
|
|
611
|
+
this.#last = { ...this.#last, selection: selection.value };
|
|
547
612
|
return out;
|
|
548
613
|
};
|
|
549
614
|
/**
|
|
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).
|
|
615
|
+
* Request a normalization pass of block `id` (deduped against the pending
|
|
616
|
+
* ones): it runs at the end of the command's transaction, inside it.
|
|
572
617
|
* @internal
|
|
573
618
|
*/
|
|
574
619
|
request = (id, normalize) => {
|
|
@@ -578,15 +623,18 @@ export class Dispatcher {
|
|
|
578
623
|
};
|
|
579
624
|
/**
|
|
580
625
|
* 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
|
-
*
|
|
626
|
+
* inside it, also when the transaction's callback threw: its writes stay.
|
|
627
|
+
* A pass is the block's kind's normalizer, over handles that read the
|
|
628
|
+
* index, so it sees what the command (and the previous pass) wrote; the
|
|
629
|
+
* work it answers runs in the same transaction (its operations are
|
|
630
|
+
* steps), and the block is normalized again, at most {@link MAX_PASSES}
|
|
631
|
+
* times.
|
|
584
632
|
* @internal
|
|
585
633
|
*/
|
|
586
634
|
drain = () => {
|
|
587
|
-
if (this
|
|
635
|
+
if (this.#draining)
|
|
588
636
|
return;
|
|
589
|
-
this
|
|
637
|
+
this.#draining = true;
|
|
590
638
|
const passes = new Map();
|
|
591
639
|
const { edytor } = this;
|
|
592
640
|
try {
|
|
@@ -605,25 +653,27 @@ export class Dispatcher {
|
|
|
605
653
|
counts.set(id, count);
|
|
606
654
|
if (count > MAX_PASSES) {
|
|
607
655
|
if (count === MAX_PASSES + 1)
|
|
608
|
-
console.warn(`edytor: ${normalize
|
|
656
|
+
console.warn(`edytor: ${normalize} on block "${id}" exceeded ${MAX_PASSES - 1} passes — a plugin normalizer is not converging; skipping further passes`);
|
|
609
657
|
continue;
|
|
610
658
|
}
|
|
611
659
|
this.current = entry;
|
|
612
|
-
this.entering = true;
|
|
613
660
|
this.active = true;
|
|
614
661
|
try {
|
|
615
|
-
|
|
662
|
+
const work = edytor.definitionOf(block.type)[normalize]?.({ block });
|
|
663
|
+
if (work) {
|
|
664
|
+
edytor.transact(work);
|
|
665
|
+
this.request(id, normalize);
|
|
666
|
+
}
|
|
616
667
|
}
|
|
617
668
|
finally {
|
|
618
669
|
this.active = false;
|
|
619
|
-
this.entering = false;
|
|
620
670
|
}
|
|
621
671
|
}
|
|
622
672
|
}
|
|
623
673
|
finally {
|
|
624
674
|
this.queue = [];
|
|
625
675
|
this.current = null;
|
|
626
|
-
this
|
|
676
|
+
this.#draining = false;
|
|
627
677
|
}
|
|
628
678
|
};
|
|
629
679
|
/**
|
|
@@ -646,10 +696,6 @@ export class Dispatcher {
|
|
|
646
696
|
const { history, selection } = this.edytor;
|
|
647
697
|
return history.continues(selection.value) ? undefined : 'before';
|
|
648
698
|
}
|
|
649
|
-
refuse(operation) {
|
|
650
|
-
this.#refused(operation);
|
|
651
|
-
return undefined;
|
|
652
|
-
}
|
|
653
699
|
/** Record `operation` as refused; answers that result. */
|
|
654
700
|
#refused(operation) {
|
|
655
701
|
return (this.#last = { operation, status: 'refused' });
|
|
@@ -689,76 +735,28 @@ export class Dispatcher {
|
|
|
689
735
|
}
|
|
690
736
|
}
|
|
691
737
|
/**
|
|
692
|
-
* The planned steps as hooks see them
|
|
693
|
-
*
|
|
694
|
-
*
|
|
695
|
-
*
|
|
696
|
-
*
|
|
697
|
-
* yet: no mapping. A document data patch shows on the root.)
|
|
738
|
+
* The planned steps as hooks see them: each as the operation it performs,
|
|
739
|
+
* with that operation's arguments (`ARGS`), about the block it writes
|
|
740
|
+
* (the root for the document's data). A step that is the command itself
|
|
741
|
+
* (same name, same block) is not repeated; a write into a block the plan
|
|
742
|
+
* creates is part of that creation.
|
|
698
743
|
*/
|
|
699
744
|
steps(writes, creates, command) {
|
|
700
|
-
const { idToBlock, root } = this.edytor;
|
|
745
|
+
const { idToBlock, root, facade } = this.edytor;
|
|
701
746
|
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
747
|
const out = [];
|
|
705
|
-
const show = (operation, block, payload, text) => out.push({ operation, block, payload, ...(text ? { text } : {}) });
|
|
706
748
|
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)
|
|
749
|
+
const keeps = w.op === 'deleteBlock' && facade.childrenIds(w.id).some((c) => !w.removes.includes(c));
|
|
750
|
+
const args = ARGS[w.op](w, keeps);
|
|
751
|
+
const target = subjectOf(args[0]);
|
|
752
|
+
const block = target === null ? root : idToBlock.get(target);
|
|
753
|
+
if ((target !== null && created.has(target)) || !block)
|
|
716
754
|
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)
|
|
755
|
+
if (w.op === command.operation && block === command.block)
|
|
722
756
|
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
|
-
}
|
|
757
|
+
const text = typeof args[1] === 'number' ? block.textAtOffset(args[1])?.text : undefined;
|
|
758
|
+
out.push({ operation: w.op, block, payload: args, ...(text && { text }) });
|
|
761
759
|
}
|
|
762
|
-
return out
|
|
760
|
+
return out;
|
|
763
761
|
}
|
|
764
762
|
}
|
|
@@ -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
|
/**
|