@portabletext/editor 7.10.9 → 7.10.11
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.
- package/lib/_chunks-dts/behavior.types.action.d.ts +1 -1
- package/lib/_chunks-es/util.slice-blocks.js +48 -26
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/index.js +73 -30
- package/lib/index.js.map +1 -1
- package/lib/utils/index.d.ts +2 -2
- package/lib/utils/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -3158,5 +3158,5 @@ type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (payload: {
|
|
|
3158
3158
|
event: TBehaviorEvent;
|
|
3159
3159
|
dom: EditorDom;
|
|
3160
3160
|
}, guardResponse: TGuardResponse) => Array<BehaviorAction>;
|
|
3161
|
-
export { HotkeyOptions as $, BlockStyleRenderProps as A, defineSpan as At, RangeDecoration as B, EditorSnapshot as C, SpanRenderProps as Ct, BlockDecoratorRenderProps as D, defineBlockObject as Dt, BlockChildRenderProps as E, TextBlockRenderProps as Et, OnCopyFn as F, KeyedSegment as Ft, RenderDecoratorFunction as G, RenderAnnotationFunction as H, OnPasteFn as I, Path as It, RenderPlaceholderFunction as J, RenderEditableFunction as K, OnPasteResult as L, EditorSelection as M, AnnotationPath as Mt, EditorSelectionPoint as N, BlockPath as Nt, BlockListItemRenderProps as O, defineContainer as Ot, InvalidValueResolution as P, ChildPath as Pt, PortableTextEditableProps as Q, OnPasteResultOrPromise as R, EditorContext as S, SpanRender as St, BlockAnnotationRenderProps as T, TextBlockRender as Tt, RenderBlockFunction as U, RangeDecorationOnMovedDetails as V, RenderChildFunction as W, ScrollSelectionIntoViewFunction as X, RenderStyleFunction as Y, PortableTextEditable as Z, MutationEvent as _, InlineObject as _t, forward as a, Containers as at, defineBehavior as b, RegistrableNode as bt, BehaviorEvent as c, RegisteredInlineObject as ct, InsertPlacement as d, BlockObject as dt, PortableTextEditor as et, NativeBehaviorEvent as f, BlockObjectRender as ft, EditorEmittedEvent as g, ContainerRenderProps as gt, PatchesEvent as h, ContainerRender as ht, execute as i, EditorSchema as it, EditableAPIDeleteOptions as j, defineTextBlock as jt, BlockRenderProps as k, defineInlineObject as kt, CustomBehaviorEvent as l, RegisteredPositional as lt, ExternalEditorEvent as m, Container as mt, BehaviorActionSet as n, TraversalSnapshot as nt, raise as o, RegisteredBlockObject as ot, SyntheticBehaviorEvent as p, BlockObjectRenderProps as pt, RenderListItemFunction as q, effect as r, Node$1 as rt, EditorDom as s, RegisteredContainer as st, BehaviorAction as t, resolveContainerAt as tt, ExternalBehaviorEvent as u, RegisteredSpan as ut, Operation as v, InlineObjectRender as vt, AddedAnnotationPaths as w, TextBlock as wt, BehaviorGuard as x, Span as xt, Behavior as y, InlineObjectRenderProps as yt, PasteData as z };
|
|
3161
|
+
export { HotkeyOptions as $, BlockStyleRenderProps as A, defineSpan as At, RangeDecoration as B, EditorSnapshot as C, SpanRenderProps as Ct, BlockDecoratorRenderProps as D, defineBlockObject as Dt, BlockChildRenderProps as E, TextBlockRenderProps as Et, OnCopyFn as F, KeyedSegment as Ft, RenderDecoratorFunction as G, RenderAnnotationFunction as H, OnPasteFn as I, Path as It, RenderPlaceholderFunction as J, RenderEditableFunction as K, OnPasteResult as L, PathSegment as Lt, EditorSelection as M, AnnotationPath as Mt, EditorSelectionPoint as N, BlockPath as Nt, BlockListItemRenderProps as O, defineContainer as Ot, InvalidValueResolution as P, ChildPath as Pt, PortableTextEditableProps as Q, OnPasteResultOrPromise as R, EditorContext as S, SpanRender as St, BlockAnnotationRenderProps as T, TextBlockRender as Tt, RenderBlockFunction as U, RangeDecorationOnMovedDetails as V, RenderChildFunction as W, ScrollSelectionIntoViewFunction as X, RenderStyleFunction as Y, PortableTextEditable as Z, MutationEvent as _, InlineObject as _t, forward as a, Containers as at, defineBehavior as b, RegistrableNode as bt, BehaviorEvent as c, RegisteredInlineObject as ct, InsertPlacement as d, BlockObject as dt, PortableTextEditor as et, NativeBehaviorEvent as f, BlockObjectRender as ft, EditorEmittedEvent as g, ContainerRenderProps as gt, PatchesEvent as h, ContainerRender as ht, execute as i, EditorSchema as it, EditableAPIDeleteOptions as j, defineTextBlock as jt, BlockRenderProps as k, defineInlineObject as kt, CustomBehaviorEvent as l, RegisteredPositional as lt, ExternalEditorEvent as m, Container as mt, BehaviorActionSet as n, TraversalSnapshot as nt, raise as o, RegisteredBlockObject as ot, SyntheticBehaviorEvent as p, BlockObjectRenderProps as pt, RenderListItemFunction as q, effect as r, Node$1 as rt, EditorDom as s, RegisteredContainer as st, BehaviorAction as t, resolveContainerAt as tt, ExternalBehaviorEvent as u, RegisteredSpan as ut, Operation as v, InlineObjectRender as vt, AddedAnnotationPaths as w, TextBlock as wt, BehaviorGuard as x, Span as xt, Behavior as y, InlineObjectRenderProps as yt, PasteData as z };
|
|
3162
3162
|
//# sourceMappingURL=behavior.types.action.d.ts.map
|
|
@@ -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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
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],
|
|
5533
|
-
blockIndexMap.has(
|
|
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
|
|
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,
|
|
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 = {
|
|
@@ -8936,6 +8978,9 @@ function createSpanNode(context) {
|
|
|
8936
8978
|
marks: []
|
|
8937
8979
|
};
|
|
8938
8980
|
}
|
|
8981
|
+
function isCosmeticNormalizationSkipped(editor) {
|
|
8982
|
+
return editor.isProcessingRemoteChanges;
|
|
8983
|
+
}
|
|
8939
8984
|
const normalizeNode = (editor, entry) => {
|
|
8940
8985
|
const [node, path2] = entry, nodeRecord = node;
|
|
8941
8986
|
if (isEditor(node) && node.snapshot.context.value.length === 0) {
|
|
@@ -8944,7 +8989,7 @@ const normalizeNode = (editor, entry) => {
|
|
|
8944
8989
|
});
|
|
8945
8990
|
return;
|
|
8946
8991
|
}
|
|
8947
|
-
if (isTextBlock({
|
|
8992
|
+
if (!isCosmeticNormalizationSkipped(editor) && isTextBlock({
|
|
8948
8993
|
schema: editor.snapshot.context.schema
|
|
8949
8994
|
}, node)) {
|
|
8950
8995
|
const children = getChildren(editor.snapshot, path2);
|
|
@@ -9260,7 +9305,9 @@ const normalizeNode = (editor, entry) => {
|
|
|
9260
9305
|
}, child)) {
|
|
9261
9306
|
if (prev != null && isSpan({
|
|
9262
9307
|
schema: editor.snapshot.context.schema
|
|
9263
|
-
}, prev)
|
|
9308
|
+
}, prev) && // Only this merge/empty-drop arm is cosmetic; the inline-object
|
|
9309
|
+
// bracketing below is a repair and keeps running.
|
|
9310
|
+
!isCosmeticNormalizationSkipped(editor)) {
|
|
9264
9311
|
if (child.text === "") {
|
|
9265
9312
|
editor.apply({
|
|
9266
9313
|
type: "unset",
|
|
@@ -10097,16 +10144,16 @@ function toEngineBlock(block, {
|
|
|
10097
10144
|
const hasMissingMarkDefs = typeof textBlock.markDefs > "u", hasMissingChildren = typeof textBlock.children > "u", children = (textBlock.children || []).map((child) => {
|
|
10098
10145
|
const {
|
|
10099
10146
|
_type: childType,
|
|
10100
|
-
_key:
|
|
10147
|
+
_key: childKey2,
|
|
10101
10148
|
...childProps
|
|
10102
10149
|
} = child, propKeys = Object.keys(childProps);
|
|
10103
10150
|
return childType === void 0 && propKeys.length === 1 && propKeys.at(0) === "text" ? {
|
|
10104
|
-
_key:
|
|
10151
|
+
_key: childKey2,
|
|
10105
10152
|
_type: schemaTypes.span.name,
|
|
10106
10153
|
text: childProps.text
|
|
10107
10154
|
} : childType !== schemaTypes.span.name ? (hasInlines = !0, {
|
|
10108
10155
|
_type: childType,
|
|
10109
|
-
_key:
|
|
10156
|
+
_key: childKey2,
|
|
10110
10157
|
...childProps
|
|
10111
10158
|
}) : child;
|
|
10112
10159
|
});
|
|
@@ -16720,21 +16767,8 @@ function isCustomBehaviorEvent(event) {
|
|
|
16720
16767
|
function eventCategory(event) {
|
|
16721
16768
|
return isNativeBehaviorEvent(event) ? "native" : isAbstractBehaviorEvent(event) ? "synthetic" : isCustomBehaviorEvent(event) ? "custom" : "synthetic";
|
|
16722
16769
|
}
|
|
16723
|
-
const maxEventDepth = 100
|
|
16724
|
-
function performEvent(
|
|
16725
|
-
const depth = (eventDepths.get(args.editor) ?? 0) + 1;
|
|
16726
|
-
if (depth > maxEventDepth) {
|
|
16727
|
-
console.error(new Error(`Performing "${args.event.type}" was aborted because the event chain exceeded a depth of ${maxEventDepth}. This usually means Behaviors keep raising events in a cycle.`));
|
|
16728
|
-
return;
|
|
16729
|
-
}
|
|
16730
|
-
eventDepths.set(args.editor, depth);
|
|
16731
|
-
try {
|
|
16732
|
-
performEventInternal(args);
|
|
16733
|
-
} finally {
|
|
16734
|
-
eventDepths.set(args.editor, depth - 1);
|
|
16735
|
-
}
|
|
16736
|
-
}
|
|
16737
|
-
function performEventInternal({
|
|
16770
|
+
const maxEventDepth = 100;
|
|
16771
|
+
function performEvent({
|
|
16738
16772
|
mode,
|
|
16739
16773
|
behaviors,
|
|
16740
16774
|
remainingEventBehaviors,
|
|
@@ -16745,8 +16779,13 @@ function performEventInternal({
|
|
|
16745
16779
|
readOnly,
|
|
16746
16780
|
schema,
|
|
16747
16781
|
nativeEvent,
|
|
16748
|
-
sendBack
|
|
16782
|
+
sendBack,
|
|
16783
|
+
depth
|
|
16749
16784
|
}) {
|
|
16785
|
+
if (depth > maxEventDepth) {
|
|
16786
|
+
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.`));
|
|
16787
|
+
return;
|
|
16788
|
+
}
|
|
16750
16789
|
mode === "send" && !isNativeBehaviorEvent(event) && (editor.undoStepId = defaultKeyGenerator()), debug.behaviors.enabled && debug.behaviors(`(${mode}:${eventCategory(event)})`, safeStringify(event, 2));
|
|
16751
16790
|
const eventBehaviors = [...remainingEventBehaviors, ...abstractBehaviors].filter((behavior) => {
|
|
16752
16791
|
if (behavior.on === "*")
|
|
@@ -16840,7 +16879,8 @@ function performEventInternal({
|
|
|
16840
16879
|
readOnly,
|
|
16841
16880
|
schema,
|
|
16842
16881
|
nativeEvent,
|
|
16843
|
-
sendBack
|
|
16882
|
+
sendBack,
|
|
16883
|
+
depth: depth + 1
|
|
16844
16884
|
});
|
|
16845
16885
|
continue;
|
|
16846
16886
|
}
|
|
@@ -16856,7 +16896,8 @@ function performEventInternal({
|
|
|
16856
16896
|
readOnly,
|
|
16857
16897
|
schema,
|
|
16858
16898
|
nativeEvent,
|
|
16859
|
-
sendBack
|
|
16899
|
+
sendBack,
|
|
16900
|
+
depth: depth + 1
|
|
16860
16901
|
});
|
|
16861
16902
|
continue;
|
|
16862
16903
|
}
|
|
@@ -16871,7 +16912,8 @@ function performEventInternal({
|
|
|
16871
16912
|
readOnly,
|
|
16872
16913
|
schema,
|
|
16873
16914
|
nativeEvent: void 0,
|
|
16874
|
-
sendBack
|
|
16915
|
+
sendBack,
|
|
16916
|
+
depth: depth + 1
|
|
16875
16917
|
});
|
|
16876
16918
|
}
|
|
16877
16919
|
}), undoStepCreated && (editor.undoStepId = void 0);
|
|
@@ -17404,6 +17446,7 @@ const editorMachine = setup({
|
|
|
17404
17446
|
const behaviors = [...context.behaviors.values()].map((config) => config.behavior);
|
|
17405
17447
|
performEvent({
|
|
17406
17448
|
mode: "send",
|
|
17449
|
+
depth: 0,
|
|
17407
17450
|
behaviors,
|
|
17408
17451
|
remainingEventBehaviors: behaviors,
|
|
17409
17452
|
event: event.behaviorEvent,
|