@portabletext/editor 2.6.3 → 2.6.5

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 (133) hide show
  1. package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs +29 -29
  2. package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs.map +1 -1
  3. package/lib/_chunks-cjs/selector.is-selection-expanded.cjs +5 -5
  4. package/lib/_chunks-cjs/selector.is-selection-expanded.cjs.map +1 -1
  5. package/lib/_chunks-cjs/util.child-selection-point-to-block-offset.cjs +3 -3
  6. package/lib/_chunks-cjs/util.child-selection-point-to-block-offset.cjs.map +1 -1
  7. package/lib/_chunks-cjs/util.is-selection-collapsed.cjs +5 -5
  8. package/lib/_chunks-cjs/util.is-selection-collapsed.cjs.map +1 -1
  9. package/lib/_chunks-cjs/util.merge-text-blocks.cjs +2 -6
  10. package/lib/_chunks-cjs/util.merge-text-blocks.cjs.map +1 -1
  11. package/lib/_chunks-cjs/util.slice-blocks.cjs +106 -117
  12. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  13. package/lib/_chunks-cjs/util.slice-text-block.cjs +3 -3
  14. package/lib/_chunks-cjs/util.slice-text-block.cjs.map +1 -1
  15. package/lib/_chunks-dts/behavior.types.action.d.ts +115 -115
  16. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +3 -2
  17. package/lib/_chunks-es/selector.is-selecting-entire-blocks.js.map +1 -1
  18. package/lib/_chunks-es/selector.is-selection-expanded.js +3 -2
  19. package/lib/_chunks-es/selector.is-selection-expanded.js.map +1 -1
  20. package/lib/_chunks-es/util.child-selection-point-to-block-offset.js +2 -1
  21. package/lib/_chunks-es/util.child-selection-point-to-block-offset.js.map +1 -1
  22. package/lib/_chunks-es/util.is-selection-collapsed.js +2 -1
  23. package/lib/_chunks-es/util.is-selection-collapsed.js.map +1 -1
  24. package/lib/_chunks-es/util.merge-text-blocks.js +2 -5
  25. package/lib/_chunks-es/util.merge-text-blocks.js.map +1 -1
  26. package/lib/_chunks-es/util.slice-blocks.js +101 -112
  27. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  28. package/lib/_chunks-es/util.slice-text-block.js +2 -1
  29. package/lib/_chunks-es/util.slice-text-block.js.map +1 -1
  30. package/lib/index.cjs +133 -96
  31. package/lib/index.cjs.map +1 -1
  32. package/lib/index.js +43 -6
  33. package/lib/index.js.map +1 -1
  34. package/lib/plugins/index.cjs +5 -5
  35. package/lib/plugins/index.cjs.map +1 -1
  36. package/lib/plugins/index.d.cts +3 -3
  37. package/lib/plugins/index.d.ts +3 -3
  38. package/lib/plugins/index.js +6 -5
  39. package/lib/plugins/index.js.map +1 -1
  40. package/lib/selectors/index.cjs +3 -3
  41. package/lib/selectors/index.cjs.map +1 -1
  42. package/lib/selectors/index.js +2 -1
  43. package/lib/selectors/index.js.map +1 -1
  44. package/lib/utils/index.cjs +14 -4
  45. package/lib/utils/index.cjs.map +1 -1
  46. package/lib/utils/index.d.cts +2 -9
  47. package/lib/utils/index.d.ts +4 -11
  48. package/lib/utils/index.js +4 -3
  49. package/lib/utils/index.js.map +1 -1
  50. package/package.json +14 -13
  51. package/src/behaviors/behavior.abstract.delete.ts +1 -1
  52. package/src/behaviors/behavior.abstract.deserialize.ts +1 -1
  53. package/src/behaviors/behavior.abstract.split.ts +2 -1
  54. package/src/behaviors/behavior.core.block-objects.ts +1 -1
  55. package/src/behaviors/behavior.core.lists.ts +2 -1
  56. package/src/behaviors/behavior.markdown.ts +1 -1
  57. package/src/converters/converter.text-plain.ts +2 -1
  58. package/src/editor/__tests__/PortableTextEditor.test.tsx +1 -1
  59. package/src/editor/__tests__/RangeDecorations.test.tsx +1 -1
  60. package/src/editor/__tests__/self-solving.test.tsx +1 -1
  61. package/src/editor/components/render-element.tsx +1 -1
  62. package/src/editor/plugins/__tests__/withEditableAPIDelete.test.tsx +1 -1
  63. package/src/editor/plugins/__tests__/withEditableAPIGetFragment.test.tsx +2 -3
  64. package/src/editor/plugins/__tests__/withEditableAPIInsert.test.tsx +1 -1
  65. package/src/editor/plugins/__tests__/withEditableAPISelectionsOverlapping.test.tsx +1 -1
  66. package/src/editor/plugins/__tests__/withPortableTextLists.test.tsx +1 -1
  67. package/src/editor/plugins/__tests__/withPortableTextMarkModel.test.tsx +1 -1
  68. package/src/editor/plugins/__tests__/withPortableTextSelections.test.tsx +1 -1
  69. package/src/editor/plugins/__tests__/withUndoRedo.test.tsx +1 -1
  70. package/src/editor/plugins/createWithObjectKeys.ts +1 -1
  71. package/src/editor/plugins/createWithPortableTextMarkModel.ts +1 -1
  72. package/src/editor/plugins/createWithSchemaTypes.ts +2 -5
  73. package/src/internal-utils/__tests__/valueNormalization.test.tsx +1 -1
  74. package/src/internal-utils/apply-operation-to-portable-text.test.ts +1 -1
  75. package/src/internal-utils/build-index-maps.ts +1 -1
  76. package/src/internal-utils/create-test-snapshot.ts +1 -1
  77. package/src/internal-utils/drag-selection.test.ts +1 -1
  78. package/src/internal-utils/editor-selection.ts +1 -1
  79. package/src/internal-utils/operation-to-patches.ts +1 -1
  80. package/src/internal-utils/parse-blocks.test.ts +1 -1
  81. package/src/internal-utils/parse-blocks.ts +1 -38
  82. package/src/internal-utils/selection-focus-text.ts +1 -1
  83. package/src/internal-utils/selection-text.ts +1 -1
  84. package/src/internal-utils/test-editor.tsx +1 -1
  85. package/src/internal-utils/text-block-key.ts +1 -1
  86. package/src/internal-utils/text-marks.ts +1 -1
  87. package/src/internal-utils/text-selection.ts +1 -1
  88. package/src/internal-utils/to-slate-range.test.ts +1 -1
  89. package/src/internal-utils/to-slate-range.ts +1 -1
  90. package/src/internal-utils/validateValue.ts +1 -1
  91. package/src/internal-utils/value-annotations.ts +1 -1
  92. package/src/operations/behavior.operation.block.unset.ts +2 -1
  93. package/src/operations/behavior.operation.delete.ts +98 -2
  94. package/src/operations/behavior.operation.insert.block.ts +2 -1
  95. package/src/operations/behavior.operation.select.ts +5 -0
  96. package/src/plugins/plugin.behavior.tsx +3 -1
  97. package/src/plugins/plugin.internal.auto-close-brackets.test.tsx +1 -2
  98. package/src/plugins/plugin.markdown.test.tsx +1 -2
  99. package/src/selectors/selector.get-active-annotations.ts +1 -1
  100. package/src/selectors/selector.get-active-list-item.ts +1 -1
  101. package/src/selectors/selector.get-active-style.ts +1 -1
  102. package/src/selectors/selector.get-anchor-text-block.ts +1 -1
  103. package/src/selectors/selector.get-caret-word-selection.test.ts +1 -1
  104. package/src/selectors/selector.get-focus-block-object.ts +1 -1
  105. package/src/selectors/selector.get-focus-span.ts +1 -1
  106. package/src/selectors/selector.get-focus-text-block.ts +1 -1
  107. package/src/selectors/selector.get-list-state.ts +1 -1
  108. package/src/selectors/selector.get-next-span.ts +1 -1
  109. package/src/selectors/selector.get-previous-span.ts +1 -1
  110. package/src/selectors/selector.get-selected-spans.ts +1 -1
  111. package/src/selectors/selector.get-selected-text-blocks.ts +1 -1
  112. package/src/selectors/selector.get-selection-text.ts +1 -1
  113. package/src/selectors/selector.get-trimmed-selection.test.ts +1 -1
  114. package/src/selectors/selector.get-trimmed-selection.ts +1 -1
  115. package/src/selectors/selector.is-active-annotation.ts +1 -1
  116. package/src/selectors/selector.is-point-after-selection.ts +1 -1
  117. package/src/selectors/selector.is-point-before-selection.ts +1 -1
  118. package/src/utils/index.ts +1 -2
  119. package/src/utils/util.at-the-beginning-of-block.ts +1 -1
  120. package/src/utils/util.block-offset.ts +1 -1
  121. package/src/utils/util.child-selection-point-to-block-offset.ts +1 -1
  122. package/src/utils/util.get-block-end-point.ts +1 -1
  123. package/src/utils/util.get-block-start-point.ts +1 -1
  124. package/src/utils/util.is-empty-text-block.ts +1 -1
  125. package/src/utils/util.merge-text-blocks.ts +1 -1
  126. package/src/utils/util.slice-blocks.ts +2 -2
  127. package/src/utils/util.slice-text-block.ts +2 -2
  128. package/src/utils/util.split-text-block.ts +1 -1
  129. package/src/internal-utils/terse-pt.test.ts +0 -175
  130. package/src/internal-utils/terse-pt.ts +0 -150
  131. package/src/internal-utils/test-key-generator.ts +0 -9
  132. package/src/utils/util.is-span.ts +0 -12
  133. package/src/utils/util.is-text-block.ts +0 -13
@@ -1,7 +1,5 @@
1
- import { isTypedObject, parseBlock } from "./util.slice-blocks.js";
2
- function isTextBlock(context, block) {
3
- return isTypedObject(block) && block._type === context.schema.block.name;
4
- }
1
+ import { isTextBlock } from "@portabletext/schema";
2
+ import { parseBlock } from "./util.slice-blocks.js";
5
3
  function mergeTextBlocks({
6
4
  context,
7
5
  targetBlock,
@@ -22,7 +20,6 @@ function mergeTextBlocks({
22
20
  };
23
21
  }
24
22
  export {
25
- isTextBlock,
26
23
  mergeTextBlocks
27
24
  };
28
25
  //# sourceMappingURL=util.merge-text-blocks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.merge-text-blocks.js","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isTypedObject} from '../internal-utils/asserters'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n return isTypedObject(block) && block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: false, validateFields: false},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["isTextBlock","context","block","isTypedObject","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","validateFields","children","markDefs"],"mappings":";AAOO,SAASA,YACdC,SACAC,OACgC;AAChC,SAAOC,cAAcD,KAAK,KAAKA,MAAME,UAAUH,QAAQI,OAAOH,MAAMI;AACtE;ACJO,SAASC,gBAAgB;AAAA,EAC9BN;AAAAA,EACAO;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,WAAW;AAAA,IACrCV;AAAAA,IACAC,OAAOO;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,MAAOC,gBAAgB;AAAA,IAAA;AAAA,EAAK,CACpD;AAED,SAAI,CAACJ,uBAAuB,CAACV,YAAYC,SAASS,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHO,UAAU,CAAC,GAAGP,YAAYO,UAAU,GAAGL,oBAAoBK,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIR,YAAYQ,YAAY,CAAA,GAC5B,GAAIN,oBAAoBM,YAAY,CAAA,CAAG;AAAA,EAAA;AAG7C;"}
1
+ {"version":3,"file":"util.merge-text-blocks.js","sources":["../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import {isTextBlock} from '@portabletext/schema'\nimport type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: false, validateFields: false},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["mergeTextBlocks","context","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","block","options","refreshKeys","validateFields","isTextBlock","children","markDefs"],"mappings":";;AAQO,SAASA,gBAAgB;AAAA,EAC9BC;AAAAA,EACAC;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,WAAW;AAAA,IACrCJ;AAAAA,IACAK,OAAOH;AAAAA,IACPI,SAAS;AAAA,MAACC,aAAa;AAAA,MAAOC,gBAAgB;AAAA,IAAA;AAAA,EAAK,CACpD;AAED,SAAI,CAACL,uBAAuB,CAACM,YAAYT,SAASG,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHS,UAAU,CAAC,GAAGT,YAAYS,UAAU,GAAGP,oBAAoBO,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIV,YAAYU,YAAY,CAAA,GAC5B,GAAIR,oBAAoBQ,YAAY,CAAA,CAAG;AAAA,EAAA;AAG7C;"}
@@ -1,3 +1,4 @@
1
+ import { isTextBlock, isSpan } from "@portabletext/schema";
1
2
  function isKeyedSegment(segment) {
2
3
  return typeof segment == "object" && segment !== null && "_key" in segment;
3
4
  }
@@ -11,6 +12,103 @@ function getChildKeyFromSelectionPoint(point) {
11
12
  if (isKeyedSegment(childPathSegment))
12
13
  return childPathSegment._key;
13
14
  }
15
+ function blockOffsetToSpanSelectionPoint({
16
+ context,
17
+ blockOffset,
18
+ direction
19
+ }) {
20
+ let offsetLeft = blockOffset.offset, selectionPoint, skippedInlineObject = !1;
21
+ for (const block of context.value)
22
+ if (block._key === blockOffset.path[0]._key && isTextBlock(context, block))
23
+ for (const child of block.children) {
24
+ if (direction === "forward") {
25
+ if (!isSpan(context, child))
26
+ continue;
27
+ if (offsetLeft <= child.text.length) {
28
+ selectionPoint = {
29
+ path: [...blockOffset.path, "children", {
30
+ _key: child._key
31
+ }],
32
+ offset: offsetLeft
33
+ };
34
+ break;
35
+ }
36
+ offsetLeft -= child.text.length;
37
+ continue;
38
+ }
39
+ if (!isSpan(context, child)) {
40
+ skippedInlineObject = !0;
41
+ continue;
42
+ }
43
+ if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {
44
+ skippedInlineObject && (selectionPoint = {
45
+ path: [...blockOffset.path, "children", {
46
+ _key: child._key
47
+ }],
48
+ offset: 0
49
+ });
50
+ break;
51
+ }
52
+ if (offsetLeft > child.text.length) {
53
+ offsetLeft -= child.text.length;
54
+ continue;
55
+ }
56
+ if (offsetLeft <= child.text.length && (selectionPoint = {
57
+ path: [...blockOffset.path, "children", {
58
+ _key: child._key
59
+ }],
60
+ offset: offsetLeft
61
+ }, offsetLeft -= child.text.length, offsetLeft !== 0))
62
+ break;
63
+ }
64
+ return selectionPoint;
65
+ }
66
+ function spanSelectionPointToBlockOffset({
67
+ context,
68
+ selectionPoint
69
+ }) {
70
+ let offset = 0;
71
+ const blockKey = getBlockKeyFromSelectionPoint(selectionPoint), spanKey = getChildKeyFromSelectionPoint(selectionPoint);
72
+ if (!(!blockKey || !spanKey)) {
73
+ for (const block of context.value)
74
+ if (block._key === blockKey && isTextBlock(context, block)) {
75
+ for (const child of block.children)
76
+ if (isSpan(context, child)) {
77
+ if (child._key === spanKey)
78
+ return {
79
+ path: [{
80
+ _key: block._key
81
+ }],
82
+ offset: offset + selectionPoint.offset
83
+ };
84
+ offset += child.text.length;
85
+ }
86
+ }
87
+ }
88
+ }
89
+ function getBlockStartPoint({
90
+ context,
91
+ block
92
+ }) {
93
+ return isTextBlock(context, block.node) ? {
94
+ path: [...block.path, "children", {
95
+ _key: block.node.children[0]._key
96
+ }],
97
+ offset: 0
98
+ } : {
99
+ path: block.path,
100
+ offset: 0
101
+ };
102
+ }
103
+ function getSelectionEndPoint(selection) {
104
+ return selection ? selection.backward ? selection.anchor : selection.focus : null;
105
+ }
106
+ function getSelectionStartPoint(selection) {
107
+ return selection ? selection.backward ? selection.focus : selection.anchor : null;
108
+ }
109
+ function getTextBlockText(block) {
110
+ return block.children.map((child) => child.text ?? "").join("");
111
+ }
14
112
  function isTypedObject(object) {
15
113
  return isRecord(object) && typeof object._type == "string";
16
114
  }
@@ -69,9 +167,6 @@ function parseBlockObject({
69
167
  function isListBlock(context, block) {
70
168
  return isTextBlock(context, block) && block.level !== void 0 && block.listItem !== void 0;
71
169
  }
72
- function isTextBlock(context, block) {
73
- return !(!isTypedObject(block) || block._type !== context.schema.block.name || !Array.isArray(block.children));
74
- }
75
170
  function parseTextBlock({
76
171
  block,
77
172
  context,
@@ -132,9 +227,6 @@ function parseTextBlock({
132
227
  }
133
228
  return typeof block.listItem == "string" && context.schema.lists.find((list) => list.name === block.listItem) && (parsedBlock.listItem = block.listItem), typeof block.level == "number" && (parsedBlock.level = block.level), parsedBlock;
134
229
  }
135
- function isSpan$1(context, child) {
136
- return !(!isTypedObject(child) || child._type !== context.schema.span.name || typeof child.text != "string");
137
- }
138
230
  function parseSpan({
139
231
  span,
140
232
  context,
@@ -221,106 +313,6 @@ function parseObject({
221
313
  ...values
222
314
  };
223
315
  }
224
- function blockOffsetToSpanSelectionPoint({
225
- context,
226
- blockOffset,
227
- direction
228
- }) {
229
- let offsetLeft = blockOffset.offset, selectionPoint, skippedInlineObject = !1;
230
- for (const block of context.value)
231
- if (block._key === blockOffset.path[0]._key && isTextBlock(context, block))
232
- for (const child of block.children) {
233
- if (direction === "forward") {
234
- if (!isSpan$1(context, child))
235
- continue;
236
- if (offsetLeft <= child.text.length) {
237
- selectionPoint = {
238
- path: [...blockOffset.path, "children", {
239
- _key: child._key
240
- }],
241
- offset: offsetLeft
242
- };
243
- break;
244
- }
245
- offsetLeft -= child.text.length;
246
- continue;
247
- }
248
- if (!isSpan$1(context, child)) {
249
- skippedInlineObject = !0;
250
- continue;
251
- }
252
- if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {
253
- skippedInlineObject && (selectionPoint = {
254
- path: [...blockOffset.path, "children", {
255
- _key: child._key
256
- }],
257
- offset: 0
258
- });
259
- break;
260
- }
261
- if (offsetLeft > child.text.length) {
262
- offsetLeft -= child.text.length;
263
- continue;
264
- }
265
- if (offsetLeft <= child.text.length && (selectionPoint = {
266
- path: [...blockOffset.path, "children", {
267
- _key: child._key
268
- }],
269
- offset: offsetLeft
270
- }, offsetLeft -= child.text.length, offsetLeft !== 0))
271
- break;
272
- }
273
- return selectionPoint;
274
- }
275
- function spanSelectionPointToBlockOffset({
276
- context,
277
- selectionPoint
278
- }) {
279
- let offset = 0;
280
- const blockKey = getBlockKeyFromSelectionPoint(selectionPoint), spanKey = getChildKeyFromSelectionPoint(selectionPoint);
281
- if (!(!blockKey || !spanKey)) {
282
- for (const block of context.value)
283
- if (block._key === blockKey && isTextBlock(context, block)) {
284
- for (const child of block.children)
285
- if (isSpan$1(context, child)) {
286
- if (child._key === spanKey)
287
- return {
288
- path: [{
289
- _key: block._key
290
- }],
291
- offset: offset + selectionPoint.offset
292
- };
293
- offset += child.text.length;
294
- }
295
- }
296
- }
297
- }
298
- function getBlockStartPoint({
299
- context,
300
- block
301
- }) {
302
- return isTextBlock(context, block.node) ? {
303
- path: [...block.path, "children", {
304
- _key: block.node.children[0]._key
305
- }],
306
- offset: 0
307
- } : {
308
- path: block.path,
309
- offset: 0
310
- };
311
- }
312
- function getSelectionEndPoint(selection) {
313
- return selection ? selection.backward ? selection.anchor : selection.focus : null;
314
- }
315
- function getSelectionStartPoint(selection) {
316
- return selection ? selection.backward ? selection.focus : selection.anchor : null;
317
- }
318
- function getTextBlockText(block) {
319
- return block.children.map((child) => child.text ?? "").join("");
320
- }
321
- function isSpan(context, child) {
322
- return child._type === context.schema.span.name;
323
- }
324
316
  function sliceBlocks({
325
317
  context,
326
318
  blocks
@@ -347,7 +339,7 @@ function sliceBlocks({
347
339
  if (startChildKey) {
348
340
  for (const child of block.children) {
349
341
  if (child._key === startChildKey) {
350
- if (isSpan$1(context, child)) {
342
+ if (isSpan(context, child)) {
351
343
  const text = child._key === endChildKey ? child.text.slice(startPoint.offset, endPoint.offset) : child.text.slice(startPoint.offset);
352
344
  startBlock = {
353
345
  ...block,
@@ -365,7 +357,7 @@ function sliceBlocks({
365
357
  break;
366
358
  continue;
367
359
  }
368
- if (startBlock && isTextBlock(context, startBlock) && (endChildKey && child._key === endChildKey && isSpan$1(context, child) ? startBlock.children.push({
360
+ if (startBlock && isTextBlock(context, startBlock) && (endChildKey && child._key === endChildKey && isSpan(context, child) ? startBlock.children.push({
369
361
  ...child,
370
362
  text: child.text.slice(0, endPoint.offset)
371
363
  }) : startBlock.children.push(child), block._key === endBlockKey && endChildKey && child._key === endChildKey))
@@ -390,7 +382,7 @@ function sliceBlocks({
390
382
  };
391
383
  for (const child of block.children)
392
384
  if (endBlock && isTextBlock(context, endBlock)) {
393
- if (child._key === endChildKey && isSpan$1(context, child)) {
385
+ if (child._key === endChildKey && isSpan(context, child)) {
394
386
  endBlock.children.push({
395
387
  ...child,
396
388
  text: child.text.slice(0, endPoint.offset)
@@ -419,9 +411,6 @@ export {
419
411
  getTextBlockText,
420
412
  isKeyedSegment,
421
413
  isListBlock,
422
- isSpan$1 as isSpan,
423
- isSpan as isSpan$1,
424
- isTextBlock,
425
414
  isTypedObject,
426
415
  parseAnnotation,
427
416
  parseBlock,
@@ -1 +1 @@
1
- {"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/selection/selection-point.ts","../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-span.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["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 '../utils/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 type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import 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 {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 refreshKeys: 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 refreshKeys: 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: {refreshKeys: boolean; 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 isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n if (!isTypedObject(block)) {\n return false\n }\n\n if (block._type !== context.schema.block.name) {\n return false\n }\n\n if (!Array.isArray(block.children)) {\n return false\n }\n\n return true\n}\n\nexport function parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean; validateFields: boolean}\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 = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : 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 children = 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\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\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 isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: unknown,\n): child is PortableTextSpan {\n if (!isTypedObject(child)) {\n return false\n }\n\n if (child._type !== context.schema.span.name) {\n return false\n }\n\n if (typeof child.text !== 'string') {\n return false\n }\n\n return true\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: {refreshKeys: boolean; validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(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 // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\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 return {\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; 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: options.refreshKeys\n ? context.keyGenerator()\n : typeof object._key === 'string'\n ? object._key\n : context.keyGenerator(),\n ...values,\n }\n}\n","import type {EditorContext} from '../editor/editor-snapshot'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\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 {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\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, EditorSelectionPoint} from '..'\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 '..'\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 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 type {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from '../utils/util.get-selection-end-point'\nimport {getSelectionStartPoint} from '../utils/util.get-selection-start-point'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\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 (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(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n"],"names":["isKeyedSegment","segment","getBlockKeyFromSelectionPoint","point","blockPathSegment","path","at","_key","getChildKeyFromSelectionPoint","childPathSegment","isTypedObject","object","isRecord","_type","value","parseBlocks","context","blocks","options","Array","isArray","flatMap","block","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","isTextBlock","level","undefined","listItem","children","customFields","key","Object","keys","validateFields","fields","some","field","refreshKeys","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","style","styles","defaultStyle","console","error","lists","list","isSpan","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","values","reduce","fieldValues","fieldValue","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","spanSelectionPointToBlockOffset","blockKey","spanKey","getBlockStartPoint","node","getSelectionEndPoint","selection","backward","anchor","focus","getSelectionStartPoint","getTextBlockText","join","sliceBlocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push"],"mappings":"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"}
1
+ {"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/selection/selection-point.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["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 '../utils/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 {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\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 {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, EditorSelectionPoint} from '..'\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 '..'\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 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 type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import {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 {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 refreshKeys: 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 refreshKeys: 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; validateFields: boolean}\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 = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : 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 children = 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\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\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: {refreshKeys: boolean; validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(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 // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\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 return {\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; 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: options.refreshKeys\n ? context.keyGenerator()\n : typeof object._key === 'string'\n ? object._key\n : context.keyGenerator(),\n ...values,\n }\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from '../utils/util.get-selection-end-point'\nimport {getSelectionStartPoint} from '../utils/util.get-selection-start-point'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\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 (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(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n"],"names":["isKeyedSegment","segment","getBlockKeyFromSelectionPoint","point","blockPathSegment","path","at","_key","getChildKeyFromSelectionPoint","childPathSegment","blockOffsetToSpanSelectionPoint","context","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","block","value","isTextBlock","child","children","isSpan","text","length","spanSelectionPointToBlockOffset","blockKey","spanKey","getBlockStartPoint","node","getSelectionEndPoint","selection","backward","anchor","focus","getSelectionStartPoint","getTextBlockText","map","join","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","refreshKeys","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","parseSpan","span","parseInlineObject","inlineObject","filter","marks","style","styles","defaultStyle","console","error","lists","list","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","values","reduce","fieldValues","fieldValue","sliceBlocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push"],"mappings":";AAKO,SAASA,eAAeC,SAA2C;AACxE,SAAO,OAAOA,WAAY,YAAYA,YAAY,QAAQ,UAAUA;AACtE;ACJO,SAASC,8BAA8BC,OAA6B;AACzE,QAAMC,mBAAmBD,MAAME,KAAKC,GAAG,CAAC;AAExC,MAAIN,eAAeI,gBAAgB;AACjC,WAAOA,iBAAiBG;AAI5B;AAEO,SAASC,8BAA8BL,OAA6B;AACzE,QAAMM,mBAAmBN,MAAME,KAAKC,GAAG,CAAC;AAExC,MAAIN,eAAeS,gBAAgB;AACjC,WAAOA,iBAAiBF;AAI5B;ACRO,SAASG,gCAAgC;AAAA,EAC9CC;AAAAA,EACAC;AAAAA,EACAC;AAKF,GAAG;AACD,MAAIC,aAAaF,YAAYG,QACzBC,gBACAC,sBAAsB;AAE1B,aAAWC,SAASP,QAAQQ;AAC1B,QAAID,MAAMX,SAASK,YAAYP,KAAK,CAAC,EAAEE,QAIlCa,YAAYT,SAASO,KAAK;AAI/B,iBAAWG,SAASH,MAAMI,UAAU;AAClC,YAAIT,cAAc,WAAW;AAC3B,cAAI,CAACU,OAAOZ,SAASU,KAAK;AACxB;AAGF,cAAIP,cAAcO,MAAMG,KAAKC,QAAQ;AACnCT,6BAAiB;AAAA,cACfX,MAAM,CAAC,GAAGO,YAAYP,MAAM,YAAY;AAAA,gBAACE,MAAMc,MAAMd;AAAAA,cAAAA,CAAK;AAAA,cAC1DQ,QAAQD;AAAAA,YAAAA;AAEV;AAAA,UACF;AAEAA,wBAAcO,MAAMG,KAAKC;AAEzB;AAAA,QACF;AAEA,YAAI,CAACF,OAAOZ,SAASU,KAAK,GAAG;AAC3BJ,gCAAsB;AACtB;AAAA,QACF;AAEA,YAAIH,eAAe,KAAKE,kBAAkB,CAACC,qBAAqB;AAC1DA,kCACFD,iBAAiB;AAAA,YACfX,MAAM,CAAC,GAAGO,YAAYP,MAAM,YAAY;AAAA,cAACE,MAAMc,MAAMd;AAAAA,YAAAA,CAAK;AAAA,YAC1DQ,QAAQ;AAAA,UAAA;AAGZ;AAAA,QACF;AAEA,YAAID,aAAaO,MAAMG,KAAKC,QAAQ;AAClCX,wBAAcO,MAAMG,KAAKC;AACzB;AAAA,QACF;AAEA,YAAIX,cAAcO,MAAMG,KAAKC,WAC3BT,iBAAiB;AAAA,UACfX,MAAM,CAAC,GAAGO,YAAYP,MAAM,YAAY;AAAA,YAACE,MAAMc,MAAMd;AAAAA,UAAAA,CAAK;AAAA,UAC1DQ,QAAQD;AAAAA,QAAAA,GAGVA,cAAcO,MAAMG,KAAKC,QAErBX,eAAe;AACjB;AAAA,MAGN;AAGF,SAAOE;AACT;AAKO,SAASU,gCAAgC;AAAA,EAC9Cf;AAAAA,EACAK;AAIF,GAA4B;AAC1B,MAAID,SAAS;AAEb,QAAMY,WAAWzB,8BAA8Bc,cAAc,GACvDY,UAAUpB,8BAA8BQ,cAAc;AAE5D,MAAI,EAAA,CAACW,YAAY,CAACC;AAIlB,eAAWV,SAASP,QAAQQ;AAC1B,UAAID,MAAMX,SAASoB,YAIdP,YAAYT,SAASO,KAAK;AAI/B,mBAAWG,SAASH,MAAMI;AACxB,cAAKC,OAAOZ,SAASU,KAAK,GAI1B;AAAA,gBAAIA,MAAMd,SAASqB;AACjB,qBAAO;AAAA,gBACLvB,MAAM,CAAC;AAAA,kBAACE,MAAMW,MAAMX;AAAAA,gBAAAA,CAAK;AAAA,gBACzBQ,QAAQA,SAASC,eAAeD;AAAAA,cAAAA;AAIpCA,sBAAUM,MAAMG,KAAKC;AAAAA,UAAAA;AAAAA;AAAAA;AAG3B;AC9HO,SAASI,mBAAmB;AAAA,EACjClB;AAAAA,EACAO;AAOF,GAAyB;AACvB,SAAIE,YAAYT,SAASO,MAAMY,IAAI,IAC1B;AAAA,IACLzB,MAAM,CAAC,GAAGa,MAAMb,MAAM,YAAY;AAAA,MAACE,MAAMW,MAAMY,KAAKR,SAAS,CAAC,EAAEf;AAAAA,IAAAA,CAAK;AAAA,IACrEQ,QAAQ;AAAA,EAAA,IAIL;AAAA,IACLV,MAAMa,MAAMb;AAAAA,IACZU,QAAQ;AAAA,EAAA;AAEZ;ACzBO,SAASgB,qBAMdC,WAAoD;AACpD,SAAKA,YAKHA,UAAUC,WAAWD,UAAUE,SAASF,UAAUG,QAJ3C;AAMX;ACdO,SAASC,uBAMdJ,WAAoD;AACpD,SAAKA,YAKHA,UAAUC,WAAWD,UAAUG,QAAQH,UAAUE,SAJ1C;AAMX;ACdO,SAASG,iBAAiBnB,OAA8B;AAC7D,SAAOA,MAAMI,SAASgB,IAAKjB,CAAAA,UAAUA,MAAMG,QAAQ,EAAE,EAAEe,KAAK,EAAE;AAChE;ACLO,SAASC,cAAcC,QAAwC;AACpE,SAAOC,SAASD,MAAM,KAAK,OAAOA,OAAOE,SAAU;AACrD;AAEA,SAASD,SAASvB,OAAkD;AAClE,SAAO,CAAC,CAACA,UAAU,OAAOA,SAAU,YAAY,OAAOA,SAAU;AACnE;ACKO,SAASyB,YAAY;AAAA,EAC1BjC;AAAAA,EACAkC;AAAAA,EACAC;AAQF,GAA6B;AAC3B,SAAKC,MAAMC,QAAQH,MAAM,IAIlBA,OAAOI,QAAS/B,CAAAA,UAAU;AAC/B,UAAMgC,cAAcC,WAAW;AAAA,MAACxC;AAAAA,MAASO;AAAAA,MAAO4B;AAAAA,IAAAA,CAAQ;AAExD,WAAOI,cAAc,CAACA,WAAW,IAAI,CAAA;AAAA,EACvC,CAAC,IAPQ,CAAA;AAQX;AAEO,SAASC,WAAW;AAAA,EACzBxC;AAAAA,EACAO;AAAAA,EACA4B;AAQF,GAAkC;AAChC,SACEM,eAAe;AAAA,IAAClC;AAAAA,IAAOP;AAAAA,IAASmC;AAAAA,EAAAA,CAAQ,KACxCO,iBAAiB;AAAA,IAACC,aAAapC;AAAAA,IAAOP;AAAAA,IAASmC;AAAAA,EAAAA,CAAQ;AAE3D;AAEO,SAASO,iBAAiB;AAAA,EAC/BC;AAAAA,EACA3C;AAAAA,EACAmC;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAcc,WAAW;AAC5B;AAGF,QAAMC,aAAa5C,QAAQ6C,OAAOC,aAAaC,KAC7C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAASL,YAAYX,KACnC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQa;AAAAA,MACR3C,SAAS;AAAA,QACPkD,cAAclD,QAAQkD;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEO,SAASgB,YACdnD,SACAO,OACgC;AAChC,SACEE,YAAYT,SAASO,KAAK,KAC1BA,MAAM6C,UAAUC,UAChB9C,MAAM+C,aAAaD;AAEvB;AAEO,SAASZ,eAAe;AAAA,EAC7BlC;AAAAA,EACAP;AAAAA,EACAmC;AAKF,GAAsC;AACpC,MAAI,CAACN,cAActB,KAAK;AACtB;AAGF,QAAMgD,eAAwC,CAAA;AAE9C,aAAWC,OAAOC,OAAOC,KAAKnD,KAAK;AAE/BiD,YAAQ,WACRA,QAAQ,UACRA,QAAQ,cACRA,QAAQ,cACRA,QAAQ,WACRA,QAAQ,cACRA,QAAQ,YAKNrB,QAAQwB,iBACN3D,QAAQ6C,OAAOtC,MAAMqD,QAAQC,KAAMC,CAAAA,UAAUA,MAAMd,SAASQ,GAAG,MACjED,aAAaC,GAAG,IAAIjD,MAAMiD,GAAG,KAG/BD,aAAaC,GAAG,IAAIjD,MAAMiD,GAAG;AAIjC,MAAIjD,MAAMyB,UAAUhC,QAAQ6C,OAAOtC,MAAMyC;AACvC;AAGF,QAAMpD,OAAOuC,QAAQ4B,cACjB/D,QAAQkD,iBACR,OAAO3C,MAAMX,QAAS,WACpBW,MAAMX,OACNI,QAAQkD,gBAERc,mBAAmC5B,MAAMC,QAAQ9B,MAAM0D,QAAQ,IACjE1D,MAAM0D,WACN,CAAA,GACEC,gBAAgB,oBAAIC,IAAAA,GACpBF,WAAWD,iBAAiB1B,QAAS8B,CAAAA,YAAY;AACrD,QAAI,CAACvC,cAAcuC,OAAO;AACxB,aAAO,CAAA;AAGT,UAAMxB,aAAa5C,QAAQ6C,OAAOwB,YAAYtB,KAC5C,CAAC;AAAA,MAACC;AAAAA,IAAAA,MAAUA,SAASoB,QAAQpC,KAC/B;AAEA,QAAI,CAACY;AACH,aAAO,CAAA;AAGT,QAAI,OAAOwB,QAAQxE,QAAS;AAG1B,aAAO,CAAA;AAGT,UAAM0E,mBAAmBrB,YAAY;AAAA,MACnCnB,QAAQsC;AAAAA,MACRpE,SAAS;AAAA,QACP4C;AAAAA,QACAM,cAAclD,QAAQkD;AAAAA,MAAAA;AAAAA,MAExBf;AAAAA,IAAAA,CACD;AAED,WAAKmC,oBAILJ,cAAcK,IAAIH,QAAQxE,MAAM0E,iBAAiB1E,IAAI,GAE9C,CAAC0E,gBAAgB,KALf,CAAA;AAAA,EAMX,CAAC,GAMK3D,YAJmCyB,MAAMC,QAAQ9B,MAAMI,QAAQ,IACjEJ,MAAMI,WACN,CAAA,GAGDgB,IACEjB,WACC8D,UAAU;AAAA,IAACC,MAAM/D;AAAAA,IAAOV;AAAAA,IAASkE;AAAAA,IAAe/B;AAAAA,EAAAA,CAAQ,KACxDuC,kBAAkB;AAAA,IAACC,cAAcjE;AAAAA,IAAOV;AAAAA,IAASmC;AAAAA,EAAAA,CAAQ,CAC7D,EACCyC,OAAQlE,WAAUA,UAAU2C,MAAS,GAElCd,cAAqC;AAAA,IACzCP,OAAOhC,QAAQ6C,OAAOtC,MAAMyC;AAAAA,IAC5BpD;AAAAA,IACAe,UACEA,SAASG,SAAS,IACdH,WACA,CACE;AAAA,MACEf,MAAMI,QAAQkD,aAAAA;AAAAA,MACdlB,OAAOhC,QAAQ6C,OAAO4B,KAAKzB;AAAAA,MAC3BnC,MAAM;AAAA,MACNgE,OAAO,CAAA;AAAA,IAAA,CACR;AAAA,IAETZ;AAAAA,IACA,GAAGV;AAAAA,EAAAA;AAGL,MACE,OAAOhD,MAAMuE,SAAU,YACvB9E,QAAQ6C,OAAOkC,OAAOhC,KAAM+B,CAAAA,UAAUA,MAAM9B,SAASzC,MAAMuE,KAAK;AAEhEvC,gBAAYuC,QAAQvE,MAAMuE;AAAAA,OACrB;AACL,UAAME,eAAehF,QAAQ6C,OAAOkC,OAAOpF,GAAG,CAAC,GAAGqD;AAE9CgC,qBAAiB3B,SACnBd,YAAYuC,QAAQE,eAEpBC,QAAQC,MAAM,wBAAwB;AAAA,EAE1C;AAEA,SACE,OAAO3E,MAAM+C,YAAa,YAC1BtD,QAAQ6C,OAAOsC,MAAMpC,KAAMqC,CAAAA,SAASA,KAAKpC,SAASzC,MAAM+C,QAAQ,MAEhEf,YAAYe,WAAW/C,MAAM+C,WAG3B,OAAO/C,MAAM6C,SAAU,aACzBb,YAAYa,QAAQ7C,MAAM6C,QAGrBb;AACT;AAEO,SAASiC,UAAU;AAAA,EACxBC;AAAAA,EACAzE;AAAAA,EACAkE;AAAAA,EACA/B;AAMF,GAAiC;AAC/B,MAAI,CAACN,cAAc4C,IAAI;AACrB;AAGF,QAAMlB,eAAwC,CAAA;AAE9C,aAAWC,OAAOC,OAAOC,KAAKe,IAAI;AAE9BjB,YAAQ,WACRA,QAAQ,UACRA,QAAQ,UACRA,QAAQ,YAERD,aAAaC,GAAG,IAAIiB,KAAKjB,GAAG;AAKhC,MAAIiB,KAAKzC,UAAUhC,QAAQ6C,OAAO4B,KAAKzB,QAAQyB,KAAKzC,UAAU;AAC5D;AAMF,QAAM6C,SAHgCzC,MAAMC,QAAQoC,KAAKI,KAAK,IAC1DJ,KAAKI,QACL,CAAA,GACwBvC,QAAS+C,CAAAA,SAAS;AAC5C,QAAI,OAAOA,QAAS;AAClB,aAAO,CAAA;AAGT,UAAMC,aAAapB,cAAcqB,IAAIF,IAAI;AAEzC,WAAIC,eAAejC,SACV,CAACiC,UAAU,IAIlBtF,QAAQ6C,OAAO2C,WAAW3B,KAAM4B,CAAAA,cAAcA,UAAUzC,SAASqC,IAAI,IAE9D,CAACA,IAAI,IAGP,CAAA;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACLrD,OAAO;AAAA,IACPpC,MAAMuC,QAAQ4B,cACV/D,QAAQkD,aAAAA,IACR,OAAOuB,KAAK7E,QAAS,WACnB6E,KAAK7E,OACLI,QAAQkD,aAAAA;AAAAA,IACdrC,MAAM,OAAO4D,KAAK5D,QAAS,WAAW4D,KAAK5D,OAAO;AAAA,IAClDgE;AAAAA,IACA,GAAI1C,QAAQwB,iBAAiB,KAAKJ;AAAAA,EAAAA;AAEtC;AAEO,SAASmB,kBAAkB;AAAA,EAChCC;AAAAA,EACA3E;AAAAA,EACAmC;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAc8C,YAAY;AAC7B;AAGF,QAAM/B,aAAa5C,QAAQ6C,OAAO6C,cAAc3C,KAC9C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAAS2B,aAAa3C,KACpC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQ6C;AAAAA,MACR3E,SAAS;AAAA,QACPkD,cAAclD,QAAQkD;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEO,SAASwD,gBAAgB;AAAA,EAC9BC;AAAAA,EACA5F;AAAAA,EACAmC;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAc+D,UAAU;AAC3B;AAGF,QAAMhD,aAAa5C,QAAQ6C,OAAOwB,YAAYtB,KAC5C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAAS4C,WAAW5D,KAClC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQ8D;AAAAA,MACR5F,SAAS;AAAA,QACPkD,cAAclD,QAAQkD;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEA,SAASc,YAAY;AAAA,EACnBnB;AAAAA,EACA9B;AAAAA,EACAmC;AAOF,GAAuB;AACrB,QAAM;AAAA,IAACH;AAAAA,IAAOpC;AAAAA,IAAM,GAAG2D;AAAAA,EAAAA,IAAgBzB,QAIjC+D,SAAS1D,QAAQwB,iBACnB3D,QAAQ4C,WAAWgB,OAAOkC,OACxB,CAACC,aAAajC,UAAU;AACtB,UAAMkC,aAAalE,OAAOgC,MAAMd,IAAI;AAEpC,WAAIgD,eAAe3C,WACjB0C,YAAYjC,MAAMd,IAAI,IAAIgD,aAGrBD;AAAAA,EACT,GACA,CAAA,CACF,IACAxC;AAEJ,SAAO;AAAA,IACLvB,OAAOhC,QAAQ4C,WAAWI;AAAAA,IAC1BpD,MAAMuC,QAAQ4B,cACV/D,QAAQkD,aAAAA,IACR,OAAOpB,OAAOlC,QAAS,WACrBkC,OAAOlC,OACPI,QAAQkD,aAAAA;AAAAA,IACd,GAAG2C;AAAAA,EAAAA;AAEP;AChZO,SAASI,YAAY;AAAA,EAC1BjG;AAAAA,EACAkC;AAIF,GAA6B;AAC3B,QAAMgE,QAAkC,CAAA;AAExC,MAAI,CAAClG,QAAQqB;AACX,WAAO6E;AAGT,MAAIC;AACJ,QAAMC,eAAoC,CAAA;AAC1C,MAAIC;AAEJ,QAAMC,aAAa7E,uBAAuBzB,QAAQqB,SAAS,GACrDkF,WAAWnF,qBAAqBpB,QAAQqB,SAAS,GACjDmF,gBAAgBjH,8BAA8B+G,UAAU,GACxDG,gBAAgB5G,8BAA8ByG,UAAU,GACxDI,cAAcnH,8BAA8BgH,QAAQ,GACpDI,cAAc9G,8BAA8B0G,QAAQ;AAE1D,MAAI,CAACC,iBAAiB,CAACE;AACrB,WAAOR;AAGT,aAAW3F,SAAS2B,QAAQ;AAC1B,QAAI,CAACzB,YAAYT,SAASO,KAAK,KACzBA,MAAMX,SAAS4G,iBAAiBjG,MAAMX,SAAS8G,aAAa;AAC9DP,mBAAa5F;AACb;AAAA,IACF;AAGF,QAAIA,MAAMX,SAAS4G,eAAe;AAChC,UAAI,CAAC/F,YAAYT,SAASO,KAAK,GAAG;AAChC4F,qBAAa5F;AACb;AAAA,MACF;AAEA,UAAIkG,eAAe;AACjB,mBAAW/F,SAASH,MAAMI,UAAU;AAClC,cAAID,MAAMd,SAAS6G,eAAe;AAChC,gBAAI7F,OAAOZ,SAASU,KAAK,GAAG;AAC1B,oBAAMG,OACJH,MAAMd,SAAS+G,cACXjG,MAAMG,KAAKqF,MAAMI,WAAWlG,QAAQmG,SAASnG,MAAM,IACnDM,MAAMG,KAAKqF,MAAMI,WAAWlG,MAAM;AAExC+F,2BAAa;AAAA,gBACX,GAAG5F;AAAAA,gBACHI,UAAU,CACR;AAAA,kBACE,GAAGD;AAAAA,kBACHG;AAAAA,gBAAAA,CACD;AAAA,cAAA;AAAA,YAGP;AACEsF,2BAAa;AAAA,gBACX,GAAG5F;AAAAA,gBACHI,UAAU,CAACD,KAAK;AAAA,cAAA;AAIpB,gBAAI+F,kBAAkBE;AACpB;AAEF;AAAA,UACF;AAEA,cAAIR,cAAc1F,YAAYT,SAASmG,UAAU,MAE7CQ,eACAjG,MAAMd,SAAS+G,eACf/F,OAAOZ,SAASU,KAAK,IAErByF,WAAWxF,SAASiG,KAAK;AAAA,YACvB,GAAGlG;AAAAA,YACHG,MAAMH,MAAMG,KAAKqF,MAAM,GAAGK,SAASnG,MAAM;AAAA,UAAA,CAC1C,IAED+F,WAAWxF,SAASiG,KAAKlG,KAAK,GAI9BH,MAAMX,SAAS8G,eACfC,eACAjG,MAAMd,SAAS+G;AAEf;AAAA,QAGN;AAEA,YAAIH,kBAAkBE;AACpB;AAGF;AAAA,MACF;AAIA,UAFAP,aAAa5F,OAETiG,kBAAkBE;AACpB;AAAA,IAEJ;AAEA,QAAInG,MAAMX,SAAS8G,aAAa;AAC9B,UAAI,CAACjG,YAAYT,SAASO,KAAK,GAAG;AAChC8F,mBAAW9F;AACX;AAAA,MACF;AAEA,UAAIoG,aAAa;AACfN,mBAAW;AAAA,UACT,GAAG9F;AAAAA,UACHI,UAAU,CAAA;AAAA,QAAA;AAGZ,mBAAWD,SAASH,MAAMI;AACxB,cAAI0F,YAAY5F,YAAYT,SAASqG,QAAQ,GAAG;AAC9C,gBAAI3F,MAAMd,SAAS+G,eAAe/F,OAAOZ,SAASU,KAAK,GAAG;AACxD2F,uBAAS1F,SAASiG,KAAK;AAAA,gBACrB,GAAGlG;AAAAA,gBACHG,MAAMH,MAAMG,KAAKqF,MAAM,GAAGK,SAASnG,MAAM;AAAA,cAAA,CAC1C;AAED;AAAA,YACF;AAIA,gBAFAiG,SAAS1F,SAASiG,KAAKlG,KAAK,GAExBiG,eAAejG,MAAMd,SAAS+G;AAChC;AAAA,UAEJ;AAGF;AAAA,MACF;AAEAN,iBAAW9F;AAEX;AAAA,IACF;AAEI4F,kBACFC,aAAaQ,KAAKrG,KAAK;AAAA,EAE3B;AAEA,SAAO,CACL,GAAI4F,aAAa,CAACA,UAAU,IAAI,CAAA,GAChC,GAAGC,cACH,GAAIC,WAAW,CAACA,QAAQ,IAAI,CAAA,CAAG;AAEnC;"}
@@ -1,5 +1,6 @@
1
- import { getBlockKeyFromSelectionPoint, getChildKeyFromSelectionPoint, isSpan, getSelectionStartPoint, getSelectionEndPoint } from "./util.slice-blocks.js";
1
+ import { getBlockKeyFromSelectionPoint, getChildKeyFromSelectionPoint, getSelectionStartPoint, getSelectionEndPoint } from "./util.slice-blocks.js";
2
2
  import { childSelectionPointToBlockOffset } from "./util.child-selection-point-to-block-offset.js";
3
+ import { isSpan } from "@portabletext/schema";
3
4
  function selectionPointToBlockOffset({
4
5
  context,
5
6
  selectionPoint
@@ -1 +1 @@
1
- {"version":3,"file":"util.slice-text-block.js","sources":["../../src/utils/util.selection-point-to-block-offset.ts","../../src/utils/util.slice-text-block.ts"],"sourcesContent":["import type {EditorContext} from '../editor/editor-snapshot'\nimport {getBlockKeyFromSelectionPoint} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {childSelectionPointToBlockOffset} from './util.child-selection-point-to-block-offset'\n\n/**\n * @public\n */\nexport function selectionPointToBlockOffset({\n context,\n selectionPoint,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n const blockKey = getBlockKeyFromSelectionPoint(selectionPoint)\n\n if (selectionPoint.path.length === 1 && blockKey !== undefined) {\n return {\n path: [{_key: blockKey}],\n offset: selectionPoint.offset,\n }\n }\n\n return childSelectionPointToBlockOffset({\n context,\n selectionPoint,\n })\n}\n","import type {PortableTextChild, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isSpan} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-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":["selectionPointToBlockOffset","context","selectionPoint","blockKey","getBlockKeyFromSelectionPoint","path","length","undefined","_key","offset","childSelectionPointToBlockOffset","sliceTextBlock","block","startPoint","getSelectionStartPoint","selection","endPoint","getSelectionEndPoint","startBlockKey","endBlockKey","startChildKey","getChildKeyFromSelectionPoint","endChildKey","startChildFound","children","child","isSpan","text","slice","push"],"mappings":";;AASO,SAASA,4BAA4B;AAAA,EAC1CC;AAAAA,EACAC;AAIF,GAA4B;AAC1B,QAAMC,WAAWC,8BAA8BF,cAAc;AAE7D,SAAIA,eAAeG,KAAKC,WAAW,KAAKH,aAAaI,SAC5C;AAAA,IACLF,MAAM,CAAC;AAAA,MAACG,MAAML;AAAAA,IAAAA,CAAS;AAAA,IACvBM,QAAQP,eAAeO;AAAAA,EAAAA,IAIpBC,iCAAiC;AAAA,IACtCT;AAAAA,IACAC;AAAAA,EAAAA,CACD;AACH;ACnBO,SAASS,eAAe;AAAA,EAC7BV;AAAAA,EACAW;AAIF,GAA0B;AACxB,QAAMC,aAAaC,uBAAuBb,QAAQc,SAAS,GACrDC,WAAWC,qBAAqBhB,QAAQc,SAAS;AAEvD,MAAI,CAACF,cAAc,CAACG;AAClB,WAAOJ;AAGT,QAAMM,gBAAgBd,8BAA8BS,UAAU,GACxDM,cAAcf,8BAA8BY,QAAQ;AAE1D,MAAIE,kBAAkBC,eAAeD,kBAAkBN,MAAMJ;AAC3D,WAAOI;AAGT,QAAMQ,gBAAgBC,8BAA8BR,UAAU,GACxDS,cAAcD,8BAA8BL,QAAQ;AAE1D,MAAI,CAACI,iBAAiB,CAACE;AACrB,WAAOV;AAGT,MAAIW,kBAAkB;AACtB,QAAMC,WAAqC,CAAA;AAE3C,aAAWC,SAASb,MAAMY,UAAU;AAClC,QAAIC,MAAMjB,SAASY,eAAe;AAGhC,UAFAG,kBAAkB,IAEdG,OAAOzB,SAASwB,KAAK,GAAG;AAC1B,cAAME,OACJF,MAAMjB,SAASc,cACXG,MAAME,KAAKC,MAAMf,WAAWJ,QAAQO,SAASP,MAAM,IACnDgB,MAAME,KAAKC,MAAMf,WAAWJ,MAAM;AAExCe,iBAASK,KAAK;AAAA,UACZ,GAAGJ;AAAAA,UACHE;AAAAA,QAAAA,CACD;AAAA,MACH;AACEH,iBAASK,KAAKJ,KAAK;AAGrB,UAAIL,kBAAkBE;AACpB;AAGF;AAAA,IACF;AAEA,QAAIG,MAAMjB,SAASc,aAAa;AAC1BI,aAAOzB,SAASwB,KAAK,IACvBD,SAASK,KAAK;AAAA,QACZ,GAAGJ;AAAAA,QACHE,MAAMF,MAAME,KAAKC,MAAM,GAAGZ,SAASP,MAAM;AAAA,MAAA,CAC1C,IAEDe,SAASK,KAAKJ,KAAK;AAGrB;AAAA,IACF;AAEIF,uBACFC,SAASK,KAAKJ,KAAK;AAAA,EAEvB;AAEA,SAAO;AAAA,IACL,GAAGb;AAAAA,IACHY;AAAAA,EAAAA;AAEJ;"}
1
+ {"version":3,"file":"util.slice-text-block.js","sources":["../../src/utils/util.selection-point-to-block-offset.ts","../../src/utils/util.slice-text-block.ts"],"sourcesContent":["import type {EditorContext} from '../editor/editor-snapshot'\nimport {getBlockKeyFromSelectionPoint} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {childSelectionPointToBlockOffset} from './util.child-selection-point-to-block-offset'\n\n/**\n * @public\n */\nexport function selectionPointToBlockOffset({\n context,\n selectionPoint,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n const blockKey = getBlockKeyFromSelectionPoint(selectionPoint)\n\n if (selectionPoint.path.length === 1 && blockKey !== undefined) {\n return {\n path: [{_key: blockKey}],\n offset: selectionPoint.offset,\n }\n }\n\n return childSelectionPointToBlockOffset({\n context,\n selectionPoint,\n })\n}\n","import {isSpan} from '@portabletext/schema'\nimport type {PortableTextChild, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-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":["selectionPointToBlockOffset","context","selectionPoint","blockKey","getBlockKeyFromSelectionPoint","path","length","undefined","_key","offset","childSelectionPointToBlockOffset","sliceTextBlock","block","startPoint","getSelectionStartPoint","selection","endPoint","getSelectionEndPoint","startBlockKey","endBlockKey","startChildKey","getChildKeyFromSelectionPoint","endChildKey","startChildFound","children","child","isSpan","text","slice","push"],"mappings":";;;AASO,SAASA,4BAA4B;AAAA,EAC1CC;AAAAA,EACAC;AAIF,GAA4B;AAC1B,QAAMC,WAAWC,8BAA8BF,cAAc;AAE7D,SAAIA,eAAeG,KAAKC,WAAW,KAAKH,aAAaI,SAC5C;AAAA,IACLF,MAAM,CAAC;AAAA,MAACG,MAAML;AAAAA,IAAAA,CAAS;AAAA,IACvBM,QAAQP,eAAeO;AAAAA,EAAAA,IAIpBC,iCAAiC;AAAA,IACtCT;AAAAA,IACAC;AAAAA,EAAAA,CACD;AACH;ACnBO,SAASS,eAAe;AAAA,EAC7BV;AAAAA,EACAW;AAIF,GAA0B;AACxB,QAAMC,aAAaC,uBAAuBb,QAAQc,SAAS,GACrDC,WAAWC,qBAAqBhB,QAAQc,SAAS;AAEvD,MAAI,CAACF,cAAc,CAACG;AAClB,WAAOJ;AAGT,QAAMM,gBAAgBd,8BAA8BS,UAAU,GACxDM,cAAcf,8BAA8BY,QAAQ;AAE1D,MAAIE,kBAAkBC,eAAeD,kBAAkBN,MAAMJ;AAC3D,WAAOI;AAGT,QAAMQ,gBAAgBC,8BAA8BR,UAAU,GACxDS,cAAcD,8BAA8BL,QAAQ;AAE1D,MAAI,CAACI,iBAAiB,CAACE;AACrB,WAAOV;AAGT,MAAIW,kBAAkB;AACtB,QAAMC,WAAqC,CAAA;AAE3C,aAAWC,SAASb,MAAMY,UAAU;AAClC,QAAIC,MAAMjB,SAASY,eAAe;AAGhC,UAFAG,kBAAkB,IAEdG,OAAOzB,SAASwB,KAAK,GAAG;AAC1B,cAAME,OACJF,MAAMjB,SAASc,cACXG,MAAME,KAAKC,MAAMf,WAAWJ,QAAQO,SAASP,MAAM,IACnDgB,MAAME,KAAKC,MAAMf,WAAWJ,MAAM;AAExCe,iBAASK,KAAK;AAAA,UACZ,GAAGJ;AAAAA,UACHE;AAAAA,QAAAA,CACD;AAAA,MACH;AACEH,iBAASK,KAAKJ,KAAK;AAGrB,UAAIL,kBAAkBE;AACpB;AAGF;AAAA,IACF;AAEA,QAAIG,MAAMjB,SAASc,aAAa;AAC1BI,aAAOzB,SAASwB,KAAK,IACvBD,SAASK,KAAK;AAAA,QACZ,GAAGJ;AAAAA,QACHE,MAAMF,MAAME,KAAKC,MAAM,GAAGZ,SAASP,MAAM;AAAA,MAAA,CAC1C,IAEDe,SAASK,KAAKJ,KAAK;AAGrB;AAAA,IACF;AAEIF,uBACFC,SAASK,KAAKJ,KAAK;AAAA,EAEvB;AAEA,SAAO;AAAA,IACL,GAAGb;AAAAA,IACHY;AAAAA,EAAAA;AAEJ;"}