@portabletext/editor 1.34.0 → 1.35.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/lib/_chunks-cjs/behavior.core.cjs +57 -118
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +27 -67
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/plugin.event-listener.cjs +53 -71
- package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-text-before.cjs +5 -7
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-active-style.cjs +22 -36
- package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +68 -153
- package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
- package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
- package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +57 -118
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +27 -67
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/plugin.event-listener.js +53 -71
- package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
- package/lib/_chunks-es/selector.get-text-before.js +5 -7
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/selector.is-active-style.js +22 -36
- package/lib/_chunks-es/selector.is-active-style.js.map +1 -1
- package/lib/_chunks-es/selector.is-at-the-start-of-block.js +68 -153
- package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
- package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/behaviors/index.cjs +18 -48
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +28 -16
- package/lib/behaviors/index.d.ts +28 -16
- package/lib/behaviors/index.js +18 -48
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.d.cts +132 -71
- package/lib/index.d.ts +132 -71
- package/lib/plugins/index.cjs +182 -186
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +147 -82
- package/lib/plugins/index.d.ts +147 -82
- package/lib/plugins/index.js +182 -186
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.cjs +22 -50
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +9 -200
- package/lib/selectors/index.d.ts +9 -200
- package/lib/selectors/index.js +22 -50
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +15 -7
- package/lib/utils/index.d.ts +15 -7
- package/lib/utils/index.js.map +1 -1
- package/package.json +6 -6
- package/src/behaviors/behavior.code-editor.ts +6 -6
- package/src/behaviors/behavior.core.annotations.ts +5 -4
- package/src/behaviors/behavior.core.block-objects.ts +17 -17
- package/src/behaviors/behavior.core.decorators.ts +12 -8
- package/src/behaviors/behavior.core.insert-break.ts +27 -29
- package/src/behaviors/behavior.core.lists.ts +19 -19
- package/src/behaviors/behavior.decorator-pair.ts +200 -0
- package/src/behaviors/behavior.default.ts +35 -30
- package/src/behaviors/behavior.emoji-picker.ts +12 -12
- package/src/behaviors/behavior.links.ts +7 -7
- package/src/behaviors/behavior.markdown.ts +41 -42
- package/src/behaviors/behavior.types.ts +15 -18
- package/src/behaviors/index.ts +0 -1
- package/src/converters/converter.json.ts +6 -6
- package/src/converters/converter.portable-text.deserialize.test.ts +28 -26
- package/src/converters/converter.portable-text.ts +6 -6
- package/src/converters/converter.text-html.deserialize.test.ts +17 -15
- package/src/converters/converter.text-html.serialize.test.ts +57 -53
- package/src/converters/converter.text-html.ts +14 -10
- package/src/converters/converter.text-plain.test.ts +17 -15
- package/src/converters/converter.text-plain.ts +15 -11
- package/src/converters/converter.types.ts +8 -7
- package/src/editor/editor-machine.ts +6 -1
- package/src/editor/plugins/create-with-event-listeners.ts +0 -5
- package/src/index.ts +3 -3
- package/src/internal-utils/get-text-to-emphasize.ts +29 -7
- package/src/plugins/plugin.decorator-shortcut.ts +235 -0
- package/src/plugins/plugin.markdown.tsx +56 -8
- package/src/plugins/plugin.one-line.tsx +17 -17
- package/src/selectors/selector.get-active-list-item.ts +4 -4
- package/src/selectors/selector.get-active-style.ts +6 -6
- package/src/selectors/selector.get-anchor-block.ts +5 -5
- package/src/selectors/selector.get-anchor-child.ts +5 -5
- package/src/selectors/selector.get-anchor-span.ts +2 -2
- package/src/selectors/selector.get-anchor-text-block.ts +2 -2
- package/src/selectors/selector.get-block-offsets.ts +8 -7
- package/src/selectors/selector.get-caret-word-selection.ts +19 -16
- package/src/selectors/selector.get-next-inline-object.ts +4 -4
- package/src/selectors/selector.get-previous-inline-object.ts +4 -4
- package/src/selectors/selector.get-selected-slice.ts +7 -4
- package/src/selectors/selector.get-selected-spans.ts +9 -9
- package/src/selectors/selector.get-selection-end-point.ts +5 -5
- package/src/selectors/selector.get-selection-start-point.ts +5 -5
- package/src/selectors/selector.get-selection-text.ts +2 -2
- package/src/selectors/selector.get-selection.ts +2 -2
- package/src/selectors/selector.get-text-before.ts +8 -8
- package/src/selectors/selector.get-trimmed-selection.ts +15 -13
- package/src/selectors/selector.get-value.ts +4 -4
- package/src/selectors/selector.is-at-the-end-of-block.ts +6 -3
- package/src/selectors/selector.is-at-the-start-of-block.ts +3 -3
- package/src/selectors/selector.is-overlapping-selection.ts +8 -6
- package/src/selectors/selector.is-selection-collapsed.ts +6 -5
- package/src/selectors/selector.is-selection-expanded.ts +2 -2
- package/src/selectors/selectors.ts +59 -59
- package/src/types/block-offset.ts +9 -0
- package/src/utils/index.ts +0 -1
- package/src/utils/util.block-offset.ts +1 -1
- package/src/utils/util.block-offsets-to-selection.ts +1 -1
- package/src/utils/util.child-selection-point-to-block-offset.ts +1 -1
- package/src/behaviors/behavior.markdown-emphasis.ts +0 -437
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import {isPortableTextTextBlock} from '@sanity/types'
|
|
2
2
|
import type {EditorSchema} from '../editor/define-schema'
|
|
3
3
|
import * as selectors from '../selectors'
|
|
4
|
-
import {getBlockTextBefore} from '../selectors/selector.get-text-before'
|
|
5
4
|
import {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'
|
|
6
5
|
import {getTextBlockText} from '../utils/util.get-text-block-text'
|
|
7
6
|
import {defineBehavior} from './behavior.types'
|
|
@@ -71,31 +70,31 @@ export type MarkdownBehaviorsConfig = {
|
|
|
71
70
|
export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
72
71
|
const automaticBlockquoteOnSpace = defineBehavior({
|
|
73
72
|
on: 'insert.text',
|
|
74
|
-
guard: ({
|
|
73
|
+
guard: ({snapshot, event}) => {
|
|
75
74
|
const isSpace = event.text === ' '
|
|
76
75
|
|
|
77
76
|
if (!isSpace) {
|
|
78
77
|
return false
|
|
79
78
|
}
|
|
80
79
|
|
|
81
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
82
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
83
|
-
const focusSpan = selectors.getFocusSpan(
|
|
80
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
81
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
82
|
+
const focusSpan = selectors.getFocusSpan(snapshot)
|
|
84
83
|
|
|
85
84
|
if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
|
|
86
85
|
return false
|
|
87
86
|
}
|
|
88
87
|
|
|
89
|
-
const previousInlineObject = selectors.getPreviousInlineObject(
|
|
88
|
+
const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
|
|
90
89
|
const blockOffset = spanSelectionPointToBlockOffset({
|
|
91
|
-
value: context.value,
|
|
90
|
+
value: snapshot.context.value,
|
|
92
91
|
selectionPoint: {
|
|
93
92
|
path: [
|
|
94
93
|
{_key: focusTextBlock.node._key},
|
|
95
94
|
'children',
|
|
96
95
|
{_key: focusSpan.node._key},
|
|
97
96
|
],
|
|
98
|
-
offset: context.selection?.focus.offset ?? 0,
|
|
97
|
+
offset: snapshot.context.selection?.focus.offset ?? 0,
|
|
99
98
|
},
|
|
100
99
|
})
|
|
101
100
|
|
|
@@ -106,7 +105,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
106
105
|
const blockText = getTextBlockText(focusTextBlock.node)
|
|
107
106
|
const caretAtTheEndOfQuote = blockOffset.offset === 1
|
|
108
107
|
const looksLikeMarkdownQuote = /^>/.test(blockText)
|
|
109
|
-
const blockquoteStyle = config.blockquoteStyle?.(context)
|
|
108
|
+
const blockquoteStyle = config.blockquoteStyle?.(snapshot.context)
|
|
110
109
|
|
|
111
110
|
if (
|
|
112
111
|
caretAtTheEndOfQuote &&
|
|
@@ -152,7 +151,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
152
151
|
})
|
|
153
152
|
const automaticHr = defineBehavior({
|
|
154
153
|
on: 'insert.text',
|
|
155
|
-
guard: ({
|
|
154
|
+
guard: ({snapshot, event}) => {
|
|
156
155
|
const hrCharacter =
|
|
157
156
|
event.text === '-'
|
|
158
157
|
? '-'
|
|
@@ -166,16 +165,16 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
166
165
|
return false
|
|
167
166
|
}
|
|
168
167
|
|
|
169
|
-
const hrObject = config.horizontalRuleObject?.(context)
|
|
170
|
-
const focusBlock = selectors.getFocusTextBlock(
|
|
171
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
168
|
+
const hrObject = config.horizontalRuleObject?.(snapshot.context)
|
|
169
|
+
const focusBlock = selectors.getFocusTextBlock(snapshot)
|
|
170
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
172
171
|
|
|
173
172
|
if (!hrObject || !focusBlock || !selectionCollapsed) {
|
|
174
173
|
return false
|
|
175
174
|
}
|
|
176
175
|
|
|
177
|
-
const previousInlineObject = selectors.getPreviousInlineObject(
|
|
178
|
-
const textBefore = getBlockTextBefore(
|
|
176
|
+
const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
|
|
177
|
+
const textBefore = selectors.getBlockTextBefore(snapshot)
|
|
179
178
|
const hrBlockOffsets = {
|
|
180
179
|
anchor: {
|
|
181
180
|
path: focusBlock.path,
|
|
@@ -218,12 +217,12 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
218
217
|
})
|
|
219
218
|
const automaticHrOnPaste = defineBehavior({
|
|
220
219
|
on: 'paste',
|
|
221
|
-
guard: ({
|
|
220
|
+
guard: ({snapshot, event}) => {
|
|
222
221
|
const text = event.data.getData('text/plain')
|
|
223
222
|
const hrRegExp = /^(---)$|(___)$|(\*\*\*)$/gm
|
|
224
223
|
const hrCharacters = text.match(hrRegExp)?.[0]
|
|
225
|
-
const hrObject = config.horizontalRuleObject?.(context)
|
|
226
|
-
const focusBlock = selectors.getFocusBlock(
|
|
224
|
+
const hrObject = config.horizontalRuleObject?.(snapshot.context)
|
|
225
|
+
const focusBlock = selectors.getFocusBlock(snapshot)
|
|
227
226
|
|
|
228
227
|
if (!hrCharacters || !hrObject || !focusBlock) {
|
|
229
228
|
return false
|
|
@@ -264,30 +263,30 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
264
263
|
})
|
|
265
264
|
const automaticHeadingOnSpace = defineBehavior({
|
|
266
265
|
on: 'insert.text',
|
|
267
|
-
guard: ({
|
|
266
|
+
guard: ({snapshot, event}) => {
|
|
268
267
|
const isSpace = event.text === ' '
|
|
269
268
|
|
|
270
269
|
if (!isSpace) {
|
|
271
270
|
return false
|
|
272
271
|
}
|
|
273
272
|
|
|
274
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
275
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
276
|
-
const focusSpan = selectors.getFocusSpan(
|
|
273
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
274
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
275
|
+
const focusSpan = selectors.getFocusSpan(snapshot)
|
|
277
276
|
|
|
278
277
|
if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
|
|
279
278
|
return false
|
|
280
279
|
}
|
|
281
280
|
|
|
282
281
|
const blockOffset = spanSelectionPointToBlockOffset({
|
|
283
|
-
value: context.value,
|
|
282
|
+
value: snapshot.context.value,
|
|
284
283
|
selectionPoint: {
|
|
285
284
|
path: [
|
|
286
285
|
{_key: focusTextBlock.node._key},
|
|
287
286
|
'children',
|
|
288
287
|
{_key: focusSpan.node._key},
|
|
289
288
|
],
|
|
290
|
-
offset: context.selection?.focus.offset ?? 0,
|
|
289
|
+
offset: snapshot.context.selection?.focus.offset ?? 0,
|
|
291
290
|
},
|
|
292
291
|
})
|
|
293
292
|
|
|
@@ -295,7 +294,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
295
294
|
return false
|
|
296
295
|
}
|
|
297
296
|
|
|
298
|
-
const previousInlineObject = selectors.getPreviousInlineObject(
|
|
297
|
+
const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
|
|
299
298
|
const blockText = getTextBlockText(focusTextBlock.node)
|
|
300
299
|
const markdownHeadingSearch = /^#+/.exec(blockText)
|
|
301
300
|
const level = markdownHeadingSearch
|
|
@@ -309,7 +308,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
309
308
|
|
|
310
309
|
const style =
|
|
311
310
|
level !== undefined
|
|
312
|
-
? config.headingStyle?.({schema: context.schema, level})
|
|
311
|
+
? config.headingStyle?.({schema: snapshot.context.schema, level})
|
|
313
312
|
: undefined
|
|
314
313
|
|
|
315
314
|
if (level !== undefined && style !== undefined) {
|
|
@@ -351,10 +350,10 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
351
350
|
})
|
|
352
351
|
const clearStyleOnBackspace = defineBehavior({
|
|
353
352
|
on: 'delete.backward',
|
|
354
|
-
guard: ({
|
|
355
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
356
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
357
|
-
const focusSpan = selectors.getFocusSpan(
|
|
353
|
+
guard: ({snapshot}) => {
|
|
354
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
355
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
356
|
+
const focusSpan = selectors.getFocusSpan(snapshot)
|
|
358
357
|
|
|
359
358
|
if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
|
|
360
359
|
return false
|
|
@@ -362,9 +361,9 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
362
361
|
|
|
363
362
|
const atTheBeginningOfBLock =
|
|
364
363
|
focusTextBlock.node.children[0]._key === focusSpan.node._key &&
|
|
365
|
-
context.selection?.focus.offset === 0
|
|
364
|
+
snapshot.context.selection?.focus.offset === 0
|
|
366
365
|
|
|
367
|
-
const defaultStyle = config.defaultStyle?.(context)
|
|
366
|
+
const defaultStyle = config.defaultStyle?.(snapshot.context)
|
|
368
367
|
|
|
369
368
|
if (
|
|
370
369
|
atTheBeginningOfBLock &&
|
|
@@ -388,31 +387,31 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
388
387
|
})
|
|
389
388
|
const automaticListOnSpace = defineBehavior({
|
|
390
389
|
on: 'insert.text',
|
|
391
|
-
guard: ({
|
|
390
|
+
guard: ({snapshot, event}) => {
|
|
392
391
|
const isSpace = event.text === ' '
|
|
393
392
|
|
|
394
393
|
if (!isSpace) {
|
|
395
394
|
return false
|
|
396
395
|
}
|
|
397
396
|
|
|
398
|
-
const selectionCollapsed = selectors.isSelectionCollapsed(
|
|
399
|
-
const focusTextBlock = selectors.getFocusTextBlock(
|
|
400
|
-
const focusSpan = selectors.getFocusSpan(
|
|
397
|
+
const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)
|
|
398
|
+
const focusTextBlock = selectors.getFocusTextBlock(snapshot)
|
|
399
|
+
const focusSpan = selectors.getFocusSpan(snapshot)
|
|
401
400
|
|
|
402
401
|
if (!selectionCollapsed || !focusTextBlock || !focusSpan) {
|
|
403
402
|
return false
|
|
404
403
|
}
|
|
405
404
|
|
|
406
|
-
const previousInlineObject = selectors.getPreviousInlineObject(
|
|
405
|
+
const previousInlineObject = selectors.getPreviousInlineObject(snapshot)
|
|
407
406
|
const blockOffset = spanSelectionPointToBlockOffset({
|
|
408
|
-
value: context.value,
|
|
407
|
+
value: snapshot.context.value,
|
|
409
408
|
selectionPoint: {
|
|
410
409
|
path: [
|
|
411
410
|
{_key: focusTextBlock.node._key},
|
|
412
411
|
'children',
|
|
413
412
|
{_key: focusSpan.node._key},
|
|
414
413
|
],
|
|
415
|
-
offset: context.selection?.focus.offset ?? 0,
|
|
414
|
+
offset: snapshot.context.selection?.focus.offset ?? 0,
|
|
416
415
|
},
|
|
417
416
|
})
|
|
418
417
|
|
|
@@ -421,9 +420,9 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
421
420
|
}
|
|
422
421
|
|
|
423
422
|
const blockText = getTextBlockText(focusTextBlock.node)
|
|
424
|
-
const defaultStyle = config.defaultStyle?.(context)
|
|
423
|
+
const defaultStyle = config.defaultStyle?.(snapshot.context)
|
|
425
424
|
const looksLikeUnorderedList = /^(-|\*)/.test(blockText)
|
|
426
|
-
const unorderedListStyle = config.unorderedListStyle?.(context)
|
|
425
|
+
const unorderedListStyle = config.unorderedListStyle?.(snapshot.context)
|
|
427
426
|
const caretAtTheEndOfUnorderedList = blockOffset.offset === 1
|
|
428
427
|
|
|
429
428
|
if (
|
|
@@ -441,7 +440,7 @@ export function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {
|
|
|
441
440
|
}
|
|
442
441
|
|
|
443
442
|
const looksLikeOrderedList = /^1\./.test(blockText)
|
|
444
|
-
const orderedListStyle = config.orderedListStyle?.(context)
|
|
443
|
+
const orderedListStyle = config.orderedListStyle?.(snapshot.context)
|
|
445
444
|
const caretAtTheEndOfOrderedList = blockOffset.offset === 2
|
|
446
445
|
|
|
447
446
|
if (
|
|
@@ -6,9 +6,10 @@ import type {
|
|
|
6
6
|
import type {TextUnit} from 'slate'
|
|
7
7
|
import type {TextInsertTextOptions} from 'slate/dist/interfaces/transforms/text'
|
|
8
8
|
import type {ConverterEvent} from '../converters/converter.types'
|
|
9
|
-
import type {EditorContext} from '../editor/editor-snapshot'
|
|
9
|
+
import type {EditorContext, EditorSnapshot} from '../editor/editor-snapshot'
|
|
10
10
|
import type {MIMEType} from '../internal-utils/mime-type'
|
|
11
11
|
import type {OmitFromUnion, PickFromUnion} from '../type-utils'
|
|
12
|
+
import type {BlockOffset} from '../types/block-offset'
|
|
12
13
|
import type {EditorSelection, PortableTextSlateEditor} from '../types/editor'
|
|
13
14
|
|
|
14
15
|
/**
|
|
@@ -236,7 +237,7 @@ export type NativeBehaviorEvent =
|
|
|
236
237
|
}
|
|
237
238
|
| {
|
|
238
239
|
type: 'serialize'
|
|
239
|
-
originEvent: 'copy' | 'cut' | 'unknown'
|
|
240
|
+
originEvent: 'copy' | 'cut' | 'drag' | 'unknown'
|
|
240
241
|
dataTransfer: DataTransfer
|
|
241
242
|
}
|
|
242
243
|
|
|
@@ -333,11 +334,13 @@ export type Behavior<
|
|
|
333
334
|
/**
|
|
334
335
|
* @beta
|
|
335
336
|
*/
|
|
336
|
-
export type BehaviorGuard<TBehaviorEvent, TGuardResponse> = ({
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
337
|
+
export type BehaviorGuard<TBehaviorEvent, TGuardResponse> = (payload: {
|
|
338
|
+
/**
|
|
339
|
+
* @deprecated
|
|
340
|
+
* Use `snapshot` instead
|
|
341
|
+
*/
|
|
340
342
|
context: EditorContext
|
|
343
|
+
snapshot: EditorSnapshot
|
|
341
344
|
event: TBehaviorEvent
|
|
342
345
|
}) => TGuardResponse | false
|
|
343
346
|
|
|
@@ -345,11 +348,13 @@ export type BehaviorGuard<TBehaviorEvent, TGuardResponse> = ({
|
|
|
345
348
|
* @beta
|
|
346
349
|
*/
|
|
347
350
|
export type BehaviorActionIntendSet<TBehaviorEvent, TGuardResponse> = (
|
|
348
|
-
{
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
351
|
+
payload: {
|
|
352
|
+
/**
|
|
353
|
+
* @deprecated
|
|
354
|
+
* Use `snapshot` instead
|
|
355
|
+
*/
|
|
352
356
|
context: EditorContext
|
|
357
|
+
snapshot: EditorSnapshot
|
|
353
358
|
event: TBehaviorEvent
|
|
354
359
|
},
|
|
355
360
|
guardResponse: TGuardResponse,
|
|
@@ -400,11 +405,3 @@ export function defineBehavior<
|
|
|
400
405
|
): Behavior {
|
|
401
406
|
return behavior as unknown as Behavior
|
|
402
407
|
}
|
|
403
|
-
|
|
404
|
-
/**
|
|
405
|
-
* @beta
|
|
406
|
-
*/
|
|
407
|
-
export type BlockOffset = {
|
|
408
|
-
path: [KeyedSegment]
|
|
409
|
-
offset: number
|
|
410
|
-
}
|
package/src/behaviors/index.ts
CHANGED
|
@@ -2,8 +2,8 @@ import {defineConverter} from './converter.types'
|
|
|
2
2
|
|
|
3
3
|
export const converterJson = defineConverter({
|
|
4
4
|
mimeType: 'application/json',
|
|
5
|
-
serialize: ({
|
|
6
|
-
const portableTextConverter = context.converters.find(
|
|
5
|
+
serialize: ({snapshot, event}) => {
|
|
6
|
+
const portableTextConverter = snapshot.context.converters.find(
|
|
7
7
|
(converter) => converter.mimeType === 'application/x-portable-text',
|
|
8
8
|
)
|
|
9
9
|
|
|
@@ -17,7 +17,7 @@ export const converterJson = defineConverter({
|
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
const serializationEvent = portableTextConverter.serialize({
|
|
20
|
-
|
|
20
|
+
snapshot,
|
|
21
21
|
event,
|
|
22
22
|
})
|
|
23
23
|
|
|
@@ -27,8 +27,8 @@ export const converterJson = defineConverter({
|
|
|
27
27
|
originEvent: event.originEvent,
|
|
28
28
|
}
|
|
29
29
|
},
|
|
30
|
-
deserialize: ({
|
|
31
|
-
const portableTextConverter = context.converters.find(
|
|
30
|
+
deserialize: ({snapshot, event}) => {
|
|
31
|
+
const portableTextConverter = snapshot.context.converters.find(
|
|
32
32
|
(converter) => converter.mimeType === 'application/x-portable-text',
|
|
33
33
|
)
|
|
34
34
|
|
|
@@ -41,7 +41,7 @@ export const converterJson = defineConverter({
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
const deserializationEvent = portableTextConverter.deserialize({
|
|
44
|
-
|
|
44
|
+
snapshot,
|
|
45
45
|
event,
|
|
46
46
|
})
|
|
47
47
|
|
|
@@ -8,14 +8,16 @@ import {createTestKeyGenerator} from '../internal-utils/test-key-generator'
|
|
|
8
8
|
import {converterPortableText} from './converter.portable-text'
|
|
9
9
|
import {coreConverters} from './converters.core'
|
|
10
10
|
|
|
11
|
-
function
|
|
11
|
+
function createSnapshot(schema: SchemaDefinition) {
|
|
12
12
|
return {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
context: {
|
|
14
|
+
converters: coreConverters,
|
|
15
|
+
activeDecorators: [],
|
|
16
|
+
keyGenerator: createTestKeyGenerator(),
|
|
17
|
+
schema: compileSchemaDefinition(schema),
|
|
18
|
+
value: [],
|
|
19
|
+
selection: null,
|
|
20
|
+
},
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
23
|
|
|
@@ -23,7 +25,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
23
25
|
test('non-array', () => {
|
|
24
26
|
expect(
|
|
25
27
|
converterPortableText.deserialize({
|
|
26
|
-
|
|
28
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
27
29
|
event: {
|
|
28
30
|
type: 'deserialize',
|
|
29
31
|
data: JSON.stringify(''),
|
|
@@ -37,7 +39,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
37
39
|
test('empty array', () => {
|
|
38
40
|
expect(
|
|
39
41
|
converterPortableText.deserialize({
|
|
40
|
-
|
|
42
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
41
43
|
event: {
|
|
42
44
|
type: 'deserialize',
|
|
43
45
|
data: JSON.stringify([]),
|
|
@@ -51,7 +53,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
51
53
|
test('no known array entries', () => {
|
|
52
54
|
expect(
|
|
53
55
|
converterPortableText.deserialize({
|
|
54
|
-
|
|
56
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
55
57
|
event: {
|
|
56
58
|
type: 'deserialize',
|
|
57
59
|
data: JSON.stringify([{foo: 'bar'}]),
|
|
@@ -65,7 +67,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
65
67
|
test('some known array entries', () => {
|
|
66
68
|
expect(
|
|
67
69
|
converterPortableText.deserialize({
|
|
68
|
-
|
|
70
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
69
71
|
event: {
|
|
70
72
|
type: 'deserialize',
|
|
71
73
|
data: JSON.stringify([{_type: 'block', children: []}, {foo: 'bar'}]),
|
|
@@ -93,7 +95,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
93
95
|
test('no marks or markDefs', () => {
|
|
94
96
|
expect(
|
|
95
97
|
converterPortableText.deserialize({
|
|
96
|
-
|
|
98
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
97
99
|
event: {
|
|
98
100
|
type: 'deserialize',
|
|
99
101
|
data: JSON.stringify([
|
|
@@ -129,7 +131,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
129
131
|
test('unknown block object', () => {
|
|
130
132
|
expect(
|
|
131
133
|
converterPortableText.deserialize({
|
|
132
|
-
|
|
134
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
133
135
|
event: {
|
|
134
136
|
type: 'deserialize',
|
|
135
137
|
data: JSON.stringify([{_type: 'foo'}]),
|
|
@@ -143,7 +145,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
143
145
|
test('known block object', () => {
|
|
144
146
|
expect(
|
|
145
147
|
converterPortableText.deserialize({
|
|
146
|
-
|
|
148
|
+
snapshot: createSnapshot(
|
|
147
149
|
defineSchema({
|
|
148
150
|
blockObjects: [{name: 'image'}],
|
|
149
151
|
}),
|
|
@@ -173,7 +175,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
173
175
|
test('unknown inline object', () => {
|
|
174
176
|
expect(
|
|
175
177
|
converterPortableText.deserialize({
|
|
176
|
-
|
|
178
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
177
179
|
event: {
|
|
178
180
|
type: 'deserialize',
|
|
179
181
|
data: JSON.stringify([
|
|
@@ -204,7 +206,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
204
206
|
test('known inline object', () => {
|
|
205
207
|
expect(
|
|
206
208
|
converterPortableText.deserialize({
|
|
207
|
-
|
|
209
|
+
snapshot: createSnapshot(
|
|
208
210
|
defineSchema({
|
|
209
211
|
inlineObjects: [{name: 'stock-ticker'}],
|
|
210
212
|
}),
|
|
@@ -231,7 +233,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
231
233
|
|
|
232
234
|
test('no style', () => {
|
|
233
235
|
const deserializedEvent = converterPortableText.deserialize({
|
|
234
|
-
|
|
236
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
235
237
|
event: {
|
|
236
238
|
type: 'deserialize',
|
|
237
239
|
data: JSON.stringify([
|
|
@@ -267,7 +269,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
267
269
|
|
|
268
270
|
test('default style', () => {
|
|
269
271
|
const deserializedEvent = converterPortableText.deserialize({
|
|
270
|
-
|
|
272
|
+
snapshot: createSnapshot(defineSchema({styles: [{name: 'h1'}]})),
|
|
271
273
|
event: {
|
|
272
274
|
type: 'deserialize',
|
|
273
275
|
data: JSON.stringify([
|
|
@@ -303,7 +305,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
303
305
|
|
|
304
306
|
test('unknown style', () => {
|
|
305
307
|
const deserializedEvent = converterPortableText.deserialize({
|
|
306
|
-
|
|
308
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
307
309
|
event: {
|
|
308
310
|
type: 'deserialize',
|
|
309
311
|
data: JSON.stringify([
|
|
@@ -340,7 +342,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
340
342
|
|
|
341
343
|
test('known style', () => {
|
|
342
344
|
const deserializedEvent = converterPortableText.deserialize({
|
|
343
|
-
|
|
345
|
+
snapshot: createSnapshot(
|
|
344
346
|
defineSchema({
|
|
345
347
|
styles: [{name: 'h1'}],
|
|
346
348
|
}),
|
|
@@ -381,7 +383,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
381
383
|
|
|
382
384
|
test('unknown listItem', () => {
|
|
383
385
|
const deserializedEvent = converterPortableText.deserialize({
|
|
384
|
-
|
|
386
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
385
387
|
event: {
|
|
386
388
|
type: 'deserialize',
|
|
387
389
|
data: JSON.stringify([
|
|
@@ -420,7 +422,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
420
422
|
|
|
421
423
|
test('known listItem', () => {
|
|
422
424
|
const deserializedEvent = converterPortableText.deserialize({
|
|
423
|
-
|
|
425
|
+
snapshot: createSnapshot(
|
|
424
426
|
defineSchema({
|
|
425
427
|
lists: [{name: 'bullet'}],
|
|
426
428
|
}),
|
|
@@ -465,7 +467,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
465
467
|
test('unknown annotations', () => {
|
|
466
468
|
expect(
|
|
467
469
|
converterPortableText.deserialize({
|
|
468
|
-
|
|
470
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
469
471
|
event: {
|
|
470
472
|
type: 'deserialize',
|
|
471
473
|
data: JSON.stringify([
|
|
@@ -523,7 +525,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
523
525
|
test('known annotations', () => {
|
|
524
526
|
expect(
|
|
525
527
|
converterPortableText.deserialize({
|
|
526
|
-
|
|
528
|
+
snapshot: createSnapshot(
|
|
527
529
|
defineSchema({
|
|
528
530
|
annotations: [{name: 'link'}],
|
|
529
531
|
}),
|
|
@@ -592,7 +594,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
592
594
|
test('unknown decorators', () => {
|
|
593
595
|
expect(
|
|
594
596
|
converterPortableText.deserialize({
|
|
595
|
-
|
|
597
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
596
598
|
event: {
|
|
597
599
|
type: 'deserialize',
|
|
598
600
|
data: JSON.stringify([
|
|
@@ -638,7 +640,7 @@ describe(converterPortableText.deserialize, () => {
|
|
|
638
640
|
test('known decorators', () => {
|
|
639
641
|
expect(
|
|
640
642
|
converterPortableText.deserialize({
|
|
641
|
-
|
|
643
|
+
snapshot: createSnapshot(
|
|
642
644
|
defineSchema({
|
|
643
645
|
decorators: [{name: 'strong'}],
|
|
644
646
|
}),
|
|
@@ -4,8 +4,8 @@ import {defineConverter} from './converter.types'
|
|
|
4
4
|
|
|
5
5
|
export const converterPortableText = defineConverter({
|
|
6
6
|
mimeType: 'application/x-portable-text',
|
|
7
|
-
serialize: ({
|
|
8
|
-
if (!context.selection) {
|
|
7
|
+
serialize: ({snapshot, event}) => {
|
|
8
|
+
if (!snapshot.context.selection) {
|
|
9
9
|
return {
|
|
10
10
|
type: 'serialization.failure',
|
|
11
11
|
mimeType: 'application/x-portable-text',
|
|
@@ -15,8 +15,8 @@ export const converterPortableText = defineConverter({
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
const blocks = sliceBlocks({
|
|
18
|
-
blocks: context.value,
|
|
19
|
-
selection: context.selection,
|
|
18
|
+
blocks: snapshot.context.value,
|
|
19
|
+
selection: snapshot.context.selection,
|
|
20
20
|
})
|
|
21
21
|
|
|
22
22
|
return {
|
|
@@ -26,7 +26,7 @@ export const converterPortableText = defineConverter({
|
|
|
26
26
|
originEvent: event.originEvent,
|
|
27
27
|
}
|
|
28
28
|
},
|
|
29
|
-
deserialize: ({
|
|
29
|
+
deserialize: ({snapshot, event}) => {
|
|
30
30
|
const blocks = JSON.parse(event.data)
|
|
31
31
|
|
|
32
32
|
if (!Array.isArray(blocks)) {
|
|
@@ -39,7 +39,7 @@ export const converterPortableText = defineConverter({
|
|
|
39
39
|
|
|
40
40
|
const parsedBlocks = blocks.flatMap((block) => {
|
|
41
41
|
const parsedBlock = parseBlock({
|
|
42
|
-
context,
|
|
42
|
+
context: snapshot.context,
|
|
43
43
|
block,
|
|
44
44
|
options: {refreshKeys: true},
|
|
45
45
|
})
|
|
@@ -8,14 +8,16 @@ import {createTestKeyGenerator} from '../internal-utils/test-key-generator'
|
|
|
8
8
|
import {converterTextHtml} from './converter.text-html'
|
|
9
9
|
import {coreConverters} from './converters.core'
|
|
10
10
|
|
|
11
|
-
function
|
|
11
|
+
function createSnapshot(schema: SchemaDefinition) {
|
|
12
12
|
return {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
context: {
|
|
14
|
+
converters: coreConverters,
|
|
15
|
+
activeDecorators: [],
|
|
16
|
+
keyGenerator: createTestKeyGenerator(),
|
|
17
|
+
schema: compileSchemaDefinition(schema),
|
|
18
|
+
selection: null,
|
|
19
|
+
value: [],
|
|
20
|
+
},
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
23
|
|
|
@@ -31,7 +33,7 @@ describe(converterTextHtml.deserialize.name, () => {
|
|
|
31
33
|
test('paragraph with unknown decorators', () => {
|
|
32
34
|
expect(
|
|
33
35
|
converterTextHtml.deserialize({
|
|
34
|
-
|
|
36
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
35
37
|
event: {
|
|
36
38
|
type: 'deserialize',
|
|
37
39
|
data: decoratedParagraph,
|
|
@@ -60,7 +62,7 @@ describe(converterTextHtml.deserialize.name, () => {
|
|
|
60
62
|
test('paragraph with known decorators', () => {
|
|
61
63
|
expect(
|
|
62
64
|
converterTextHtml.deserialize({
|
|
63
|
-
|
|
65
|
+
snapshot: createSnapshot(
|
|
64
66
|
defineSchema({
|
|
65
67
|
decorators: [{name: 'strong'}, {name: 'em'}, {name: 'code'}],
|
|
66
68
|
}),
|
|
@@ -105,7 +107,7 @@ describe(converterTextHtml.deserialize.name, () => {
|
|
|
105
107
|
test('image', () => {
|
|
106
108
|
expect(
|
|
107
109
|
converterTextHtml.deserialize({
|
|
108
|
-
|
|
110
|
+
snapshot: createSnapshot(
|
|
109
111
|
defineSchema({
|
|
110
112
|
blockObjects: [{name: 'image'}],
|
|
111
113
|
}),
|
|
@@ -123,7 +125,7 @@ describe(converterTextHtml.deserialize.name, () => {
|
|
|
123
125
|
test('paragraph with unknown link', () => {
|
|
124
126
|
expect(
|
|
125
127
|
converterTextHtml.deserialize({
|
|
126
|
-
|
|
128
|
+
snapshot: createSnapshot(defineSchema({})),
|
|
127
129
|
event: {
|
|
128
130
|
type: 'deserialize',
|
|
129
131
|
data: paragraphWithLink,
|
|
@@ -152,7 +154,7 @@ describe(converterTextHtml.deserialize.name, () => {
|
|
|
152
154
|
test('paragraph with known link', () => {
|
|
153
155
|
expect(
|
|
154
156
|
converterTextHtml.deserialize({
|
|
155
|
-
|
|
157
|
+
snapshot: createSnapshot(
|
|
156
158
|
defineSchema({
|
|
157
159
|
annotations: [{name: 'link'}],
|
|
158
160
|
}),
|
|
@@ -197,7 +199,7 @@ describe(converterTextHtml.deserialize.name, () => {
|
|
|
197
199
|
test('unordered list', () => {
|
|
198
200
|
expect(
|
|
199
201
|
converterTextHtml.deserialize({
|
|
200
|
-
|
|
202
|
+
snapshot: createSnapshot(
|
|
201
203
|
defineSchema({
|
|
202
204
|
lists: [{name: 'bullet'}],
|
|
203
205
|
}),
|
|
@@ -248,7 +250,7 @@ describe(converterTextHtml.deserialize.name, () => {
|
|
|
248
250
|
test('ordered list', () => {
|
|
249
251
|
expect(
|
|
250
252
|
converterTextHtml.deserialize({
|
|
251
|
-
|
|
253
|
+
snapshot: createSnapshot(
|
|
252
254
|
defineSchema({
|
|
253
255
|
lists: [{name: 'number'}],
|
|
254
256
|
}),
|
|
@@ -299,7 +301,7 @@ describe(converterTextHtml.deserialize.name, () => {
|
|
|
299
301
|
test('nested list', () => {
|
|
300
302
|
expect(
|
|
301
303
|
converterTextHtml.deserialize({
|
|
302
|
-
|
|
304
|
+
snapshot: createSnapshot(
|
|
303
305
|
defineSchema({
|
|
304
306
|
lists: [{name: 'bullet'}, {name: 'number'}],
|
|
305
307
|
}),
|