@portabletext/editor 7.10.8 → 7.10.10

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.
@@ -1,5 +1,36 @@
1
1
  import { isTextBlock, isSpan, getSubSchema } from "@portabletext/schema";
2
2
  import { getNode, isKeyedSegment, getParent, isTypedObject, isRecord } from "./get-parent.js";
3
+ function textOffsetOfChild(children, getSpanText, childKey, offsetInChild) {
4
+ let precedingTextLength = 0;
5
+ for (const child of children) {
6
+ const text = getSpanText(child);
7
+ if (keyOf(child) === childKey)
8
+ return text === void 0 ? void 0 : precedingTextLength + offsetInChild;
9
+ text !== void 0 && (precedingTextLength += text.length);
10
+ }
11
+ }
12
+ function childAtTextOffset(children, getSpanText, textOffset) {
13
+ let remainingOffset = textOffset;
14
+ for (const child of children) {
15
+ const text = getSpanText(child);
16
+ if (text !== void 0) {
17
+ if (remainingOffset <= text.length) {
18
+ const key = keyOf(child);
19
+ return key === void 0 ? void 0 : {
20
+ key,
21
+ offset: remainingOffset
22
+ };
23
+ }
24
+ remainingOffset -= text.length;
25
+ }
26
+ }
27
+ }
28
+ function keyOf(child) {
29
+ if (child !== null && typeof child == "object" && "_key" in child) {
30
+ const key = child._key;
31
+ return typeof key == "string" ? key : void 0;
32
+ }
33
+ }
3
34
  function blockOffsetToSpanSelectionPoint({
4
35
  snapshot,
5
36
  blockOffset,
@@ -9,23 +40,17 @@ function blockOffsetToSpanSelectionPoint({
9
40
  if (!blockEntry || !isTextBlock(snapshot.context, blockEntry.node))
10
41
  return;
11
42
  const block = blockEntry.node, blockPath = blockEntry.path;
43
+ if (direction === "forward") {
44
+ const placed = childAtTextOffset(block.children, (child) => isSpan(snapshot.context, child) ? child.text : void 0, blockOffset.offset);
45
+ return placed ? {
46
+ path: [...blockPath, "children", {
47
+ _key: placed.key
48
+ }],
49
+ offset: placed.offset
50
+ } : void 0;
51
+ }
12
52
  let offsetLeft = blockOffset.offset, selectionPoint, skippedInlineObject = !1;
13
53
  for (const child of block.children) {
14
- if (direction === "forward") {
15
- if (!isSpan(snapshot.context, child))
16
- continue;
17
- if (offsetLeft <= child.text.length) {
18
- selectionPoint = {
19
- path: [...blockPath, "children", {
20
- _key: child._key
21
- }],
22
- offset: offsetLeft
23
- };
24
- break;
25
- }
26
- offsetLeft -= child.text.length;
27
- continue;
28
- }
29
54
  if (!isSpan(snapshot.context, child)) {
30
55
  skippedInlineObject = !0;
31
56
  continue;
@@ -60,16 +85,11 @@ function spanSelectionPointToBlockOffset({
60
85
  });
61
86
  if (!textBlock)
62
87
  return;
63
- let offset = 0;
64
- for (const child of textBlock.node.children)
65
- if (isSpan(snapshot.context, child)) {
66
- if (child._key === spanSegment._key)
67
- return {
68
- path: textBlock.path,
69
- offset: offset + selectionPoint.offset
70
- };
71
- offset += child.text.length;
72
- }
88
+ const offset = textOffsetOfChild(textBlock.node.children, (child) => isSpan(snapshot.context, child) ? child.text : void 0, spanSegment._key, selectionPoint.offset);
89
+ return offset === void 0 ? void 0 : {
90
+ path: textBlock.path,
91
+ offset
92
+ };
73
93
  }
74
94
  function isEqualPathSegments(segA, segB) {
75
95
  return segA === segB ? !0 : segA === void 0 || segB === void 0 ? !1 : (typeof segA == "string" || typeof segA == "number") && (typeof segB == "string" || typeof segB == "number") ? segA === segB : isKeyedSegment(segA) && isKeyedSegment(segB) ? segA._key === segB._key : Array.isArray(segA) && Array.isArray(segB) ? segA[0] === segB[0] && segA[1] === segB[1] : !1;
@@ -676,6 +696,7 @@ function sliceBlocks({
676
696
  }
677
697
  export {
678
698
  blockOffsetToSpanSelectionPoint,
699
+ childAtTextOffset,
679
700
  defaultKeyGenerator,
680
701
  getBlockEndPoint,
681
702
  getBlockKeyFromSelectionPoint,
@@ -693,6 +714,7 @@ export {
693
714
  parseMarkDefs,
694
715
  parseSpan,
695
716
  sliceBlocks,
696
- spanSelectionPointToBlockOffset
717
+ spanSelectionPointToBlockOffset,
718
+ textOffsetOfChild
697
719
  };
698
720
  //# sourceMappingURL=util.slice-blocks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.block-offset.ts","../../src/utils/util.is-equal-path-segments.ts","../../src/utils/util.is-equal-paths.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.selection-point.ts","../../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.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/key-generator.ts","../../src/utils/parse-blocks.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import {isSpan, isTextBlock} from '@portabletext/schema'\nimport {getNode} from '../traversal/get-node'\nimport {getParent} from '../traversal/get-parent'\nimport type {TraversalSnapshot} from '../traversal/traversal-snapshot'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n snapshot,\n blockOffset,\n direction,\n}: {\n snapshot: TraversalSnapshot\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n const blockEntry = getNode(snapshot, blockOffset.path)\n\n if (!blockEntry || !isTextBlock(snapshot.context, blockEntry.node)) {\n return undefined\n }\n\n const block = blockEntry.node\n const blockPath = blockEntry.path\n\n let offsetLeft = blockOffset.offset\n let selectionPoint: {path: ChildPath; offset: number} | undefined\n let skippedInlineObject = false\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isSpan(snapshot.context, child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockPath, '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(snapshot.context, child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n // A boundary offset stays at the end of the previous span unless an\n // inline object was skipped, in which case falling through to the\n // `offsetLeft <= child.text.length` branch lands the point at the\n // start of this span instead.\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: [...blockPath, '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 return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n snapshot,\n selectionPoint,\n}: {\n snapshot: TraversalSnapshot\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n const spanSegment = selectionPoint.path.at(-1)\n\n if (!isKeyedSegment(spanSegment)) {\n return undefined\n }\n\n const textBlock = getParent(snapshot, selectionPoint.path, {\n match: (node) => isTextBlock({schema: snapshot.context.schema}, node),\n })\n\n if (!textBlock) {\n return undefined\n }\n\n let offset = 0\n\n for (const child of textBlock.node.children) {\n if (!isSpan(snapshot.context, child)) {\n continue\n }\n\n if (child._key === spanSegment._key) {\n return {\n path: textBlock.path,\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n\n return undefined\n}\n","import type {PathSegment} from '../types/paths'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function isEqualPathSegments(\n segA: PathSegment | undefined,\n segB: PathSegment | undefined,\n): boolean {\n if (segA === segB) {\n return true\n }\n\n if (segA === undefined || segB === undefined) {\n return false\n }\n\n if (\n (typeof segA === 'string' || typeof segA === 'number') &&\n (typeof segB === 'string' || typeof segB === 'number')\n ) {\n return segA === segB\n }\n\n if (isKeyedSegment(segA) && isKeyedSegment(segB)) {\n return segA._key === segB._key\n }\n\n if (Array.isArray(segA) && Array.isArray(segB)) {\n return segA[0] === segB[0] && segA[1] === segB[1]\n }\n\n return false\n}\n","import type {Path} from '../types/paths'\nimport {isEqualPathSegments} from './util.is-equal-path-segments'\n\n/**\n * @public\n */\nexport function isEqualPaths(a: Path, b: Path): boolean {\n if (a.length !== b.length) {\n return false\n }\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqualPathSegments(a[i], b[i])) {\n return false\n }\n }\n\n return true\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isEqualPaths} from './util.is-equal-paths'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return a.offset === b.offset && isEqualPaths(a.path, b.path)\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, type PortableTextBlock} from '@portabletext/schema'\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, type PortableTextBlock} from '@portabletext/schema'\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 const firstChild = block.node.children[0]\n return {\n path: [...block.path, 'children', {_key: firstChild?._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'\nimport {isEqualPaths} from './util.is-equal-paths'\n\n/**\n * @public\n */\nexport function isSelectionCollapsed(selection: EditorSelection) {\n if (!selection) {\n return false\n }\n\n return (\n isEqualPaths(selection.anchor.path, selection.focus.path) &&\n selection.anchor.offset === selection.focus.offset\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 EditorSelectionPoint | null =\n 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 EditorSelectionPoint | null =\n 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","/**\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 {\n getSubSchema,\n isSpan,\n isTextBlock,\n type FieldDefinition,\n type OfDefinition,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n type Schema,\n type TypedObject,\n} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isRecord, isTypedObject} from './asserters'\n\nexport function parseBlocks({\n schema,\n keyGenerator,\n blocks,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\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 = parseBlockInternal({\n schema,\n keyGenerator,\n block,\n options,\n })\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n schema,\n keyGenerator,\n block,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return parseBlockInternal({schema, keyGenerator, block, options})\n}\n\nexport function parseSpan({\n span,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n return parseSpanInternal({span, schema, keyGenerator, markDefKeyMap, options})\n}\n\nexport function parseInlineObject({\n inlineObject,\n schema,\n keyGenerator,\n options,\n}: {\n inlineObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n return parseInlineObjectInternal({\n inlineObject,\n schema,\n keyGenerator,\n options,\n })\n}\n\nexport function parseChild({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return parseChildInternal({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n })\n}\n\nexport function parseMarkDefs({\n schema,\n keyGenerator,\n markDefs,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n markDefs: unknown\n options: {validateFields: boolean}\n}): {\n markDefs: Array<PortableTextObject>\n markDefKeyMap: Map<string, string>\n} {\n return parseMarkDefsInternal({schema, keyGenerator, markDefs, options})\n}\n\nfunction parseBlockInternal({\n schema,\n keyGenerator,\n block,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, schema, keyGenerator, options}) ??\n parseBlockObject({blockObject: block, schema, keyGenerator, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n schema,\n keyGenerator,\n options,\n}: {\n blockObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = 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 schema,\n keyGenerator,\n schemaType,\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\nfunction parseTextBlock({\n block,\n schema,\n keyGenerator,\n options,\n}: {\n block: unknown\n schema: Schema\n keyGenerator: () => string\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 if (block._type !== schema.block.name) {\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 ((schema.block.fields ?? []).some((f) => f.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\n }\n\n const _key =\n typeof block['_key'] === 'string' ? block['_key'] : keyGenerator()\n\n const {markDefs, markDefKeyMap} = parseMarkDefsInternal({\n schema,\n keyGenerator,\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) =>\n parseChildInternal({child, schema, keyGenerator, markDefKeyMap, 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: keyGenerator(),\n _type: 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({schema}, child)) {\n return [...normalizedChildren, child]\n }\n\n const previousChild = normalizedChildren.at(-1)\n\n if (!previousChild || !isSpan({schema}, previousChild)) {\n return [\n ...normalizedChildren,\n {\n _key: keyGenerator(),\n _type: schema.span.name,\n text: '',\n marks: [],\n },\n child,\n ...(index === children.length - 1\n ? [\n {\n _key: keyGenerator(),\n _type: 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: 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 schema.styles.find((style) => style.name === block['style'])\n ) {\n parsedBlock.style = block['style']\n }\n\n if (\n typeof block['listItem'] === 'string' &&\n 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\nfunction parseMarkDefsInternal({\n schema,\n keyGenerator,\n markDefs,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\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 = 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 schema,\n keyGenerator,\n schemaType,\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\nfunction parseChildInternal({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return (\n parseSpanInternal({\n span: child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n }) ??\n parseInlineObjectInternal({\n inlineObject: child,\n schema,\n keyGenerator,\n options,\n })\n )\n}\n\nfunction parseSpanInternal({\n span,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n schema: Schema\n keyGenerator: () => string\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 (schema.decorators.some((decorator) => decorator.name === mark)) {\n return [mark]\n }\n\n return []\n })\n\n if (typeof span['_type'] === 'string' && span['_type'] !== schema.span.name) {\n return undefined\n }\n\n if (typeof span['_type'] !== 'string') {\n if (typeof span['text'] === 'string') {\n return {\n _type: schema.span.name as 'span',\n _key: typeof span['_key'] === 'string' ? span['_key'] : keyGenerator(),\n text: span['text'],\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n }\n\n return undefined\n }\n\n return {\n _type: schema.span.name as 'span',\n _key: typeof span['_key'] === 'string' ? span['_key'] : keyGenerator(),\n text: typeof span['text'] === 'string' ? span['text'] : '',\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n}\n\nfunction parseInlineObjectInternal({\n inlineObject,\n schema,\n keyGenerator,\n options,\n}: {\n inlineObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = 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 schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n schema,\n keyGenerator,\n options,\n}: {\n annotation: TypedObject\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = 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 schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\n/**\n * Resolve an `of` member against a runtime `_type`. Returns the schema-type\n * to use for parsing the item, or `undefined` if no member matches.\n *\n * Three forms (one branch each):\n * - Inline declaration `{type: 'object', name: 'X', fields: [...]}` -- name\n * matches `_type`, fields are inline.\n * - Reference `{type: 'X'}` -- looks up in the ancestor chain first\n * (inline-declared types are visible to descendants), then in the schema's\n * root `blockObjects`. Mirrors `resolve-containers.ts`'s reference\n * resolution.\n * - `{type: 'block'}` -- not a non-PTE object member, returns `undefined`.\n */\nfunction resolveOfMember(\n of: ReadonlyArray<OfDefinition>,\n typeName: string,\n schema: Schema,\n ancestorFields: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>,\n): {name: string; fields: ReadonlyArray<FieldDefinition>} | undefined {\n for (const member of of) {\n if (member.type === 'block') {\n continue\n }\n if (member.type === 'object' && 'name' in member && member.name) {\n if (member.name === typeName && 'fields' in member && member.fields) {\n return {name: member.name, fields: member.fields}\n }\n continue\n }\n if (member.type === typeName) {\n const ancestorMatch = ancestorFields.get(typeName)\n if (ancestorMatch) {\n return {name: typeName, fields: ancestorMatch}\n }\n const rootMatch = schema.blockObjects.find(\n (blockObject) => blockObject.name === typeName,\n )\n if (rootMatch && 'fields' in rootMatch && rootMatch.fields) {\n return {name: rootMatch.name, fields: rootMatch.fields}\n }\n return undefined\n }\n }\n return undefined\n}\n\n/**\n * Parse an object against a `{name, fields}` schema type. Validates top-level\n * fields and recurses into any array field whose `of` contains a block-like\n * member -- parsing the nested blocks against a child `Schema` built from\n * that `of`.\n */\nfunction parseObject({\n object,\n schema,\n keyGenerator,\n schemaType,\n ancestorFields,\n options,\n}: {\n object: TypedObject\n schema: Schema\n keyGenerator: () => string\n schemaType: {\n name: string\n fields: ReadonlyArray<FieldDefinition>\n }\n ancestorFields?: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>\n options: {validateFields: boolean}\n}): PortableTextObject {\n const {_key, ...customFields} = object\n\n const fieldsByName = new Map(\n schemaType.fields.map((field) => [field.name, field]),\n )\n\n const nextAncestors = new Map(ancestorFields ?? [])\n nextAncestors.set(schemaType.name, schemaType.fields)\n\n const values: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(customFields)) {\n if (key === '_type') {\n continue\n }\n\n if (value === undefined) {\n continue\n }\n\n const field = fieldsByName.get(key)\n\n if (options.validateFields && !field) {\n continue\n }\n\n if (field && field.type === 'array' && field.of && Array.isArray(value)) {\n values[key] = parseContainerFieldValue({\n schema,\n keyGenerator,\n of: field.of,\n value,\n ancestorFields: nextAncestors,\n options,\n })\n continue\n }\n\n values[key] = value\n }\n\n return {\n _type: schemaType.name,\n _key: typeof _key === 'string' ? _key : keyGenerator(),\n ...values,\n }\n}\n\n/**\n * Parse the value of an array field whose `of` declares what's allowed at\n * that position. Each item is dispatched per its own type:\n *\n * - Text blocks (`_type === schema.block.name`) are parsed against a child\n * sub-schema derived from the `{type: 'block'}` member of `of` (which\n * carries the styles, decorators, annotations, lists, and inline objects\n * allowed at this position).\n *\n * - Block objects (and structural objects sitting between containers and\n * text blocks) are parsed via `resolveOfMember` against the `of` array,\n * with `ancestorFields` carrying inline type declarations down to bare\n * references like `{type: 'list'}`. This lets nested containers resolve\n * to their inline shapes at any depth.\n *\n * Items that don't resolve are passed through unchanged.\n */\nfunction parseContainerFieldValue({\n schema,\n keyGenerator,\n of,\n value,\n ancestorFields,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n of: ReadonlyArray<OfDefinition>\n value: ReadonlyArray<unknown>\n ancestorFields: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>\n options: {validateFields: boolean; normalize?: boolean}\n}): Array<unknown> {\n const hasBlockMember = of.some((member) => member.type === 'block')\n const childBlockSubSchema = hasBlockMember\n ? getSubSchema(schema, of)\n : undefined\n\n return value.flatMap((item) => {\n if (!isTypedObject(item)) {\n return [item]\n }\n\n if (childBlockSubSchema && item._type === childBlockSubSchema.block.name) {\n const parsed = parseTextBlock({\n block: item,\n schema: childBlockSubSchema,\n keyGenerator,\n options: {\n normalize: false,\n removeUnusedMarkDefs: false,\n validateFields: options.validateFields,\n },\n })\n return parsed ? [parsed] : []\n }\n\n const schemaType = resolveOfMember(of, item._type, schema, ancestorFields)\n if (!schemaType) {\n return [item]\n }\n return [\n parseObject({\n object: item,\n schema,\n keyGenerator,\n schemaType: {\n name: schemaType.name,\n fields: schemaType.fields,\n },\n ancestorFields,\n options,\n }),\n ]\n })\n}\n","import {isSpan, isTextBlock, type PortableTextBlock} from '@portabletext/schema'\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 keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n }) ?? block,\n )\n }\n }\n\n const parsedStartBlock = startBlock\n ? parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block: startBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n })\n : undefined\n\n const parsedEndBlock = endBlock\n ? parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block: endBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n })\n : undefined\n\n return [\n ...(parsedStartBlock ? [parsedStartBlock] : []),\n ...middleBlocks,\n ...(parsedEndBlock ? [parsedEndBlock] : []),\n ]\n}\n"],"names":["blockOffsetToSpanSelectionPoint","snapshot","blockOffset","direction","blockEntry","getNode","path","isTextBlock","context","node","block","blockPath","offsetLeft","offset","selectionPoint","skippedInlineObject","child","children","isSpan","text","length","_key","spanSelectionPointToBlockOffset","spanSegment","at","isKeyedSegment","textBlock","getParent","match","schema","isEqualPathSegments","segA","segB","undefined","Array","isArray","isEqualPaths","a","b","i","isEqualSelectionPoints","getBlockKeyFromSelectionPoint","point","blockPathSegment","getChildKeyFromSelectionPoint","childPathSegment","getBlockEndPoint","lastChild","getBlockStartPoint","firstChild","isSelectionCollapsed","selection","anchor","focus","getSelectionEndPoint","backward","getSelectionStartPoint","defaultKeyGenerator","randomKey","getByteHexTable","table","toString","slice","whatwgRNG","rnds8","Uint8Array","crypto","getRandomValues","reduce","str","n","parseBlocks","keyGenerator","blocks","options","flatMap","parsedBlock","parseBlockInternal","parseBlock","parseSpan","span","markDefKeyMap","parseSpanInternal","parseInlineObject","inlineObject","parseInlineObjectInternal","parseMarkDefs","markDefs","parseMarkDefsInternal","parseTextBlock","parseBlockObject","blockObject","isTypedObject","schemaType","blockObjects","find","name","_type","parseObject","object","isListBlock","level","listItem","customFields","key","Object","keys","validateFields","fields","some","f","parsedChildren","map","parseChildInternal","filter","marks","normalizedChildren","normalize","index","previousChild","removeUnusedMarkDefs","markDef","includes","styles","style","lists","list","unparsedMarkDefs","Map","annotations","parsedAnnotation","set","isRecord","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","resolveOfMember","of","typeName","ancestorFields","member","type","ancestorMatch","rootMatch","fieldsByName","field","nextAncestors","values","value","entries","parseContainerFieldValue","childBlockSubSchema","getSubSchema","item","parsed","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.child-text-offset.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.is-equal-path-segments.ts","../../src/utils/util.is-equal-paths.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.selection-point.ts","../../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.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/key-generator.ts","../../src/utils/parse-blocks.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["/**\n * Pure text-offset arithmetic over a node's children array, shared by\n * the snapshot-aware block-offset utils (`util.block-offset.ts`) and\n * the schema-free point transform (`engine/point/transform-point.ts`).\n * Span-ness is the caller's concern, expressed as an accessor that\n * returns the child's text when the child occupies text offsets and\n * `undefined` when it does not (inline objects, blocks).\n */\n\n/**\n * The text offset of `(childKey, offsetInChild)` within `children`:\n * the total text of the children before that child, plus the offset\n * into it. `undefined` when the child is missing or carries no text.\n */\nexport function textOffsetOfChild(\n children: ReadonlyArray<unknown>,\n getSpanText: (child: unknown) => string | undefined,\n childKey: string,\n offsetInChild: number,\n): number | undefined {\n let precedingTextLength = 0\n\n for (const child of children) {\n const text = getSpanText(child)\n if (keyOf(child) === childKey) {\n return text === undefined\n ? undefined\n : precedingTextLength + offsetInChild\n }\n if (text !== undefined) {\n precedingTextLength += text.length\n }\n }\n\n return undefined\n}\n\n/**\n * The child and child-local offset at `textOffset` within `children`.\n * Forward-boundary convention: an offset landing exactly on a span\n * boundary stays at the end of the earlier span. `undefined` when the\n * offset lies beyond the children's total text.\n */\nexport function childAtTextOffset(\n children: ReadonlyArray<unknown>,\n getSpanText: (child: unknown) => string | undefined,\n textOffset: number,\n): {key: string; offset: number} | undefined {\n let remainingOffset = textOffset\n\n for (const child of children) {\n const text = getSpanText(child)\n if (text === undefined) {\n continue\n }\n if (remainingOffset <= text.length) {\n const key = keyOf(child)\n return key === undefined ? undefined : {key, offset: remainingOffset}\n }\n remainingOffset -= text.length\n }\n\n return undefined\n}\n\nfunction keyOf(child: unknown): string | undefined {\n if (child !== null && typeof child === 'object' && '_key' in child) {\n const key = (child as {_key: unknown})._key\n return typeof key === 'string' ? key : undefined\n }\n return undefined\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport {getNode} from '../traversal/get-node'\nimport {getParent} from '../traversal/get-parent'\nimport type {TraversalSnapshot} from '../traversal/traversal-snapshot'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\nimport {childAtTextOffset, textOffsetOfChild} from './util.child-text-offset'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n snapshot,\n blockOffset,\n direction,\n}: {\n snapshot: TraversalSnapshot\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n const blockEntry = getNode(snapshot, blockOffset.path)\n\n if (!blockEntry || !isTextBlock(snapshot.context, blockEntry.node)) {\n return undefined\n }\n\n const block = blockEntry.node\n const blockPath = blockEntry.path\n\n if (direction === 'forward') {\n const placed = childAtTextOffset(\n block.children,\n (child) =>\n isSpan(snapshot.context, child as (typeof block.children)[number])\n ? (child as {text: string}).text\n : undefined,\n blockOffset.offset,\n )\n return placed\n ? {\n path: [\n ...blockPath,\n 'children',\n {_key: placed.key},\n ] satisfies ChildPath,\n offset: placed.offset,\n }\n : undefined\n }\n\n let offsetLeft = blockOffset.offset\n let selectionPoint: {path: ChildPath; offset: number} | undefined\n let skippedInlineObject = false\n\n for (const child of block.children) {\n if (!isSpan(snapshot.context, child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n // A boundary offset stays at the end of the previous span unless an\n // inline object was skipped, in which case falling through to the\n // `offsetLeft <= child.text.length` branch lands the point at the\n // start of this span instead.\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: [...blockPath, '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 return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n snapshot,\n selectionPoint,\n}: {\n snapshot: TraversalSnapshot\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n const spanSegment = selectionPoint.path.at(-1)\n\n if (!isKeyedSegment(spanSegment)) {\n return undefined\n }\n\n const textBlock = getParent(snapshot, selectionPoint.path, {\n match: (node) => isTextBlock({schema: snapshot.context.schema}, node),\n })\n\n if (!textBlock) {\n return undefined\n }\n\n const offset = textOffsetOfChild(\n textBlock.node.children,\n (child) =>\n isSpan(\n snapshot.context,\n child as (typeof textBlock.node.children)[number],\n )\n ? (child as {text: string}).text\n : undefined,\n spanSegment._key,\n selectionPoint.offset,\n )\n\n return offset === undefined ? undefined : {path: textBlock.path, offset}\n}\n","import type {PathSegment} from '../types/paths'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function isEqualPathSegments(\n segA: PathSegment | undefined,\n segB: PathSegment | undefined,\n): boolean {\n if (segA === segB) {\n return true\n }\n\n if (segA === undefined || segB === undefined) {\n return false\n }\n\n if (\n (typeof segA === 'string' || typeof segA === 'number') &&\n (typeof segB === 'string' || typeof segB === 'number')\n ) {\n return segA === segB\n }\n\n if (isKeyedSegment(segA) && isKeyedSegment(segB)) {\n return segA._key === segB._key\n }\n\n if (Array.isArray(segA) && Array.isArray(segB)) {\n return segA[0] === segB[0] && segA[1] === segB[1]\n }\n\n return false\n}\n","import type {Path} from '../types/paths'\nimport {isEqualPathSegments} from './util.is-equal-path-segments'\n\n/**\n * @public\n */\nexport function isEqualPaths(a: Path, b: Path): boolean {\n if (a.length !== b.length) {\n return false\n }\n\n for (let i = 0; i < a.length; i++) {\n if (!isEqualPathSegments(a[i], b[i])) {\n return false\n }\n }\n\n return true\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isEqualPaths} from './util.is-equal-paths'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return a.offset === b.offset && isEqualPaths(a.path, b.path)\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, type PortableTextBlock} from '@portabletext/schema'\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, type PortableTextBlock} from '@portabletext/schema'\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 const firstChild = block.node.children[0]\n return {\n path: [...block.path, 'children', {_key: firstChild?._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'\nimport {isEqualPaths} from './util.is-equal-paths'\n\n/**\n * @public\n */\nexport function isSelectionCollapsed(selection: EditorSelection) {\n if (!selection) {\n return false\n }\n\n return (\n isEqualPaths(selection.anchor.path, selection.focus.path) &&\n selection.anchor.offset === selection.focus.offset\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 EditorSelectionPoint | null =\n 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 EditorSelectionPoint | null =\n 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","/**\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 {\n getSubSchema,\n isSpan,\n isTextBlock,\n type FieldDefinition,\n type OfDefinition,\n type PortableTextBlock,\n type PortableTextListBlock,\n type PortableTextObject,\n type PortableTextSpan,\n type PortableTextTextBlock,\n type Schema,\n type TypedObject,\n} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isRecord, isTypedObject} from './asserters'\n\nexport function parseBlocks({\n schema,\n keyGenerator,\n blocks,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\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 = parseBlockInternal({\n schema,\n keyGenerator,\n block,\n options,\n })\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n schema,\n keyGenerator,\n block,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return parseBlockInternal({schema, keyGenerator, block, options})\n}\n\nexport function parseSpan({\n span,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n return parseSpanInternal({span, schema, keyGenerator, markDefKeyMap, options})\n}\n\nexport function parseInlineObject({\n inlineObject,\n schema,\n keyGenerator,\n options,\n}: {\n inlineObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n return parseInlineObjectInternal({\n inlineObject,\n schema,\n keyGenerator,\n options,\n })\n}\n\nexport function parseChild({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return parseChildInternal({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n })\n}\n\nexport function parseMarkDefs({\n schema,\n keyGenerator,\n markDefs,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n markDefs: unknown\n options: {validateFields: boolean}\n}): {\n markDefs: Array<PortableTextObject>\n markDefKeyMap: Map<string, string>\n} {\n return parseMarkDefsInternal({schema, keyGenerator, markDefs, options})\n}\n\nfunction parseBlockInternal({\n schema,\n keyGenerator,\n block,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, schema, keyGenerator, options}) ??\n parseBlockObject({blockObject: block, schema, keyGenerator, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n schema,\n keyGenerator,\n options,\n}: {\n blockObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = 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 schema,\n keyGenerator,\n schemaType,\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\nfunction parseTextBlock({\n block,\n schema,\n keyGenerator,\n options,\n}: {\n block: unknown\n schema: Schema\n keyGenerator: () => string\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 if (block._type !== schema.block.name) {\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 ((schema.block.fields ?? []).some((f) => f.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\n }\n\n const _key =\n typeof block['_key'] === 'string' ? block['_key'] : keyGenerator()\n\n const {markDefs, markDefKeyMap} = parseMarkDefsInternal({\n schema,\n keyGenerator,\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) =>\n parseChildInternal({child, schema, keyGenerator, markDefKeyMap, 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: keyGenerator(),\n _type: 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({schema}, child)) {\n return [...normalizedChildren, child]\n }\n\n const previousChild = normalizedChildren.at(-1)\n\n if (!previousChild || !isSpan({schema}, previousChild)) {\n return [\n ...normalizedChildren,\n {\n _key: keyGenerator(),\n _type: schema.span.name,\n text: '',\n marks: [],\n },\n child,\n ...(index === children.length - 1\n ? [\n {\n _key: keyGenerator(),\n _type: 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: 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 schema.styles.find((style) => style.name === block['style'])\n ) {\n parsedBlock.style = block['style']\n }\n\n if (\n typeof block['listItem'] === 'string' &&\n 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\nfunction parseMarkDefsInternal({\n schema,\n keyGenerator,\n markDefs,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\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 = 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 schema,\n keyGenerator,\n schemaType,\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\nfunction parseChildInternal({\n child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n schema: Schema\n keyGenerator: () => string\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return (\n parseSpanInternal({\n span: child,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n }) ??\n parseInlineObjectInternal({\n inlineObject: child,\n schema,\n keyGenerator,\n options,\n })\n )\n}\n\nfunction parseSpanInternal({\n span,\n schema,\n keyGenerator,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n schema: Schema\n keyGenerator: () => string\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 (schema.decorators.some((decorator) => decorator.name === mark)) {\n return [mark]\n }\n\n return []\n })\n\n if (typeof span['_type'] === 'string' && span['_type'] !== schema.span.name) {\n return undefined\n }\n\n if (typeof span['_type'] !== 'string') {\n if (typeof span['text'] === 'string') {\n return {\n _type: schema.span.name as 'span',\n _key: typeof span['_key'] === 'string' ? span['_key'] : keyGenerator(),\n text: span['text'],\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n }\n\n return undefined\n }\n\n return {\n _type: schema.span.name as 'span',\n _key: typeof span['_key'] === 'string' ? span['_key'] : keyGenerator(),\n text: typeof span['text'] === 'string' ? span['text'] : '',\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n}\n\nfunction parseInlineObjectInternal({\n inlineObject,\n schema,\n keyGenerator,\n options,\n}: {\n inlineObject: unknown\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = 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 schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n schema,\n keyGenerator,\n options,\n}: {\n annotation: TypedObject\n schema: Schema\n keyGenerator: () => string\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = 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 schema,\n keyGenerator,\n schemaType,\n options,\n })\n}\n\n/**\n * Resolve an `of` member against a runtime `_type`. Returns the schema-type\n * to use for parsing the item, or `undefined` if no member matches.\n *\n * Three forms (one branch each):\n * - Inline declaration `{type: 'object', name: 'X', fields: [...]}` -- name\n * matches `_type`, fields are inline.\n * - Reference `{type: 'X'}` -- looks up in the ancestor chain first\n * (inline-declared types are visible to descendants), then in the schema's\n * root `blockObjects`. Mirrors `resolve-containers.ts`'s reference\n * resolution.\n * - `{type: 'block'}` -- not a non-PTE object member, returns `undefined`.\n */\nfunction resolveOfMember(\n of: ReadonlyArray<OfDefinition>,\n typeName: string,\n schema: Schema,\n ancestorFields: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>,\n): {name: string; fields: ReadonlyArray<FieldDefinition>} | undefined {\n for (const member of of) {\n if (member.type === 'block') {\n continue\n }\n if (member.type === 'object' && 'name' in member && member.name) {\n if (member.name === typeName && 'fields' in member && member.fields) {\n return {name: member.name, fields: member.fields}\n }\n continue\n }\n if (member.type === typeName) {\n const ancestorMatch = ancestorFields.get(typeName)\n if (ancestorMatch) {\n return {name: typeName, fields: ancestorMatch}\n }\n const rootMatch = schema.blockObjects.find(\n (blockObject) => blockObject.name === typeName,\n )\n if (rootMatch && 'fields' in rootMatch && rootMatch.fields) {\n return {name: rootMatch.name, fields: rootMatch.fields}\n }\n return undefined\n }\n }\n return undefined\n}\n\n/**\n * Parse an object against a `{name, fields}` schema type. Validates top-level\n * fields and recurses into any array field whose `of` contains a block-like\n * member -- parsing the nested blocks against a child `Schema` built from\n * that `of`.\n */\nfunction parseObject({\n object,\n schema,\n keyGenerator,\n schemaType,\n ancestorFields,\n options,\n}: {\n object: TypedObject\n schema: Schema\n keyGenerator: () => string\n schemaType: {\n name: string\n fields: ReadonlyArray<FieldDefinition>\n }\n ancestorFields?: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>\n options: {validateFields: boolean}\n}): PortableTextObject {\n const {_key, ...customFields} = object\n\n const fieldsByName = new Map(\n schemaType.fields.map((field) => [field.name, field]),\n )\n\n const nextAncestors = new Map(ancestorFields ?? [])\n nextAncestors.set(schemaType.name, schemaType.fields)\n\n const values: Record<string, unknown> = {}\n\n for (const [key, value] of Object.entries(customFields)) {\n if (key === '_type') {\n continue\n }\n\n if (value === undefined) {\n continue\n }\n\n const field = fieldsByName.get(key)\n\n if (options.validateFields && !field) {\n continue\n }\n\n if (field && field.type === 'array' && field.of && Array.isArray(value)) {\n values[key] = parseContainerFieldValue({\n schema,\n keyGenerator,\n of: field.of,\n value,\n ancestorFields: nextAncestors,\n options,\n })\n continue\n }\n\n values[key] = value\n }\n\n return {\n _type: schemaType.name,\n _key: typeof _key === 'string' ? _key : keyGenerator(),\n ...values,\n }\n}\n\n/**\n * Parse the value of an array field whose `of` declares what's allowed at\n * that position. Each item is dispatched per its own type:\n *\n * - Text blocks (`_type === schema.block.name`) are parsed against a child\n * sub-schema derived from the `{type: 'block'}` member of `of` (which\n * carries the styles, decorators, annotations, lists, and inline objects\n * allowed at this position).\n *\n * - Block objects (and structural objects sitting between containers and\n * text blocks) are parsed via `resolveOfMember` against the `of` array,\n * with `ancestorFields` carrying inline type declarations down to bare\n * references like `{type: 'list'}`. This lets nested containers resolve\n * to their inline shapes at any depth.\n *\n * Items that don't resolve are passed through unchanged.\n */\nfunction parseContainerFieldValue({\n schema,\n keyGenerator,\n of,\n value,\n ancestorFields,\n options,\n}: {\n schema: Schema\n keyGenerator: () => string\n of: ReadonlyArray<OfDefinition>\n value: ReadonlyArray<unknown>\n ancestorFields: ReadonlyMap<string, ReadonlyArray<FieldDefinition>>\n options: {validateFields: boolean; normalize?: boolean}\n}): Array<unknown> {\n const hasBlockMember = of.some((member) => member.type === 'block')\n const childBlockSubSchema = hasBlockMember\n ? getSubSchema(schema, of)\n : undefined\n\n return value.flatMap((item) => {\n if (!isTypedObject(item)) {\n return [item]\n }\n\n if (childBlockSubSchema && item._type === childBlockSubSchema.block.name) {\n const parsed = parseTextBlock({\n block: item,\n schema: childBlockSubSchema,\n keyGenerator,\n options: {\n normalize: false,\n removeUnusedMarkDefs: false,\n validateFields: options.validateFields,\n },\n })\n return parsed ? [parsed] : []\n }\n\n const schemaType = resolveOfMember(of, item._type, schema, ancestorFields)\n if (!schemaType) {\n return [item]\n }\n return [\n parseObject({\n object: item,\n schema,\n keyGenerator,\n schemaType: {\n name: schemaType.name,\n fields: schemaType.fields,\n },\n ancestorFields,\n options,\n }),\n ]\n })\n}\n","import {isSpan, isTextBlock, type PortableTextBlock} from '@portabletext/schema'\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 keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n }) ?? block,\n )\n }\n }\n\n const parsedStartBlock = startBlock\n ? parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block: startBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n })\n : undefined\n\n const parsedEndBlock = endBlock\n ? parseBlock({\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n block: endBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n schema: context.schema,\n })\n : undefined\n\n return [\n ...(parsedStartBlock ? [parsedStartBlock] : []),\n ...middleBlocks,\n ...(parsedEndBlock ? [parsedEndBlock] : []),\n ]\n}\n"],"names":["textOffsetOfChild","children","getSpanText","childKey","offsetInChild","precedingTextLength","child","text","keyOf","undefined","length","childAtTextOffset","textOffset","remainingOffset","key","offset","_key","blockOffsetToSpanSelectionPoint","snapshot","blockOffset","direction","blockEntry","getNode","path","isTextBlock","context","node","block","blockPath","placed","isSpan","offsetLeft","selectionPoint","skippedInlineObject","spanSelectionPointToBlockOffset","spanSegment","at","isKeyedSegment","textBlock","getParent","match","schema","isEqualPathSegments","segA","segB","Array","isArray","isEqualPaths","a","b","i","isEqualSelectionPoints","getBlockKeyFromSelectionPoint","point","blockPathSegment","getChildKeyFromSelectionPoint","childPathSegment","getBlockEndPoint","lastChild","getBlockStartPoint","firstChild","isSelectionCollapsed","selection","anchor","focus","getSelectionEndPoint","backward","getSelectionStartPoint","defaultKeyGenerator","randomKey","getByteHexTable","table","toString","slice","whatwgRNG","rnds8","Uint8Array","crypto","getRandomValues","reduce","str","n","parseBlocks","keyGenerator","blocks","options","flatMap","parsedBlock","parseBlockInternal","parseBlock","parseSpan","span","markDefKeyMap","parseSpanInternal","parseInlineObject","inlineObject","parseInlineObjectInternal","parseMarkDefs","markDefs","parseMarkDefsInternal","parseTextBlock","parseBlockObject","blockObject","isTypedObject","schemaType","blockObjects","find","name","_type","parseObject","object","isListBlock","level","listItem","customFields","Object","keys","validateFields","fields","some","f","parsedChildren","map","parseChildInternal","filter","marks","normalizedChildren","normalize","index","previousChild","removeUnusedMarkDefs","markDef","includes","styles","style","lists","list","unparsedMarkDefs","Map","annotations","parsedAnnotation","set","isRecord","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","resolveOfMember","of","typeName","ancestorFields","member","type","ancestorMatch","rootMatch","fieldsByName","field","nextAncestors","values","value","entries","parseContainerFieldValue","childBlockSubSchema","getSubSchema","item","parsed","sliceBlocks","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push","parsedStartBlock","parsedEndBlock"],"mappings":"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"}
package/lib/index.js CHANGED
@@ -9,8 +9,8 @@ import { isSpan, isTextBlock, getSubSchema, compileSchema } from "@portabletext/
9
9
  import { defineSchema } from "@portabletext/schema";
10
10
  import scrollIntoView from "scroll-into-view-if-needed";
11
11
  import { createKeyboardShortcut, undo, redo, code, underline, italic as italic$1, bold as bold$1 } from "@portabletext/keyboard-shortcuts";
12
+ import { textOffsetOfChild, childAtTextOffset, isEqualSelectionPoints, blockOffsetToSpanSelectionPoint, getBlockKeyFromSelectionPoint, getBlockEndPoint, getBlockStartPoint, isSelectionCollapsed, defaultKeyGenerator, parseBlocks, parseBlock, isListBlock, getSelectionStartPoint as getSelectionStartPoint$1, getSelectionEndPoint as getSelectionEndPoint$1, parseAnnotation, parseMarkDefs, parseSpan, parseInlineObject } from "./_chunks-es/util.slice-blocks.js";
12
13
  import { rangesOverlap, getFocusInlineObject, isSelectionCollapsed as isSelectionCollapsed$1, getFocusTextBlock, getFocusSpan, getFragment, isSelectionExpanded, getSelectionStartBlock, getSelectionEndBlock, isOverlappingSelection, getFocusBlock, getSelectedBlocks, isSelectingEntireBlocks, getSelectedValue, isActiveAnnotation, getActiveAnnotationsMarks, getActiveDecorators, getCaretWordSelection, getSelectionStartChild, getSelectionStartPoint, getSelectionEndChild, getSelectionEndPoint, getPreviousSpan, getNextSpan, getFocusBlockObject, isAtTheEndOfBlock, isAtTheStartOfBlock, getLastBlock, getRootAcceptedTypes, getMarkState, getFocusListBlock, getNextBlock, getPreviousBlock, getSelectedTextBlocks, isActiveDecorator, getFocusChild, getActiveAnnotations, isActiveListItem, isActiveStyle } from "./_chunks-es/selector.is-at-the-start-of-block.js";
13
- import { isEqualSelectionPoints, blockOffsetToSpanSelectionPoint, getBlockKeyFromSelectionPoint, getBlockEndPoint, getBlockStartPoint, isSelectionCollapsed, defaultKeyGenerator, parseBlocks, parseBlock, isListBlock, getSelectionStartPoint as getSelectionStartPoint$1, getSelectionEndPoint as getSelectionEndPoint$1, parseAnnotation, parseMarkDefs, parseSpan, parseInlineObject } from "./_chunks-es/util.slice-blocks.js";
14
14
  import rawDebug from "debug";
15
15
  import { isEmptyTextBlock, isEqualSelections, getTextBlockText } from "./_chunks-es/util.is-equal-selections.js";
16
16
  import { defineBehavior, forward, raise, effect } from "./behaviors/index.js";
@@ -1361,7 +1361,11 @@ function transformPoint$1(point2, op, options = {}) {
1361
1361
  newPath !== void 0 && (path2 = newPath);
1362
1362
  }
1363
1363
  }
1364
- return propertyName === "text" && pathEquals(nodePath, path2) && (op.value == null || typeof op.value != "string" ? offset = 0 : offset > op.value.length && (offset = op.value.length)), path2 === point2.path && offset === point2.offset ? point2 : {
1364
+ if (propertyName === "text" && pathEquals(nodePath, path2) && (op.value == null || typeof op.value != "string" ? offset = 0 : offset > op.value.length && (offset = op.value.length)), propertyName === "children" && Array.isArray(op.value)) {
1365
+ const remappedPoint = remapPointThroughChildrenReplacement(point2, op.path, op.value, op.inverse?.type === "set" && Array.isArray(op.inverse.value) ? op.inverse.value : void 0);
1366
+ remappedPoint && (path2 = remappedPoint.path, offset = remappedPoint.offset);
1367
+ }
1368
+ return path2 === point2.path && offset === point2.offset ? point2 : {
1365
1369
  path: path2,
1366
1370
  offset
1367
1371
  };
@@ -1381,6 +1385,44 @@ function transformPoint$1(point2, op, options = {}) {
1381
1385
  return point2;
1382
1386
  }
1383
1387
  }
1388
+ function remapPointThroughChildrenReplacement(point2, childrenPath, newChildren, oldChildren) {
1389
+ if (!oldChildren || point2.path.length !== childrenPath.length + 1 || !pathEquals(point2.path.slice(0, childrenPath.length), childrenPath))
1390
+ return;
1391
+ const pointSegment = point2.path[point2.path.length - 1];
1392
+ if (!isKeyedSegment(pointSegment) || newChildren.some((child) => childKey(child) === pointSegment._key))
1393
+ return;
1394
+ const nodeTextOffset = textOffsetOfChild(oldChildren, childText, pointSegment._key, point2.offset);
1395
+ if (nodeTextOffset === void 0 || concatenatedText(oldChildren) !== concatenatedText(newChildren))
1396
+ return;
1397
+ const placed = childAtTextOffset(newChildren, childText, nodeTextOffset);
1398
+ if (placed !== void 0)
1399
+ return {
1400
+ path: [...childrenPath, {
1401
+ _key: placed.key
1402
+ }],
1403
+ offset: placed.offset
1404
+ };
1405
+ }
1406
+ function childText(child) {
1407
+ if (child !== null && typeof child == "object" && "text" in child) {
1408
+ const text = child.text;
1409
+ return typeof text == "string" ? text : void 0;
1410
+ }
1411
+ }
1412
+ function childKey(child) {
1413
+ if (child !== null && typeof child == "object" && "_key" in child) {
1414
+ const key = child._key;
1415
+ return typeof key == "string" ? key : void 0;
1416
+ }
1417
+ }
1418
+ function concatenatedText(children) {
1419
+ let text = "";
1420
+ for (const child of children) {
1421
+ const childTextValue = childText(child);
1422
+ childTextValue !== void 0 && (text += childTextValue);
1423
+ }
1424
+ return text;
1425
+ }
1384
1426
  function verifyDiffState(editor, textDiff) {
1385
1427
  const {
1386
1428
  path: path2,
@@ -5529,8 +5571,8 @@ function collectDescendantIndexes(context, node, nodePath, parent, blockIndexMap
5529
5571
  continue;
5530
5572
  const childSegment = {
5531
5573
  _key: child._key
5532
- }, childPath = [...nodePath, result.fieldName, childSegment], childKey = serializePath(childPath);
5533
- blockIndexMap.has(childKey) || blockIndexMap.set(childKey, i), collectDescendantIndexes(context, child, childPath, result.parent, blockIndexMap);
5574
+ }, childPath = [...nodePath, result.fieldName, childSegment], childKey2 = serializePath(childPath);
5575
+ blockIndexMap.has(childKey2) || blockIndexMap.set(childKey2, i), collectDescendantIndexes(context, child, childPath, result.parent, blockIndexMap);
5534
5576
  }
5535
5577
  }
5536
5578
  function RenderTextBlock(props) {
@@ -7884,7 +7926,7 @@ const modifyDescendant = (editor, path2, f) => {
7884
7926
  }
7885
7927
  }
7886
7928
  for (let level = keyedSegments.length - 2; level >= 0; level--) {
7887
- const childKey = keyedSegments[level + 1]._key, fieldName = fieldNames[level + 1];
7929
+ const childKey2 = keyedSegments[level + 1]._key, fieldName = fieldNames[level + 1];
7888
7930
  let ancestorPathEnd = -1, keyedCount = 0;
7889
7931
  for (let pi = 0; pi < path2.length; pi++)
7890
7932
  if (typeof path2[pi] != "string") {
@@ -7897,7 +7939,7 @@ const modifyDescendant = (editor, path2, f) => {
7897
7939
  const ancestorPath = ancestorPathEnd > 0 ? path2.slice(0, ancestorPathEnd) : [], ancestorEntry = getNode(editor.snapshot, ancestorPath);
7898
7940
  if (!ancestorEntry)
7899
7941
  return;
7900
- const ancestorNode = ancestorEntry.node, ancestorRecord = ancestorNode, currentChildren = Array.isArray(ancestorRecord[fieldName]) ? ancestorRecord[fieldName] : [], originalNumericIndex = numericIndices.get(level + 1), childIndex = originalNumericIndex !== void 0 ? originalNumericIndex : findIndexByKey(currentChildren, childKey);
7942
+ const ancestorNode = ancestorEntry.node, ancestorRecord = ancestorNode, currentChildren = Array.isArray(ancestorRecord[fieldName]) ? ancestorRecord[fieldName] : [], originalNumericIndex = numericIndices.get(level + 1), childIndex = originalNumericIndex !== void 0 ? originalNumericIndex : findIndexByKey(currentChildren, childKey2);
7901
7943
  if (childIndex === -1)
7902
7944
  return;
7903
7945
  modifiedNode = {
@@ -10097,16 +10139,16 @@ function toEngineBlock(block, {
10097
10139
  const hasMissingMarkDefs = typeof textBlock.markDefs > "u", hasMissingChildren = typeof textBlock.children > "u", children = (textBlock.children || []).map((child) => {
10098
10140
  const {
10099
10141
  _type: childType,
10100
- _key: childKey,
10142
+ _key: childKey2,
10101
10143
  ...childProps
10102
10144
  } = child, propKeys = Object.keys(childProps);
10103
10145
  return childType === void 0 && propKeys.length === 1 && propKeys.at(0) === "text" ? {
10104
- _key: childKey,
10146
+ _key: childKey2,
10105
10147
  _type: schemaTypes.span.name,
10106
10148
  text: childProps.text
10107
10149
  } : childType !== schemaTypes.span.name ? (hasInlines = !0, {
10108
10150
  _type: childType,
10109
- _key: childKey,
10151
+ _key: childKey2,
10110
10152
  ...childProps
10111
10153
  }) : child;
10112
10154
  });
@@ -11042,12 +11084,13 @@ const addAnnotationOnCollapsedSelection = defineBehavior({
11042
11084
  }), preventOverlappingAnnotations = defineBehavior({
11043
11085
  // Given an `annotation.add` event
11044
11086
  on: "annotation.add",
11045
- // When the annotation is active in the selection
11087
+ // When the raised `annotation.remove` would strip the annotation from at
11088
+ // least one span
11046
11089
  guard: ({
11047
11090
  snapshot,
11048
11091
  event
11049
11092
  }) => {
11050
- const at = event.at ?? snapshot.context.selection;
11093
+ const at = resolveEffectiveSelection(snapshot, event.at);
11051
11094
  if (!at)
11052
11095
  return !1;
11053
11096
  const adjustedSnapshot = {
@@ -11114,7 +11157,22 @@ const addAnnotationOnCollapsedSelection = defineBehavior({
11114
11157
  marks: activeDecorators
11115
11158
  }
11116
11159
  }), forward(event)]]
11117
- }), coreAnnotationBehaviors = [addAnnotationOnCollapsedSelection, preventOverlappingAnnotations, stripAnnotationsOnFullSpanDeletion], defaultKeyboardShortcuts = {
11160
+ }), coreAnnotationBehaviors = [addAnnotationOnCollapsedSelection, preventOverlappingAnnotations, stripAnnotationsOnFullSpanDeletion];
11161
+ function resolveEffectiveSelection(snapshot, at) {
11162
+ if (!at)
11163
+ return snapshot.context.selection;
11164
+ const resolvedAt = resolveSelection({
11165
+ snapshot
11166
+ }, at);
11167
+ return resolvedAt ? {
11168
+ anchor: resolvedAt.anchor,
11169
+ focus: resolvedAt.focus,
11170
+ // Resolving can move either point, so `at.backward` may no longer
11171
+ // match; derive the direction from the resolved points instead.
11172
+ backward: isBackwardRange(resolvedAt, snapshot.context)
11173
+ } : snapshot.context.selection;
11174
+ }
11175
+ const defaultKeyboardShortcuts = {
11118
11176
  arrowDown: createKeyboardShortcut({
11119
11177
  default: [{
11120
11178
  key: "ArrowDown",
@@ -16704,6 +16762,7 @@ function isCustomBehaviorEvent(event) {
16704
16762
  function eventCategory(event) {
16705
16763
  return isNativeBehaviorEvent(event) ? "native" : isAbstractBehaviorEvent(event) ? "synthetic" : isCustomBehaviorEvent(event) ? "custom" : "synthetic";
16706
16764
  }
16765
+ const maxEventDepth = 100;
16707
16766
  function performEvent({
16708
16767
  mode,
16709
16768
  behaviors,
@@ -16715,8 +16774,13 @@ function performEvent({
16715
16774
  readOnly,
16716
16775
  schema,
16717
16776
  nativeEvent,
16718
- sendBack
16777
+ sendBack,
16778
+ depth
16719
16779
  }) {
16780
+ if (depth > maxEventDepth) {
16781
+ console.error(new Error(`Performing "${event.type}" was aborted because the event chain exceeded a depth of ${maxEventDepth}. This usually means Behaviors keep raising events in a cycle.`));
16782
+ return;
16783
+ }
16720
16784
  mode === "send" && !isNativeBehaviorEvent(event) && (editor.undoStepId = defaultKeyGenerator()), debug.behaviors.enabled && debug.behaviors(`(${mode}:${eventCategory(event)})`, safeStringify(event, 2));
16721
16785
  const eventBehaviors = [...remainingEventBehaviors, ...abstractBehaviors].filter((behavior) => {
16722
16786
  if (behavior.on === "*")
@@ -16810,7 +16874,8 @@ function performEvent({
16810
16874
  readOnly,
16811
16875
  schema,
16812
16876
  nativeEvent,
16813
- sendBack
16877
+ sendBack,
16878
+ depth: depth + 1
16814
16879
  });
16815
16880
  continue;
16816
16881
  }
@@ -16826,7 +16891,8 @@ function performEvent({
16826
16891
  readOnly,
16827
16892
  schema,
16828
16893
  nativeEvent,
16829
- sendBack
16894
+ sendBack,
16895
+ depth: depth + 1
16830
16896
  });
16831
16897
  continue;
16832
16898
  }
@@ -16841,7 +16907,8 @@ function performEvent({
16841
16907
  readOnly,
16842
16908
  schema,
16843
16909
  nativeEvent: void 0,
16844
- sendBack
16910
+ sendBack,
16911
+ depth: depth + 1
16845
16912
  });
16846
16913
  }
16847
16914
  }), undoStepCreated && (editor.undoStepId = void 0);
@@ -17374,6 +17441,7 @@ const editorMachine = setup({
17374
17441
  const behaviors = [...context.behaviors.values()].map((config) => config.behavior);
17375
17442
  performEvent({
17376
17443
  mode: "send",
17444
+ depth: 0,
17377
17445
  behaviors,
17378
17446
  remainingEventBehaviors: behaviors,
17379
17447
  event: event.behaviorEvent,