@portabletext/editor 3.0.1 → 3.0.2

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.
@@ -214,15 +214,11 @@ function parseTextBlock({
214
214
  options
215
215
  });
216
216
  return parsedAnnotation ? (markDefKeyMap.set(markDef._key, parsedAnnotation._key), [parsedAnnotation]) : [];
217
- }), parsedChildren = (Array.isArray(block.children) ? block.children : []).map((child) => parseSpan({
218
- span: child,
217
+ }), parsedChildren = (Array.isArray(block.children) ? block.children : []).map((child) => parseChild({
218
+ child,
219
219
  context,
220
220
  markDefKeyMap,
221
221
  options
222
- }) ?? parseInlineObject({
223
- inlineObject: child,
224
- context,
225
- options
226
222
  })).filter((child) => child !== void 0), marks = parsedChildren.flatMap((child) => child.marks ?? []), children = parsedChildren.length > 0 ? parsedChildren : [{
227
223
  _key: context.keyGenerator(),
228
224
  _type: context.schema.span.name,
@@ -261,6 +257,23 @@ function parseTextBlock({
261
257
  }
262
258
  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;
263
259
  }
260
+ function parseChild({
261
+ child,
262
+ context,
263
+ markDefKeyMap,
264
+ options
265
+ }) {
266
+ return parseSpan({
267
+ span: child,
268
+ context,
269
+ markDefKeyMap,
270
+ options
271
+ }) ?? parseInlineObject({
272
+ inlineObject: child,
273
+ context,
274
+ options
275
+ });
276
+ }
264
277
  function parseSpan({
265
278
  span,
266
279
  context,
@@ -278,19 +291,20 @@ function parseSpan({
278
291
  const markDefKey = markDefKeyMap.get(mark);
279
292
  return markDefKey !== void 0 ? [markDefKey] : context.schema.decorators.some((decorator) => decorator.name === mark) ? [mark] : [];
280
293
  });
281
- return span._type !== context.schema.span.name ? !context.schema.inlineObjects.some((inlineObject) => inlineObject.name === span._type) && typeof span.text == "string" ? {
282
- _type: context.schema.span.name,
283
- _key: typeof span._key == "string" ? span._key : context.keyGenerator(),
284
- text: span.text,
285
- marks,
286
- ...options.validateFields ? {} : customFields
287
- } : void 0 : {
288
- _type: context.schema.span.name,
289
- _key: typeof span._key == "string" ? span._key : context.keyGenerator(),
290
- text: typeof span.text == "string" ? span.text : "",
291
- marks,
292
- ...options.validateFields ? {} : customFields
293
- };
294
+ if (!(typeof span._type == "string" && span._type !== context.schema.span.name))
295
+ return typeof span._type != "string" ? typeof span.text == "string" ? {
296
+ _type: context.schema.span.name,
297
+ _key: typeof span._key == "string" ? span._key : context.keyGenerator(),
298
+ text: span.text,
299
+ marks,
300
+ ...options.validateFields ? {} : customFields
301
+ } : void 0 : {
302
+ _type: context.schema.span.name,
303
+ _key: typeof span._key == "string" ? span._key : context.keyGenerator(),
304
+ text: typeof span.text == "string" ? span.text : "",
305
+ marks,
306
+ ...options.validateFields ? {} : customFields
307
+ };
294
308
  }
295
309
  function parseInlineObject({
296
310
  inlineObject,
@@ -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(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n const marks = parsedChildren.flatMap((child) => child.marks ?? [])\n\n const children =\n parsedChildren.length > 0\n ? parsedChildren\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ]\n\n const normalizedChildren = options.normalize\n ? // Ensure that inline objects re surrounded by spans\n children.reduce<Array<PortableTextObject | PortableTextSpan>>(\n (normalizedChildren, child, index) => {\n if (isSpan(context, child)) {\n return [...normalizedChildren, child]\n }\n\n const previousChild = normalizedChildren.at(-1)\n\n if (!previousChild || !isSpan(context, previousChild)) {\n return [\n ...normalizedChildren,\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n child,\n ...(index === children.length - 1\n ? [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ]\n : []),\n ]\n }\n\n return [...normalizedChildren, child]\n },\n [],\n )\n : children\n\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children: normalizedChildren,\n markDefs: options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs,\n ...customFields,\n }\n\n if (\n typeof block.style === 'string' &&\n context.schema.styles.find((style) => style.name === block.style)\n ) {\n parsedBlock.style = block.style\n } else {\n const defaultStyle = context.schema.styles.at(0)?.name\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n console.error('Expected default style')\n }\n }\n\n if (\n typeof block.listItem === 'string' &&\n context.schema.lists.find((list) => list.name === block.listItem)\n ) {\n parsedBlock.listItem = block.listItem\n }\n\n if (typeof block.level === 'number') {\n parsedBlock.level = block.level\n }\n\n return parsedBlock\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isRecord(span)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(span)) {\n if (\n key !== '_type' &&\n key !== '_key' &&\n key !== 'text' &&\n key !== 'marks'\n ) {\n customFields[key] = span[key]\n }\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.name === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n if (span._type !== context.schema.span.name) {\n if (\n !context.schema.inlineObjects.some(\n (inlineObject) => inlineObject.name === span._type,\n ) &&\n typeof span.text === 'string'\n ) {\n return {\n _type: context.schema.span.name as 'span',\n _key:\n typeof span._key === 'string' ? span._key : context.keyGenerator(),\n text: span.text,\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n }\n\n return undefined\n }\n\n return {\n _type: context.schema.span.name as 'span',\n _key: typeof span._key === 'string' ? span._key : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n}\n\nexport function parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = context.schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n context,\n options,\n}: {\n annotation: TypedObject\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nfunction parseObject({\n object,\n context,\n options,\n}: {\n object: TypedObject\n context: Pick<EditorContext, 'keyGenerator'> & {\n schemaType: EditorSchema['blockObjects'][0]\n }\n options: {validateFields: boolean}\n}): PortableTextObject {\n const {_type, _key, ...customFields} = object\n\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = options.validateFields\n ? context.schemaType.fields.reduce<Record<string, unknown>>(\n (fieldValues, field) => {\n const fieldValue = object[field.name]\n\n if (fieldValue !== undefined) {\n fieldValues[field.name] = fieldValue\n }\n\n return fieldValues\n },\n {},\n )\n : customFields\n\n return {\n _type: context.schemaType.name,\n _key:\n typeof object._key === 'string' ? object._key : context.keyGenerator(),\n ...values,\n }\n}\n","/**\n * @public\n */\nexport const defaultKeyGenerator = (): string => randomKey(12)\n\nconst getByteHexTable = (() => {\n let table: any[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nfunction randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionEndPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {defaultKeyGenerator} from './key-generator'\nimport {parseBlock} from './parse-blocks'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'> & {\n keyGenerator?: () => string\n }\n blocks: Array<PortableTextBlock>\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!context.selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isTextBlock(context, block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isTextBlock(context, block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (block._key === endBlockKey && startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isTextBlock(context, startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isSpan(context, child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isTextBlock(context, block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isTextBlock(context, endBlock)) {\n if (child._key === endChildKey && isSpan(context, child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(\n parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n }) ?? block,\n )\n }\n }\n\n const parsedStartBlock = startBlock\n ? parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block: startBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n })\n : undefined\n\n const parsedEndBlock = endBlock\n ? parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block: endBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n })\n : undefined\n\n return [\n ...(parsedStartBlock ? [parsedStartBlock] : []),\n ...middleBlocks,\n ...(parsedEndBlock ? [parsedEndBlock] : []),\n ]\n}\n"],"names":["getBlockEndPoint","context","block","isTextBlock","node","lastChild","children","length","path","_key","offset","isSpan","text","getBlockStartPoint","isSelectionCollapsed","selection","JSON","stringify","anchor","focus","isKeyedSegment","segment","getBlockKeyFromSelectionPoint","point","blockPathSegment","at","getChildKeyFromSelectionPoint","childPathSegment","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","selectionPoint","skippedInlineObject","value","child","spanSelectionPointToBlockOffset","blockKey","spanKey","isEqualSelectionPoints","a","b","isTypedObject","object","isRecord","_type","parseBlocks","blocks","options","Array","isArray","flatMap","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","level","undefined","listItem","customFields","key","Object","keys","validateFields","fields","some","field","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","parsedChildren","map","parseSpan","span","parseInlineObject","inlineObject","filter","marks","normalizedChildren","normalize","reduce","index","previousChild","removeUnusedMarkDefs","includes","style","styles","defaultStyle","console","error","lists","list","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","values","fieldValues","fieldValue","defaultKeyGenerator","randomKey","getByteHexTable","table","i","toString","slice","whatwgRNG","rnds8","Uint8Array","crypto","getRandomValues","str","n","getSelectionEndPoint","backward","getSelectionStartPoint","sliceBlocks","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push","parsedStartBlock","parsedEndBlock"],"mappings":";AASO,SAASA,iBAAiB;AAAA,EAC/BC;AAAAA,EACAC;AAOF,GAAyB;AACvB,MAAIC,YAAYF,SAASC,MAAME,IAAI,GAAG;AACpC,UAAMC,YAAYH,MAAME,KAAKE,SAASJ,MAAME,KAAKE,SAASC,SAAS,CAAC;AAEpE,QAAIF;AACF,aAAO;AAAA,QACLG,MAAM,CAAC,GAAGN,MAAMM,MAAM,YAAY;AAAA,UAACC,MAAMJ,UAAUI;AAAAA,QAAAA,CAAK;AAAA,QACxDC,QAAQC,OAAOV,SAASI,SAAS,IAAIA,UAAUO,KAAKL,SAAS;AAAA,MAAA;AAAA,EAGnE;AAEA,SAAO;AAAA,IACLC,MAAMN,MAAMM;AAAAA,IACZE,QAAQ;AAAA,EAAA;AAEZ;ACzBO,SAASG,mBAAmB;AAAA,EACjCZ;AAAAA,EACAC;AAOF,GAAyB;AACvB,SAAIC,YAAYF,SAASC,MAAME,IAAI,IAC1B;AAAA,IACLI,MAAM,CAAC,GAAGN,MAAMM,MAAM,YAAY;AAAA,MAACC,MAAMP,MAAME,KAAKE,SAAS,CAAC,EAAEG;AAAAA,IAAAA,CAAK;AAAA,IACrEC,QAAQ;AAAA,EAAA,IAIL;AAAA,IACLF,MAAMN,MAAMM;AAAAA,IACZE,QAAQ;AAAA,EAAA;AAEZ;ACzBO,SAASI,qBAAqBC,WAA4B;AAC/D,SAAKA,YAKHC,KAAKC,UAAUF,UAAUG,OAAOV,IAAI,MAClCQ,KAAKC,UAAUF,UAAUI,MAAMX,IAAI,KACrCO,UAAUG,OAAOR,WAAWK,UAAUI,MAAMT,SANrC;AAQX;ACVO,SAASU,eAAeC,SAA2C;AACxE,SAAO,OAAOA,WAAY,YAAYA,YAAY,QAAQ,UAAUA;AACtE;ACJO,SAASC,8BAA8BC,OAA6B;AACzE,QAAMC,mBAAmBD,MAAMf,KAAKiB,GAAG,CAAC;AAExC,MAAIL,eAAeI,gBAAgB;AACjC,WAAOA,iBAAiBf;AAI5B;AAEO,SAASiB,8BAA8BH,OAA6B;AACzE,QAAMI,mBAAmBJ,MAAMf,KAAKiB,GAAG,CAAC;AAExC,MAAIL,eAAeO,gBAAgB;AACjC,WAAOA,iBAAiBlB;AAI5B;ACRO,SAASmB,gCAAgC;AAAA,EAC9C3B;AAAAA,EACA4B;AAAAA,EACAC;AAKF,GAAG;AACD,MAAIC,aAAaF,YAAYnB,QACzBsB,gBACAC,sBAAsB;AAE1B,aAAW/B,SAASD,QAAQiC;AAC1B,QAAIhC,MAAMO,SAASoB,YAAYrB,KAAK,CAAC,EAAEC,QAIlCN,YAAYF,SAASC,KAAK;AAI/B,iBAAWiC,SAASjC,MAAMI,UAAU;AAClC,YAAIwB,cAAc,WAAW;AAC3B,cAAI,CAACnB,OAAOV,SAASkC,KAAK;AACxB;AAGF,cAAIJ,cAAcI,MAAMvB,KAAKL,QAAQ;AACnCyB,6BAAiB;AAAA,cACfxB,MAAM,CAAC,GAAGqB,YAAYrB,MAAM,YAAY;AAAA,gBAACC,MAAM0B,MAAM1B;AAAAA,cAAAA,CAAK;AAAA,cAC1DC,QAAQqB;AAAAA,YAAAA;AAEV;AAAA,UACF;AAEAA,wBAAcI,MAAMvB,KAAKL;AAEzB;AAAA,QACF;AAEA,YAAI,CAACI,OAAOV,SAASkC,KAAK,GAAG;AAC3BF,gCAAsB;AACtB;AAAA,QACF;AAEA,YAAIF,eAAe,KAAKC,kBAAkB,CAACC,qBAAqB;AAC1DA,kCACFD,iBAAiB;AAAA,YACfxB,MAAM,CAAC,GAAGqB,YAAYrB,MAAM,YAAY;AAAA,cAACC,MAAM0B,MAAM1B;AAAAA,YAAAA,CAAK;AAAA,YAC1DC,QAAQ;AAAA,UAAA;AAGZ;AAAA,QACF;AAEA,YAAIqB,aAAaI,MAAMvB,KAAKL,QAAQ;AAClCwB,wBAAcI,MAAMvB,KAAKL;AACzB;AAAA,QACF;AAEA,YAAIwB,cAAcI,MAAMvB,KAAKL,WAC3ByB,iBAAiB;AAAA,UACfxB,MAAM,CAAC,GAAGqB,YAAYrB,MAAM,YAAY;AAAA,YAACC,MAAM0B,MAAM1B;AAAAA,UAAAA,CAAK;AAAA,UAC1DC,QAAQqB;AAAAA,QAAAA,GAGVA,cAAcI,MAAMvB,KAAKL,QAErBwB,eAAe;AACjB;AAAA,MAGN;AAGF,SAAOC;AACT;AAKO,SAASI,gCAAgC;AAAA,EAC9CnC;AAAAA,EACA+B;AAIF,GAA4B;AAC1B,MAAItB,SAAS;AAEb,QAAM2B,WAAWf,8BAA8BU,cAAc,GACvDM,UAAUZ,8BAA8BM,cAAc;AAE5D,MAAI,EAAA,CAACK,YAAY,CAACC;AAIlB,eAAWpC,SAASD,QAAQiC;AAC1B,UAAIhC,MAAMO,SAAS4B,YAIdlC,YAAYF,SAASC,KAAK;AAI/B,mBAAWiC,SAASjC,MAAMI;AACxB,cAAKK,OAAOV,SAASkC,KAAK,GAI1B;AAAA,gBAAIA,MAAM1B,SAAS6B;AACjB,qBAAO;AAAA,gBACL9B,MAAM,CAAC;AAAA,kBAACC,MAAMP,MAAMO;AAAAA,gBAAAA,CAAK;AAAA,gBACzBC,QAAQA,SAASsB,eAAetB;AAAAA,cAAAA;AAIpCA,sBAAUyB,MAAMvB,KAAKL;AAAAA,UAAAA;AAAAA;AAAAA;AAG3B;AClIO,SAASgC,uBACdC,GACAC,GACA;AACA,SACED,EAAE9B,WAAW+B,EAAE/B,UAAUM,KAAKC,UAAUuB,EAAEhC,IAAI,MAAMQ,KAAKC,UAAUwB,EAAEjC,IAAI;AAE7E;ACVO,SAASkC,cAAcC,QAAwC;AACpE,SAAOC,SAASD,MAAM,KAAK,OAAOA,OAAOE,SAAU;AACrD;AAEO,SAASD,SAASV,OAAkD;AACzE,SAAO,CAAC,CAACA,UAAU,OAAOA,SAAU,YAAY,OAAOA,SAAU;AACnE;ACKO,SAASY,YAAY;AAAA,EAC1B7C;AAAAA,EACA8C;AAAAA,EACAC;AASF,GAA6B;AAC3B,SAAKC,MAAMC,QAAQH,MAAM,IAIlBA,OAAOI,QAASjD,CAAAA,UAAU;AAC/B,UAAMkD,cAAcC,WAAW;AAAA,MAACpD;AAAAA,MAASC;AAAAA,MAAO8C;AAAAA,IAAAA,CAAQ;AAExD,WAAOI,cAAc,CAACA,WAAW,IAAI,CAAA;AAAA,EACvC,CAAC,IAPQ,CAAA;AAQX;AAEO,SAASC,WAAW;AAAA,EACzBpD;AAAAA,EACAC;AAAAA,EACA8C;AASF,GAAkC;AAChC,SACEM,eAAe;AAAA,IAACpD;AAAAA,IAAOD;AAAAA,IAAS+C;AAAAA,EAAAA,CAAQ,KACxCO,iBAAiB;AAAA,IAACC,aAAatD;AAAAA,IAAOD;AAAAA,IAAS+C;AAAAA,EAAAA,CAAQ;AAE3D;AAEO,SAASO,iBAAiB;AAAA,EAC/BC;AAAAA,EACAvD;AAAAA,EACA+C;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAcc,WAAW;AAC5B;AAGF,QAAMC,aAAaxD,QAAQyD,OAAOC,aAAaC,KAC7C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAASL,YAAYX,KACnC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQa;AAAAA,MACRvD,SAAS;AAAA,QACP8D,cAAc9D,QAAQ8D;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEO,SAASgB,YACd/D,SACAC,OACgC;AAChC,SACEC,YAAYF,SAASC,KAAK,KAC1BA,MAAM+D,UAAUC,UAChBhE,MAAMiE,aAAaD;AAEvB;AAEO,SAASZ,eAAe;AAAA,EAC7BpD;AAAAA,EACAD;AAAAA,EACA+C;AASF,GAAsC;AACpC,MAAI,CAACN,cAAcxC,KAAK;AACtB;AAGF,QAAMkE,eAAwC,CAAA;AAE9C,aAAWC,OAAOC,OAAOC,KAAKrE,KAAK;AAE/BmE,YAAQ,WACRA,QAAQ,UACRA,QAAQ,cACRA,QAAQ,cACRA,QAAQ,WACRA,QAAQ,cACRA,QAAQ,YAKNrB,QAAQwB,iBACNvE,QAAQyD,OAAOxD,MAAMuE,QAAQC,KAAMC,CAAAA,UAAUA,MAAMd,SAASQ,GAAG,MACjED,aAAaC,GAAG,IAAInE,MAAMmE,GAAG,KAG/BD,aAAaC,GAAG,IAAInE,MAAMmE,GAAG;AAIjC,MAAInE,MAAM2C,UAAU5C,QAAQyD,OAAOxD,MAAM2D;AACvC;AAGF,QAAMpD,OACJ,OAAOP,MAAMO,QAAS,WAAWP,MAAMO,OAAOR,QAAQ8D,aAAAA,GAElDa,mBAAmC3B,MAAMC,QAAQhD,MAAM2E,QAAQ,IACjE3E,MAAM2E,WACN,CAAA,GACEC,gBAAgB,oBAAIC,IAAAA,GACpBF,WAAWD,iBAAiBzB,QAAS6B,CAAAA,YAAY;AACrD,QAAI,CAACtC,cAAcsC,OAAO;AACxB,aAAO,CAAA;AAGT,UAAMvB,aAAaxD,QAAQyD,OAAOuB,YAAYrB,KAC5C,CAAC;AAAA,MAACC;AAAAA,IAAAA,MAAUA,SAASmB,QAAQnC,KAC/B;AAEA,QAAI,CAACY;AACH,aAAO,CAAA;AAGT,QAAI,OAAOuB,QAAQvE,QAAS;AAG1B,aAAO,CAAA;AAGT,UAAMyE,mBAAmBpB,YAAY;AAAA,MACnCnB,QAAQqC;AAAAA,MACR/E,SAAS;AAAA,QACPwD;AAAAA,QACAM,cAAc9D,QAAQ8D;AAAAA,MAAAA;AAAAA,MAExBf;AAAAA,IAAAA,CACD;AAED,WAAKkC,oBAILJ,cAAcK,IAAIH,QAAQvE,MAAMyE,iBAAiBzE,IAAI,GAE9C,CAACyE,gBAAgB,KALf,CAAA;AAAA,EAMX,CAAC,GAMKE,kBAJmCnC,MAAMC,QAAQhD,MAAMI,QAAQ,IACjEJ,MAAMI,WACN,CAAA,GAGD+E,IACElD,WACCmD,UAAU;AAAA,IAACC,MAAMpD;AAAAA,IAAOlC;AAAAA,IAAS6E;AAAAA,IAAe9B;AAAAA,EAAAA,CAAQ,KACxDwC,kBAAkB;AAAA,IAACC,cAActD;AAAAA,IAAOlC;AAAAA,IAAS+C;AAAAA,EAAAA,CAAQ,CAC7D,EACC0C,OAAQvD,WAAUA,UAAU+B,MAAS,GAClCyB,QAAQP,eAAejC,QAAShB,WAAUA,MAAMwD,SAAS,CAAA,CAAE,GAE3DrF,WACJ8E,eAAe7E,SAAS,IACpB6E,iBACA,CACE;AAAA,IACE3E,MAAMR,QAAQ8D,aAAAA;AAAAA,IACdlB,OAAO5C,QAAQyD,OAAO6B,KAAK1B;AAAAA,IAC3BjD,MAAM;AAAA,IACN+E,OAAO,CAAA;AAAA,EAAA,CACR,GAGHC,qBAAqB5C,QAAQ6C;AAAAA;AAAAA,IAE/BvF,SAASwF,OACP,CAACF,qBAAoBzD,OAAO4D,UAAU;AACpC,UAAIpF,OAAOV,SAASkC,KAAK;AACvB,eAAO,CAAC,GAAGyD,qBAAoBzD,KAAK;AAGtC,YAAM6D,gBAAgBJ,oBAAmBnE,GAAG,EAAE;AAE9C,aAAI,CAACuE,iBAAiB,CAACrF,OAAOV,SAAS+F,aAAa,IAC3C,CACL,GAAGJ,qBACH;AAAA,QACEnF,MAAMR,QAAQ8D,aAAAA;AAAAA,QACdlB,OAAO5C,QAAQyD,OAAO6B,KAAK1B;AAAAA,QAC3BjD,MAAM;AAAA,QACN+E,OAAO,CAAA;AAAA,MAAA,GAETxD,OACA,GAAI4D,UAAUzF,SAASC,SAAS,IAC5B,CACE;AAAA,QACEE,MAAMR,QAAQ8D,aAAAA;AAAAA,QACdlB,OAAO5C,QAAQyD,OAAO6B,KAAK1B;AAAAA,QAC3BjD,MAAM;AAAA,QACN+E,OAAO,CAAA;AAAA,MAAA,CACR,IAEH,CAAA,CAAG,IAIJ,CAAC,GAAGC,qBAAoBzD,KAAK;AAAA,IACtC,GACA,CAAA,CACF;AAAA,MACA7B,UAEE8C,cAAqC;AAAA,IACzCP,OAAO5C,QAAQyD,OAAOxD,MAAM2D;AAAAA,IAC5BpD;AAAAA,IACAH,UAAUsF;AAAAA,IACVf,UAAU7B,QAAQiD,uBACdpB,SAASa,OAAQV,CAAAA,YAAYW,MAAMO,SAASlB,QAAQvE,IAAI,CAAC,IACzDoE;AAAAA,IACJ,GAAGT;AAAAA,EAAAA;AAGL,MACE,OAAOlE,MAAMiG,SAAU,YACvBlG,QAAQyD,OAAO0C,OAAOxC,KAAMuC,CAAAA,UAAUA,MAAMtC,SAAS3D,MAAMiG,KAAK;AAEhE/C,gBAAY+C,QAAQjG,MAAMiG;AAAAA,OACrB;AACL,UAAME,eAAepG,QAAQyD,OAAO0C,OAAO3E,GAAG,CAAC,GAAGoC;AAE9CwC,qBAAiBnC,SACnBd,YAAY+C,QAAQE,eAEpBC,QAAQC,MAAM,wBAAwB;AAAA,EAE1C;AAEA,SACE,OAAOrG,MAAMiE,YAAa,YAC1BlE,QAAQyD,OAAO8C,MAAM5C,KAAM6C,CAAAA,SAASA,KAAK5C,SAAS3D,MAAMiE,QAAQ,MAEhEf,YAAYe,WAAWjE,MAAMiE,WAG3B,OAAOjE,MAAM+D,SAAU,aACzBb,YAAYa,QAAQ/D,MAAM+D,QAGrBb;AACT;AAEO,SAASkC,UAAU;AAAA,EACxBC;AAAAA,EACAtF;AAAAA,EACA6E;AAAAA,EACA9B;AAMF,GAAiC;AAC/B,MAAI,CAACJ,SAAS2C,IAAI;AAChB;AAGF,QAAMnB,eAAwC,CAAA;AAE9C,aAAWC,OAAOC,OAAOC,KAAKgB,IAAI;AAE9BlB,YAAQ,WACRA,QAAQ,UACRA,QAAQ,UACRA,QAAQ,YAERD,aAAaC,GAAG,IAAIkB,KAAKlB,GAAG;AAOhC,QAAMsB,SAHgC1C,MAAMC,QAAQqC,KAAKI,KAAK,IAC1DJ,KAAKI,QACL,CAAA,GACwBxC,QAASuD,CAAAA,SAAS;AAC5C,QAAI,OAAOA,QAAS;AAClB,aAAO,CAAA;AAGT,UAAMC,aAAa7B,cAAc8B,IAAIF,IAAI;AAEzC,WAAIC,eAAezC,SACV,CAACyC,UAAU,IAIlB1G,QAAQyD,OAAOmD,WAAWnC,KAAMoC,CAAAA,cAAcA,UAAUjD,SAAS6C,IAAI,IAE9D,CAACA,IAAI,IAGP,CAAA;AAAA,EACT,CAAC;AAED,SAAInB,KAAK1C,UAAU5C,QAAQyD,OAAO6B,KAAK1B,OAEnC,CAAC5D,QAAQyD,OAAOqD,cAAcrC,KAC3Be,CAAAA,iBAAiBA,aAAa5B,SAAS0B,KAAK1C,KAC/C,KACA,OAAO0C,KAAK3E,QAAS,WAEd;AAAA,IACLiC,OAAO5C,QAAQyD,OAAO6B,KAAK1B;AAAAA,IAC3BpD,MACE,OAAO8E,KAAK9E,QAAS,WAAW8E,KAAK9E,OAAOR,QAAQ8D,aAAAA;AAAAA,IACtDnD,MAAM2E,KAAK3E;AAAAA,IACX+E;AAAAA,IACA,GAAI3C,QAAQwB,iBAAiB,KAAKJ;AAAAA,EAAAA,IAItC,SAGK;AAAA,IACLvB,OAAO5C,QAAQyD,OAAO6B,KAAK1B;AAAAA,IAC3BpD,MAAM,OAAO8E,KAAK9E,QAAS,WAAW8E,KAAK9E,OAAOR,QAAQ8D,aAAAA;AAAAA,IAC1DnD,MAAM,OAAO2E,KAAK3E,QAAS,WAAW2E,KAAK3E,OAAO;AAAA,IAClD+E;AAAAA,IACA,GAAI3C,QAAQwB,iBAAiB,KAAKJ;AAAAA,EAAAA;AAEtC;AAEO,SAASoB,kBAAkB;AAAA,EAChCC;AAAAA,EACAxF;AAAAA,EACA+C;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAc+C,YAAY;AAC7B;AAGF,QAAMhC,aAAaxD,QAAQyD,OAAOqD,cAAcnD,KAC9C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAAS4B,aAAa5C,KACpC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQ8C;AAAAA,MACRxF,SAAS;AAAA,QACP8D,cAAc9D,QAAQ8D;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEO,SAASgE,gBAAgB;AAAA,EAC9BC;AAAAA,EACAhH;AAAAA,EACA+C;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAcuE,UAAU;AAC3B;AAGF,QAAMxD,aAAaxD,QAAQyD,OAAOuB,YAAYrB,KAC5C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAASoD,WAAWpE,KAClC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQsE;AAAAA,MACRhH,SAAS;AAAA,QACP8D,cAAc9D,QAAQ8D;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEA,SAASc,YAAY;AAAA,EACnBnB;AAAAA,EACA1C;AAAAA,EACA+C;AAOF,GAAuB;AACrB,QAAM;AAAA,IAACH;AAAAA,IAAOpC;AAAAA,IAAM,GAAG2D;AAAAA,EAAAA,IAAgBzB,QAIjCuE,SAASlE,QAAQwB,iBACnBvE,QAAQwD,WAAWgB,OAAOqB,OACxB,CAACqB,aAAaxC,UAAU;AACtB,UAAMyC,aAAazE,OAAOgC,MAAMd,IAAI;AAEpC,WAAIuD,eAAelD,WACjBiD,YAAYxC,MAAMd,IAAI,IAAIuD,aAGrBD;AAAAA,EACT,GACA,CAAA,CACF,IACA/C;AAEJ,SAAO;AAAA,IACLvB,OAAO5C,QAAQwD,WAAWI;AAAAA,IAC1BpD,MACE,OAAOkC,OAAOlC,QAAS,WAAWkC,OAAOlC,OAAOR,QAAQ8D,aAAAA;AAAAA,IAC1D,GAAGmD;AAAAA,EAAAA;AAEP;ACjdO,MAAMG,sBAAsBA,MAAcC,UAAU,EAAE,GAEvDC,kBAAmB,uBAAM;AAC7B,MAAIC;AACJ,SAAO,MAAM;AACX,QAAIA;AACF,aAAOA;AAGTA,YAAQ,CAAA;AACR,aAASC,IAAI,GAAGA,IAAI,KAAK,EAAEA;AACzBD,YAAMC,CAAC,KAAKA,IAAI,KAAOC,SAAS,EAAE,EAAEC,MAAM,CAAC;AAE7C,WAAOH;AAAAA,EACT;AACF,GAAA;AAGA,SAASI,UAAUrH,SAAS,IAAI;AAC9B,QAAMsH,QAAQ,IAAIC,WAAWvH,MAAM;AACnCwH,SAAAA,OAAOC,gBAAgBH,KAAK,GACrBA;AACT;AAEA,SAASP,UAAU/G,QAAyB;AAC1C,QAAMiH,QAAQD,gBAAAA;AACd,SAAOK,UAAUrH,MAAM,EACpBuF,OAAO,CAACmC,KAAKC,MAAMD,MAAMT,MAAMU,CAAC,GAAG,EAAE,EACrCP,MAAM,GAAGpH,MAAM;AACpB;AC3BO,SAAS4H,qBAMdpH,WAAoD;AACpD,SAAKA,YAKHA,UAAUqH,WAAWrH,UAAUG,SAASH,UAAUI,QAJ3C;AAMX;ACdO,SAASkH,uBAMdtH,WAAoD;AACpD,SAAKA,YAKHA,UAAUqH,WAAWrH,UAAUI,QAAQJ,UAAUG,SAJ1C;AAMX;ACJO,SAASoH,YAAY;AAAA,EAC1BrI;AAAAA,EACA8C;AAMF,GAA6B;AAC3B,QAAM4E,QAAkC,CAAA;AAExC,MAAI,CAAC1H,QAAQc;AACX,WAAO4G;AAGT,MAAIY;AACJ,QAAMC,eAAoC,CAAA;AAC1C,MAAIC;AAEJ,QAAMC,aAAaL,uBAAuBpI,QAAQc,SAAS,GACrD4H,WAAWR,qBAAqBlI,QAAQc,SAAS,GACjD6H,gBAAgBtH,8BAA8BoH,UAAU,GACxDG,gBAAgBnH,8BAA8BgH,UAAU,GACxDI,cAAcxH,8BAA8BqH,QAAQ,GACpDI,cAAcrH,8BAA8BiH,QAAQ;AAE1D,MAAI,CAACC,iBAAiB,CAACE;AACrB,WAAOnB;AAGT,aAAWzH,SAAS6C,QAAQ;AAC1B,QAAI,CAAC5C,YAAYF,SAASC,KAAK,KACzBA,MAAMO,SAASmI,iBAAiB1I,MAAMO,SAASqI,aAAa;AAC9DP,mBAAarI;AACb;AAAA,IACF;AAGF,QAAIA,MAAMO,SAASmI,eAAe;AAChC,UAAI,CAACzI,YAAYF,SAASC,KAAK,GAAG;AAChCqI,qBAAarI;AACb;AAAA,MACF;AAEA,UAAI2I,eAAe;AACjB,mBAAW1G,SAASjC,MAAMI,UAAU;AAClC,cAAI6B,MAAM1B,SAASoI,eAAe;AAChC,gBAAIlI,OAAOV,SAASkC,KAAK,GAAG;AAC1B,oBAAMvB,OACJuB,MAAM1B,SAASsI,cACX5G,MAAMvB,KAAK+G,MAAMe,WAAWhI,QAAQiI,SAASjI,MAAM,IACnDyB,MAAMvB,KAAK+G,MAAMe,WAAWhI,MAAM;AAExC6H,2BAAa;AAAA,gBACX,GAAGrI;AAAAA,gBACHI,UAAU,CACR;AAAA,kBACE,GAAG6B;AAAAA,kBACHvB;AAAAA,gBAAAA,CACD;AAAA,cAAA;AAAA,YAGP;AACE2H,2BAAa;AAAA,gBACX,GAAGrI;AAAAA,gBACHI,UAAU,CAAC6B,KAAK;AAAA,cAAA;AAIpB,gBAAIjC,MAAMO,SAASqI,eAAeD,kBAAkBE;AAClD;AAEF;AAAA,UACF;AAEA,cAAIR,cAAcpI,YAAYF,SAASsI,UAAU,MAE7CQ,eACA5G,MAAM1B,SAASsI,eACfpI,OAAOV,SAASkC,KAAK,IAErBoG,WAAWjI,SAAS0I,KAAK;AAAA,YACvB,GAAG7G;AAAAA,YACHvB,MAAMuB,MAAMvB,KAAK+G,MAAM,GAAGgB,SAASjI,MAAM;AAAA,UAAA,CAC1C,IAED6H,WAAWjI,SAAS0I,KAAK7G,KAAK,GAI9BjC,MAAMO,SAASqI,eACfC,eACA5G,MAAM1B,SAASsI;AAEf;AAAA,QAGN;AAEA,YAAIH,kBAAkBE;AACpB;AAGF;AAAA,MACF;AAIA,UAFAP,aAAarI,OAET0I,kBAAkBE;AACpB;AAAA,IAEJ;AAEA,QAAI5I,MAAMO,SAASqI,aAAa;AAC9B,UAAI,CAAC3I,YAAYF,SAASC,KAAK,GAAG;AAChCuI,mBAAWvI;AACX;AAAA,MACF;AAEA,UAAI6I,aAAa;AACfN,mBAAW;AAAA,UACT,GAAGvI;AAAAA,UACHI,UAAU,CAAA;AAAA,QAAA;AAGZ,mBAAW6B,SAASjC,MAAMI;AACxB,cAAImI,YAAYtI,YAAYF,SAASwI,QAAQ,GAAG;AAC9C,gBAAItG,MAAM1B,SAASsI,eAAepI,OAAOV,SAASkC,KAAK,GAAG;AACxDsG,uBAASnI,SAAS0I,KAAK;AAAA,gBACrB,GAAG7G;AAAAA,gBACHvB,MAAMuB,MAAMvB,KAAK+G,MAAM,GAAGgB,SAASjI,MAAM;AAAA,cAAA,CAC1C;AAED;AAAA,YACF;AAIA,gBAFA+H,SAASnI,SAAS0I,KAAK7G,KAAK,GAExB4G,eAAe5G,MAAM1B,SAASsI;AAChC;AAAA,UAEJ;AAGF;AAAA,MACF;AAEAN,iBAAWvI;AAEX;AAAA,IACF;AAEIqI,kBACFC,aAAaQ,KACX3F,WAAW;AAAA,MACTpD,SAAS;AAAA,QACPyD,QAAQzD,QAAQyD;AAAAA,QAChBK,cAAc9D,QAAQ8D,gBAAgBsD;AAAAA,MAAAA;AAAAA,MAExCnH;AAAAA,MACA8C,SAAS;AAAA,QACP6C,WAAW;AAAA,QACXI,sBAAsB;AAAA,QACtBzB,gBAAgB;AAAA,MAAA;AAAA,IAClB,CACD,KAAKtE,KACR;AAAA,EAEJ;AAEA,QAAM+I,mBAAmBV,aACrBlF,WAAW;AAAA,IACTpD,SAAS;AAAA,MACPyD,QAAQzD,QAAQyD;AAAAA,MAChBK,cAAc9D,QAAQ8D,gBAAgBsD;AAAAA,IAAAA;AAAAA,IAExCnH,OAAOqI;AAAAA,IACPvF,SAAS;AAAA,MACP6C,WAAW;AAAA,MACXI,sBAAsB;AAAA,MACtBzB,gBAAgB;AAAA,IAAA;AAAA,EAClB,CACD,IACDN,QAEEgF,iBAAiBT,WACnBpF,WAAW;AAAA,IACTpD,SAAS;AAAA,MACPyD,QAAQzD,QAAQyD;AAAAA,MAChBK,cAAc9D,QAAQ8D,gBAAgBsD;AAAAA,IAAAA;AAAAA,IAExCnH,OAAOuI;AAAAA,IACPzF,SAAS;AAAA,MACP6C,WAAW;AAAA,MACXI,sBAAsB;AAAA,MACtBzB,gBAAgB;AAAA,IAAA;AAAA,EAClB,CACD,IACDN;AAEJ,SAAO,CACL,GAAI+E,mBAAmB,CAACA,gBAAgB,IAAI,CAAA,GAC5C,GAAGT,cACH,GAAIU,iBAAiB,CAACA,cAAc,IAAI,CAAA,CAAG;AAE/C;"}
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 markDefs: options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs,\n ...customFields,\n }\n\n if (\n typeof block.style === 'string' &&\n context.schema.styles.find((style) => style.name === block.style)\n ) {\n parsedBlock.style = block.style\n } else {\n const defaultStyle = context.schema.styles.at(0)?.name\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n console.error('Expected default style')\n }\n }\n\n if (\n typeof block.listItem === 'string' &&\n context.schema.lists.find((list) => list.name === block.listItem)\n ) {\n parsedBlock.listItem = block.listItem\n }\n\n if (typeof block.level === 'number') {\n parsedBlock.level = block.level\n }\n\n return parsedBlock\n}\n\nexport function 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","defaultStyle","console","error","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/editor",
3
- "version": "3.0.1",
3
+ "version": "3.0.2",
4
4
  "description": "Portable Text Editor made in React",
5
5
  "keywords": [
6
6
  "sanity",
@@ -1,7 +1,12 @@
1
1
  import {compileSchema, defineSchema} from '@portabletext/schema'
2
2
  import {createTestKeyGenerator} from '@portabletext/test'
3
3
  import {describe, expect, test} from 'vitest'
4
- import {parseBlock, parseInlineObject, parseSpan} from './parse-blocks'
4
+ import {
5
+ parseBlock,
6
+ parseChild,
7
+ parseInlineObject,
8
+ parseSpan,
9
+ } from './parse-blocks'
5
10
 
6
11
  describe(parseBlock.name, () => {
7
12
  test('null', () => {
@@ -265,12 +270,6 @@ describe(parseBlock.name, () => {
265
270
  text: '',
266
271
  marks: ['em'],
267
272
  },
268
- {
269
- _key: 'k6',
270
- _type: 'span',
271
- text: 'inline object or span?',
272
- marks: [],
273
- },
274
273
  ],
275
274
  markDefs: [],
276
275
  style: 'normal',
@@ -813,3 +812,41 @@ describe(parseInlineObject.name, () => {
813
812
  })
814
813
  })
815
814
  })
815
+
816
+ describe(parseChild.name, () => {
817
+ describe('inline object', () => {
818
+ describe('looks like text node', () => {
819
+ test('known inline object _type', () => {
820
+ expect(
821
+ parseChild({
822
+ context: {
823
+ keyGenerator: createTestKeyGenerator(),
824
+ schema: compileSchema(
825
+ defineSchema({inlineObjects: [{name: 'stock-ticker'}]}),
826
+ ),
827
+ },
828
+ markDefKeyMap: new Map(),
829
+ options: {validateFields: true},
830
+ child: {_type: 'stock-ticker', text: 'foo'},
831
+ }),
832
+ ).toEqual({_key: 'k0', _type: 'stock-ticker'})
833
+ })
834
+
835
+ test('unknown inline object _type', () => {
836
+ expect(
837
+ parseChild({
838
+ context: {
839
+ keyGenerator: createTestKeyGenerator(),
840
+ schema: compileSchema(
841
+ defineSchema({inlineObjects: [{name: 'stock-ticker'}]}),
842
+ ),
843
+ },
844
+ markDefKeyMap: new Map(),
845
+ options: {validateFields: true},
846
+ child: {_type: 'image', text: 'foo'},
847
+ }),
848
+ ).toBe(undefined)
849
+ })
850
+ })
851
+ })
852
+ })
@@ -190,11 +190,7 @@ export function parseTextBlock({
190
190
  : []
191
191
 
192
192
  const parsedChildren = unparsedChildren
193
- .map(
194
- (child) =>
195
- parseSpan({span: child, context, markDefKeyMap, options}) ??
196
- parseInlineObject({inlineObject: child, context, options}),
197
- )
193
+ .map((child) => parseChild({child, context, markDefKeyMap, options}))
198
194
  .filter((child) => child !== undefined)
199
195
  const marks = parsedChildren.flatMap((child) => child.marks ?? [])
200
196
 
@@ -288,6 +284,23 @@ export function parseTextBlock({
288
284
  return parsedBlock
289
285
  }
290
286
 
287
+ export function parseChild({
288
+ child,
289
+ context,
290
+ markDefKeyMap,
291
+ options,
292
+ }: {
293
+ child: unknown
294
+ context: Pick<EditorContext, 'keyGenerator' | 'schema'>
295
+ markDefKeyMap: Map<string, string>
296
+ options: {validateFields: boolean}
297
+ }): PortableTextSpan | PortableTextObject | undefined {
298
+ return (
299
+ parseSpan({span: child, context, markDefKeyMap, options}) ??
300
+ parseInlineObject({inlineObject: child, context, options})
301
+ )
302
+ }
303
+
291
304
  export function parseSpan({
292
305
  span,
293
306
  context,
@@ -339,13 +352,15 @@ export function parseSpan({
339
352
  return []
340
353
  })
341
354
 
342
- if (span._type !== context.schema.span.name) {
343
- if (
344
- !context.schema.inlineObjects.some(
345
- (inlineObject) => inlineObject.name === span._type,
346
- ) &&
347
- typeof span.text === 'string'
348
- ) {
355
+ if (
356
+ typeof span._type === 'string' &&
357
+ span._type !== context.schema.span.name
358
+ ) {
359
+ return undefined
360
+ }
361
+
362
+ if (typeof span._type !== 'string') {
363
+ if (typeof span.text === 'string') {
349
364
  return {
350
365
  _type: context.schema.span.name as 'span',
351
366
  _key: