@portabletext/editor 3.3.3 → 3.3.4

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.
Files changed (306) hide show
  1. package/package.json +11 -12
  2. package/src/behaviors/_exports/index.ts +0 -1
  3. package/src/behaviors/behavior.abstract.annotation.ts +0 -77
  4. package/src/behaviors/behavior.abstract.decorator.ts +0 -39
  5. package/src/behaviors/behavior.abstract.delete.ts +0 -273
  6. package/src/behaviors/behavior.abstract.deserialize.ts +0 -232
  7. package/src/behaviors/behavior.abstract.insert.ts +0 -525
  8. package/src/behaviors/behavior.abstract.keyboard.ts +0 -189
  9. package/src/behaviors/behavior.abstract.list-item.ts +0 -70
  10. package/src/behaviors/behavior.abstract.move.ts +0 -79
  11. package/src/behaviors/behavior.abstract.select.ts +0 -118
  12. package/src/behaviors/behavior.abstract.serialize.ts +0 -96
  13. package/src/behaviors/behavior.abstract.split.ts +0 -170
  14. package/src/behaviors/behavior.abstract.style.ts +0 -55
  15. package/src/behaviors/behavior.abstract.ts +0 -139
  16. package/src/behaviors/behavior.config.ts +0 -7
  17. package/src/behaviors/behavior.core.annotations.ts +0 -62
  18. package/src/behaviors/behavior.core.block-element.ts +0 -116
  19. package/src/behaviors/behavior.core.block-objects.ts +0 -285
  20. package/src/behaviors/behavior.core.decorators.ts +0 -44
  21. package/src/behaviors/behavior.core.dnd.ts +0 -356
  22. package/src/behaviors/behavior.core.insert-break.ts +0 -266
  23. package/src/behaviors/behavior.core.insert.ts +0 -52
  24. package/src/behaviors/behavior.core.lists.ts +0 -691
  25. package/src/behaviors/behavior.core.ts +0 -44
  26. package/src/behaviors/behavior.perform-event.ts +0 -354
  27. package/src/behaviors/behavior.types.action.ts +0 -102
  28. package/src/behaviors/behavior.types.behavior.ts +0 -83
  29. package/src/behaviors/behavior.types.event.ts +0 -667
  30. package/src/behaviors/behavior.types.guard.ts +0 -11
  31. package/src/behaviors/index.ts +0 -17
  32. package/src/converters/converter.json.ts +0 -53
  33. package/src/converters/converter.portable-text.deserialize.test.ts +0 -680
  34. package/src/converters/converter.portable-text.ts +0 -75
  35. package/src/converters/converter.text-html.deserialize.test.ts +0 -406
  36. package/src/converters/converter.text-html.serialize.test.ts +0 -246
  37. package/src/converters/converter.text-html.ts +0 -87
  38. package/src/converters/converter.text-markdown.ts +0 -67
  39. package/src/converters/converter.text-plain.test.ts +0 -245
  40. package/src/converters/converter.text-plain.ts +0 -126
  41. package/src/converters/converter.types.ts +0 -72
  42. package/src/converters/converters.core.ts +0 -18
  43. package/src/editor/Editable.tsx +0 -1012
  44. package/src/editor/PortableTextEditor.tsx +0 -791
  45. package/src/editor/components/drop-indicator.tsx +0 -17
  46. package/src/editor/components/render-block-object.tsx +0 -121
  47. package/src/editor/components/render-default-object.tsx +0 -21
  48. package/src/editor/components/render-element.tsx +0 -88
  49. package/src/editor/components/render-inline-object.tsx +0 -129
  50. package/src/editor/components/render-leaf.tsx +0 -64
  51. package/src/editor/components/render-span.tsx +0 -303
  52. package/src/editor/components/render-text-block.tsx +0 -265
  53. package/src/editor/components/render-text.tsx +0 -18
  54. package/src/editor/components/use-core-block-element-behaviors.ts +0 -39
  55. package/src/editor/create-editor.ts +0 -323
  56. package/src/editor/create-slate-editor.tsx +0 -64
  57. package/src/editor/editor-actor-context.ts +0 -4
  58. package/src/editor/editor-context.tsx +0 -7
  59. package/src/editor/editor-dom.ts +0 -220
  60. package/src/editor/editor-machine.ts +0 -751
  61. package/src/editor/editor-provider.tsx +0 -111
  62. package/src/editor/editor-schema.ts +0 -6
  63. package/src/editor/editor-selector.ts +0 -89
  64. package/src/editor/editor-snapshot.ts +0 -68
  65. package/src/editor/event-to-change.tsx +0 -49
  66. package/src/editor/hooks/usePortableTextEditor.ts +0 -25
  67. package/src/editor/hooks/usePortableTextEditorSelection.tsx +0 -28
  68. package/src/editor/mutation-machine.ts +0 -322
  69. package/src/editor/plugins/create-with-event-listeners.ts +0 -271
  70. package/src/editor/plugins/createWithEditableAPI.ts +0 -529
  71. package/src/editor/plugins/createWithHotKeys.ts +0 -68
  72. package/src/editor/plugins/createWithObjectKeys.ts +0 -289
  73. package/src/editor/plugins/createWithPatches.ts +0 -272
  74. package/src/editor/plugins/createWithPortableTextMarkModel.ts +0 -559
  75. package/src/editor/plugins/createWithSchemaTypes.ts +0 -121
  76. package/src/editor/plugins/slate-plugin.update-selection.ts +0 -51
  77. package/src/editor/plugins/slate-plugin.update-value.ts +0 -46
  78. package/src/editor/plugins/with-plugins.ts +0 -69
  79. package/src/editor/range-decorations-machine.ts +0 -421
  80. package/src/editor/relay-actor-context.ts +0 -4
  81. package/src/editor/relay-machine.ts +0 -152
  82. package/src/editor/sync-machine.ts +0 -961
  83. package/src/editor/use-editor.ts +0 -27
  84. package/src/editor/validate-selection-machine.test.ts +0 -47
  85. package/src/editor/validate-selection-machine.ts +0 -149
  86. package/src/editor/weakMaps.ts +0 -15
  87. package/src/editor/with-normalizing-node.ts +0 -14
  88. package/src/editor/with-performing-behavior-operation.ts +0 -21
  89. package/src/editor/withChanges.ts +0 -13
  90. package/src/editor/without-normalizing-conditional.ts +0 -13
  91. package/src/editor/withoutPatching.ts +0 -14
  92. package/src/editor.ts +0 -59
  93. package/src/history/behavior.operation.history.redo.ts +0 -67
  94. package/src/history/behavior.operation.history.undo.ts +0 -71
  95. package/src/history/event.history.undo.test.tsx +0 -672
  96. package/src/history/history.preserving-keys.test.tsx +0 -112
  97. package/src/history/remote-patches.ts +0 -20
  98. package/src/history/slate-plugin.history.ts +0 -142
  99. package/src/history/slate-plugin.redoing.ts +0 -21
  100. package/src/history/slate-plugin.undoing.ts +0 -21
  101. package/src/history/slate-plugin.without-history.ts +0 -23
  102. package/src/history/transform-operation.ts +0 -245
  103. package/src/history/undo-redo-collaboration.test.tsx +0 -541
  104. package/src/history/undo-redo.feature +0 -125
  105. package/src/history/undo-redo.test.tsx +0 -195
  106. package/src/history/undo-step.ts +0 -148
  107. package/src/index.ts +0 -107
  108. package/src/internal-utils/__tests__/ranges.test.ts +0 -23
  109. package/src/internal-utils/__tests__/values.test.ts +0 -110
  110. package/src/internal-utils/apply-operation-to-portable-text.test.ts +0 -1861
  111. package/src/internal-utils/apply-operation-to-portable-text.ts +0 -615
  112. package/src/internal-utils/applyPatch.ts +0 -644
  113. package/src/internal-utils/block-keys.ts +0 -9
  114. package/src/internal-utils/build-index-maps.test.ts +0 -464
  115. package/src/internal-utils/build-index-maps.ts +0 -131
  116. package/src/internal-utils/collapse-selection.ts +0 -36
  117. package/src/internal-utils/compound-client-rect.ts +0 -28
  118. package/src/internal-utils/create-placeholder-block.ts +0 -21
  119. package/src/internal-utils/create-test-snapshot.ts +0 -28
  120. package/src/internal-utils/debug.ts +0 -12
  121. package/src/internal-utils/editor-selection.test.ts +0 -44
  122. package/src/internal-utils/editor-selection.ts +0 -56
  123. package/src/internal-utils/event-position.ts +0 -318
  124. package/src/internal-utils/global-scope.ts +0 -27
  125. package/src/internal-utils/globally-scoped-context.ts +0 -39
  126. package/src/internal-utils/is-hotkey.test.ts +0 -114
  127. package/src/internal-utils/is-hotkey.ts +0 -209
  128. package/src/internal-utils/mime-type.ts +0 -1
  129. package/src/internal-utils/move-range-by-operation.ts +0 -19
  130. package/src/internal-utils/operation-to-patches.test.ts +0 -522
  131. package/src/internal-utils/operation-to-patches.ts +0 -571
  132. package/src/internal-utils/portable-text-node.ts +0 -209
  133. package/src/internal-utils/schema.ts +0 -8
  134. package/src/internal-utils/selection-block-keys.ts +0 -20
  135. package/src/internal-utils/selection-focus-text.ts +0 -40
  136. package/src/internal-utils/selection-text.test.ts +0 -32
  137. package/src/internal-utils/selection-text.ts +0 -21
  138. package/src/internal-utils/selection.ts +0 -77
  139. package/src/internal-utils/sibling-utils.ts +0 -55
  140. package/src/internal-utils/slate-utils.test.tsx +0 -121
  141. package/src/internal-utils/slate-utils.ts +0 -417
  142. package/src/internal-utils/split-string.ts +0 -12
  143. package/src/internal-utils/stop-actor.ts +0 -43
  144. package/src/internal-utils/string-overlap.test.ts +0 -14
  145. package/src/internal-utils/string-overlap.ts +0 -28
  146. package/src/internal-utils/string-utils.ts +0 -7
  147. package/src/internal-utils/text-block-key.test.ts +0 -41
  148. package/src/internal-utils/text-block-key.ts +0 -26
  149. package/src/internal-utils/text-marks.test.ts +0 -41
  150. package/src/internal-utils/text-marks.ts +0 -22
  151. package/src/internal-utils/text-selection.test.ts +0 -211
  152. package/src/internal-utils/text-selection.ts +0 -121
  153. package/src/internal-utils/to-slate-range.test.ts +0 -278
  154. package/src/internal-utils/to-slate-range.ts +0 -171
  155. package/src/internal-utils/validateValue.ts +0 -443
  156. package/src/internal-utils/value-annotations.ts +0 -33
  157. package/src/internal-utils/values.test.ts +0 -282
  158. package/src/internal-utils/values.ts +0 -266
  159. package/src/keyboard-shortcuts/default-keyboard-shortcuts.ts +0 -146
  160. package/src/operations/behavior.operation.annotation.add.ts +0 -99
  161. package/src/operations/behavior.operation.annotation.remove.ts +0 -150
  162. package/src/operations/behavior.operation.block.set.ts +0 -104
  163. package/src/operations/behavior.operation.block.unset.ts +0 -54
  164. package/src/operations/behavior.operation.child.set.ts +0 -107
  165. package/src/operations/behavior.operation.child.unset.ts +0 -116
  166. package/src/operations/behavior.operation.decorator.add.ts +0 -131
  167. package/src/operations/behavior.operation.delete.ts +0 -294
  168. package/src/operations/behavior.operation.insert.block.ts +0 -495
  169. package/src/operations/behavior.operation.insert.child.ts +0 -129
  170. package/src/operations/behavior.operation.insert.text.ts +0 -8
  171. package/src/operations/behavior.operation.move.backward.ts +0 -12
  172. package/src/operations/behavior.operation.move.block.ts +0 -44
  173. package/src/operations/behavior.operation.move.forward.ts +0 -11
  174. package/src/operations/behavior.operation.select.ts +0 -27
  175. package/src/operations/behavior.operations.ts +0 -221
  176. package/src/plugins/_exports/index.ts +0 -1
  177. package/src/plugins/index.ts +0 -3
  178. package/src/plugins/plugin.behavior.tsx +0 -24
  179. package/src/plugins/plugin.editor-ref.tsx +0 -17
  180. package/src/plugins/plugin.event-listener.tsx +0 -68
  181. package/src/plugins/plugin.internal.auto-close-brackets.test.tsx +0 -71
  182. package/src/plugins/plugin.internal.auto-close-brackets.ts +0 -62
  183. package/src/plugins/plugin.internal.change-ref.tsx +0 -19
  184. package/src/plugins/plugin.internal.portable-text-editor-ref.tsx +0 -16
  185. package/src/plugins/plugin.internal.slate-editor-ref.tsx +0 -15
  186. package/src/priority/priority.core.ts +0 -3
  187. package/src/priority/priority.sort.test.ts +0 -319
  188. package/src/priority/priority.sort.ts +0 -123
  189. package/src/priority/priority.types.ts +0 -24
  190. package/src/selectors/_exports/index.ts +0 -1
  191. package/src/selectors/drag-selection.test.ts +0 -578
  192. package/src/selectors/drag-selection.ts +0 -118
  193. package/src/selectors/index.ts +0 -54
  194. package/src/selectors/selector.get-active-annotation-marks.ts +0 -12
  195. package/src/selectors/selector.get-active-annotations.ts +0 -36
  196. package/src/selectors/selector.get-active-decorators.ts +0 -29
  197. package/src/selectors/selector.get-active-list-item.ts +0 -38
  198. package/src/selectors/selector.get-active-style.ts +0 -38
  199. package/src/selectors/selector.get-anchor-block.ts +0 -22
  200. package/src/selectors/selector.get-anchor-child.ts +0 -36
  201. package/src/selectors/selector.get-anchor-span.ts +0 -17
  202. package/src/selectors/selector.get-anchor-text-block.ts +0 -18
  203. package/src/selectors/selector.get-block-offsets.ts +0 -34
  204. package/src/selectors/selector.get-caret-word-selection.test.ts +0 -284
  205. package/src/selectors/selector.get-caret-word-selection.ts +0 -134
  206. package/src/selectors/selector.get-first-block.ts +0 -14
  207. package/src/selectors/selector.get-focus-block-object.ts +0 -18
  208. package/src/selectors/selector.get-focus-block.ts +0 -23
  209. package/src/selectors/selector.get-focus-child.ts +0 -36
  210. package/src/selectors/selector.get-focus-inline-object.ts +0 -17
  211. package/src/selectors/selector.get-focus-list-block.ts +0 -18
  212. package/src/selectors/selector.get-focus-span.ts +0 -18
  213. package/src/selectors/selector.get-focus-text-block.ts +0 -18
  214. package/src/selectors/selector.get-last-block.ts +0 -16
  215. package/src/selectors/selector.get-mark-state.test.ts +0 -325
  216. package/src/selectors/selector.get-mark-state.ts +0 -263
  217. package/src/selectors/selector.get-next-block.ts +0 -29
  218. package/src/selectors/selector.get-next-inline-object.ts +0 -53
  219. package/src/selectors/selector.get-next-inline-objects.ts +0 -50
  220. package/src/selectors/selector.get-next-span.ts +0 -56
  221. package/src/selectors/selector.get-previous-block.ts +0 -29
  222. package/src/selectors/selector.get-previous-inline-object.ts +0 -50
  223. package/src/selectors/selector.get-previous-inline-objects.ts +0 -47
  224. package/src/selectors/selector.get-previous-span.ts +0 -53
  225. package/src/selectors/selector.get-selected-blocks.ts +0 -61
  226. package/src/selectors/selector.get-selected-spans.test.ts +0 -347
  227. package/src/selectors/selector.get-selected-spans.ts +0 -155
  228. package/src/selectors/selector.get-selected-text-blocks.ts +0 -73
  229. package/src/selectors/selector.get-selected-value.test.ts +0 -834
  230. package/src/selectors/selector.get-selected-value.ts +0 -66
  231. package/src/selectors/selector.get-selection-end-block.ts +0 -33
  232. package/src/selectors/selector.get-selection-end-child.ts +0 -33
  233. package/src/selectors/selector.get-selection-end-point.ts +0 -17
  234. package/src/selectors/selector.get-selection-start-block.ts +0 -33
  235. package/src/selectors/selector.get-selection-start-child.ts +0 -33
  236. package/src/selectors/selector.get-selection-start-point.ts +0 -17
  237. package/src/selectors/selector.get-selection-text.test.ts +0 -421
  238. package/src/selectors/selector.get-selection-text.ts +0 -27
  239. package/src/selectors/selector.get-selection.ts +0 -9
  240. package/src/selectors/selector.get-text-after.ts +0 -46
  241. package/src/selectors/selector.get-text-before.ts +0 -46
  242. package/src/selectors/selector.get-value.ts +0 -11
  243. package/src/selectors/selector.is-active-annotation.test.ts +0 -320
  244. package/src/selectors/selector.is-active-annotation.ts +0 -52
  245. package/src/selectors/selector.is-active-decorator.test.ts +0 -136
  246. package/src/selectors/selector.is-active-decorator.ts +0 -24
  247. package/src/selectors/selector.is-active-list-item.ts +0 -13
  248. package/src/selectors/selector.is-active-style.ts +0 -13
  249. package/src/selectors/selector.is-at-the-end-of-block.ts +0 -30
  250. package/src/selectors/selector.is-at-the-start-of-block.ts +0 -30
  251. package/src/selectors/selector.is-overlapping-selection.test.ts +0 -304
  252. package/src/selectors/selector.is-overlapping-selection.ts +0 -181
  253. package/src/selectors/selector.is-point-after-selection.ts +0 -97
  254. package/src/selectors/selector.is-point-before-selection.ts +0 -97
  255. package/src/selectors/selector.is-selecting-entire-blocks.ts +0 -43
  256. package/src/selectors/selector.is-selection-collapsed.ts +0 -17
  257. package/src/selectors/selector.is-selection-expanded.test.ts +0 -63
  258. package/src/selectors/selector.is-selection-expanded.ts +0 -9
  259. package/src/test/_exports/index.ts +0 -1
  260. package/src/test/gherkin-parameter-types.ts +0 -112
  261. package/src/test/index.ts +0 -1
  262. package/src/test/vitest/_exports/index.ts +0 -1
  263. package/src/test/vitest/index.ts +0 -3
  264. package/src/test/vitest/step-context.ts +0 -13
  265. package/src/test/vitest/step-definitions.tsx +0 -960
  266. package/src/test/vitest/test-editor.tsx +0 -198
  267. package/src/type-utils.ts +0 -29
  268. package/src/types/block-offset.ts +0 -9
  269. package/src/types/block-with-optional-key.ts +0 -25
  270. package/src/types/editor.ts +0 -509
  271. package/src/types/options.ts +0 -13
  272. package/src/types/paths.ts +0 -35
  273. package/src/types/slate-editor.ts +0 -50
  274. package/src/types/slate.ts +0 -27
  275. package/src/utils/_exports/index.ts +0 -1
  276. package/src/utils/asserters.ts +0 -9
  277. package/src/utils/index.ts +0 -24
  278. package/src/utils/key-generator.ts +0 -33
  279. package/src/utils/parse-blocks.test.ts +0 -836
  280. package/src/utils/parse-blocks.ts +0 -504
  281. package/src/utils/util.at-the-beginning-of-block.ts +0 -32
  282. package/src/utils/util.block-offset-to-block-selection-point.ts +0 -28
  283. package/src/utils/util.block-offset-to-selection-point.ts +0 -33
  284. package/src/utils/util.block-offset.test.ts +0 -375
  285. package/src/utils/util.block-offset.ts +0 -136
  286. package/src/utils/util.block-offsets-to-selection.ts +0 -38
  287. package/src/utils/util.child-selection-point-to-block-offset.ts +0 -51
  288. package/src/utils/util.get-block-end-point.ts +0 -35
  289. package/src/utils/util.get-block-start-point.ts +0 -31
  290. package/src/utils/util.get-selection-end-point.ts +0 -20
  291. package/src/utils/util.get-selection-start-point.ts +0 -20
  292. package/src/utils/util.get-text-block-text.ts +0 -8
  293. package/src/utils/util.is-empty-text-block.ts +0 -21
  294. package/src/utils/util.is-equal-selection-points.ts +0 -13
  295. package/src/utils/util.is-equal-selections.ts +0 -20
  296. package/src/utils/util.is-keyed-segment.ts +0 -8
  297. package/src/utils/util.is-selection-collapsed.ts +0 -16
  298. package/src/utils/util.is-selection-expanded.ts +0 -13
  299. package/src/utils/util.merge-text-blocks.ts +0 -40
  300. package/src/utils/util.reverse-selection.ts +0 -26
  301. package/src/utils/util.selection-point-to-block-offset.ts +0 -30
  302. package/src/utils/util.selection-point.ts +0 -22
  303. package/src/utils/util.slice-blocks.ts +0 -221
  304. package/src/utils/util.slice-text-block.test.ts +0 -190
  305. package/src/utils/util.slice-text-block.ts +0 -89
  306. package/src/utils/util.split-text-block.ts +0 -54
@@ -1,289 +0,0 @@
1
- import {isSpan, isTextBlock} from '@portabletext/schema'
2
- import {isEqual} from 'lodash'
3
- import {Editor, Element, Node, Path, Transforms} from 'slate'
4
- import {isRedoing} from '../../history/slate-plugin.redoing'
5
- import {isUndoing} from '../../history/slate-plugin.undoing'
6
- import type {PortableTextSlateEditor} from '../../types/slate-editor'
7
- import type {EditorActor} from '../editor-machine'
8
- import {withNormalizeNode} from '../with-normalizing-node'
9
- import {isChangingRemotely} from '../withChanges'
10
-
11
- /**
12
- * This plugin makes sure that every new node in the editor get a new _key prop when created
13
- *
14
- */
15
- export function createWithObjectKeys(editorActor: EditorActor) {
16
- return function withKeys(
17
- editor: PortableTextSlateEditor,
18
- ): PortableTextSlateEditor {
19
- const {apply, normalizeNode} = editor
20
-
21
- // The default behavior is to always generate a new key here.
22
- // For example, when undoing and redoing we want to retain the keys, but
23
- // when we create a new bold span by splitting a non-bold-span we want the produced node to get a new key.
24
- editor.apply = (operation) => {
25
- /**
26
- * We don't want to run any side effects when the editor is processing
27
- * remote changes.
28
- */
29
- if (isChangingRemotely(editor)) {
30
- apply(operation)
31
- return
32
- }
33
-
34
- /**
35
- * We don't want to run any side effects when the editor is undoing or
36
- * redoing operations.
37
- */
38
- if (isUndoing(editor) || isRedoing(editor)) {
39
- apply(operation)
40
- return
41
- }
42
-
43
- if (operation.type === 'split_node') {
44
- const existingKeys = [...Node.descendants(editor)].map(
45
- ([node]) => node._key,
46
- )
47
-
48
- apply({
49
- ...operation,
50
- properties: {
51
- ...operation.properties,
52
- _key:
53
- operation.properties._key === undefined ||
54
- existingKeys.includes(operation.properties._key)
55
- ? editorActor.getSnapshot().context.keyGenerator()
56
- : operation.properties._key,
57
- },
58
- })
59
-
60
- return
61
- }
62
-
63
- if (operation.type === 'insert_node') {
64
- if (!Editor.isEditor(operation.node)) {
65
- const existingKeys = [...Node.descendants(editor)].map(
66
- ([node]) => node._key,
67
- )
68
-
69
- apply({
70
- ...operation,
71
- node: {
72
- ...operation.node,
73
- _key:
74
- operation.node._key === undefined ||
75
- existingKeys.includes(operation.node._key)
76
- ? editorActor.getSnapshot().context.keyGenerator()
77
- : operation.node._key,
78
- },
79
- })
80
-
81
- return
82
- }
83
- }
84
-
85
- if (operation.type === 'merge_node') {
86
- const index = operation.path[operation.path.length - 1]
87
- const prevPath = Path.previous(operation.path)
88
- const prevIndex = prevPath[prevPath.length - 1]
89
-
90
- if (operation.path.length !== 1 || prevPath.length !== 1) {
91
- apply(operation)
92
- return
93
- }
94
-
95
- const block = editor.value.at(index)
96
- const previousBlock = editor.value.at(prevIndex)
97
-
98
- if (!block || !previousBlock) {
99
- apply(operation)
100
- return
101
- }
102
-
103
- if (
104
- !isTextBlock(editorActor.getSnapshot().context, block) ||
105
- !isTextBlock(editorActor.getSnapshot().context, previousBlock)
106
- ) {
107
- apply(operation)
108
- return
109
- }
110
-
111
- // If we are merging two text blocks, then we need to make sure there
112
- // are no duplicate keys in the blocks. Therefore, we assign new keys
113
- // to any child or markDef that shares key with other children or
114
- // markDefs in the previous block.
115
- const previousBlockChildKeys = previousBlock.children.map(
116
- (child) => child._key,
117
- )
118
- const previousBlockMarkDefKeys =
119
- previousBlock.markDefs?.map((markDef) => markDef._key) ?? []
120
-
121
- // Assign new keys to markDefs with duplicate keys and keep track of
122
- // the mapping between the old and new keys
123
- const markDefKeyMap = new Map<string, string>()
124
- const adjustedMarkDefs = block.markDefs?.map((markDef) => {
125
- if (previousBlockMarkDefKeys.includes(markDef._key)) {
126
- const newKey = editorActor.getSnapshot().context.keyGenerator()
127
- markDefKeyMap.set(markDef._key, newKey)
128
- return {
129
- ...markDef,
130
- _key: newKey,
131
- }
132
- }
133
-
134
- return markDef
135
- })
136
-
137
- // Assign new keys to spans with duplicate keys and update any markDef
138
- // key if needed
139
- let childIndex = 0
140
- for (const child of block.children) {
141
- if (isSpan(editorActor.getSnapshot().context, child)) {
142
- const marks =
143
- child.marks?.map((mark) => {
144
- const markDefKey = markDefKeyMap.get(mark)
145
-
146
- if (markDefKey) {
147
- return markDefKey
148
- }
149
-
150
- return mark
151
- }) ?? []
152
-
153
- if (!isEqual(child.marks, marks)) {
154
- Transforms.setNodes(
155
- editor,
156
- {
157
- marks,
158
- },
159
- {
160
- at: [index, childIndex],
161
- },
162
- )
163
- }
164
- }
165
-
166
- if (previousBlockChildKeys.includes(child._key)) {
167
- Transforms.setNodes(
168
- editor,
169
- {
170
- _key: editorActor.getSnapshot().context.keyGenerator(),
171
- },
172
- {
173
- at: [index, childIndex],
174
- },
175
- )
176
- }
177
- childIndex++
178
- }
179
-
180
- apply({
181
- ...operation,
182
- properties: {
183
- ...operation.properties,
184
- // Make sure the adjusted markDefs are carried along for the merge
185
- // operation
186
- markDefs: adjustedMarkDefs,
187
- },
188
- })
189
- return
190
- }
191
-
192
- apply(operation)
193
- }
194
-
195
- editor.normalizeNode = (entry) => {
196
- const [node, path] = entry
197
-
198
- if (Element.isElement(node)) {
199
- const [parent] = Editor.parent(editor, path)
200
-
201
- if (parent && Editor.isEditor(parent)) {
202
- const blockKeys = new Set<string>()
203
-
204
- for (const sibling of parent.children) {
205
- if (sibling._key && blockKeys.has(sibling._key)) {
206
- const _key = editorActor.getSnapshot().context.keyGenerator()
207
-
208
- blockKeys.add(_key)
209
-
210
- withNormalizeNode(editor, () => {
211
- Transforms.setNodes(editor, {_key}, {at: path})
212
- })
213
-
214
- return
215
- }
216
-
217
- if (!sibling._key) {
218
- const _key = editorActor.getSnapshot().context.keyGenerator()
219
-
220
- blockKeys.add(_key)
221
-
222
- withNormalizeNode(editor, () => {
223
- Transforms.setNodes(editor, {_key}, {at: path})
224
- })
225
-
226
- return
227
- }
228
-
229
- blockKeys.add(sibling._key)
230
- }
231
- }
232
- }
233
-
234
- if (
235
- Element.isElement(node) &&
236
- node._type === editorActor.getSnapshot().context.schema.block.name
237
- ) {
238
- // Set key on block itself
239
- if (!node._key) {
240
- withNormalizeNode(editor, () => {
241
- Transforms.setNodes(
242
- editor,
243
- {_key: editorActor.getSnapshot().context.keyGenerator()},
244
- {at: path},
245
- )
246
- })
247
- return
248
- }
249
-
250
- // Set unique keys on it's children
251
- const childKeys = new Set<string>()
252
-
253
- for (const [child, childPath] of Node.children(editor, path)) {
254
- if (child._key && childKeys.has(child._key)) {
255
- const _key = editorActor.getSnapshot().context.keyGenerator()
256
-
257
- childKeys.add(_key)
258
-
259
- withNormalizeNode(editor, () => {
260
- Transforms.setNodes(editor, {_key}, {at: childPath})
261
- })
262
-
263
- return
264
- }
265
-
266
- if (!child._key) {
267
- const _key = editorActor.getSnapshot().context.keyGenerator()
268
-
269
- childKeys.add(_key)
270
-
271
- withNormalizeNode(editor, () => {
272
- Transforms.setNodes(editor, {_key}, {at: childPath})
273
- })
274
-
275
- return
276
- }
277
-
278
- childKeys.add(child._key)
279
- }
280
- }
281
-
282
- withNormalizeNode(editor, () => {
283
- normalizeNode(entry)
284
- })
285
- }
286
-
287
- return editor
288
- }
289
- }
@@ -1,272 +0,0 @@
1
- import {insert, setIfMissing, unset, type Patch} from '@portabletext/patches'
2
- import type {PortableTextBlock} from '@portabletext/schema'
3
- import {Editor, type Operation} from 'slate'
4
- import {pluginWithoutHistory} from '../../history/slate-plugin.without-history'
5
- import {getCurrentUndoStepId} from '../../history/undo-step'
6
- import {createApplyPatch} from '../../internal-utils/applyPatch'
7
- import {debugWithName} from '../../internal-utils/debug'
8
- import {
9
- insertNodePatch,
10
- insertTextPatch,
11
- mergeNodePatch,
12
- moveNodePatch,
13
- removeNodePatch,
14
- removeTextPatch,
15
- setNodePatch,
16
- splitNodePatch,
17
- } from '../../internal-utils/operation-to-patches'
18
- import {isEqualToEmptyEditor} from '../../internal-utils/values'
19
- import type {PortableTextSlateEditor} from '../../types/slate-editor'
20
- import type {EditorActor} from '../editor-machine'
21
- import type {RelayActor} from '../relay-machine'
22
- import {IS_PROCESSING_REMOTE_CHANGES} from '../weakMaps'
23
- import {withRemoteChanges} from '../withChanges'
24
- import {isPatching, PATCHING, withoutPatching} from '../withoutPatching'
25
-
26
- const debug = debugWithName('plugin:withPatches')
27
- const debugVerbose = false
28
-
29
- interface Options {
30
- editorActor: EditorActor
31
- relayActor: RelayActor
32
- subscriptions: Array<() => () => void>
33
- }
34
-
35
- export function createWithPatches({
36
- editorActor,
37
- relayActor,
38
- subscriptions,
39
- }: Options): (editor: PortableTextSlateEditor) => PortableTextSlateEditor {
40
- // The previous editor value are needed to figure out the _key of deleted nodes
41
- // The editor.value would no longer contain that information if the node is already deleted.
42
- let previousValue: PortableTextBlock[]
43
-
44
- const applyPatch = createApplyPatch(editorActor.getSnapshot().context)
45
-
46
- return function withPatches(editor: PortableTextSlateEditor) {
47
- IS_PROCESSING_REMOTE_CHANGES.set(editor, false)
48
- PATCHING.set(editor, true)
49
- previousValue = [...editor.value]
50
-
51
- const {apply} = editor
52
- let bufferedPatches: Patch[] = []
53
-
54
- const handleBufferedRemotePatches = () => {
55
- if (bufferedPatches.length === 0) {
56
- return
57
- }
58
- const patches = bufferedPatches
59
- bufferedPatches = []
60
- let changed = false
61
-
62
- withRemoteChanges(editor, () => {
63
- Editor.withoutNormalizing(editor, () => {
64
- withoutPatching(editor, () => {
65
- pluginWithoutHistory(editor, () => {
66
- for (const patch of patches) {
67
- if (debug.enabled) {
68
- debug(`Handling remote patch ${JSON.stringify(patch)}`)
69
- }
70
-
71
- try {
72
- changed = applyPatch(editor, patch)
73
- } catch (error) {
74
- console.error(
75
- `Applying patch ${JSON.stringify(patch)} failed due to: ${error.message}`,
76
- )
77
- }
78
- }
79
- })
80
- })
81
- })
82
- if (changed) {
83
- editor.normalize()
84
- editor.onChange()
85
- }
86
- })
87
- }
88
-
89
- const handlePatches = ({patches}: {patches: Patch[]}) => {
90
- const remotePatches = patches.filter((p) => p.origin !== 'local')
91
- if (remotePatches.length === 0) {
92
- return
93
- }
94
- bufferedPatches = bufferedPatches.concat(remotePatches)
95
- handleBufferedRemotePatches()
96
- }
97
-
98
- subscriptions.push(() => {
99
- debug('Subscribing to remote patches')
100
- const sub = editorActor.on('patches', handlePatches)
101
- return () => {
102
- debug('Unsubscribing to remote patches')
103
- sub.unsubscribe()
104
- }
105
- })
106
-
107
- editor.apply = (operation: Operation): void | Editor => {
108
- let patches: Patch[] = []
109
-
110
- // Update previous children here before we apply
111
- previousValue = editor.value
112
-
113
- const editorWasEmpty = isEqualToEmptyEditor(
114
- editorActor.getSnapshot().context.initialValue,
115
- previousValue,
116
- editorActor.getSnapshot().context.schema,
117
- )
118
-
119
- // Apply the operation
120
- apply(operation)
121
-
122
- const editorIsEmpty = isEqualToEmptyEditor(
123
- editorActor.getSnapshot().context.initialValue,
124
- editor.value,
125
- editorActor.getSnapshot().context.schema,
126
- )
127
-
128
- if (!isPatching(editor)) {
129
- if (debugVerbose && debug.enabled) {
130
- debug(
131
- `Editor is not producing patch for operation ${operation.type}`,
132
- operation,
133
- )
134
- }
135
- return editor
136
- }
137
-
138
- // If the editor was empty and now isn't, insert the placeholder into it.
139
- if (
140
- editorWasEmpty &&
141
- !editorIsEmpty &&
142
- operation.type !== 'set_selection'
143
- ) {
144
- patches.push(insert(previousValue, 'before', [0]))
145
- }
146
-
147
- switch (operation.type) {
148
- case 'insert_text':
149
- patches = [
150
- ...patches,
151
- ...insertTextPatch(
152
- editorActor.getSnapshot().context.schema,
153
- editor.children,
154
- operation,
155
- previousValue,
156
- ),
157
- ]
158
- break
159
- case 'remove_text':
160
- patches = [
161
- ...patches,
162
- ...removeTextPatch(
163
- editorActor.getSnapshot().context.schema,
164
- editor.children,
165
- operation,
166
- previousValue,
167
- ),
168
- ]
169
- break
170
- case 'remove_node':
171
- patches = [
172
- ...patches,
173
- ...removeNodePatch(
174
- editorActor.getSnapshot().context.schema,
175
- previousValue,
176
- operation,
177
- ),
178
- ]
179
- break
180
- case 'split_node':
181
- patches = [
182
- ...patches,
183
- ...splitNodePatch(
184
- editorActor.getSnapshot().context.schema,
185
- editor.children,
186
- operation,
187
- previousValue,
188
- ),
189
- ]
190
- break
191
- case 'insert_node':
192
- patches = [
193
- ...patches,
194
- ...insertNodePatch(
195
- editorActor.getSnapshot().context.schema,
196
- editor.children,
197
- operation,
198
- previousValue,
199
- ),
200
- ]
201
- break
202
- case 'set_node':
203
- patches = [
204
- ...patches,
205
- ...setNodePatch(
206
- editorActor.getSnapshot().context.schema,
207
- editor.children,
208
- operation,
209
- ),
210
- ]
211
- break
212
- case 'merge_node':
213
- patches = [
214
- ...patches,
215
- ...mergeNodePatch(
216
- editorActor.getSnapshot().context.schema,
217
- editor.children,
218
- operation,
219
- previousValue,
220
- ),
221
- ]
222
- break
223
- case 'move_node':
224
- patches = [
225
- ...patches,
226
- ...moveNodePatch(
227
- editorActor.getSnapshot().context.schema,
228
- previousValue,
229
- operation,
230
- ),
231
- ]
232
- break
233
- default:
234
- // Do nothing
235
- }
236
-
237
- // Unset the value if a operation made the editor empty
238
- if (
239
- !editorWasEmpty &&
240
- editorIsEmpty &&
241
- ['merge_node', 'set_node', 'remove_text', 'remove_node'].includes(
242
- operation.type,
243
- )
244
- ) {
245
- patches = [...patches, unset([])]
246
- relayActor.send({
247
- type: 'unset',
248
- previousValue,
249
- })
250
- }
251
-
252
- // Prepend patches with setIfMissing if going from empty editor to something involving a patch.
253
- if (editorWasEmpty && patches.length > 0) {
254
- patches = [setIfMissing([], []), ...patches]
255
- }
256
-
257
- // Emit all patches
258
- if (patches.length > 0) {
259
- for (const patch of patches) {
260
- editorActor.send({
261
- type: 'internal.patch',
262
- patch: {...patch, origin: 'local'},
263
- operationId: getCurrentUndoStepId(editor),
264
- value: editor.value,
265
- })
266
- }
267
- }
268
- return editor
269
- }
270
- return editor
271
- }
272
- }