@portabletext/editor 3.0.8 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -266,6 +266,20 @@ declare class PortableTextEditor extends Component<PortableTextEditorProps<Inter
266
266
  * ```
267
267
  */
268
268
  static blur: (editor: PortableTextEditor) => void;
269
+ /**
270
+ * @deprecated
271
+ * Use `editor.send(...)` instead
272
+ *
273
+ * ```
274
+ * const editor = useEditor()
275
+ * editor.send({
276
+ * type: 'delete',
277
+ * at: {...},
278
+ * direction: '...',
279
+ * unit: '...',
280
+ * })
281
+ * ```
282
+ */
269
283
  static delete: (editor: PortableTextEditor, selection: EditorSelection, options?: EditableAPIDeleteOptions) => void;
270
284
  static findDOMNode: (editor: PortableTextEditor, element: PortableTextBlock | PortableTextChild) => Node | undefined;
271
285
  static findByPath: (editor: PortableTextEditor, path: Path) => [_sanity_types4.PortableTextTextBlock<PortableTextObject | _sanity_types4.PortableTextSpan> | PortableTextObject | _sanity_types4.PortableTextSpan | undefined, Path | undefined];
@@ -740,14 +754,6 @@ interface PortableTextSlateEditor extends ReactEditor {
740
754
  * Use hotkeys
741
755
  */
742
756
  pteWithHotKeys: (event: KeyboardEvent$1<HTMLDivElement>) => void;
743
- /**
744
- * Helper function that creates a text block
745
- */
746
- pteCreateTextBlock: (options: {
747
- decorators: Array<string>;
748
- listItem?: string;
749
- level?: number;
750
- }) => Descendant;
751
757
  /**
752
758
  * Undo
753
759
  */
@@ -1700,7 +1706,7 @@ declare const editorMachine: xstate228.StateMachine<{
1700
1706
  type: StrictExtract<"split" | "annotation.add" | "annotation.remove" | "block.set" | "block.unset" | "child.set" | "child.unset" | "decorator.add" | "decorator.remove" | "delete" | "history.redo" | "history.undo" | "insert.block" | "insert.child" | "insert.text" | "move.backward" | "move.block" | "move.forward" | "select" | "annotation.set" | "annotation.toggle" | "decorator.toggle" | "delete.backward" | "delete.block" | "delete.child" | "delete.forward" | "delete.text" | "deserialize" | "deserialize.data" | "deserialization.success" | "deserialization.failure" | "insert.blocks" | "insert.break" | "insert.inline object" | "insert.soft break" | "insert.span" | "list item.add" | "list item.remove" | "list item.toggle" | "move.block down" | "move.block up" | "select.block" | "select.previous block" | "select.next block" | "serialize" | "serialize.data" | "serialization.success" | "serialization.failure" | "style.add" | "style.remove" | "style.toggle", "delete">;
1701
1707
  at?: NonNullable<EditorSelection>;
1702
1708
  direction?: "backward" | "forward";
1703
- unit?: "character" | "word" | "line" | "block";
1709
+ unit?: "character" | "word" | "line" | "block" | "child";
1704
1710
  } | {
1705
1711
  type: StrictExtract<"split" | "annotation.add" | "annotation.remove" | "block.set" | "block.unset" | "child.set" | "child.unset" | "decorator.add" | "decorator.remove" | "delete" | "history.redo" | "history.undo" | "insert.block" | "insert.child" | "insert.text" | "move.backward" | "move.block" | "move.forward" | "select" | "annotation.set" | "annotation.toggle" | "decorator.toggle" | "delete.backward" | "delete.block" | "delete.child" | "delete.forward" | "delete.text" | "deserialize" | "deserialize.data" | "deserialization.success" | "deserialization.failure" | "insert.blocks" | "insert.break" | "insert.inline object" | "insert.soft break" | "insert.span" | "list item.add" | "list item.remove" | "list item.toggle" | "move.block down" | "move.block up" | "select.block" | "select.previous block" | "select.next block" | "serialize" | "serialize.data" | "serialization.success" | "serialization.failure" | "style.add" | "style.remove" | "style.toggle", "history.redo">;
1706
1712
  } | {
@@ -3100,7 +3106,7 @@ type SyntheticBehaviorEvent = {
3100
3106
  /**
3101
3107
  * Defaults to character deletion.
3102
3108
  */
3103
- unit?: 'character' | 'word' | 'line' | 'block';
3109
+ unit?: 'character' | 'word' | 'line' | 'block' | 'child';
3104
3110
  } | {
3105
3111
  type: StrictExtract<SyntheticBehaviorEventType, 'history.redo'>;
3106
3112
  } | {
@@ -125,6 +125,12 @@ function spanSelectionPointToBlockOffset({
125
125
  function isEqualSelectionPoints(a, b) {
126
126
  return a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path);
127
127
  }
128
+ function getSelectionEndPoint(selection) {
129
+ return selection ? selection.backward ? selection.anchor : selection.focus : null;
130
+ }
131
+ function getSelectionStartPoint(selection) {
132
+ return selection ? selection.backward ? selection.focus : selection.anchor : null;
133
+ }
128
134
  function isTypedObject(object) {
129
135
  return isRecord(object) && typeof object._type == "string";
130
136
  }
@@ -195,25 +201,13 @@ function parseTextBlock({
195
201
  key === "_type" || key === "_key" || key === "children" || key === "markDefs" || key === "style" || key === "listItem" || key === "level" || (options.validateFields ? context.schema.block.fields?.some((field) => field.name === key) && (customFields[key] = block[key]) : customFields[key] = block[key]);
196
202
  if (block._type !== context.schema.block.name)
197
203
  return;
198
- const _key = typeof block._key == "string" ? block._key : context.keyGenerator(), unparsedMarkDefs = Array.isArray(block.markDefs) ? block.markDefs : [], markDefKeyMap = /* @__PURE__ */ new Map(), markDefs = unparsedMarkDefs.flatMap((markDef) => {
199
- if (!isTypedObject(markDef))
200
- return [];
201
- const schemaType = context.schema.annotations.find(({
202
- name
203
- }) => name === markDef._type);
204
- if (!schemaType)
205
- return [];
206
- if (typeof markDef._key != "string")
207
- return [];
208
- const parsedAnnotation = parseObject({
209
- object: markDef,
210
- context: {
211
- schemaType,
212
- keyGenerator: context.keyGenerator
213
- },
214
- options
215
- });
216
- return parsedAnnotation ? (markDefKeyMap.set(markDef._key, parsedAnnotation._key), [parsedAnnotation]) : [];
204
+ const _key = typeof block._key == "string" ? block._key : context.keyGenerator(), {
205
+ markDefs,
206
+ markDefKeyMap
207
+ } = parseMarkDefs({
208
+ context,
209
+ markDefs: block.markDefs,
210
+ options
217
211
  }), parsedChildren = (Array.isArray(block.children) ? block.children : []).map((child) => parseChild({
218
212
  child,
219
213
  context,
@@ -250,6 +244,36 @@ function parseTextBlock({
250
244
  };
251
245
  return typeof block.markDefs == "object" && block.markDefs !== null && (parsedBlock.markDefs = options.removeUnusedMarkDefs ? markDefs.filter((markDef) => marks.includes(markDef._key)) : markDefs), typeof block.style == "string" && context.schema.styles.find((style) => style.name === block.style) && (parsedBlock.style = block.style), 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;
252
246
  }
247
+ function parseMarkDefs({
248
+ context,
249
+ markDefs,
250
+ options
251
+ }) {
252
+ const unparsedMarkDefs = Array.isArray(markDefs) ? markDefs : [], markDefKeyMap = /* @__PURE__ */ new Map();
253
+ return {
254
+ markDefs: unparsedMarkDefs.flatMap((markDef) => {
255
+ if (!isTypedObject(markDef))
256
+ return [];
257
+ const schemaType = context.schema.annotations.find(({
258
+ name
259
+ }) => name === markDef._type);
260
+ if (!schemaType)
261
+ return [];
262
+ if (typeof markDef._key != "string")
263
+ return [];
264
+ const parsedAnnotation = parseObject({
265
+ object: markDef,
266
+ context: {
267
+ schemaType,
268
+ keyGenerator: context.keyGenerator
269
+ },
270
+ options
271
+ });
272
+ return parsedAnnotation ? (markDefKeyMap.set(markDef._key, parsedAnnotation._key), [parsedAnnotation]) : [];
273
+ }),
274
+ markDefKeyMap
275
+ };
276
+ }
253
277
  function parseChild({
254
278
  child,
255
279
  context,
@@ -377,12 +401,6 @@ function randomKey(length) {
377
401
  const table = getByteHexTable();
378
402
  return whatwgRNG(length).reduce((str, n) => str + table[n], "").slice(0, length);
379
403
  }
380
- function getSelectionEndPoint(selection) {
381
- return selection ? selection.backward ? selection.anchor : selection.focus : null;
382
- }
383
- function getSelectionStartPoint(selection) {
384
- return selection ? selection.backward ? selection.focus : selection.anchor : null;
385
- }
386
404
  function sliceBlocks({
387
405
  context,
388
406
  blocks
@@ -523,6 +541,7 @@ export {
523
541
  parseBlock,
524
542
  parseBlocks,
525
543
  parseInlineObject,
544
+ parseMarkDefs,
526
545
  parseSpan,
527
546
  sliceBlocks,
528
547
  spanSelectionPointToBlockOffset
@@ -1 +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((child) => parseChild({child, context, markDefKeyMap, options}))\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 ...customFields,\n }\n\n if (typeof block.markDefs === 'object' && block.markDefs !== null) {\n parsedBlock.markDefs = options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs\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 }\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 parseChild({\n child,\n context,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return (\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options})\n )\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 (\n typeof span._type === 'string' &&\n span._type !== context.schema.span.name\n ) {\n return undefined\n }\n\n if (typeof span._type !== 'string') {\n if (typeof span.text === 'string') {\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","parseChild","filter","marks","span","normalizedChildren","normalize","reduce","index","previousChild","removeUnusedMarkDefs","includes","style","styles","lists","list","parseSpan","parseInlineObject","inlineObject","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
+ {"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/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/asserters.ts","../../src/utils/parse-blocks.ts","../../src/utils/key-generator.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 {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 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 {markDefs, markDefKeyMap} = parseMarkDefs({\n context,\n markDefs: block.markDefs,\n options,\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const parsedChildren = unparsedChildren\n .map((child) => parseChild({child, context, markDefKeyMap, options}))\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 ...customFields,\n }\n\n if (typeof block.markDefs === 'object' && block.markDefs !== null) {\n parsedBlock.markDefs = options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs\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 }\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 parseMarkDefs({\n context,\n markDefs,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefs: unknown\n options: {validateFields: boolean}\n}): {\n markDefs: Array<PortableTextObject>\n markDefKeyMap: Map<string, string>\n} {\n const unparsedMarkDefs: Array<unknown> = Array.isArray(markDefs)\n ? markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n\n const parsedMarkDefs = 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 return {\n markDefs: parsedMarkDefs,\n markDefKeyMap,\n }\n}\n\nexport function parseChild({\n child,\n context,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return (\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options})\n )\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 (\n typeof span._type === 'string' &&\n span._type !== context.schema.span.name\n ) {\n return undefined\n }\n\n if (typeof span._type !== 'string') {\n if (typeof span.text === 'string') {\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 {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","getSelectionEndPoint","backward","getSelectionStartPoint","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","markDefs","markDefKeyMap","parseMarkDefs","parsedChildren","map","parseChild","filter","marks","span","normalizedChildren","normalize","reduce","index","previousChild","removeUnusedMarkDefs","markDef","includes","style","styles","lists","list","unparsedMarkDefs","Map","annotations","parsedAnnotation","set","parseSpan","parseInlineObject","inlineObject","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","sliceBlocks","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push","parsedStartBlock","parsedEndBlock"],"mappings":"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"}
@@ -1 +1 @@
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
+ {"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 | unknown,\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;"}