@portabletext/editor 2.21.3 → 3.0.1

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 (95) hide show
  1. package/lib/_chunks-dts/index.d.ts +49 -209
  2. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +103 -20
  3. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  4. package/lib/_chunks-es/{util.get-text-block-text.js → util.slice-blocks.js} +73 -24
  5. package/lib/_chunks-es/util.slice-blocks.js.map +1 -0
  6. package/lib/_chunks-es/util.slice-text-block.js +13 -2
  7. package/lib/_chunks-es/util.slice-text-block.js.map +1 -1
  8. package/lib/behaviors/index.d.ts +1 -1
  9. package/lib/index.d.ts +2 -2
  10. package/lib/index.js +339 -341
  11. package/lib/index.js.map +1 -1
  12. package/lib/plugins/index.d.ts +2 -133
  13. package/lib/plugins/index.js +2 -796
  14. package/lib/plugins/index.js.map +1 -1
  15. package/lib/selectors/index.d.ts +2 -24
  16. package/lib/selectors/index.js +28 -130
  17. package/lib/selectors/index.js.map +1 -1
  18. package/lib/utils/index.d.ts +6 -4
  19. package/lib/utils/index.js +98 -9
  20. package/lib/utils/index.js.map +1 -1
  21. package/package.json +1 -3
  22. package/src/behaviors/behavior.abstract.split.ts +1 -0
  23. package/src/behaviors/behavior.perform-event.ts +7 -7
  24. package/src/converters/converter.portable-text.ts +1 -0
  25. package/src/converters/converter.text-html.ts +1 -0
  26. package/src/converters/converter.text-plain.ts +1 -0
  27. package/src/editor/Editable.tsx +1 -0
  28. package/src/editor/PortableTextEditor.tsx +0 -19
  29. package/src/editor/create-editor.ts +0 -3
  30. package/src/editor/editor-machine.ts +0 -10
  31. package/src/editor/event-to-change.tsx +5 -1
  32. package/src/editor/plugins/create-with-event-listeners.ts +30 -6
  33. package/src/editor/plugins/createWithObjectKeys.ts +2 -1
  34. package/src/editor/plugins/createWithPatches.ts +3 -3
  35. package/src/editor/plugins/createWithPlaceholderBlock.ts +2 -1
  36. package/src/editor/plugins/createWithPortableTextMarkModel.ts +2 -1
  37. package/src/editor/plugins/with-plugins.ts +10 -14
  38. package/src/editor/relay-machine.ts +0 -4
  39. package/src/editor/sync-machine.ts +2 -2
  40. package/src/editor.ts +0 -4
  41. package/src/history/behavior.operation.history.redo.ts +67 -0
  42. package/src/history/behavior.operation.history.undo.ts +71 -0
  43. package/src/history/event.history.undo.test.tsx +672 -0
  44. package/src/history/history.preserving-keys.test.tsx +112 -0
  45. package/src/history/remote-patches.ts +20 -0
  46. package/src/history/slate-plugin.history.ts +146 -0
  47. package/src/history/slate-plugin.redoing.ts +21 -0
  48. package/src/history/slate-plugin.undoing.ts +21 -0
  49. package/src/history/slate-plugin.without-history.ts +23 -0
  50. package/src/history/transform-operation.ts +245 -0
  51. package/src/history/undo-redo-collaboration.test.tsx +541 -0
  52. package/src/history/undo-redo.feature +125 -0
  53. package/src/history/undo-redo.test.tsx +195 -0
  54. package/src/history/undo-step.ts +148 -0
  55. package/src/index.ts +0 -1
  56. package/src/internal-utils/operation-to-patches.test.ts +23 -25
  57. package/src/internal-utils/operation-to-patches.ts +31 -22
  58. package/src/internal-utils/selection-text.test.ts +3 -0
  59. package/src/internal-utils/selection-text.ts +5 -2
  60. package/src/internal-utils/values.ts +23 -11
  61. package/src/operations/behavior.operation.block.set.ts +1 -0
  62. package/src/operations/behavior.operation.block.unset.ts +2 -0
  63. package/src/operations/behavior.operation.insert.block.ts +1 -0
  64. package/src/operations/behavior.operations.ts +2 -4
  65. package/src/plugins/index.ts +0 -3
  66. package/src/selectors/index.ts +0 -3
  67. package/src/test/vitest/step-definitions.tsx +57 -0
  68. package/src/test/vitest/test-editor.tsx +1 -1
  69. package/src/utils/parse-blocks.test.ts +296 -16
  70. package/src/utils/parse-blocks.ts +81 -22
  71. package/src/utils/util.merge-text-blocks.ts +5 -1
  72. package/src/utils/util.slice-blocks.ts +24 -10
  73. package/lib/_chunks-es/selector.get-selection-text.js +0 -92
  74. package/lib/_chunks-es/selector.get-selection-text.js.map +0 -1
  75. package/lib/_chunks-es/selector.get-text-before.js +0 -36
  76. package/lib/_chunks-es/selector.get-text-before.js.map +0 -1
  77. package/lib/_chunks-es/util.get-text-block-text.js.map +0 -1
  78. package/lib/_chunks-es/util.is-empty-text-block.js +0 -40
  79. package/lib/_chunks-es/util.is-empty-text-block.js.map +0 -1
  80. package/lib/_chunks-es/util.merge-text-blocks.js +0 -101
  81. package/lib/_chunks-es/util.merge-text-blocks.js.map +0 -1
  82. package/src/editor/plugins/createWithMaxBlocks.ts +0 -53
  83. package/src/editor/plugins/createWithUndoRedo.ts +0 -628
  84. package/src/editor/with-undo-step.ts +0 -37
  85. package/src/editor/withUndoRedo.ts +0 -34
  86. package/src/editor-event-listener.tsx +0 -28
  87. package/src/plugins/plugin.decorator-shortcut.ts +0 -238
  88. package/src/plugins/plugin.markdown.test.tsx +0 -42
  89. package/src/plugins/plugin.markdown.tsx +0 -131
  90. package/src/plugins/plugin.one-line.tsx +0 -123
  91. package/src/selectors/selector.get-list-state.test.ts +0 -189
  92. package/src/selectors/selector.get-list-state.ts +0 -96
  93. package/src/selectors/selector.get-selected-slice.ts +0 -13
  94. package/src/selectors/selector.get-trimmed-selection.test.ts +0 -657
  95. package/src/selectors/selector.get-trimmed-selection.ts +0 -189
@@ -1,4 +1,23 @@
1
1
  import { isTextBlock, isSpan } from "@portabletext/schema";
2
+ function getBlockEndPoint({
3
+ context,
4
+ block
5
+ }) {
6
+ if (isTextBlock(context, block.node)) {
7
+ const lastChild = block.node.children[block.node.children.length - 1];
8
+ if (lastChild)
9
+ return {
10
+ path: [...block.path, "children", {
11
+ _key: lastChild._key
12
+ }],
13
+ offset: isSpan(context, lastChild) ? lastChild.text.length : 0
14
+ };
15
+ }
16
+ return {
17
+ path: block.path,
18
+ offset: 0
19
+ };
20
+ }
2
21
  function getBlockStartPoint({
3
22
  context,
4
23
  block
@@ -13,6 +32,9 @@ function getBlockStartPoint({
13
32
  offset: 0
14
33
  };
15
34
  }
35
+ function isSelectionCollapsed(selection) {
36
+ return selection ? JSON.stringify(selection.anchor.path) === JSON.stringify(selection.focus.path) && selection.anchor.offset === selection.focus.offset : !1;
37
+ }
16
38
  function isKeyedSegment(segment) {
17
39
  return typeof segment == "object" && segment !== null && "_key" in segment;
18
40
  }
@@ -100,6 +122,9 @@ function spanSelectionPointToBlockOffset({
100
122
  }
101
123
  }
102
124
  }
125
+ function isEqualSelectionPoints(a, b) {
126
+ return a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path);
127
+ }
103
128
  function isTypedObject(object) {
104
129
  return isRecord(object) && typeof object._type == "string";
105
130
  }
@@ -189,7 +214,7 @@ function parseTextBlock({
189
214
  options
190
215
  });
191
216
  return parsedAnnotation ? (markDefKeyMap.set(markDef._key, parsedAnnotation._key), [parsedAnnotation]) : [];
192
- }), children = (Array.isArray(block.children) ? block.children : []).map((child) => parseSpan({
217
+ }), parsedChildren = (Array.isArray(block.children) ? block.children : []).map((child) => parseSpan({
193
218
  span: child,
194
219
  context,
195
220
  markDefKeyMap,
@@ -198,15 +223,33 @@ function parseTextBlock({
198
223
  inlineObject: child,
199
224
  context,
200
225
  options
201
- })).filter((child) => child !== void 0), marks = children.flatMap((child) => child.marks ?? []), parsedBlock = {
226
+ })).filter((child) => child !== void 0), marks = parsedChildren.flatMap((child) => child.marks ?? []), children = parsedChildren.length > 0 ? parsedChildren : [{
227
+ _key: context.keyGenerator(),
228
+ _type: context.schema.span.name,
229
+ text: "",
230
+ marks: []
231
+ }], normalizedChildren = options.normalize ? (
232
+ // Ensure that inline objects re surrounded by spans
233
+ children.reduce((normalizedChildren2, child, index) => {
234
+ if (isSpan(context, child))
235
+ return [...normalizedChildren2, child];
236
+ const previousChild = normalizedChildren2.at(-1);
237
+ return !previousChild || !isSpan(context, previousChild) ? [...normalizedChildren2, {
238
+ _key: context.keyGenerator(),
239
+ _type: context.schema.span.name,
240
+ text: "",
241
+ marks: []
242
+ }, child, ...index === children.length - 1 ? [{
243
+ _key: context.keyGenerator(),
244
+ _type: context.schema.span.name,
245
+ text: "",
246
+ marks: []
247
+ }] : []] : [...normalizedChildren2, child];
248
+ }, [])
249
+ ) : children, parsedBlock = {
202
250
  _type: context.schema.block.name,
203
251
  _key,
204
- children: children.length > 0 ? children : [{
205
- _key: context.keyGenerator(),
206
- _type: context.schema.span.name,
207
- text: "",
208
- marks: []
209
- }],
252
+ children: normalizedChildren,
210
253
  markDefs: options.removeUnusedMarkDefs ? markDefs.filter((markDef) => marks.includes(markDef._key)) : markDefs,
211
254
  ...customFields
212
255
  };
@@ -224,21 +267,25 @@ function parseSpan({
224
267
  markDefKeyMap,
225
268
  options
226
269
  }) {
227
- if (!isTypedObject(span))
270
+ if (!isRecord(span))
228
271
  return;
229
272
  const customFields = {};
230
273
  for (const key of Object.keys(span))
231
274
  key !== "_type" && key !== "_key" && key !== "text" && key !== "marks" && (customFields[key] = span[key]);
232
- if (span._type !== context.schema.span.name || span._type !== "span")
233
- return;
234
275
  const marks = (Array.isArray(span.marks) ? span.marks : []).flatMap((mark) => {
235
276
  if (typeof mark != "string")
236
277
  return [];
237
278
  const markDefKey = markDefKeyMap.get(mark);
238
279
  return markDefKey !== void 0 ? [markDefKey] : context.schema.decorators.some((decorator) => decorator.name === mark) ? [mark] : [];
239
280
  });
240
- return {
241
- _type: "span",
281
+ return span._type !== context.schema.span.name ? !context.schema.inlineObjects.some((inlineObject) => inlineObject.name === span._type) && typeof span.text == "string" ? {
282
+ _type: context.schema.span.name,
283
+ _key: typeof span._key == "string" ? span._key : context.keyGenerator(),
284
+ text: span.text,
285
+ marks,
286
+ ...options.validateFields ? {} : customFields
287
+ } : void 0 : {
288
+ _type: context.schema.span.name,
242
289
  _key: typeof span._key == "string" ? span._key : context.keyGenerator(),
243
290
  text: typeof span.text == "string" ? span.text : "",
244
291
  marks,
@@ -415,11 +462,12 @@ function sliceBlocks({
415
462
  }
416
463
  startBlock && middleBlocks.push(parseBlock({
417
464
  context: {
418
- ...context,
419
- keyGenerator: defaultKeyGenerator
465
+ schema: context.schema,
466
+ keyGenerator: context.keyGenerator ?? defaultKeyGenerator
420
467
  },
421
468
  block,
422
469
  options: {
470
+ normalize: !1,
423
471
  removeUnusedMarkDefs: !0,
424
472
  validateFields: !1
425
473
  }
@@ -427,41 +475,42 @@ function sliceBlocks({
427
475
  }
428
476
  const parsedStartBlock = startBlock ? parseBlock({
429
477
  context: {
430
- ...context,
431
- keyGenerator: defaultKeyGenerator
478
+ schema: context.schema,
479
+ keyGenerator: context.keyGenerator ?? defaultKeyGenerator
432
480
  },
433
481
  block: startBlock,
434
482
  options: {
483
+ normalize: !1,
435
484
  removeUnusedMarkDefs: !0,
436
485
  validateFields: !1
437
486
  }
438
487
  }) : void 0, parsedEndBlock = endBlock ? parseBlock({
439
488
  context: {
440
- ...context,
441
- keyGenerator: defaultKeyGenerator
489
+ schema: context.schema,
490
+ keyGenerator: context.keyGenerator ?? defaultKeyGenerator
442
491
  },
443
492
  block: endBlock,
444
493
  options: {
494
+ normalize: !1,
445
495
  removeUnusedMarkDefs: !0,
446
496
  validateFields: !1
447
497
  }
448
498
  }) : void 0;
449
499
  return [...parsedStartBlock ? [parsedStartBlock] : [], ...middleBlocks, ...parsedEndBlock ? [parsedEndBlock] : []];
450
500
  }
451
- function getTextBlockText(block) {
452
- return block.children.map((child) => child.text ?? "").join("");
453
- }
454
501
  export {
455
502
  blockOffsetToSpanSelectionPoint,
456
503
  defaultKeyGenerator,
504
+ getBlockEndPoint,
457
505
  getBlockKeyFromSelectionPoint,
458
506
  getBlockStartPoint,
459
507
  getChildKeyFromSelectionPoint,
460
508
  getSelectionEndPoint,
461
509
  getSelectionStartPoint,
462
- getTextBlockText,
510
+ isEqualSelectionPoints,
463
511
  isKeyedSegment,
464
512
  isListBlock,
513
+ isSelectionCollapsed,
465
514
  isTypedObject,
466
515
  parseAnnotation,
467
516
  parseBlock,
@@ -471,4 +520,4 @@ export {
471
520
  sliceBlocks,
472
521
  spanSelectionPointToBlockOffset
473
522
  };
474
- //# sourceMappingURL=util.get-text-block-text.js.map
523
+ //# sourceMappingURL=util.slice-blocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.is-selection-collapsed.ts","../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.selection-point.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/asserters.ts","../../src/utils/parse-blocks.ts","../../src/utils/key-generator.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n const lastChild = block.node.children[block.node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...block.path, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n return {\n path: [...block.path, 'children', {_key: block.node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import type {EditorSelection} from '../types/editor'\n\n/**\n * @public\n */\nexport function isSelectionCollapsed(selection: EditorSelection) {\n if (!selection) {\n return false\n }\n\n return (\n JSON.stringify(selection.anchor.path) ===\n JSON.stringify(selection.focus.path) &&\n selection.anchor.offset === selection.focus.offset\n )\n}\n","import type {KeyedSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: unknown): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function getBlockKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const blockPathSegment = point.path.at(0)\n\n if (isKeyedSegment(blockPathSegment)) {\n return blockPathSegment._key\n }\n\n return undefined\n}\n\nexport function getChildKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const childPathSegment = point.path.at(2)\n\n if (isKeyedSegment(childPathSegment)) {\n return childPathSegment._key\n }\n\n return undefined\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n context,\n blockOffset,\n direction,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint: {path: ChildPath; offset: number} | undefined\n let skippedInlineObject = false\n\n for (const block of context.value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isTextBlock(context, block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isSpan(context, child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isSpan(context, child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n context,\n selectionPoint,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = getBlockKeyFromSelectionPoint(selectionPoint)\n const spanKey = getChildKeyFromSelectionPoint(selectionPoint)\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of context.value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isTextBlock(context, block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isSpan(context, child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {\n PortableTextBlock,\n PortableTextListBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n TypedObject,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isRecord, isTypedObject} from './asserters'\n\nexport function parseBlocks({\n context,\n blocks,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n blocks: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlock({context, block, options})\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nexport function parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = context.schema.blockObjects.find(\n ({name}) => name === blockObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: blockObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function isListBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextListBlock {\n return (\n isTextBlock(context, block) &&\n block.level !== undefined &&\n block.listItem !== undefined\n )\n}\n\nexport function parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(block)) {\n if (\n key === '_type' ||\n key === '_key' ||\n key === 'children' ||\n key === 'markDefs' ||\n key === 'style' ||\n key === 'listItem' ||\n key === 'level'\n ) {\n continue\n }\n\n if (options.validateFields) {\n if (context.schema.block.fields?.some((field) => field.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key =\n typeof block._key === 'string' ? block._key : context.keyGenerator()\n\n const unparsedMarkDefs: Array<unknown> = Array.isArray(block.markDefs)\n ? block.markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n const markDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === markDef._type,\n )\n\n if (!schemaType) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n // If the `markDef` doesn't have a `_key` then we don't know what spans\n // it belongs to and therefore we have to discard it.\n return []\n }\n\n const parsedAnnotation = parseObject({\n object: markDef,\n context: {\n schemaType,\n keyGenerator: context.keyGenerator,\n },\n options,\n })\n\n if (!parsedAnnotation) {\n return []\n }\n\n markDefKeyMap.set(markDef._key, parsedAnnotation._key)\n\n return [parsedAnnotation]\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const parsedChildren = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n const marks = parsedChildren.flatMap((child) => child.marks ?? [])\n\n const children =\n parsedChildren.length > 0\n ? parsedChildren\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ]\n\n const normalizedChildren = options.normalize\n ? // Ensure that inline objects re surrounded by spans\n children.reduce<Array<PortableTextObject | PortableTextSpan>>(\n (normalizedChildren, child, index) => {\n if (isSpan(context, child)) {\n return [...normalizedChildren, child]\n }\n\n const previousChild = normalizedChildren.at(-1)\n\n if (!previousChild || !isSpan(context, previousChild)) {\n return [\n ...normalizedChildren,\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n child,\n ...(index === children.length - 1\n ? [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ]\n : []),\n ]\n }\n\n return [...normalizedChildren, child]\n },\n [],\n )\n : children\n\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children: normalizedChildren,\n markDefs: options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs,\n ...customFields,\n }\n\n if (\n typeof block.style === 'string' &&\n context.schema.styles.find((style) => style.name === block.style)\n ) {\n parsedBlock.style = block.style\n } else {\n const defaultStyle = context.schema.styles.at(0)?.name\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n console.error('Expected default style')\n }\n }\n\n if (\n typeof block.listItem === 'string' &&\n context.schema.lists.find((list) => list.name === block.listItem)\n ) {\n parsedBlock.listItem = block.listItem\n }\n\n if (typeof block.level === 'number') {\n parsedBlock.level = block.level\n }\n\n return parsedBlock\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isRecord(span)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(span)) {\n if (\n key !== '_type' &&\n key !== '_key' &&\n key !== 'text' &&\n key !== 'marks'\n ) {\n customFields[key] = span[key]\n }\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.name === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n if (span._type !== context.schema.span.name) {\n if (\n !context.schema.inlineObjects.some(\n (inlineObject) => inlineObject.name === span._type,\n ) &&\n typeof span.text === 'string'\n ) {\n return {\n _type: context.schema.span.name as 'span',\n _key:\n typeof span._key === 'string' ? span._key : context.keyGenerator(),\n text: span.text,\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n }\n\n return undefined\n }\n\n return {\n _type: context.schema.span.name as 'span',\n _key: typeof span._key === 'string' ? span._key : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n}\n\nexport function parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = context.schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n context,\n options,\n}: {\n annotation: TypedObject\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nfunction parseObject({\n object,\n context,\n options,\n}: {\n object: TypedObject\n context: Pick<EditorContext, 'keyGenerator'> & {\n schemaType: EditorSchema['blockObjects'][0]\n }\n options: {validateFields: boolean}\n}): PortableTextObject {\n const {_type, _key, ...customFields} = object\n\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = options.validateFields\n ? context.schemaType.fields.reduce<Record<string, unknown>>(\n (fieldValues, field) => {\n const fieldValue = object[field.name]\n\n if (fieldValue !== undefined) {\n fieldValues[field.name] = fieldValue\n }\n\n return fieldValues\n },\n {},\n )\n : customFields\n\n return {\n _type: context.schemaType.name,\n _key:\n typeof object._key === 'string' ? object._key : context.keyGenerator(),\n ...values,\n }\n}\n","/**\n * @public\n */\nexport const defaultKeyGenerator = (): string => randomKey(12)\n\nconst getByteHexTable = (() => {\n let table: any[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nfunction randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionEndPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {defaultKeyGenerator} from './key-generator'\nimport {parseBlock} from './parse-blocks'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'> & {\n keyGenerator?: () => string\n }\n blocks: Array<PortableTextBlock>\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!context.selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isTextBlock(context, block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isTextBlock(context, block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (block._key === endBlockKey && startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isTextBlock(context, startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isSpan(context, child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isTextBlock(context, block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isTextBlock(context, endBlock)) {\n if (child._key === endChildKey && isSpan(context, child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(\n parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n }) ?? block,\n )\n }\n }\n\n const parsedStartBlock = startBlock\n ? parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block: startBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n })\n : undefined\n\n const parsedEndBlock = endBlock\n ? parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block: endBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n })\n : undefined\n\n return [\n ...(parsedStartBlock ? [parsedStartBlock] : []),\n ...middleBlocks,\n ...(parsedEndBlock ? [parsedEndBlock] : []),\n ]\n}\n"],"names":["getBlockEndPoint","context","block","isTextBlock","node","lastChild","children","length","path","_key","offset","isSpan","text","getBlockStartPoint","isSelectionCollapsed","selection","JSON","stringify","anchor","focus","isKeyedSegment","segment","getBlockKeyFromSelectionPoint","point","blockPathSegment","at","getChildKeyFromSelectionPoint","childPathSegment","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","selectionPoint","skippedInlineObject","value","child","spanSelectionPointToBlockOffset","blockKey","spanKey","isEqualSelectionPoints","a","b","isTypedObject","object","isRecord","_type","parseBlocks","blocks","options","Array","isArray","flatMap","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","level","undefined","listItem","customFields","key","Object","keys","validateFields","fields","some","field","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","parsedChildren","map","parseSpan","span","parseInlineObject","inlineObject","filter","marks","normalizedChildren","normalize","reduce","index","previousChild","removeUnusedMarkDefs","includes","style","styles","defaultStyle","console","error","lists","list","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","values","fieldValues","fieldValue","defaultKeyGenerator","randomKey","getByteHexTable","table","i","toString","slice","whatwgRNG","rnds8","Uint8Array","crypto","getRandomValues","str","n","getSelectionEndPoint","backward","getSelectionStartPoint","sliceBlocks","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push","parsedStartBlock","parsedEndBlock"],"mappings":"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"}
@@ -1,5 +1,14 @@
1
- import { isSpan } from "@portabletext/schema";
2
- import { getBlockKeyFromSelectionPoint, getSelectionStartPoint, getSelectionEndPoint, getChildKeyFromSelectionPoint } from "./util.get-text-block-text.js";
1
+ import { isTextBlock, isSpan } from "@portabletext/schema";
2
+ import { getBlockKeyFromSelectionPoint, getSelectionStartPoint, getSelectionEndPoint, getChildKeyFromSelectionPoint } from "./util.slice-blocks.js";
3
+ function getTextBlockText(block) {
4
+ return block.children.map((child) => child.text ?? "").join("");
5
+ }
6
+ function isEmptyTextBlock(context, block) {
7
+ if (!isTextBlock(context, block))
8
+ return !1;
9
+ const onlyText = block.children.every((child) => isSpan(context, child)), blockText = getTextBlockText(block);
10
+ return onlyText && blockText === "";
11
+ }
3
12
  function sliceTextBlock({
4
13
  context,
5
14
  block
@@ -44,6 +53,8 @@ function sliceTextBlock({
44
53
  };
45
54
  }
46
55
  export {
56
+ getTextBlockText,
57
+ isEmptyTextBlock,
47
58
  sliceTextBlock
48
59
  };
49
60
  //# sourceMappingURL=util.slice-text-block.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.slice-text-block.js","sources":["../../src/utils/util.slice-text-block.ts"],"sourcesContent":["import {isSpan} from '@portabletext/schema'\nimport type {PortableTextChild, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\nexport function sliceTextBlock({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\n block: PortableTextTextBlock\n}): PortableTextTextBlock {\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n\n if (!startPoint || !endPoint) {\n return block\n }\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (startBlockKey !== endBlockKey || startBlockKey !== block._key) {\n return block\n }\n\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startChildKey || !endChildKey) {\n return block\n }\n\n let startChildFound = false\n const children: Array<PortableTextChild> = []\n\n for (const child of block.children) {\n if (child._key === startChildKey) {\n startChildFound = true\n\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n children.push({\n ...child,\n text,\n })\n } else {\n children.push(child)\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n\n continue\n }\n\n if (child._key === endChildKey) {\n if (isSpan(context, child)) {\n children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n children.push(child)\n }\n\n break\n }\n\n if (startChildFound) {\n children.push(child)\n }\n }\n\n return {\n ...block,\n children,\n }\n}\n"],"names":["sliceTextBlock","context","block","startPoint","getSelectionStartPoint","selection","endPoint","getSelectionEndPoint","startBlockKey","getBlockKeyFromSelectionPoint","endBlockKey","_key","startChildKey","getChildKeyFromSelectionPoint","endChildKey","startChildFound","children","child","isSpan","text","slice","offset","push"],"mappings":";;AAUO,SAASA,eAAe;AAAA,EAC7BC;AAAAA,EACAC;AAIF,GAA0B;AACxB,QAAMC,aAAaC,uBAAuBH,QAAQI,SAAS,GACrDC,WAAWC,qBAAqBN,QAAQI,SAAS;AAEvD,MAAI,CAACF,cAAc,CAACG;AAClB,WAAOJ;AAGT,QAAMM,gBAAgBC,8BAA8BN,UAAU,GACxDO,cAAcD,8BAA8BH,QAAQ;AAE1D,MAAIE,kBAAkBE,eAAeF,kBAAkBN,MAAMS;AAC3D,WAAOT;AAGT,QAAMU,gBAAgBC,8BAA8BV,UAAU,GACxDW,cAAcD,8BAA8BP,QAAQ;AAE1D,MAAI,CAACM,iBAAiB,CAACE;AACrB,WAAOZ;AAGT,MAAIa,kBAAkB;AACtB,QAAMC,WAAqC,CAAA;AAE3C,aAAWC,SAASf,MAAMc,UAAU;AAClC,QAAIC,MAAMN,SAASC,eAAe;AAGhC,UAFAG,kBAAkB,IAEdG,OAAOjB,SAASgB,KAAK,GAAG;AAC1B,cAAME,OACJF,MAAMN,SAASG,cACXG,MAAME,KAAKC,MAAMjB,WAAWkB,QAAQf,SAASe,MAAM,IACnDJ,MAAME,KAAKC,MAAMjB,WAAWkB,MAAM;AAExCL,iBAASM,KAAK;AAAA,UACZ,GAAGL;AAAAA,UACHE;AAAAA,QAAAA,CACD;AAAA,MACH;AACEH,iBAASM,KAAKL,KAAK;AAGrB,UAAIL,kBAAkBE;AACpB;AAGF;AAAA,IACF;AAEA,QAAIG,MAAMN,SAASG,aAAa;AAC1BI,aAAOjB,SAASgB,KAAK,IACvBD,SAASM,KAAK;AAAA,QACZ,GAAGL;AAAAA,QACHE,MAAMF,MAAME,KAAKC,MAAM,GAAGd,SAASe,MAAM;AAAA,MAAA,CAC1C,IAEDL,SAASM,KAAKL,KAAK;AAGrB;AAAA,IACF;AAEIF,uBACFC,SAASM,KAAKL,KAAK;AAAA,EAEvB;AAEA,SAAO;AAAA,IACL,GAAGf;AAAAA,IACHc;AAAAA,EAAAA;AAEJ;"}
1
+ {"version":3,"file":"util.slice-text-block.js","sources":["../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.slice-text-block.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n) {\n if (!isTextBlock(context, block)) {\n return false\n }\n\n const onlyText = block.children.every((child) => isSpan(context, child))\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import {isSpan} from '@portabletext/schema'\nimport type {PortableTextChild, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\nexport function sliceTextBlock({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\n block: PortableTextTextBlock\n}): PortableTextTextBlock {\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n\n if (!startPoint || !endPoint) {\n return block\n }\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (startBlockKey !== endBlockKey || startBlockKey !== block._key) {\n return block\n }\n\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startChildKey || !endChildKey) {\n return block\n }\n\n let startChildFound = false\n const children: Array<PortableTextChild> = []\n\n for (const child of block.children) {\n if (child._key === startChildKey) {\n startChildFound = true\n\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n children.push({\n ...child,\n text,\n })\n } else {\n children.push(child)\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n\n continue\n }\n\n if (child._key === endChildKey) {\n if (isSpan(context, child)) {\n children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n children.push(child)\n }\n\n break\n }\n\n if (startChildFound) {\n children.push(child)\n }\n }\n\n return {\n ...block,\n children,\n }\n}\n"],"names":["getTextBlockText","block","children","map","child","text","join","isEmptyTextBlock","context","isTextBlock","onlyText","every","isSpan","blockText","sliceTextBlock","startPoint","getSelectionStartPoint","selection","endPoint","getSelectionEndPoint","startBlockKey","getBlockKeyFromSelectionPoint","endBlockKey","_key","startChildKey","getChildKeyFromSelectionPoint","endChildKey","startChildFound","slice","offset","push"],"mappings":";;AAKO,SAASA,iBAAiBC,OAA8B;AAC7D,SAAOA,MAAMC,SAASC,IAAKC,CAAAA,UAAUA,MAAMC,QAAQ,EAAE,EAAEC,KAAK,EAAE;AAChE;ACCO,SAASC,iBACdC,SACAP,OACA;AACA,MAAI,CAACQ,YAAYD,SAASP,KAAK;AAC7B,WAAO;AAGT,QAAMS,WAAWT,MAAMC,SAASS,MAAOP,CAAAA,UAAUQ,OAAOJ,SAASJ,KAAK,CAAC,GACjES,YAAYb,iBAAiBC,KAAK;AAExC,SAAOS,YAAYG,cAAc;AACnC;ACVO,SAASC,eAAe;AAAA,EAC7BN;AAAAA,EACAP;AAIF,GAA0B;AACxB,QAAMc,aAAaC,uBAAuBR,QAAQS,SAAS,GACrDC,WAAWC,qBAAqBX,QAAQS,SAAS;AAEvD,MAAI,CAACF,cAAc,CAACG;AAClB,WAAOjB;AAGT,QAAMmB,gBAAgBC,8BAA8BN,UAAU,GACxDO,cAAcD,8BAA8BH,QAAQ;AAE1D,MAAIE,kBAAkBE,eAAeF,kBAAkBnB,MAAMsB;AAC3D,WAAOtB;AAGT,QAAMuB,gBAAgBC,8BAA8BV,UAAU,GACxDW,cAAcD,8BAA8BP,QAAQ;AAE1D,MAAI,CAACM,iBAAiB,CAACE;AACrB,WAAOzB;AAGT,MAAI0B,kBAAkB;AACtB,QAAMzB,WAAqC,CAAA;AAE3C,aAAWE,SAASH,MAAMC,UAAU;AAClC,QAAIE,MAAMmB,SAASC,eAAe;AAGhC,UAFAG,kBAAkB,IAEdf,OAAOJ,SAASJ,KAAK,GAAG;AAC1B,cAAMC,OACJD,MAAMmB,SAASG,cACXtB,MAAMC,KAAKuB,MAAMb,WAAWc,QAAQX,SAASW,MAAM,IACnDzB,MAAMC,KAAKuB,MAAMb,WAAWc,MAAM;AAExC3B,iBAAS4B,KAAK;AAAA,UACZ,GAAG1B;AAAAA,UACHC;AAAAA,QAAAA,CACD;AAAA,MACH;AACEH,iBAAS4B,KAAK1B,KAAK;AAGrB,UAAIoB,kBAAkBE;AACpB;AAGF;AAAA,IACF;AAEA,QAAItB,MAAMmB,SAASG,aAAa;AAC1Bd,aAAOJ,SAASJ,KAAK,IACvBF,SAAS4B,KAAK;AAAA,QACZ,GAAG1B;AAAAA,QACHC,MAAMD,MAAMC,KAAKuB,MAAM,GAAGV,SAASW,MAAM;AAAA,MAAA,CAC1C,IAED3B,SAAS4B,KAAK1B,KAAK;AAGrB;AAAA,IACF;AAEIuB,uBACFzB,SAAS4B,KAAK1B,KAAK;AAAA,EAEvB;AAEA,SAAO;AAAA,IACL,GAAGH;AAAAA,IACHC;AAAAA,EAAAA;AAEJ;"}
@@ -1,2 +1,2 @@
1
- import { J as Behavior, X as BehaviorGuard, Y as defineBehavior, a as forward, c as CustomBehaviorEvent, d as SyntheticBehaviorEvent, i as execute, l as InsertPlacement, n as BehaviorActionSet, o as raise, r as effect, s as BehaviorEvent, t as BehaviorAction, u as NativeBehaviorEvent } from "../_chunks-dts/index.js";
1
+ import { J as defineBehavior, Y as BehaviorGuard, a as forward, c as CustomBehaviorEvent, d as SyntheticBehaviorEvent, i as execute, l as InsertPlacement, n as BehaviorActionSet, o as raise, q as Behavior, r as effect, s as BehaviorEvent, t as BehaviorAction, u as NativeBehaviorEvent } from "../_chunks-dts/index.js";
2
2
  export { Behavior, BehaviorAction, BehaviorActionSet, BehaviorEvent, BehaviorGuard, CustomBehaviorEvent, InsertPlacement, NativeBehaviorEvent, SyntheticBehaviorEvent, defineBehavior, effect, execute, forward, raise };
package/lib/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { $ as AddedAnnotationPaths, $t as PortableTextEditorProps, A as PortableTextTextBlock, At as RangeDecorationOnMovedDetails, B as EditorSelector, Bt as RenderStyleFunction, C as ListDefinition, Ct as OnPasteResult, D as PortableTextChild, Dt as PatchObservable, E as PortableTextBlock, Et as PatchChange, F as BlockOffset, Ft as RenderChildFunction, G as Editor, Gt as ValueChange, H as EditorProvider, Ht as SelectionChange, I as useEditor, It as RenderDecoratorFunction, Jt as ChildPath, K as EditorConfig, Kt as AnnotationPath, L as defaultKeyGenerator, Lt as RenderEditableFunction, M as StyleDefinition, Mt as RedoChange, N as StyleSchemaType, Nt as RenderAnnotationFunction, O as PortableTextObject, Ot as PortableTextMemberSchemaTypes, P as defineSchema, Pt as RenderBlockFunction, Q as EditorSnapshot, Qt as PortableTextEditor, R as usePortableTextEditorSelection, Rt as RenderListItemFunction, S as InlineObjectSchemaType, St as OnPasteFn, T as Patch, Tt as PasteData, U as EditorProviderProps, Ut as UndoChange, V as useEditorSelector, Vt as ScrollSelectionIntoViewFunction, W as EditorEventListener, Wt as UnsetChange, Xt as PortableTextEditableProps, Yt as PortableTextEditable, Z as EditorContext, Zt as HotkeyOptions, _ as BlockObjectSchemaType, _t as InvalidValueResolution, at as BlockStyleRenderProps, b as FieldDefinition, bt as OnBeforeInputFn, ct as EditableAPI, dt as EditorChanges, en as EditorSchema, et as BlockAnnotationRenderProps, f as PatchesEvent, ft as EditorSelection, g as BlockObjectDefinition, gt as InvalidValue, h as BaseDefinition, ht as FocusChange, it as BlockRenderProps, j as SchemaDefinition, jt as ReadyChange, k as PortableTextSpan, kt as RangeDecoration, lt as EditableAPIDeleteOptions, m as AnnotationSchemaType, mt as ErrorChange, nn as MutationEvent, nt as BlockDecoratorRenderProps, ot as BlurChange, p as AnnotationDefinition, pt as EditorSelectionPoint, q as EditorEvent, qt as BlockPath, rt as BlockListItemRenderProps, st as ConnectionChange, tn as EditorEmittedEvent, tt as BlockChildRenderProps, ut as EditorChange, v as DecoratorDefinition, vt as LoadingChange, w as ListSchemaType, wt as OnPasteResultOrPromise, x as InlineObjectDefinition, xt as OnCopyFn, y as DecoratorSchemaType, yt as MutationChange, z as usePortableTextEditor, zt as RenderPlaceholderFunction } from "./_chunks-dts/index.js";
2
- export { AddedAnnotationPaths, AnnotationDefinition, AnnotationPath, AnnotationSchemaType, BaseDefinition, BlockAnnotationRenderProps, BlockChildRenderProps, BlockDecoratorRenderProps, BlockListItemRenderProps, BlockObjectDefinition, BlockObjectSchemaType, BlockOffset, BlockPath, BlockRenderProps, BlockStyleRenderProps, BlurChange, ChildPath, ConnectionChange, DecoratorDefinition, DecoratorSchemaType, EditableAPI, EditableAPIDeleteOptions, Editor, EditorChange, EditorChanges, EditorConfig, EditorContext, EditorEmittedEvent, EditorEvent, EditorEventListener, EditorProvider, EditorProviderProps, EditorSchema, EditorSelection, EditorSelectionPoint, EditorSelector, EditorSnapshot, ErrorChange, FieldDefinition, FocusChange, HotkeyOptions, InlineObjectDefinition, InlineObjectSchemaType, InvalidValue, InvalidValueResolution, ListDefinition, ListSchemaType, LoadingChange, MutationChange, MutationEvent, OnBeforeInputFn, OnCopyFn, OnPasteFn, OnPasteResult, OnPasteResultOrPromise, PasteData, Patch, PatchChange, PatchObservable, PatchesEvent, PortableTextBlock, PortableTextChild, PortableTextEditable, PortableTextEditableProps, PortableTextEditor, PortableTextEditorProps, PortableTextMemberSchemaTypes, PortableTextObject, PortableTextSpan, PortableTextTextBlock, RangeDecoration, RangeDecorationOnMovedDetails, ReadyChange, RedoChange, RenderAnnotationFunction, RenderBlockFunction, RenderChildFunction, RenderDecoratorFunction, RenderEditableFunction, RenderListItemFunction, RenderPlaceholderFunction, RenderStyleFunction, SchemaDefinition, ScrollSelectionIntoViewFunction, SelectionChange, StyleDefinition, StyleSchemaType, UndoChange, UnsetChange, ValueChange, defineSchema, defaultKeyGenerator as keyGenerator, useEditor, useEditorSelector, usePortableTextEditor, usePortableTextEditorSelection };
1
+ import { $ as BlockAnnotationRenderProps, $t as EditorSchema, A as PortableTextTextBlock, At as ReadyChange, B as EditorSelector, Bt as ScrollSelectionIntoViewFunction, C as ListDefinition, Ct as OnPasteResultOrPromise, D as PortableTextChild, Dt as PortableTextMemberSchemaTypes, E as PortableTextBlock, Et as PatchObservable, F as BlockOffset, Ft as RenderDecoratorFunction, G as EditorConfig, Gt as AnnotationPath, H as EditorProvider, Ht as UndoChange, I as useEditor, It as RenderEditableFunction, Jt as PortableTextEditable, K as EditorEvent, Kt as BlockPath, L as defaultKeyGenerator, Lt as RenderListItemFunction, M as StyleDefinition, Mt as RenderAnnotationFunction, N as StyleSchemaType, Nt as RenderBlockFunction, O as PortableTextObject, Ot as RangeDecoration, P as defineSchema, Pt as RenderChildFunction, Q as AddedAnnotationPaths, Qt as PortableTextEditorProps, R as usePortableTextEditorSelection, Rt as RenderPlaceholderFunction, S as InlineObjectSchemaType, St as OnPasteResult, T as Patch, Tt as PatchChange, U as EditorProviderProps, Ut as UnsetChange, V as useEditorSelector, Vt as SelectionChange, W as Editor, Wt as ValueChange, X as EditorContext, Xt as HotkeyOptions, Yt as PortableTextEditableProps, Z as EditorSnapshot, Zt as PortableTextEditor, _ as BlockObjectSchemaType, _t as LoadingChange, at as BlurChange, b as FieldDefinition, bt as OnCopyFn, ct as EditableAPIDeleteOptions, dt as EditorSelection, en as EditorEmittedEvent, et as BlockChildRenderProps, f as PatchesEvent, ft as EditorSelectionPoint, g as BlockObjectDefinition, gt as InvalidValueResolution, h as BaseDefinition, ht as InvalidValue, it as BlockStyleRenderProps, j as SchemaDefinition, jt as RedoChange, k as PortableTextSpan, kt as RangeDecorationOnMovedDetails, lt as EditorChange, m as AnnotationSchemaType, mt as FocusChange, nt as BlockListItemRenderProps, ot as ConnectionChange, p as AnnotationDefinition, pt as ErrorChange, qt as ChildPath, rt as BlockRenderProps, st as EditableAPI, tn as MutationEvent, tt as BlockDecoratorRenderProps, ut as EditorChanges, v as DecoratorDefinition, vt as MutationChange, w as ListSchemaType, wt as PasteData, x as InlineObjectDefinition, xt as OnPasteFn, y as DecoratorSchemaType, yt as OnBeforeInputFn, z as usePortableTextEditor, zt as RenderStyleFunction } from "./_chunks-dts/index.js";
2
+ export { AddedAnnotationPaths, AnnotationDefinition, AnnotationPath, AnnotationSchemaType, BaseDefinition, BlockAnnotationRenderProps, BlockChildRenderProps, BlockDecoratorRenderProps, BlockListItemRenderProps, BlockObjectDefinition, BlockObjectSchemaType, BlockOffset, BlockPath, BlockRenderProps, BlockStyleRenderProps, BlurChange, ChildPath, ConnectionChange, DecoratorDefinition, DecoratorSchemaType, EditableAPI, EditableAPIDeleteOptions, Editor, EditorChange, EditorChanges, EditorConfig, EditorContext, EditorEmittedEvent, EditorEvent, EditorProvider, EditorProviderProps, EditorSchema, EditorSelection, EditorSelectionPoint, EditorSelector, EditorSnapshot, ErrorChange, FieldDefinition, FocusChange, HotkeyOptions, InlineObjectDefinition, InlineObjectSchemaType, InvalidValue, InvalidValueResolution, ListDefinition, ListSchemaType, LoadingChange, MutationChange, MutationEvent, OnBeforeInputFn, OnCopyFn, OnPasteFn, OnPasteResult, OnPasteResultOrPromise, PasteData, Patch, PatchChange, PatchObservable, PatchesEvent, PortableTextBlock, PortableTextChild, PortableTextEditable, PortableTextEditableProps, PortableTextEditor, PortableTextEditorProps, PortableTextMemberSchemaTypes, PortableTextObject, PortableTextSpan, PortableTextTextBlock, RangeDecoration, RangeDecorationOnMovedDetails, ReadyChange, RedoChange, RenderAnnotationFunction, RenderBlockFunction, RenderChildFunction, RenderDecoratorFunction, RenderEditableFunction, RenderListItemFunction, RenderPlaceholderFunction, RenderStyleFunction, SchemaDefinition, ScrollSelectionIntoViewFunction, SelectionChange, StyleDefinition, StyleSchemaType, UndoChange, UnsetChange, ValueChange, defineSchema, defaultKeyGenerator as keyGenerator, useEditor, useEditorSelector, usePortableTextEditor, usePortableTextEditorSelection };