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/crdt/text/model.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Y } from '../engine.js';
|
|
2
|
+
import { asYDoc, asYNode, attrItems, engineOps, newNode as makeNode, rangeCursorOf, storeOf } from '../structs.js';
|
|
2
3
|
import { CONTENT, CONTENT_NODE, ID, NONCE, SCHEMA } from '../schema.js';
|
|
3
4
|
import { DEV } from 'esm-env';
|
|
4
5
|
import { hash32, hash53 } from '../rand.js';
|
|
@@ -105,372 +106,361 @@ export const claimGraph = (blocks) => {
|
|
|
105
106
|
};
|
|
106
107
|
/** `owner(b)` for every block (see {@link claimGraph}). */
|
|
107
108
|
export const computeOwners = (blocks) => claimGraph(blocks).owners;
|
|
108
|
-
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const effectiveClaims = (doc, blocks, rows, delim, streams) => {
|
|
162
|
-
/** Live index of unit `ref` (assoc 0) in `text`, or `null` when it is not `text`'s. */
|
|
163
|
-
const indexIn = (text, ref) => {
|
|
164
|
-
const itemId = text._item?.id;
|
|
165
|
-
if (!itemId)
|
|
166
|
-
return null;
|
|
167
|
-
const abs = Y.createAbsolutePositionFromRelativePosition(Y.createRelativePositionFromJSON({
|
|
168
|
-
type: { client: itemId.client, clock: itemId.clock },
|
|
169
|
-
item: { client: ref.c, clock: ref.k },
|
|
170
|
-
assoc: 0
|
|
171
|
-
}), asYDoc(doc), false);
|
|
172
|
-
return abs === null || abs.type !== text ? null : abs.index;
|
|
173
|
-
};
|
|
174
|
-
const targetOf = (holder, c) => {
|
|
175
|
-
if (c.a === undefined)
|
|
176
|
-
return holder;
|
|
177
|
-
const s = streams.get(holder);
|
|
178
|
-
const row = s && rows.get(s.text);
|
|
179
|
-
if (row === undefined || indexIn(row.text, c.a) === null)
|
|
180
|
-
return holder;
|
|
181
|
-
const cuts = [];
|
|
182
|
-
row.bounds.forEach((b, j) => {
|
|
183
|
-
if (delim.get(b.s) === b.key)
|
|
184
|
-
cuts.push(j);
|
|
185
|
-
});
|
|
186
|
-
const head = delim.has(row.home) ? null : row.home;
|
|
187
|
-
// The gap before `r`: a live boundary's own index, else the boundaries before it.
|
|
188
|
-
let gap = row.bounds.length;
|
|
189
|
-
if (c.r != null) {
|
|
190
|
-
const key = `${c.r.c}:${c.r.k}`;
|
|
191
|
-
const at = row.bounds.findIndex((b) => b.key === key);
|
|
192
|
-
if (at >= 0)
|
|
193
|
-
gap = at;
|
|
194
|
-
else {
|
|
195
|
-
const p = indexIn(row.text, c.r);
|
|
196
|
-
if (p === null)
|
|
197
|
-
return holder;
|
|
198
|
-
gap = row.bounds.filter((b) => b.at < p).length;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
const segment = (g) => cuts.filter((j) => j < g).length;
|
|
202
|
-
const k = segment(gap);
|
|
203
|
-
// The holder's own segment: the one its stream starts in.
|
|
204
|
-
const k0 = segment(row.bounds.filter((b) => b.at < s.start).length);
|
|
205
|
-
if (k < k0)
|
|
206
|
-
return holder;
|
|
207
|
-
return (k === 0 ? head : row.bounds[cuts[k - 1]].s) ?? holder;
|
|
208
|
-
};
|
|
209
|
-
const own = new Map();
|
|
210
|
-
const moved = new Map();
|
|
211
|
-
for (const [h, rec] of blocks) {
|
|
212
|
-
const stays = [];
|
|
213
|
-
for (const c of rec.listClaims ?? rec.claims) {
|
|
214
|
-
const t = targetOf(h, c);
|
|
215
|
-
if (t === h)
|
|
216
|
-
stays.push(c);
|
|
217
|
-
else {
|
|
218
|
-
let into = moved.get(t);
|
|
219
|
-
if (into === undefined)
|
|
220
|
-
moved.set(t, (into = []));
|
|
221
|
-
into.push({ ...c, holder: h });
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
own.set(h, stays);
|
|
225
|
-
}
|
|
226
|
-
for (const [t, list] of moved) {
|
|
227
|
-
if (!own.has(t))
|
|
228
|
-
continue;
|
|
229
|
-
list.sort((x, y) => cmpStamp(x.stamp, y.stamp));
|
|
230
|
-
own.set(t, [...own.get(t), ...list]);
|
|
231
|
-
}
|
|
232
|
-
return own;
|
|
233
|
-
};
|
|
234
|
-
const computeOwnership = (doc, given) => {
|
|
235
|
-
const rows = [];
|
|
236
|
-
for (const rec of given.values())
|
|
237
|
-
if (rec.content)
|
|
238
|
-
rows.push(scanText(rec.id, rec.content));
|
|
239
|
-
const delim = delimiters(given, rows);
|
|
240
|
-
const streams = new Map();
|
|
241
|
-
const inText = new Map();
|
|
242
|
-
for (const row of rows) {
|
|
243
|
-
const list = placeText(row, delim);
|
|
244
|
-
inText.set(row.home, list);
|
|
245
|
-
for (const s of list)
|
|
246
|
-
streams.set(s.block, s);
|
|
247
|
-
}
|
|
248
|
-
// The records with their effective claims (`merge.claim.anchor`).
|
|
249
|
-
const effective = effectiveClaims(doc, given, new Map(rows.map((row) => [row.text, row])), delim, streams);
|
|
250
|
-
const blocks = new Map();
|
|
251
|
-
for (const [id, rec] of given)
|
|
252
|
-
blocks.set(id, {
|
|
253
|
-
...rec,
|
|
254
|
-
listClaims: rec.listClaims ?? rec.claims,
|
|
255
|
-
claims: effective.get(id) ?? rec.claims
|
|
256
|
-
});
|
|
257
|
-
const { owners, top } = claimGraph(blocks);
|
|
258
|
-
const ownerOf = (b) => owners.get(b) ?? DEAD;
|
|
259
|
-
const own = {
|
|
260
|
-
ownerOf,
|
|
261
|
-
hidden: (b) => ownerOf(b) !== b,
|
|
262
|
-
top: (m) => top.get(m),
|
|
263
|
-
streamOf: (b) => streams.get(b),
|
|
264
|
-
streamsIn: (home) => inText.get(home) ?? [],
|
|
265
|
-
streamAt: (home, i) => (inText.get(home) ?? []).find((x) => x.start <= i && i <= x.end),
|
|
266
|
-
display: (b) => displayOf(b, blocks, own),
|
|
267
|
-
claimsOf: (b) => blocks.get(b)?.claims ?? []
|
|
268
|
-
};
|
|
269
|
-
return own;
|
|
270
|
-
};
|
|
271
|
-
/** `b`'s display pieces (`[]` when hidden or streamless and claimless). */
|
|
272
|
-
const flatten = (b, blocks, own) => {
|
|
273
|
-
void blocks;
|
|
274
|
-
return own.display(b) ?? [];
|
|
109
|
+
const D = bindDeletes(Y);
|
|
110
|
+
const ops = engineOps(Y);
|
|
111
|
+
/** Construct a detached v14 node, viewed through the structural interface. */
|
|
112
|
+
export const newNode = (name) => makeNode(Y, name);
|
|
113
|
+
/** Anchor → live index in `text`, or `null` when its item is not integrated here. */
|
|
114
|
+
export const resolveAnchor = (doc, text, anchor) => {
|
|
115
|
+
const item = text._item;
|
|
116
|
+
// A text end: the text's own length, while the text is held (not collected).
|
|
117
|
+
if (anchor.i === null)
|
|
118
|
+
return !item?.id || item.content?.type === text ? (anchor.a < 0 ? 0 : text.length) : null;
|
|
119
|
+
if (!item?.id)
|
|
120
|
+
return null;
|
|
121
|
+
return Y.indexOfId(asYDoc(doc), Y.createID(anchor.i.c, anchor.i.k), anchor.a)?.index ?? null;
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Live index → anchor bound on the `assoc` side: `assoc < 0` binds the unit
|
|
125
|
+
* before `index` (an insert at `index` lands right of it; `i: null` at the
|
|
126
|
+
* text start), `assoc >= 0` the unit at `index` (`i: null` at the text end).
|
|
127
|
+
*/
|
|
128
|
+
export const anchorAt = (text, index, assoc) => {
|
|
129
|
+
const id = Y.idAtIndex(asYNode(text), index, assoc);
|
|
130
|
+
return { i: id ? { c: id.client, k: id.clock } : null, a: assoc < 0 ? -1 : 0 };
|
|
131
|
+
};
|
|
132
|
+
/** A bounded read cursor on `text` (live-content space). */
|
|
133
|
+
export const openRangeCursor = (text) => rangeCursorOf(Y, text);
|
|
134
|
+
export const itemsOfRange = (text, i0, i1) => readRange(openRangeCursor(text), i0, i1);
|
|
135
|
+
/** The items of `segs`, one cursor per backing text. */
|
|
136
|
+
export const readSegs = (segs, stats) => {
|
|
137
|
+
const out = [];
|
|
138
|
+
const cursors = new Map();
|
|
139
|
+
for (const seg of segs) {
|
|
140
|
+
let cur = cursors.get(seg.text);
|
|
141
|
+
if (cur === undefined)
|
|
142
|
+
cursors.set(seg.text, (cur = openRangeCursor(seg.text)));
|
|
143
|
+
readRange(cur, seg.i0, seg.i1, stats, out);
|
|
144
|
+
}
|
|
145
|
+
return out;
|
|
146
|
+
};
|
|
147
|
+
/** A from-scratch ownership context over `blocks` (every text scanned). */
|
|
148
|
+
/**
|
|
149
|
+
* The effective claims of every block, from scratch (`merge.claim.anchor`;
|
|
150
|
+
* the index keeps them incrementally, `text/runs.ts`): an anchored claim
|
|
151
|
+
* goes to the block of the segment just before its `r` (the text's last
|
|
152
|
+
* segment when `r` is null) in the row of its holder's stream, when that
|
|
153
|
+
* segment is the holder's or a later one.
|
|
154
|
+
*/
|
|
155
|
+
const effectiveClaims = (doc, blocks, rows, delim, streams) => {
|
|
156
|
+
/** Live index of unit `ref` (assoc 0) in `text`, or `null` when it is not `text`'s. */
|
|
157
|
+
const indexIn = (text, ref) => {
|
|
158
|
+
if (!text._item?.id)
|
|
159
|
+
return null;
|
|
160
|
+
const abs = Y.indexOfId(asYDoc(doc), Y.createID(ref.c, ref.k));
|
|
161
|
+
return abs === null || abs.type !== text ? null : abs.index;
|
|
275
162
|
};
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
.
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
* `marks` (an operation for each mark its gap gave it otherwise).
|
|
288
|
-
*/
|
|
289
|
-
const insertIntoText = (doc, blocks, own, b, offset, payload, marks) => {
|
|
290
|
-
const segs = flatten(b, blocks, own);
|
|
291
|
-
const hit = locate(segs, Math.max(0, Math.min(offset, ownedLength(segs))));
|
|
292
|
-
if (hit === null)
|
|
293
|
-
throw new Error(`insertIntoText: "${b}" has no stream`);
|
|
294
|
-
const text = hit.seg.text;
|
|
295
|
-
plain(text, () => {
|
|
296
|
-
if (typeof payload !== 'string')
|
|
297
|
-
return text.insertInGap(hit.idx, [payload]);
|
|
298
|
-
text.insertInGap(hit.idx, payload);
|
|
299
|
-
const at = openRangeCursor(text).read(hit.idx, hit.idx + payload.length);
|
|
300
|
-
const have = at.find((p) => !p.deleted && p.len > 0)?.formats;
|
|
301
|
-
fitMarks(doc, text, hit.idx, payload.length, have, marks);
|
|
163
|
+
const targetOf = (holder, c) => {
|
|
164
|
+
if (c.a === undefined)
|
|
165
|
+
return holder;
|
|
166
|
+
const s = streams.get(holder);
|
|
167
|
+
const row = s && rows.get(s.text);
|
|
168
|
+
if (row === undefined || indexIn(row.text, c.a) === null)
|
|
169
|
+
return holder;
|
|
170
|
+
const cuts = [];
|
|
171
|
+
row.bounds.forEach((b, j) => {
|
|
172
|
+
if (delim.get(b.s) === b.key)
|
|
173
|
+
cuts.push(j);
|
|
302
174
|
});
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
for (const r of rangesOf(flatten(b, blocks, own), offset, offset + length))
|
|
317
|
-
plain(r.text, () => writeMarks(doc, r.text, r.a, r.b - r.a, formats));
|
|
318
|
-
};
|
|
319
|
-
/**
|
|
320
|
-
* Delete the content of streams `streams` (the room's purge of a
|
|
321
|
-
* block deleted past the horizon): every piece, so no boundary goes and
|
|
322
|
-
* each stream still delimits, renderer-free, writing no delete mark.
|
|
323
|
-
* Streams of one text are deleted from its end, so the indices the
|
|
324
|
-
* caller read stay valid.
|
|
325
|
-
*/
|
|
326
|
-
const purgeStreams = (streams) => {
|
|
327
|
-
const ordered = [...streams].sort((a, b) => b.start - a.start);
|
|
328
|
-
for (const s of ordered) {
|
|
329
|
-
const parts = pieces(s).filter(([a, b]) => b > a);
|
|
330
|
-
for (let i = parts.length - 1; i >= 0; i--) {
|
|
331
|
-
const [a, b] = parts[i];
|
|
332
|
-
plain(s.text, () => s.text.delete(a, b - a));
|
|
175
|
+
const head = delim.has(row.home) ? null : row.home;
|
|
176
|
+
// The gap before `r`: a live boundary's own index, else the boundaries before it.
|
|
177
|
+
let gap = row.bounds.length;
|
|
178
|
+
if (c.r != null) {
|
|
179
|
+
const key = `${c.r.c}:${c.r.k}`;
|
|
180
|
+
const at = row.bounds.findIndex((b) => b.key === key);
|
|
181
|
+
if (at >= 0)
|
|
182
|
+
gap = at;
|
|
183
|
+
else {
|
|
184
|
+
const p = indexIn(row.text, c.r);
|
|
185
|
+
if (p === null)
|
|
186
|
+
return holder;
|
|
187
|
+
gap = row.bounds.filter((b) => b.at < p).length;
|
|
333
188
|
}
|
|
334
189
|
}
|
|
190
|
+
const segment = (g) => cuts.filter((j) => j < g).length;
|
|
191
|
+
const k = segment(gap);
|
|
192
|
+
// The holder's own segment: the one its stream starts in.
|
|
193
|
+
const k0 = segment(row.bounds.filter((b) => b.at < s.start).length);
|
|
194
|
+
if (k < k0)
|
|
195
|
+
return holder;
|
|
196
|
+
return (k === 0 ? head : row.bounds[cuts[k - 1]].s) ?? holder;
|
|
335
197
|
};
|
|
336
|
-
|
|
337
|
-
const
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
198
|
+
const own = new Map();
|
|
199
|
+
const moved = new Map();
|
|
200
|
+
for (const [h, rec] of blocks) {
|
|
201
|
+
const stays = [];
|
|
202
|
+
for (const c of rec.listClaims ?? rec.claims) {
|
|
203
|
+
const t = targetOf(h, c);
|
|
204
|
+
if (t === h)
|
|
205
|
+
stays.push(c);
|
|
206
|
+
else {
|
|
207
|
+
let into = moved.get(t);
|
|
208
|
+
if (into === undefined)
|
|
209
|
+
moved.set(t, (into = []));
|
|
210
|
+
into.push({ ...c, holder: h });
|
|
347
211
|
}
|
|
348
212
|
}
|
|
349
|
-
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
213
|
+
own.set(h, stays);
|
|
214
|
+
}
|
|
215
|
+
for (const [t, list] of moved) {
|
|
216
|
+
if (!own.has(t))
|
|
217
|
+
continue;
|
|
218
|
+
list.sort((x, y) => cmpStamp(x.stamp, y.stamp));
|
|
219
|
+
own.set(t, [...own.get(t), ...list]);
|
|
220
|
+
}
|
|
221
|
+
return own;
|
|
222
|
+
};
|
|
223
|
+
export const computeOwnership = (doc, given) => {
|
|
224
|
+
const rows = [];
|
|
225
|
+
for (const rec of given.values())
|
|
226
|
+
if (rec.content)
|
|
227
|
+
rows.push(scanText(rec.id, rec.content));
|
|
228
|
+
const delim = delimiters(given, rows);
|
|
229
|
+
const streams = new Map();
|
|
230
|
+
const inText = new Map();
|
|
231
|
+
for (const row of rows) {
|
|
232
|
+
const list = placeText(row, delim);
|
|
233
|
+
inText.set(row.home, list);
|
|
234
|
+
for (const s of list)
|
|
235
|
+
streams.set(s.block, s);
|
|
236
|
+
}
|
|
237
|
+
// The records with their effective claims (`merge.claim.anchor`).
|
|
238
|
+
const effective = effectiveClaims(doc, given, new Map(rows.map((row) => [row.text, row])), delim, streams);
|
|
239
|
+
const blocks = new Map();
|
|
240
|
+
for (const [id, rec] of given)
|
|
241
|
+
blocks.set(id, {
|
|
242
|
+
...rec,
|
|
243
|
+
listClaims: rec.listClaims ?? rec.claims,
|
|
244
|
+
claims: effective.get(id) ?? rec.claims
|
|
245
|
+
});
|
|
246
|
+
const { owners, top } = claimGraph(blocks);
|
|
247
|
+
const ownerOf = (b) => owners.get(b) ?? DEAD;
|
|
248
|
+
const own = {
|
|
249
|
+
ownerOf,
|
|
250
|
+
hidden: (b) => ownerOf(b) !== b,
|
|
251
|
+
top: (m) => top.get(m),
|
|
252
|
+
streamOf: (b) => streams.get(b),
|
|
253
|
+
streamsIn: (home) => inText.get(home) ?? [],
|
|
254
|
+
streamAt: (home, i) => (inText.get(home) ?? []).find((x) => x.start <= i && i <= x.end),
|
|
255
|
+
display: (b) => displayOf(b, blocks, own),
|
|
256
|
+
claimsOf: (b) => blocks.get(b)?.claims ?? []
|
|
388
257
|
};
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
258
|
+
return own;
|
|
259
|
+
};
|
|
260
|
+
/** `b`'s display pieces (`[]` when hidden or streamless and claimless). */
|
|
261
|
+
export const flatten = (b, blocks, own) => {
|
|
262
|
+
void blocks;
|
|
263
|
+
return own.display(b) ?? [];
|
|
264
|
+
};
|
|
265
|
+
export const contentItemsOf = (b, blocks, own) => readSegs(flatten(b, blocks, own));
|
|
266
|
+
export const blockTextOf = (b, blocks, own) => contentItemsOf(b, blocks, own)
|
|
267
|
+
.map((i) => (i.kind === 'text' ? i.text : ''))
|
|
268
|
+
.join('');
|
|
269
|
+
// ── writes (inside doc.transact; the plan clamped offsets) ────────
|
|
270
|
+
/**
|
|
271
|
+
* Insert at a display offset, beside the boundary the engine walk and the
|
|
272
|
+
* left side choose. The display must be non-empty: a streamless block gets
|
|
273
|
+
* its own text first ({@link ownText}). The content goes in its gap
|
|
274
|
+
* (`insertInGap`, fork patch YP13: after the marks attached to the text before it,
|
|
275
|
+
* before those attached to the text after it); text then shows exactly
|
|
276
|
+
* `marks` (an operation for each mark its gap gave it otherwise).
|
|
277
|
+
*/
|
|
278
|
+
export const insertIntoText = (doc, blocks, own, b, offset, payload, marks) => {
|
|
279
|
+
const segs = flatten(b, blocks, own);
|
|
280
|
+
const hit = locate(segs, Math.max(0, Math.min(offset, ownedLength(segs))));
|
|
281
|
+
if (hit === null)
|
|
282
|
+
throw new Error(`insertIntoText: "${b}" has no stream`);
|
|
283
|
+
const text = hit.seg.text;
|
|
284
|
+
if (typeof payload !== 'string')
|
|
285
|
+
return text.insertInGap(hit.idx, [payload]);
|
|
286
|
+
text.insertInGap(hit.idx, payload);
|
|
287
|
+
const at = openRangeCursor(text).read(hit.idx, hit.idx + payload.length);
|
|
288
|
+
const have = at.find((p) => !p.deleted && p.len > 0)?.formats;
|
|
289
|
+
fitMarks(doc, text, hit.idx, payload.length, have, marks);
|
|
290
|
+
};
|
|
291
|
+
/** The per-stream delete: each range lies inside one stream's pieces, so no boundary is ever removed. */
|
|
292
|
+
export const deleteRange = (doc, blocks, own, b, offset, length) => {
|
|
293
|
+
const spans = [];
|
|
294
|
+
for (const r of rangesOf(flatten(b, blocks, own), offset, offset + length)) {
|
|
295
|
+
for (const p of openRangeCursor(r.text).read(r.a, r.b))
|
|
296
|
+
if (!p.deleted && p.len > 0 && (p.content.str !== undefined || 'type' in p.content))
|
|
297
|
+
spans.push({ c: p.id.client, k: p.id.clock, n: p.len });
|
|
298
|
+
r.text.delete(r.a, r.b - r.a);
|
|
299
|
+
}
|
|
300
|
+
D.markDeleted(doc, spans);
|
|
301
|
+
};
|
|
302
|
+
export const formatRangeIn = (doc, blocks, own, b, offset, length, formats) => {
|
|
303
|
+
for (const r of rangesOf(flatten(b, blocks, own), offset, offset + length))
|
|
304
|
+
writeMarks(doc, r.text, r.a, r.b - r.a, formats);
|
|
305
|
+
};
|
|
306
|
+
/**
|
|
307
|
+
* Delete the content of streams `streams` (the room's purge of a
|
|
308
|
+
* block deleted past the horizon): every piece, so no boundary goes and
|
|
309
|
+
* each stream still delimits, writing no delete mark.
|
|
310
|
+
* Streams of one text are deleted from its end, so the indices the
|
|
311
|
+
* caller read stay valid.
|
|
312
|
+
*/
|
|
313
|
+
export const purgeStreams = (streams) => {
|
|
314
|
+
const ordered = [...streams].sort((a, b) => b.start - a.start);
|
|
315
|
+
for (const s of ordered) {
|
|
316
|
+
const parts = pieces(s).filter(([a, b]) => b > a);
|
|
317
|
+
for (let i = parts.length - 1; i >= 0; i--) {
|
|
318
|
+
const [a, b] = parts[i];
|
|
319
|
+
s.text.delete(a, b - a);
|
|
405
320
|
}
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
const it = x?.id;
|
|
420
|
-
return it === undefined ? '-' : `${it.client}:${it.clock}`;
|
|
421
|
-
};
|
|
422
|
-
const seed = [
|
|
423
|
-
`own/${SCHEMA.name}@${SCHEMA.version}`,
|
|
424
|
-
rec.id,
|
|
425
|
-
String(rec.n),
|
|
426
|
-
idOf(rec.node._item),
|
|
427
|
-
idOf(map.get(NONCE)),
|
|
428
|
-
idOf(map.get(CONTENT))
|
|
429
|
-
].join('|');
|
|
430
|
-
const writer = hash53(seed) || 1;
|
|
431
|
-
const to = hash32(`${seed}|n`);
|
|
432
|
-
const store = storeOf(doc);
|
|
433
|
-
// The derivation is fresh per incarnation: a writer that already wrote
|
|
434
|
-
// here is another block's (a hash collision, the known residual class).
|
|
435
|
-
if (DEV && store.getClock(writer) !== 0)
|
|
436
|
-
console.warn(`[edytor] own-text writer ${writer} of block ${rec.id} collides`);
|
|
437
|
-
const local = doc.clientID;
|
|
438
|
-
doc.clientID = writer;
|
|
439
|
-
try {
|
|
440
|
-
rec.node.setAttr(CONTENT, newNode(CONTENT_NODE));
|
|
441
|
-
rec.node.setAttr(NONCE, to);
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
/** The inline atom `inlineId` in `b`'s display: its text, engine index and node. */
|
|
324
|
+
export const findAtom = (own, b, inlineId) => {
|
|
325
|
+
for (const s of own.display(b) ?? []) {
|
|
326
|
+
let at = 0;
|
|
327
|
+
for (let it = nodeStart(s.text); it !== null && at < s.i1; it = it.right) {
|
|
328
|
+
if (it.deleted || it.countable === false)
|
|
329
|
+
continue;
|
|
330
|
+
const node = it.content.type;
|
|
331
|
+
if (node !== undefined && at >= s.i0 && node.getAttr(ID) === inlineId)
|
|
332
|
+
return { text: s.text, at, node };
|
|
333
|
+
at += it.length;
|
|
442
334
|
}
|
|
443
|
-
|
|
444
|
-
|
|
335
|
+
}
|
|
336
|
+
return null;
|
|
337
|
+
};
|
|
338
|
+
/**
|
|
339
|
+
* Split `b`'s display at `offset` for the new block `newId` (incarnation
|
|
340
|
+
* `n`): one boundary through fork patch YP7 at the end of the gap, and the claims that
|
|
341
|
+
* follow the split point — every claim of the stream's own block, then each
|
|
342
|
+
* holder's claims after the one that led down — returned for re-insertion
|
|
343
|
+
* on the new block and deleted from their holders. No text is copied.
|
|
344
|
+
*/
|
|
345
|
+
export const splitAt = (blocks, own, b, offset, newId, n) => {
|
|
346
|
+
const segs = flatten(b, blocks, own);
|
|
347
|
+
const hit = locate(segs, Math.max(0, Math.min(offset, ownedLength(segs))));
|
|
348
|
+
if (hit === null)
|
|
349
|
+
throw new Error(`splitAt: "${b}" has no stream`);
|
|
350
|
+
const { seg, idx } = hit;
|
|
351
|
+
const moved = [];
|
|
352
|
+
// A claim another block stores (its anchor moved it here) is deleted from that list.
|
|
353
|
+
const after = (holder, from) => blocks
|
|
354
|
+
.get(holder)
|
|
355
|
+
.claims.slice(from)
|
|
356
|
+
.forEach((c) => moved.push({ holder: c.holder ?? holder, claim: c }));
|
|
357
|
+
after(seg.block, 0);
|
|
358
|
+
for (let i = seg.path.length - 1; i >= 0; i--)
|
|
359
|
+
after(seg.path[i].holder, seg.path[i].entry + 1);
|
|
360
|
+
const text = seg.text;
|
|
361
|
+
text.insertAtGapEnd(idx, [{ s: newId, n }]);
|
|
362
|
+
const byHolder = new Map();
|
|
363
|
+
// An implicit claim (a losing incarnation) has no list entry: it is
|
|
364
|
+
// only written, explicitly, on the new block, whose claim outranks it.
|
|
365
|
+
for (const { holder, claim } of moved)
|
|
366
|
+
if (claim.seqIndex >= 0)
|
|
367
|
+
byHolder.set(holder, [...(byHolder.get(holder) ?? []), claim.seqIndex]);
|
|
368
|
+
for (const [holder, idxs] of byHolder) {
|
|
369
|
+
const list = blocks.get(holder).claimsNode;
|
|
370
|
+
for (const i of idxs.sort((x, y) => y - x))
|
|
371
|
+
list.delete(i, 1);
|
|
372
|
+
}
|
|
373
|
+
// Re-inserted with their anchors: the region they end is the new block's now.
|
|
374
|
+
return moved.map(({ claim: c }) => c.a === undefined ? { m: c.m } : { m: c.m, a: c.a, r: c.r ?? null });
|
|
375
|
+
};
|
|
376
|
+
/**
|
|
377
|
+
* Append a merge claim `{m: from}` to `into`'s claims list, anchored to
|
|
378
|
+
* the end of `into`'s stream (`merge.claim.anchor`): its last unit (its
|
|
379
|
+
* opening boundary when empty; none at an own text's start) and the item
|
|
380
|
+
* after it.
|
|
381
|
+
*/
|
|
382
|
+
export const claimInto = (blocks, own, from, into) => {
|
|
383
|
+
const list = blocks.get(into).claimsNode;
|
|
384
|
+
const claim = { m: from };
|
|
385
|
+
const s = own.streamOf(into);
|
|
386
|
+
if (s !== undefined) {
|
|
387
|
+
const a = anchorAt(s.text, s.end, -1).i;
|
|
388
|
+
if (a !== null) {
|
|
389
|
+
claim.a = a;
|
|
390
|
+
claim.r = anchorAt(s.text, s.end, 0).i;
|
|
445
391
|
}
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
contentItemsOf,
|
|
463
|
-
blockTextOf,
|
|
464
|
-
insertIntoText,
|
|
465
|
-
deleteRange,
|
|
466
|
-
formatRangeIn,
|
|
467
|
-
purgeStreams,
|
|
468
|
-
findAtom,
|
|
469
|
-
splitAt,
|
|
470
|
-
claimInto,
|
|
471
|
-
ownText
|
|
392
|
+
}
|
|
393
|
+
list.insert(list.length, [claim]);
|
|
394
|
+
};
|
|
395
|
+
/**
|
|
396
|
+
* Give streamless block `rec` its own text and re-mint its nonce, so a late
|
|
397
|
+
* copy of its old boundary is inert. Both writes carry a writer id
|
|
398
|
+
* derived from the block's node and its dead incarnation, so replicas that
|
|
399
|
+
* type into the block concurrently write the SAME items and both typings
|
|
400
|
+
* land in one text (the seed writer's mechanism). Returns the nonce
|
|
401
|
+
* change (the caller moves the block's attribution record with it).
|
|
402
|
+
*/
|
|
403
|
+
export const ownText = (doc, rec) => {
|
|
404
|
+
const map = attrItems(rec.node);
|
|
405
|
+
const idOf = (x) => {
|
|
406
|
+
const it = x?.id;
|
|
407
|
+
return it === undefined ? '-' : `${it.client}:${it.clock}`;
|
|
472
408
|
};
|
|
409
|
+
const seed = [
|
|
410
|
+
`own/${SCHEMA.name}@${SCHEMA.version}`,
|
|
411
|
+
rec.id,
|
|
412
|
+
String(rec.n),
|
|
413
|
+
idOf(rec.node._item),
|
|
414
|
+
idOf(map.get(NONCE)),
|
|
415
|
+
idOf(map.get(CONTENT))
|
|
416
|
+
].join('|');
|
|
417
|
+
const writer = hash53(seed) || 1;
|
|
418
|
+
const to = hash32(`${seed}|n`);
|
|
419
|
+
const store = storeOf(doc);
|
|
420
|
+
// The derivation is fresh per incarnation: a writer that already wrote
|
|
421
|
+
// here is another block's (a hash collision, the known residual class).
|
|
422
|
+
if (DEV && store.getClock(writer) !== 0)
|
|
423
|
+
console.warn(`[edytor] own-text writer ${writer} of block ${rec.id} collides`);
|
|
424
|
+
const local = doc.clientID;
|
|
425
|
+
doc.clientID = writer;
|
|
426
|
+
try {
|
|
427
|
+
rec.node.setAttr(CONTENT, newNode(CONTENT_NODE));
|
|
428
|
+
rec.node.setAttr(NONCE, to);
|
|
429
|
+
}
|
|
430
|
+
finally {
|
|
431
|
+
doc.clientID = local;
|
|
432
|
+
}
|
|
433
|
+
const ids = ownTextIds.get(doc) ?? ops.idSet();
|
|
434
|
+
ownTextIds.set(doc, ids);
|
|
435
|
+
const clock = store.getClock(writer);
|
|
436
|
+
ids.add(writer, clock - 2, 2);
|
|
437
|
+
return { from: rec.n, to };
|
|
473
438
|
};
|
|
439
|
+
/**
|
|
440
|
+
* The text engine as one object (the public binding's `text`): the reads
|
|
441
|
+
* and writes above. Edytor's own modules import them directly.
|
|
442
|
+
*/
|
|
443
|
+
export const bindText = (_Y) => ({
|
|
444
|
+
newNode,
|
|
445
|
+
resolveAnchor,
|
|
446
|
+
anchorAt,
|
|
447
|
+
openRangeCursor,
|
|
448
|
+
itemsOfRange,
|
|
449
|
+
readSegs,
|
|
450
|
+
computeOwnership,
|
|
451
|
+
flatten,
|
|
452
|
+
ownedLength,
|
|
453
|
+
contentItemsOf,
|
|
454
|
+
blockTextOf,
|
|
455
|
+
insertIntoText,
|
|
456
|
+
deleteRange,
|
|
457
|
+
formatRangeIn,
|
|
458
|
+
purgeStreams,
|
|
459
|
+
findAtom,
|
|
460
|
+
splitAt,
|
|
461
|
+
claimInto,
|
|
462
|
+
ownText
|
|
463
|
+
});
|
|
474
464
|
/**
|
|
475
465
|
* The items this replica wrote with a derived own-text writer (local only): a
|
|
476
466
|
* history step never captures them, so undoing the first typing removes the
|