@portabletext/editor 3.0.7 → 3.0.9
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-es/util.slice-blocks.js +45 -33
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/_chunks-es/util.slice-text-block.js.map +1 -1
- package/lib/index.js +93 -78
- package/lib/index.js.map +1 -1
- package/lib/utils/index.d.ts +1 -1
- package/package.json +8 -8
- package/src/converters/converter.portable-text.deserialize.test.ts +0 -13
- package/src/editor/Editable.tsx +5 -4
- package/src/editor/plugins/createWithPortableTextMarkModel.ts +19 -0
- package/src/internal-utils/__tests__/values.test.ts +0 -2
- package/src/internal-utils/values.test.ts +0 -7
- package/src/internal-utils/values.ts +70 -26
- package/src/operations/behavior.operation.block.set.ts +82 -27
- package/src/operations/behavior.operation.block.unset.ts +26 -58
- package/src/operations/behavior.operation.insert.block.ts +4 -4
- package/src/utils/parse-blocks.test.ts +0 -16
- package/src/utils/parse-blocks.ts +70 -50
- package/src/utils/util.is-empty-text-block.ts +1 -1
- package/src/behaviors/behavior.decorator-pair.ts +0 -212
- package/src/behaviors/behavior.markdown.ts +0 -478
- package/src/internal-utils/get-text-to-emphasize.test.ts +0 -60
- package/src/internal-utils/get-text-to-emphasize.ts +0 -40
|
@@ -125,6 +125,12 @@ function spanSelectionPointToBlockOffset({
|
|
|
125
125
|
function isEqualSelectionPoints(a, b) {
|
|
126
126
|
return a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path);
|
|
127
127
|
}
|
|
128
|
+
function getSelectionEndPoint(selection) {
|
|
129
|
+
return selection ? selection.backward ? selection.anchor : selection.focus : null;
|
|
130
|
+
}
|
|
131
|
+
function getSelectionStartPoint(selection) {
|
|
132
|
+
return selection ? selection.backward ? selection.focus : selection.anchor : null;
|
|
133
|
+
}
|
|
128
134
|
function isTypedObject(object) {
|
|
129
135
|
return isRecord(object) && typeof object._type == "string";
|
|
130
136
|
}
|
|
@@ -195,25 +201,13 @@ function parseTextBlock({
|
|
|
195
201
|
key === "_type" || key === "_key" || key === "children" || key === "markDefs" || key === "style" || key === "listItem" || key === "level" || (options.validateFields ? context.schema.block.fields?.some((field) => field.name === key) && (customFields[key] = block[key]) : customFields[key] = block[key]);
|
|
196
202
|
if (block._type !== context.schema.block.name)
|
|
197
203
|
return;
|
|
198
|
-
const _key = typeof block._key == "string" ? block._key : context.keyGenerator(),
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
return [];
|
|
206
|
-
if (typeof markDef._key != "string")
|
|
207
|
-
return [];
|
|
208
|
-
const parsedAnnotation = parseObject({
|
|
209
|
-
object: markDef,
|
|
210
|
-
context: {
|
|
211
|
-
schemaType,
|
|
212
|
-
keyGenerator: context.keyGenerator
|
|
213
|
-
},
|
|
214
|
-
options
|
|
215
|
-
});
|
|
216
|
-
return parsedAnnotation ? (markDefKeyMap.set(markDef._key, parsedAnnotation._key), [parsedAnnotation]) : [];
|
|
204
|
+
const _key = typeof block._key == "string" ? block._key : context.keyGenerator(), {
|
|
205
|
+
markDefs,
|
|
206
|
+
markDefKeyMap
|
|
207
|
+
} = parseMarkDefs({
|
|
208
|
+
context,
|
|
209
|
+
markDefs: block.markDefs,
|
|
210
|
+
options
|
|
217
211
|
}), parsedChildren = (Array.isArray(block.children) ? block.children : []).map((child) => parseChild({
|
|
218
212
|
child,
|
|
219
213
|
context,
|
|
@@ -246,16 +240,39 @@ function parseTextBlock({
|
|
|
246
240
|
_type: context.schema.block.name,
|
|
247
241
|
_key,
|
|
248
242
|
children: normalizedChildren,
|
|
249
|
-
markDefs: options.removeUnusedMarkDefs ? markDefs.filter((markDef) => marks.includes(markDef._key)) : markDefs,
|
|
250
243
|
...customFields
|
|
251
244
|
};
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
245
|
+
return typeof block.markDefs == "object" && block.markDefs !== null && (parsedBlock.markDefs = options.removeUnusedMarkDefs ? markDefs.filter((markDef) => marks.includes(markDef._key)) : markDefs), typeof block.style == "string" && context.schema.styles.find((style) => style.name === block.style) && (parsedBlock.style = block.style), typeof block.listItem == "string" && context.schema.lists.find((list) => list.name === block.listItem) && (parsedBlock.listItem = block.listItem), typeof block.level == "number" && (parsedBlock.level = block.level), parsedBlock;
|
|
246
|
+
}
|
|
247
|
+
function parseMarkDefs({
|
|
248
|
+
context,
|
|
249
|
+
markDefs,
|
|
250
|
+
options
|
|
251
|
+
}) {
|
|
252
|
+
const unparsedMarkDefs = Array.isArray(markDefs) ? markDefs : [], markDefKeyMap = /* @__PURE__ */ new Map();
|
|
253
|
+
return {
|
|
254
|
+
markDefs: unparsedMarkDefs.flatMap((markDef) => {
|
|
255
|
+
if (!isTypedObject(markDef))
|
|
256
|
+
return [];
|
|
257
|
+
const schemaType = context.schema.annotations.find(({
|
|
258
|
+
name
|
|
259
|
+
}) => name === markDef._type);
|
|
260
|
+
if (!schemaType)
|
|
261
|
+
return [];
|
|
262
|
+
if (typeof markDef._key != "string")
|
|
263
|
+
return [];
|
|
264
|
+
const parsedAnnotation = parseObject({
|
|
265
|
+
object: markDef,
|
|
266
|
+
context: {
|
|
267
|
+
schemaType,
|
|
268
|
+
keyGenerator: context.keyGenerator
|
|
269
|
+
},
|
|
270
|
+
options
|
|
271
|
+
});
|
|
272
|
+
return parsedAnnotation ? (markDefKeyMap.set(markDef._key, parsedAnnotation._key), [parsedAnnotation]) : [];
|
|
273
|
+
}),
|
|
274
|
+
markDefKeyMap
|
|
275
|
+
};
|
|
259
276
|
}
|
|
260
277
|
function parseChild({
|
|
261
278
|
child,
|
|
@@ -384,12 +401,6 @@ function randomKey(length) {
|
|
|
384
401
|
const table = getByteHexTable();
|
|
385
402
|
return whatwgRNG(length).reduce((str, n) => str + table[n], "").slice(0, length);
|
|
386
403
|
}
|
|
387
|
-
function getSelectionEndPoint(selection) {
|
|
388
|
-
return selection ? selection.backward ? selection.anchor : selection.focus : null;
|
|
389
|
-
}
|
|
390
|
-
function getSelectionStartPoint(selection) {
|
|
391
|
-
return selection ? selection.backward ? selection.focus : selection.anchor : null;
|
|
392
|
-
}
|
|
393
404
|
function sliceBlocks({
|
|
394
405
|
context,
|
|
395
406
|
blocks
|
|
@@ -530,6 +541,7 @@ export {
|
|
|
530
541
|
parseBlock,
|
|
531
542
|
parseBlocks,
|
|
532
543
|
parseInlineObject,
|
|
544
|
+
parseMarkDefs,
|
|
533
545
|
parseSpan,
|
|
534
546
|
sliceBlocks,
|
|
535
547
|
spanSelectionPointToBlockOffset
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.is-selection-collapsed.ts","../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.selection-point.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/asserters.ts","../../src/utils/parse-blocks.ts","../../src/utils/key-generator.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n const lastChild = block.node.children[block.node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...block.path, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n return {\n path: [...block.path, 'children', {_key: block.node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import type {EditorSelection} from '../types/editor'\n\n/**\n * @public\n */\nexport function isSelectionCollapsed(selection: EditorSelection) {\n if (!selection) {\n return false\n }\n\n return (\n JSON.stringify(selection.anchor.path) ===\n JSON.stringify(selection.focus.path) &&\n selection.anchor.offset === selection.focus.offset\n )\n}\n","import type {KeyedSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: unknown): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function getBlockKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const blockPathSegment = point.path.at(0)\n\n if (isKeyedSegment(blockPathSegment)) {\n return blockPathSegment._key\n }\n\n return undefined\n}\n\nexport function getChildKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const childPathSegment = point.path.at(2)\n\n if (isKeyedSegment(childPathSegment)) {\n return childPathSegment._key\n }\n\n return undefined\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n context,\n blockOffset,\n direction,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint: {path: ChildPath; offset: number} | undefined\n let skippedInlineObject = false\n\n for (const block of context.value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isTextBlock(context, block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isSpan(context, child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isSpan(context, child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n context,\n selectionPoint,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = getBlockKeyFromSelectionPoint(selectionPoint)\n const spanKey = getChildKeyFromSelectionPoint(selectionPoint)\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of context.value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isTextBlock(context, block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isSpan(context, child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {\n PortableTextBlock,\n PortableTextListBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n TypedObject,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isRecord, isTypedObject} from './asserters'\n\nexport function parseBlocks({\n context,\n blocks,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n blocks: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlock({context, block, options})\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nexport function parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = context.schema.blockObjects.find(\n ({name}) => name === blockObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: blockObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function isListBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextListBlock {\n return (\n isTextBlock(context, block) &&\n block.level !== undefined &&\n block.listItem !== undefined\n )\n}\n\nexport function parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(block)) {\n if (\n key === '_type' ||\n key === '_key' ||\n key === 'children' ||\n key === 'markDefs' ||\n key === 'style' ||\n key === 'listItem' ||\n key === 'level'\n ) {\n continue\n }\n\n if (options.validateFields) {\n if (context.schema.block.fields?.some((field) => field.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key =\n typeof block._key === 'string' ? block._key : context.keyGenerator()\n\n const unparsedMarkDefs: Array<unknown> = Array.isArray(block.markDefs)\n ? block.markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n const markDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === markDef._type,\n )\n\n if (!schemaType) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n // If the `markDef` doesn't have a `_key` then we don't know what spans\n // it belongs to and therefore we have to discard it.\n return []\n }\n\n const parsedAnnotation = parseObject({\n object: markDef,\n context: {\n schemaType,\n keyGenerator: context.keyGenerator,\n },\n options,\n })\n\n if (!parsedAnnotation) {\n return []\n }\n\n markDefKeyMap.set(markDef._key, parsedAnnotation._key)\n\n return [parsedAnnotation]\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const parsedChildren = unparsedChildren\n .map((child) => parseChild({child, context, markDefKeyMap, options}))\n .filter((child) => child !== undefined)\n const marks = parsedChildren.flatMap((child) => child.marks ?? [])\n\n const children =\n parsedChildren.length > 0\n ? parsedChildren\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ]\n\n const normalizedChildren = options.normalize\n ? // Ensure that inline objects re surrounded by spans\n children.reduce<Array<PortableTextObject | PortableTextSpan>>(\n (normalizedChildren, child, index) => {\n if (isSpan(context, child)) {\n return [...normalizedChildren, child]\n }\n\n const previousChild = normalizedChildren.at(-1)\n\n if (!previousChild || !isSpan(context, previousChild)) {\n return [\n ...normalizedChildren,\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n child,\n ...(index === children.length - 1\n ? [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ]\n : []),\n ]\n }\n\n return [...normalizedChildren, child]\n },\n [],\n )\n : children\n\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children: normalizedChildren,\n markDefs: options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs,\n ...customFields,\n }\n\n if (\n typeof block.style === 'string' &&\n context.schema.styles.find((style) => style.name === block.style)\n ) {\n parsedBlock.style = block.style\n } else {\n const defaultStyle = context.schema.styles.at(0)?.name\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n console.error('Expected default style')\n }\n }\n\n if (\n typeof block.listItem === 'string' &&\n context.schema.lists.find((list) => list.name === block.listItem)\n ) {\n parsedBlock.listItem = block.listItem\n }\n\n if (typeof block.level === 'number') {\n parsedBlock.level = block.level\n }\n\n return parsedBlock\n}\n\nexport function parseChild({\n child,\n context,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return (\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options})\n )\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isRecord(span)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(span)) {\n if (\n key !== '_type' &&\n key !== '_key' &&\n key !== 'text' &&\n key !== 'marks'\n ) {\n customFields[key] = span[key]\n }\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.name === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n if (\n typeof span._type === 'string' &&\n span._type !== context.schema.span.name\n ) {\n return undefined\n }\n\n if (typeof span._type !== 'string') {\n if (typeof span.text === 'string') {\n return {\n _type: context.schema.span.name as 'span',\n _key:\n typeof span._key === 'string' ? span._key : context.keyGenerator(),\n text: span.text,\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n }\n\n return undefined\n }\n\n return {\n _type: context.schema.span.name as 'span',\n _key: typeof span._key === 'string' ? span._key : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n}\n\nexport function parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = context.schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n context,\n options,\n}: {\n annotation: TypedObject\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nfunction parseObject({\n object,\n context,\n options,\n}: {\n object: TypedObject\n context: Pick<EditorContext, 'keyGenerator'> & {\n schemaType: EditorSchema['blockObjects'][0]\n }\n options: {validateFields: boolean}\n}): PortableTextObject {\n const {_type, _key, ...customFields} = object\n\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = options.validateFields\n ? context.schemaType.fields.reduce<Record<string, unknown>>(\n (fieldValues, field) => {\n const fieldValue = object[field.name]\n\n if (fieldValue !== undefined) {\n fieldValues[field.name] = fieldValue\n }\n\n return fieldValues\n },\n {},\n )\n : customFields\n\n return {\n _type: context.schemaType.name,\n _key:\n typeof object._key === 'string' ? object._key : context.keyGenerator(),\n ...values,\n }\n}\n","/**\n * @public\n */\nexport const defaultKeyGenerator = (): string => randomKey(12)\n\nconst getByteHexTable = (() => {\n let table: any[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nfunction randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionEndPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {defaultKeyGenerator} from './key-generator'\nimport {parseBlock} from './parse-blocks'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'> & {\n keyGenerator?: () => string\n }\n blocks: Array<PortableTextBlock>\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!context.selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isTextBlock(context, block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isTextBlock(context, block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (block._key === endBlockKey && startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isTextBlock(context, startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isSpan(context, child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isTextBlock(context, block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isTextBlock(context, endBlock)) {\n if (child._key === endChildKey && isSpan(context, child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(\n parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n }) ?? block,\n )\n }\n }\n\n const parsedStartBlock = startBlock\n ? parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block: startBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n })\n : undefined\n\n const parsedEndBlock = endBlock\n ? parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block: endBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n })\n : undefined\n\n return [\n ...(parsedStartBlock ? [parsedStartBlock] : []),\n ...middleBlocks,\n ...(parsedEndBlock ? [parsedEndBlock] : []),\n ]\n}\n"],"names":["getBlockEndPoint","context","block","isTextBlock","node","lastChild","children","length","path","_key","offset","isSpan","text","getBlockStartPoint","isSelectionCollapsed","selection","JSON","stringify","anchor","focus","isKeyedSegment","segment","getBlockKeyFromSelectionPoint","point","blockPathSegment","at","getChildKeyFromSelectionPoint","childPathSegment","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","selectionPoint","skippedInlineObject","value","child","spanSelectionPointToBlockOffset","blockKey","spanKey","isEqualSelectionPoints","a","b","isTypedObject","object","isRecord","_type","parseBlocks","blocks","options","Array","isArray","flatMap","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","level","undefined","listItem","customFields","key","Object","keys","validateFields","fields","some","field","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","parsedChildren","map","parseChild","filter","marks","span","normalizedChildren","normalize","reduce","index","previousChild","removeUnusedMarkDefs","includes","style","styles","defaultStyle","console","error","lists","list","parseSpan","parseInlineObject","inlineObject","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","values","fieldValues","fieldValue","defaultKeyGenerator","randomKey","getByteHexTable","table","i","toString","slice","whatwgRNG","rnds8","Uint8Array","crypto","getRandomValues","str","n","getSelectionEndPoint","backward","getSelectionStartPoint","sliceBlocks","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push","parsedStartBlock","parsedEndBlock"],"mappings":";AASO,SAASA,iBAAiB;AAAA,EAC/BC;AAAAA,EACAC;AAOF,GAAyB;AACvB,MAAIC,YAAYF,SAASC,MAAME,IAAI,GAAG;AACpC,UAAMC,YAAYH,MAAME,KAAKE,SAASJ,MAAME,KAAKE,SAASC,SAAS,CAAC;AAEpE,QAAIF;AACF,aAAO;AAAA,QACLG,MAAM,CAAC,GAAGN,MAAMM,MAAM,YAAY;AAAA,UAACC,MAAMJ,UAAUI;AAAAA,QAAAA,CAAK;AAAA,QACxDC,QAAQC,OAAOV,SAASI,SAAS,IAAIA,UAAUO,KAAKL,SAAS;AAAA,MAAA;AAAA,EAGnE;AAEA,SAAO;AAAA,IACLC,MAAMN,MAAMM;AAAAA,IACZE,QAAQ;AAAA,EAAA;AAEZ;ACzBO,SAASG,mBAAmB;AAAA,EACjCZ;AAAAA,EACAC;AAOF,GAAyB;AACvB,SAAIC,YAAYF,SAASC,MAAME,IAAI,IAC1B;AAAA,IACLI,MAAM,CAAC,GAAGN,MAAMM,MAAM,YAAY;AAAA,MAACC,MAAMP,MAAME,KAAKE,SAAS,CAAC,EAAEG;AAAAA,IAAAA,CAAK;AAAA,IACrEC,QAAQ;AAAA,EAAA,IAIL;AAAA,IACLF,MAAMN,MAAMM;AAAAA,IACZE,QAAQ;AAAA,EAAA;AAEZ;ACzBO,SAASI,qBAAqBC,WAA4B;AAC/D,SAAKA,YAKHC,KAAKC,UAAUF,UAAUG,OAAOV,IAAI,MAClCQ,KAAKC,UAAUF,UAAUI,MAAMX,IAAI,KACrCO,UAAUG,OAAOR,WAAWK,UAAUI,MAAMT,SANrC;AAQX;ACVO,SAASU,eAAeC,SAA2C;AACxE,SAAO,OAAOA,WAAY,YAAYA,YAAY,QAAQ,UAAUA;AACtE;ACJO,SAASC,8BAA8BC,OAA6B;AACzE,QAAMC,mBAAmBD,MAAMf,KAAKiB,GAAG,CAAC;AAExC,MAAIL,eAAeI,gBAAgB;AACjC,WAAOA,iBAAiBf;AAI5B;AAEO,SAASiB,8BAA8BH,OAA6B;AACzE,QAAMI,mBAAmBJ,MAAMf,KAAKiB,GAAG,CAAC;AAExC,MAAIL,eAAeO,gBAAgB;AACjC,WAAOA,iBAAiBlB;AAI5B;ACRO,SAASmB,gCAAgC;AAAA,EAC9C3B;AAAAA,EACA4B;AAAAA,EACAC;AAKF,GAAG;AACD,MAAIC,aAAaF,YAAYnB,QACzBsB,gBACAC,sBAAsB;AAE1B,aAAW/B,SAASD,QAAQiC;AAC1B,QAAIhC,MAAMO,SAASoB,YAAYrB,KAAK,CAAC,EAAEC,QAIlCN,YAAYF,SAASC,KAAK;AAI/B,iBAAWiC,SAASjC,MAAMI,UAAU;AAClC,YAAIwB,cAAc,WAAW;AAC3B,cAAI,CAACnB,OAAOV,SAASkC,KAAK;AACxB;AAGF,cAAIJ,cAAcI,MAAMvB,KAAKL,QAAQ;AACnCyB,6BAAiB;AAAA,cACfxB,MAAM,CAAC,GAAGqB,YAAYrB,MAAM,YAAY;AAAA,gBAACC,MAAM0B,MAAM1B;AAAAA,cAAAA,CAAK;AAAA,cAC1DC,QAAQqB;AAAAA,YAAAA;AAEV;AAAA,UACF;AAEAA,wBAAcI,MAAMvB,KAAKL;AAEzB;AAAA,QACF;AAEA,YAAI,CAACI,OAAOV,SAASkC,KAAK,GAAG;AAC3BF,gCAAsB;AACtB;AAAA,QACF;AAEA,YAAIF,eAAe,KAAKC,kBAAkB,CAACC,qBAAqB;AAC1DA,kCACFD,iBAAiB;AAAA,YACfxB,MAAM,CAAC,GAAGqB,YAAYrB,MAAM,YAAY;AAAA,cAACC,MAAM0B,MAAM1B;AAAAA,YAAAA,CAAK;AAAA,YAC1DC,QAAQ;AAAA,UAAA;AAGZ;AAAA,QACF;AAEA,YAAIqB,aAAaI,MAAMvB,KAAKL,QAAQ;AAClCwB,wBAAcI,MAAMvB,KAAKL;AACzB;AAAA,QACF;AAEA,YAAIwB,cAAcI,MAAMvB,KAAKL,WAC3ByB,iBAAiB;AAAA,UACfxB,MAAM,CAAC,GAAGqB,YAAYrB,MAAM,YAAY;AAAA,YAACC,MAAM0B,MAAM1B;AAAAA,UAAAA,CAAK;AAAA,UAC1DC,QAAQqB;AAAAA,QAAAA,GAGVA,cAAcI,MAAMvB,KAAKL,QAErBwB,eAAe;AACjB;AAAA,MAGN;AAGF,SAAOC;AACT;AAKO,SAASI,gCAAgC;AAAA,EAC9CnC;AAAAA,EACA+B;AAIF,GAA4B;AAC1B,MAAItB,SAAS;AAEb,QAAM2B,WAAWf,8BAA8BU,cAAc,GACvDM,UAAUZ,8BAA8BM,cAAc;AAE5D,MAAI,EAAA,CAACK,YAAY,CAACC;AAIlB,eAAWpC,SAASD,QAAQiC;AAC1B,UAAIhC,MAAMO,SAAS4B,YAIdlC,YAAYF,SAASC,KAAK;AAI/B,mBAAWiC,SAASjC,MAAMI;AACxB,cAAKK,OAAOV,SAASkC,KAAK,GAI1B;AAAA,gBAAIA,MAAM1B,SAAS6B;AACjB,qBAAO;AAAA,gBACL9B,MAAM,CAAC;AAAA,kBAACC,MAAMP,MAAMO;AAAAA,gBAAAA,CAAK;AAAA,gBACzBC,QAAQA,SAASsB,eAAetB;AAAAA,cAAAA;AAIpCA,sBAAUyB,MAAMvB,KAAKL;AAAAA,UAAAA;AAAAA;AAAAA;AAG3B;AClIO,SAASgC,uBACdC,GACAC,GACA;AACA,SACED,EAAE9B,WAAW+B,EAAE/B,UAAUM,KAAKC,UAAUuB,EAAEhC,IAAI,MAAMQ,KAAKC,UAAUwB,EAAEjC,IAAI;AAE7E;ACVO,SAASkC,cAAcC,QAAwC;AACpE,SAAOC,SAASD,MAAM,KAAK,OAAOA,OAAOE,SAAU;AACrD;AAEO,SAASD,SAASV,OAAkD;AACzE,SAAO,CAAC,CAACA,UAAU,OAAOA,SAAU,YAAY,OAAOA,SAAU;AACnE;ACKO,SAASY,YAAY;AAAA,EAC1B7C;AAAAA,EACA8C;AAAAA,EACAC;AASF,GAA6B;AAC3B,SAAKC,MAAMC,QAAQH,MAAM,IAIlBA,OAAOI,QAASjD,CAAAA,UAAU;AAC/B,UAAMkD,cAAcC,WAAW;AAAA,MAACpD;AAAAA,MAASC;AAAAA,MAAO8C;AAAAA,IAAAA,CAAQ;AAExD,WAAOI,cAAc,CAACA,WAAW,IAAI,CAAA;AAAA,EACvC,CAAC,IAPQ,CAAA;AAQX;AAEO,SAASC,WAAW;AAAA,EACzBpD;AAAAA,EACAC;AAAAA,EACA8C;AASF,GAAkC;AAChC,SACEM,eAAe;AAAA,IAACpD;AAAAA,IAAOD;AAAAA,IAAS+C;AAAAA,EAAAA,CAAQ,KACxCO,iBAAiB;AAAA,IAACC,aAAatD;AAAAA,IAAOD;AAAAA,IAAS+C;AAAAA,EAAAA,CAAQ;AAE3D;AAEO,SAASO,iBAAiB;AAAA,EAC/BC;AAAAA,EACAvD;AAAAA,EACA+C;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAcc,WAAW;AAC5B;AAGF,QAAMC,aAAaxD,QAAQyD,OAAOC,aAAaC,KAC7C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAASL,YAAYX,KACnC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQa;AAAAA,MACRvD,SAAS;AAAA,QACP8D,cAAc9D,QAAQ8D;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEO,SAASgB,YACd/D,SACAC,OACgC;AAChC,SACEC,YAAYF,SAASC,KAAK,KAC1BA,MAAM+D,UAAUC,UAChBhE,MAAMiE,aAAaD;AAEvB;AAEO,SAASZ,eAAe;AAAA,EAC7BpD;AAAAA,EACAD;AAAAA,EACA+C;AASF,GAAsC;AACpC,MAAI,CAACN,cAAcxC,KAAK;AACtB;AAGF,QAAMkE,eAAwC,CAAA;AAE9C,aAAWC,OAAOC,OAAOC,KAAKrE,KAAK;AAE/BmE,YAAQ,WACRA,QAAQ,UACRA,QAAQ,cACRA,QAAQ,cACRA,QAAQ,WACRA,QAAQ,cACRA,QAAQ,YAKNrB,QAAQwB,iBACNvE,QAAQyD,OAAOxD,MAAMuE,QAAQC,KAAMC,CAAAA,UAAUA,MAAMd,SAASQ,GAAG,MACjED,aAAaC,GAAG,IAAInE,MAAMmE,GAAG,KAG/BD,aAAaC,GAAG,IAAInE,MAAMmE,GAAG;AAIjC,MAAInE,MAAM2C,UAAU5C,QAAQyD,OAAOxD,MAAM2D;AACvC;AAGF,QAAMpD,OACJ,OAAOP,MAAMO,QAAS,WAAWP,MAAMO,OAAOR,QAAQ8D,aAAAA,GAElDa,mBAAmC3B,MAAMC,QAAQhD,MAAM2E,QAAQ,IACjE3E,MAAM2E,WACN,CAAA,GACEC,gBAAgB,oBAAIC,IAAAA,GACpBF,WAAWD,iBAAiBzB,QAAS6B,CAAAA,YAAY;AACrD,QAAI,CAACtC,cAAcsC,OAAO;AACxB,aAAO,CAAA;AAGT,UAAMvB,aAAaxD,QAAQyD,OAAOuB,YAAYrB,KAC5C,CAAC;AAAA,MAACC;AAAAA,IAAAA,MAAUA,SAASmB,QAAQnC,KAC/B;AAEA,QAAI,CAACY;AACH,aAAO,CAAA;AAGT,QAAI,OAAOuB,QAAQvE,QAAS;AAG1B,aAAO,CAAA;AAGT,UAAMyE,mBAAmBpB,YAAY;AAAA,MACnCnB,QAAQqC;AAAAA,MACR/E,SAAS;AAAA,QACPwD;AAAAA,QACAM,cAAc9D,QAAQ8D;AAAAA,MAAAA;AAAAA,MAExBf;AAAAA,IAAAA,CACD;AAED,WAAKkC,oBAILJ,cAAcK,IAAIH,QAAQvE,MAAMyE,iBAAiBzE,IAAI,GAE9C,CAACyE,gBAAgB,KALf,CAAA;AAAA,EAMX,CAAC,GAMKE,kBAJmCnC,MAAMC,QAAQhD,MAAMI,QAAQ,IACjEJ,MAAMI,WACN,CAAA,GAGD+E,IAAKlD,WAAUmD,WAAW;AAAA,IAACnD;AAAAA,IAAOlC;AAAAA,IAAS6E;AAAAA,IAAe9B;AAAAA,EAAAA,CAAQ,CAAC,EACnEuC,OAAQpD,WAAUA,UAAU+B,MAAS,GAClCsB,QAAQJ,eAAejC,QAAShB,WAAUA,MAAMqD,SAAS,CAAA,CAAE,GAE3DlF,WACJ8E,eAAe7E,SAAS,IACpB6E,iBACA,CACE;AAAA,IACE3E,MAAMR,QAAQ8D,aAAAA;AAAAA,IACdlB,OAAO5C,QAAQyD,OAAO+B,KAAK5B;AAAAA,IAC3BjD,MAAM;AAAA,IACN4E,OAAO,CAAA;AAAA,EAAA,CACR,GAGHE,qBAAqB1C,QAAQ2C;AAAAA;AAAAA,IAE/BrF,SAASsF,OACP,CAACF,qBAAoBvD,OAAO0D,UAAU;AACpC,UAAIlF,OAAOV,SAASkC,KAAK;AACvB,eAAO,CAAC,GAAGuD,qBAAoBvD,KAAK;AAGtC,YAAM2D,gBAAgBJ,oBAAmBjE,GAAG,EAAE;AAE9C,aAAI,CAACqE,iBAAiB,CAACnF,OAAOV,SAAS6F,aAAa,IAC3C,CACL,GAAGJ,qBACH;AAAA,QACEjF,MAAMR,QAAQ8D,aAAAA;AAAAA,QACdlB,OAAO5C,QAAQyD,OAAO+B,KAAK5B;AAAAA,QAC3BjD,MAAM;AAAA,QACN4E,OAAO,CAAA;AAAA,MAAA,GAETrD,OACA,GAAI0D,UAAUvF,SAASC,SAAS,IAC5B,CACE;AAAA,QACEE,MAAMR,QAAQ8D,aAAAA;AAAAA,QACdlB,OAAO5C,QAAQyD,OAAO+B,KAAK5B;AAAAA,QAC3BjD,MAAM;AAAA,QACN4E,OAAO,CAAA;AAAA,MAAA,CACR,IAEH,CAAA,CAAG,IAIJ,CAAC,GAAGE,qBAAoBvD,KAAK;AAAA,IACtC,GACA,CAAA,CACF;AAAA,MACA7B,UAEE8C,cAAqC;AAAA,IACzCP,OAAO5C,QAAQyD,OAAOxD,MAAM2D;AAAAA,IAC5BpD;AAAAA,IACAH,UAAUoF;AAAAA,IACVb,UAAU7B,QAAQ+C,uBACdlB,SAASU,OAAQP,CAAAA,YAAYQ,MAAMQ,SAAShB,QAAQvE,IAAI,CAAC,IACzDoE;AAAAA,IACJ,GAAGT;AAAAA,EAAAA;AAGL,MACE,OAAOlE,MAAM+F,SAAU,YACvBhG,QAAQyD,OAAOwC,OAAOtC,KAAMqC,CAAAA,UAAUA,MAAMpC,SAAS3D,MAAM+F,KAAK;AAEhE7C,gBAAY6C,QAAQ/F,MAAM+F;AAAAA,OACrB;AACL,UAAME,eAAelG,QAAQyD,OAAOwC,OAAOzE,GAAG,CAAC,GAAGoC;AAE9CsC,qBAAiBjC,SACnBd,YAAY6C,QAAQE,eAEpBC,QAAQC,MAAM,wBAAwB;AAAA,EAE1C;AAEA,SACE,OAAOnG,MAAMiE,YAAa,YAC1BlE,QAAQyD,OAAO4C,MAAM1C,KAAM2C,CAAAA,SAASA,KAAK1C,SAAS3D,MAAMiE,QAAQ,MAEhEf,YAAYe,WAAWjE,MAAMiE,WAG3B,OAAOjE,MAAM+D,SAAU,aACzBb,YAAYa,QAAQ/D,MAAM+D,QAGrBb;AACT;AAEO,SAASkC,WAAW;AAAA,EACzBnD;AAAAA,EACAlC;AAAAA,EACA6E;AAAAA,EACA9B;AAMF,GAAsD;AACpD,SACEwD,UAAU;AAAA,IAACf,MAAMtD;AAAAA,IAAOlC;AAAAA,IAAS6E;AAAAA,IAAe9B;AAAAA,EAAAA,CAAQ,KACxDyD,kBAAkB;AAAA,IAACC,cAAcvE;AAAAA,IAAOlC;AAAAA,IAAS+C;AAAAA,EAAAA,CAAQ;AAE7D;AAEO,SAASwD,UAAU;AAAA,EACxBf;AAAAA,EACAxF;AAAAA,EACA6E;AAAAA,EACA9B;AAMF,GAAiC;AAC/B,MAAI,CAACJ,SAAS6C,IAAI;AAChB;AAGF,QAAMrB,eAAwC,CAAA;AAE9C,aAAWC,OAAOC,OAAOC,KAAKkB,IAAI;AAE9BpB,YAAQ,WACRA,QAAQ,UACRA,QAAQ,UACRA,QAAQ,YAERD,aAAaC,GAAG,IAAIoB,KAAKpB,GAAG;AAOhC,QAAMmB,SAHgCvC,MAAMC,QAAQuC,KAAKD,KAAK,IAC1DC,KAAKD,QACL,CAAA,GACwBrC,QAASwD,CAAAA,SAAS;AAC5C,QAAI,OAAOA,QAAS;AAClB,aAAO,CAAA;AAGT,UAAMC,aAAa9B,cAAc+B,IAAIF,IAAI;AAEzC,WAAIC,eAAe1C,SACV,CAAC0C,UAAU,IAIlB3G,QAAQyD,OAAOoD,WAAWpC,KAAMqC,CAAAA,cAAcA,UAAUlD,SAAS8C,IAAI,IAE9D,CAACA,IAAI,IAGP,CAAA;AAAA,EACT,CAAC;AAED,MACE,EAAA,OAAOlB,KAAK5C,SAAU,YACtB4C,KAAK5C,UAAU5C,QAAQyD,OAAO+B,KAAK5B;AAKrC,WAAI,OAAO4B,KAAK5C,SAAU,WACpB,OAAO4C,KAAK7E,QAAS,WAChB;AAAA,MACLiC,OAAO5C,QAAQyD,OAAO+B,KAAK5B;AAAAA,MAC3BpD,MACE,OAAOgF,KAAKhF,QAAS,WAAWgF,KAAKhF,OAAOR,QAAQ8D,aAAAA;AAAAA,MACtDnD,MAAM6E,KAAK7E;AAAAA,MACX4E;AAAAA,MACA,GAAIxC,QAAQwB,iBAAiB,KAAKJ;AAAAA,IAAAA,IAItC,SAGK;AAAA,MACLvB,OAAO5C,QAAQyD,OAAO+B,KAAK5B;AAAAA,MAC3BpD,MAAM,OAAOgF,KAAKhF,QAAS,WAAWgF,KAAKhF,OAAOR,QAAQ8D,aAAAA;AAAAA,MAC1DnD,MAAM,OAAO6E,KAAK7E,QAAS,WAAW6E,KAAK7E,OAAO;AAAA,MAClD4E;AAAAA,MACA,GAAIxC,QAAQwB,iBAAiB,KAAKJ;AAAAA,IAAAA;AAEtC;AAEO,SAASqC,kBAAkB;AAAA,EAChCC;AAAAA,EACAzG;AAAAA,EACA+C;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAcgE,YAAY;AAC7B;AAGF,QAAMjD,aAAaxD,QAAQyD,OAAOsD,cAAcpD,KAC9C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAAS6C,aAAa7D,KACpC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQ+D;AAAAA,MACRzG,SAAS;AAAA,QACP8D,cAAc9D,QAAQ8D;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEO,SAASiE,gBAAgB;AAAA,EAC9BC;AAAAA,EACAjH;AAAAA,EACA+C;AAKF,GAAmC;AACjC,MAAI,CAACN,cAAcwE,UAAU;AAC3B;AAGF,QAAMzD,aAAaxD,QAAQyD,OAAOuB,YAAYrB,KAC5C,CAAC;AAAA,IAACC;AAAAA,EAAAA,MAAUA,SAASqD,WAAWrE,KAClC;AAEA,MAAKY;AAIL,WAAOK,YAAY;AAAA,MACjBnB,QAAQuE;AAAAA,MACRjH,SAAS;AAAA,QACP8D,cAAc9D,QAAQ8D;AAAAA,QACtBN;AAAAA,MAAAA;AAAAA,MAEFT;AAAAA,IAAAA,CACD;AACH;AAEA,SAASc,YAAY;AAAA,EACnBnB;AAAAA,EACA1C;AAAAA,EACA+C;AAOF,GAAuB;AACrB,QAAM;AAAA,IAACH;AAAAA,IAAOpC;AAAAA,IAAM,GAAG2D;AAAAA,EAAAA,IAAgBzB,QAIjCwE,SAASnE,QAAQwB,iBACnBvE,QAAQwD,WAAWgB,OAAOmB,OACxB,CAACwB,aAAazC,UAAU;AACtB,UAAM0C,aAAa1E,OAAOgC,MAAMd,IAAI;AAEpC,WAAIwD,eAAenD,WACjBkD,YAAYzC,MAAMd,IAAI,IAAIwD,aAGrBD;AAAAA,EACT,GACA,CAAA,CACF,IACAhD;AAEJ,SAAO;AAAA,IACLvB,OAAO5C,QAAQwD,WAAWI;AAAAA,IAC1BpD,MACE,OAAOkC,OAAOlC,QAAS,WAAWkC,OAAOlC,OAAOR,QAAQ8D,aAAAA;AAAAA,IAC1D,GAAGoD;AAAAA,EAAAA;AAEP;ACheO,MAAMG,sBAAsBA,MAAcC,UAAU,EAAE,GAEvDC,kBAAmB,uBAAM;AAC7B,MAAIC;AACJ,SAAO,MAAM;AACX,QAAIA;AACF,aAAOA;AAGTA,YAAQ,CAAA;AACR,aAASC,IAAI,GAAGA,IAAI,KAAK,EAAEA;AACzBD,YAAMC,CAAC,KAAKA,IAAI,KAAOC,SAAS,EAAE,EAAEC,MAAM,CAAC;AAE7C,WAAOH;AAAAA,EACT;AACF,GAAA;AAGA,SAASI,UAAUtH,SAAS,IAAI;AAC9B,QAAMuH,QAAQ,IAAIC,WAAWxH,MAAM;AACnCyH,SAAAA,OAAOC,gBAAgBH,KAAK,GACrBA;AACT;AAEA,SAASP,UAAUhH,QAAyB;AAC1C,QAAMkH,QAAQD,gBAAAA;AACd,SAAOK,UAAUtH,MAAM,EACpBqF,OAAO,CAACsC,KAAKC,MAAMD,MAAMT,MAAMU,CAAC,GAAG,EAAE,EACrCP,MAAM,GAAGrH,MAAM;AACpB;AC3BO,SAAS6H,qBAMdrH,WAAoD;AACpD,SAAKA,YAKHA,UAAUsH,WAAWtH,UAAUG,SAASH,UAAUI,QAJ3C;AAMX;ACdO,SAASmH,uBAMdvH,WAAoD;AACpD,SAAKA,YAKHA,UAAUsH,WAAWtH,UAAUI,QAAQJ,UAAUG,SAJ1C;AAMX;ACJO,SAASqH,YAAY;AAAA,EAC1BtI;AAAAA,EACA8C;AAMF,GAA6B;AAC3B,QAAM6E,QAAkC,CAAA;AAExC,MAAI,CAAC3H,QAAQc;AACX,WAAO6G;AAGT,MAAIY;AACJ,QAAMC,eAAoC,CAAA;AAC1C,MAAIC;AAEJ,QAAMC,aAAaL,uBAAuBrI,QAAQc,SAAS,GACrD6H,WAAWR,qBAAqBnI,QAAQc,SAAS,GACjD8H,gBAAgBvH,8BAA8BqH,UAAU,GACxDG,gBAAgBpH,8BAA8BiH,UAAU,GACxDI,cAAczH,8BAA8BsH,QAAQ,GACpDI,cAActH,8BAA8BkH,QAAQ;AAE1D,MAAI,CAACC,iBAAiB,CAACE;AACrB,WAAOnB;AAGT,aAAW1H,SAAS6C,QAAQ;AAC1B,QAAI,CAAC5C,YAAYF,SAASC,KAAK,KACzBA,MAAMO,SAASoI,iBAAiB3I,MAAMO,SAASsI,aAAa;AAC9DP,mBAAatI;AACb;AAAA,IACF;AAGF,QAAIA,MAAMO,SAASoI,eAAe;AAChC,UAAI,CAAC1I,YAAYF,SAASC,KAAK,GAAG;AAChCsI,qBAAatI;AACb;AAAA,MACF;AAEA,UAAI4I,eAAe;AACjB,mBAAW3G,SAASjC,MAAMI,UAAU;AAClC,cAAI6B,MAAM1B,SAASqI,eAAe;AAChC,gBAAInI,OAAOV,SAASkC,KAAK,GAAG;AAC1B,oBAAMvB,OACJuB,MAAM1B,SAASuI,cACX7G,MAAMvB,KAAKgH,MAAMe,WAAWjI,QAAQkI,SAASlI,MAAM,IACnDyB,MAAMvB,KAAKgH,MAAMe,WAAWjI,MAAM;AAExC8H,2BAAa;AAAA,gBACX,GAAGtI;AAAAA,gBACHI,UAAU,CACR;AAAA,kBACE,GAAG6B;AAAAA,kBACHvB;AAAAA,gBAAAA,CACD;AAAA,cAAA;AAAA,YAGP;AACE4H,2BAAa;AAAA,gBACX,GAAGtI;AAAAA,gBACHI,UAAU,CAAC6B,KAAK;AAAA,cAAA;AAIpB,gBAAIjC,MAAMO,SAASsI,eAAeD,kBAAkBE;AAClD;AAEF;AAAA,UACF;AAEA,cAAIR,cAAcrI,YAAYF,SAASuI,UAAU,MAE7CQ,eACA7G,MAAM1B,SAASuI,eACfrI,OAAOV,SAASkC,KAAK,IAErBqG,WAAWlI,SAAS2I,KAAK;AAAA,YACvB,GAAG9G;AAAAA,YACHvB,MAAMuB,MAAMvB,KAAKgH,MAAM,GAAGgB,SAASlI,MAAM;AAAA,UAAA,CAC1C,IAED8H,WAAWlI,SAAS2I,KAAK9G,KAAK,GAI9BjC,MAAMO,SAASsI,eACfC,eACA7G,MAAM1B,SAASuI;AAEf;AAAA,QAGN;AAEA,YAAIH,kBAAkBE;AACpB;AAGF;AAAA,MACF;AAIA,UAFAP,aAAatI,OAET2I,kBAAkBE;AACpB;AAAA,IAEJ;AAEA,QAAI7I,MAAMO,SAASsI,aAAa;AAC9B,UAAI,CAAC5I,YAAYF,SAASC,KAAK,GAAG;AAChCwI,mBAAWxI;AACX;AAAA,MACF;AAEA,UAAI8I,aAAa;AACfN,mBAAW;AAAA,UACT,GAAGxI;AAAAA,UACHI,UAAU,CAAA;AAAA,QAAA;AAGZ,mBAAW6B,SAASjC,MAAMI;AACxB,cAAIoI,YAAYvI,YAAYF,SAASyI,QAAQ,GAAG;AAC9C,gBAAIvG,MAAM1B,SAASuI,eAAerI,OAAOV,SAASkC,KAAK,GAAG;AACxDuG,uBAASpI,SAAS2I,KAAK;AAAA,gBACrB,GAAG9G;AAAAA,gBACHvB,MAAMuB,MAAMvB,KAAKgH,MAAM,GAAGgB,SAASlI,MAAM;AAAA,cAAA,CAC1C;AAED;AAAA,YACF;AAIA,gBAFAgI,SAASpI,SAAS2I,KAAK9G,KAAK,GAExB6G,eAAe7G,MAAM1B,SAASuI;AAChC;AAAA,UAEJ;AAGF;AAAA,MACF;AAEAN,iBAAWxI;AAEX;AAAA,IACF;AAEIsI,kBACFC,aAAaQ,KACX5F,WAAW;AAAA,MACTpD,SAAS;AAAA,QACPyD,QAAQzD,QAAQyD;AAAAA,QAChBK,cAAc9D,QAAQ8D,gBAAgBuD;AAAAA,MAAAA;AAAAA,MAExCpH;AAAAA,MACA8C,SAAS;AAAA,QACP2C,WAAW;AAAA,QACXI,sBAAsB;AAAA,QACtBvB,gBAAgB;AAAA,MAAA;AAAA,IAClB,CACD,KAAKtE,KACR;AAAA,EAEJ;AAEA,QAAMgJ,mBAAmBV,aACrBnF,WAAW;AAAA,IACTpD,SAAS;AAAA,MACPyD,QAAQzD,QAAQyD;AAAAA,MAChBK,cAAc9D,QAAQ8D,gBAAgBuD;AAAAA,IAAAA;AAAAA,IAExCpH,OAAOsI;AAAAA,IACPxF,SAAS;AAAA,MACP2C,WAAW;AAAA,MACXI,sBAAsB;AAAA,MACtBvB,gBAAgB;AAAA,IAAA;AAAA,EAClB,CACD,IACDN,QAEEiF,iBAAiBT,WACnBrF,WAAW;AAAA,IACTpD,SAAS;AAAA,MACPyD,QAAQzD,QAAQyD;AAAAA,MAChBK,cAAc9D,QAAQ8D,gBAAgBuD;AAAAA,IAAAA;AAAAA,IAExCpH,OAAOwI;AAAAA,IACP1F,SAAS;AAAA,MACP2C,WAAW;AAAA,MACXI,sBAAsB;AAAA,MACtBvB,gBAAgB;AAAA,IAAA;AAAA,EAClB,CACD,IACDN;AAEJ,SAAO,CACL,GAAIgF,mBAAmB,CAACA,gBAAgB,IAAI,CAAA,GAC5C,GAAGT,cACH,GAAIU,iBAAiB,CAACA,cAAc,IAAI,CAAA,CAAG;AAE/C;"}
|
|
1
|
+
{"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.is-selection-collapsed.ts","../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.selection-point.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/asserters.ts","../../src/utils/parse-blocks.ts","../../src/utils/key-generator.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n const lastChild = block.node.children[block.node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...block.path, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import {isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: BlockPath\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n return {\n path: [...block.path, 'children', {_key: block.node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import type {EditorSelection} from '../types/editor'\n\n/**\n * @public\n */\nexport function isSelectionCollapsed(selection: EditorSelection) {\n if (!selection) {\n return false\n }\n\n return (\n JSON.stringify(selection.anchor.path) ===\n JSON.stringify(selection.focus.path) &&\n selection.anchor.offset === selection.focus.offset\n )\n}\n","import type {KeyedSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: unknown): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\nexport function getBlockKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const blockPathSegment = point.path.at(0)\n\n if (isKeyedSegment(blockPathSegment)) {\n return blockPathSegment._key\n }\n\n return undefined\n}\n\nexport function getChildKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const childPathSegment = point.path.at(2)\n\n if (isKeyedSegment(childPathSegment)) {\n return childPathSegment._key\n }\n\n return undefined\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n context,\n blockOffset,\n direction,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint: {path: ChildPath; offset: number} | undefined\n let skippedInlineObject = false\n\n for (const block of context.value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isTextBlock(context, block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isSpan(context, child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isSpan(context, child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n context,\n selectionPoint,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = getBlockKeyFromSelectionPoint(selectionPoint)\n const spanKey = getChildKeyFromSelectionPoint(selectionPoint)\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of context.value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isTextBlock(context, block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isSpan(context, child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionEndPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\n}\n","import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {\n PortableTextBlock,\n PortableTextListBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n TypedObject,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isRecord, isTypedObject} from './asserters'\n\nexport function parseBlocks({\n context,\n blocks,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n blocks: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlock({context, block, options})\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nexport function parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = context.schema.blockObjects.find(\n ({name}) => name === blockObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: blockObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function isListBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextListBlock {\n return (\n isTextBlock(context, block) &&\n block.level !== undefined &&\n block.listItem !== undefined\n )\n}\n\nexport function parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {\n normalize: boolean\n removeUnusedMarkDefs: boolean\n validateFields: boolean\n }\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(block)) {\n if (\n key === '_type' ||\n key === '_key' ||\n key === 'children' ||\n key === 'markDefs' ||\n key === 'style' ||\n key === 'listItem' ||\n key === 'level'\n ) {\n continue\n }\n\n if (options.validateFields) {\n if (context.schema.block.fields?.some((field) => field.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key =\n typeof block._key === 'string' ? block._key : context.keyGenerator()\n\n const {markDefs, markDefKeyMap} = parseMarkDefs({\n context,\n markDefs: block.markDefs,\n options,\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const parsedChildren = unparsedChildren\n .map((child) => parseChild({child, context, markDefKeyMap, options}))\n .filter((child) => child !== undefined)\n const marks = parsedChildren.flatMap((child) => child.marks ?? [])\n\n const children =\n parsedChildren.length > 0\n ? parsedChildren\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ]\n\n const normalizedChildren = options.normalize\n ? // Ensure that inline objects re surrounded by spans\n children.reduce<Array<PortableTextObject | PortableTextSpan>>(\n (normalizedChildren, child, index) => {\n if (isSpan(context, child)) {\n return [...normalizedChildren, child]\n }\n\n const previousChild = normalizedChildren.at(-1)\n\n if (!previousChild || !isSpan(context, previousChild)) {\n return [\n ...normalizedChildren,\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n child,\n ...(index === children.length - 1\n ? [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ]\n : []),\n ]\n }\n\n return [...normalizedChildren, child]\n },\n [],\n )\n : children\n\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children: normalizedChildren,\n ...customFields,\n }\n\n if (typeof block.markDefs === 'object' && block.markDefs !== null) {\n parsedBlock.markDefs = options.removeUnusedMarkDefs\n ? markDefs.filter((markDef) => marks.includes(markDef._key))\n : markDefs\n }\n\n if (\n typeof block.style === 'string' &&\n context.schema.styles.find((style) => style.name === block.style)\n ) {\n parsedBlock.style = block.style\n }\n\n if (\n typeof block.listItem === 'string' &&\n context.schema.lists.find((list) => list.name === block.listItem)\n ) {\n parsedBlock.listItem = block.listItem\n }\n\n if (typeof block.level === 'number') {\n parsedBlock.level = block.level\n }\n\n return parsedBlock\n}\n\nexport function parseMarkDefs({\n context,\n markDefs,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefs: unknown\n options: {validateFields: boolean}\n}): {\n markDefs: Array<PortableTextObject>\n markDefKeyMap: Map<string, string>\n} {\n const unparsedMarkDefs: Array<unknown> = Array.isArray(markDefs)\n ? markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n\n const parsedMarkDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === markDef._type,\n )\n\n if (!schemaType) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n // If the `markDef` doesn't have a `_key` then we don't know what spans\n // it belongs to and therefore we have to discard it.\n return []\n }\n\n const parsedAnnotation = parseObject({\n object: markDef,\n context: {\n schemaType,\n keyGenerator: context.keyGenerator,\n },\n options,\n })\n\n if (!parsedAnnotation) {\n return []\n }\n\n markDefKeyMap.set(markDef._key, parsedAnnotation._key)\n\n return [parsedAnnotation]\n })\n\n return {\n markDefs: parsedMarkDefs,\n markDefKeyMap,\n }\n}\n\nexport function parseChild({\n child,\n context,\n markDefKeyMap,\n options,\n}: {\n child: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | PortableTextObject | undefined {\n return (\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options})\n )\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isRecord(span)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(span)) {\n if (\n key !== '_type' &&\n key !== '_key' &&\n key !== 'text' &&\n key !== 'marks'\n ) {\n customFields[key] = span[key]\n }\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.name === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n if (\n typeof span._type === 'string' &&\n span._type !== context.schema.span.name\n ) {\n return undefined\n }\n\n if (typeof span._type !== 'string') {\n if (typeof span.text === 'string') {\n return {\n _type: context.schema.span.name as 'span',\n _key:\n typeof span._key === 'string' ? span._key : context.keyGenerator(),\n text: span.text,\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n }\n\n return undefined\n }\n\n return {\n _type: context.schema.span.name as 'span',\n _key: typeof span._key === 'string' ? span._key : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n ...(options.validateFields ? {} : customFields),\n }\n}\n\nexport function parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = context.schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n context,\n options,\n}: {\n annotation: TypedObject\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {validateFields: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nfunction parseObject({\n object,\n context,\n options,\n}: {\n object: TypedObject\n context: Pick<EditorContext, 'keyGenerator'> & {\n schemaType: EditorSchema['blockObjects'][0]\n }\n options: {validateFields: boolean}\n}): PortableTextObject {\n const {_type, _key, ...customFields} = object\n\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = options.validateFields\n ? context.schemaType.fields.reduce<Record<string, unknown>>(\n (fieldValues, field) => {\n const fieldValue = object[field.name]\n\n if (fieldValue !== undefined) {\n fieldValues[field.name] = fieldValue\n }\n\n return fieldValues\n },\n {},\n )\n : customFields\n\n return {\n _type: context.schemaType.name,\n _key:\n typeof object._key === 'string' ? object._key : context.keyGenerator(),\n ...values,\n }\n}\n","/**\n * @public\n */\nexport const defaultKeyGenerator = (): string => randomKey(12)\n\nconst getByteHexTable = (() => {\n let table: any[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nfunction randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {defaultKeyGenerator} from './key-generator'\nimport {parseBlock} from './parse-blocks'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'> & {\n keyGenerator?: () => string\n }\n blocks: Array<PortableTextBlock>\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!context.selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isTextBlock(context, block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isTextBlock(context, block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (block._key === endBlockKey && startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isTextBlock(context, startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isSpan(context, child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isTextBlock(context, block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isTextBlock(context, endBlock)) {\n if (child._key === endChildKey && isSpan(context, child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(\n parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n }) ?? block,\n )\n }\n }\n\n const parsedStartBlock = startBlock\n ? parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block: startBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n })\n : undefined\n\n const parsedEndBlock = endBlock\n ? parseBlock({\n context: {\n schema: context.schema,\n keyGenerator: context.keyGenerator ?? defaultKeyGenerator,\n },\n block: endBlock,\n options: {\n normalize: false,\n removeUnusedMarkDefs: true,\n validateFields: false,\n },\n })\n : undefined\n\n return [\n ...(parsedStartBlock ? [parsedStartBlock] : []),\n ...middleBlocks,\n ...(parsedEndBlock ? [parsedEndBlock] : []),\n ]\n}\n"],"names":["getBlockEndPoint","context","block","isTextBlock","node","lastChild","children","length","path","_key","offset","isSpan","text","getBlockStartPoint","isSelectionCollapsed","selection","JSON","stringify","anchor","focus","isKeyedSegment","segment","getBlockKeyFromSelectionPoint","point","blockPathSegment","at","getChildKeyFromSelectionPoint","childPathSegment","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","selectionPoint","skippedInlineObject","value","child","spanSelectionPointToBlockOffset","blockKey","spanKey","isEqualSelectionPoints","a","b","getSelectionEndPoint","backward","getSelectionStartPoint","isTypedObject","object","isRecord","_type","parseBlocks","blocks","options","Array","isArray","flatMap","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","level","undefined","listItem","customFields","key","Object","keys","validateFields","fields","some","field","markDefs","markDefKeyMap","parseMarkDefs","parsedChildren","map","parseChild","filter","marks","span","normalizedChildren","normalize","reduce","index","previousChild","removeUnusedMarkDefs","markDef","includes","style","styles","lists","list","unparsedMarkDefs","Map","annotations","parsedAnnotation","set","parseSpan","parseInlineObject","inlineObject","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","values","fieldValues","fieldValue","defaultKeyGenerator","randomKey","getByteHexTable","table","i","toString","slice","whatwgRNG","rnds8","Uint8Array","crypto","getRandomValues","str","n","sliceBlocks","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push","parsedStartBlock","parsedEndBlock"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.slice-text-block.js","sources":["../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.slice-text-block.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n) {\n if (!isTextBlock(context, block)) {\n return false\n }\n\n const onlyText = block.children.every((child) => isSpan(context, child))\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import {isSpan} from '@portabletext/schema'\nimport type {PortableTextChild, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\nexport function sliceTextBlock({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\n block: PortableTextTextBlock\n}): PortableTextTextBlock {\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n\n if (!startPoint || !endPoint) {\n return block\n }\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (startBlockKey !== endBlockKey || startBlockKey !== block._key) {\n return block\n }\n\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startChildKey || !endChildKey) {\n return block\n }\n\n let startChildFound = false\n const children: Array<PortableTextChild> = []\n\n for (const child of block.children) {\n if (child._key === startChildKey) {\n startChildFound = true\n\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n children.push({\n ...child,\n text,\n })\n } else {\n children.push(child)\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n\n continue\n }\n\n if (child._key === endChildKey) {\n if (isSpan(context, child)) {\n children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n children.push(child)\n }\n\n break\n }\n\n if (startChildFound) {\n children.push(child)\n }\n }\n\n return {\n ...block,\n children,\n }\n}\n"],"names":["getTextBlockText","block","children","map","child","text","join","isEmptyTextBlock","context","isTextBlock","onlyText","every","isSpan","blockText","sliceTextBlock","startPoint","getSelectionStartPoint","selection","endPoint","getSelectionEndPoint","startBlockKey","getBlockKeyFromSelectionPoint","endBlockKey","_key","startChildKey","getChildKeyFromSelectionPoint","endChildKey","startChildFound","slice","offset","push"],"mappings":";;AAKO,SAASA,iBAAiBC,OAA8B;AAC7D,SAAOA,MAAMC,SAASC,IAAKC,CAAAA,UAAUA,MAAMC,QAAQ,EAAE,EAAEC,KAAK,EAAE;AAChE;ACCO,SAASC,iBACdC,SACAP,OACA;AACA,MAAI,CAACQ,YAAYD,SAASP,KAAK;AAC7B,WAAO;AAGT,QAAMS,WAAWT,MAAMC,SAASS,MAAOP,CAAAA,UAAUQ,OAAOJ,SAASJ,KAAK,CAAC,GACjES,YAAYb,iBAAiBC,KAAK;AAExC,SAAOS,YAAYG,cAAc;AACnC;ACVO,SAASC,eAAe;AAAA,EAC7BN;AAAAA,EACAP;AAIF,GAA0B;AACxB,QAAMc,aAAaC,uBAAuBR,QAAQS,SAAS,GACrDC,WAAWC,qBAAqBX,QAAQS,SAAS;AAEvD,MAAI,CAACF,cAAc,CAACG;AAClB,WAAOjB;AAGT,QAAMmB,gBAAgBC,8BAA8BN,UAAU,GACxDO,cAAcD,8BAA8BH,QAAQ;AAE1D,MAAIE,kBAAkBE,eAAeF,kBAAkBnB,MAAMsB;AAC3D,WAAOtB;AAGT,QAAMuB,gBAAgBC,8BAA8BV,UAAU,GACxDW,cAAcD,8BAA8BP,QAAQ;AAE1D,MAAI,CAACM,iBAAiB,CAACE;AACrB,WAAOzB;AAGT,MAAI0B,kBAAkB;AACtB,QAAMzB,WAAqC,CAAA;AAE3C,aAAWE,SAASH,MAAMC,UAAU;AAClC,QAAIE,MAAMmB,SAASC,eAAe;AAGhC,UAFAG,kBAAkB,IAEdf,OAAOJ,SAASJ,KAAK,GAAG;AAC1B,cAAMC,OACJD,MAAMmB,SAASG,cACXtB,MAAMC,KAAKuB,MAAMb,WAAWc,QAAQX,SAASW,MAAM,IACnDzB,MAAMC,KAAKuB,MAAMb,WAAWc,MAAM;AAExC3B,iBAAS4B,KAAK;AAAA,UACZ,GAAG1B;AAAAA,UACHC;AAAAA,QAAAA,CACD;AAAA,MACH;AACEH,iBAAS4B,KAAK1B,KAAK;AAGrB,UAAIoB,kBAAkBE;AACpB;AAGF;AAAA,IACF;AAEA,QAAItB,MAAMmB,SAASG,aAAa;AAC1Bd,aAAOJ,SAASJ,KAAK,IACvBF,SAAS4B,KAAK;AAAA,QACZ,GAAG1B;AAAAA,QACHC,MAAMD,MAAMC,KAAKuB,MAAM,GAAGV,SAASW,MAAM;AAAA,MAAA,CAC1C,IAED3B,SAAS4B,KAAK1B,KAAK;AAGrB;AAAA,IACF;AAEIuB,uBACFzB,SAAS4B,KAAK1B,KAAK;AAAA,EAEvB;AAEA,SAAO;AAAA,IACL,GAAGH;AAAAA,IACHC;AAAAA,EAAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"util.slice-text-block.js","sources":["../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.slice-text-block.ts"],"sourcesContent":["import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock | unknown,\n) {\n if (!isTextBlock(context, block)) {\n return false\n }\n\n const onlyText = block.children.every((child) => isSpan(context, child))\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import {isSpan} from '@portabletext/schema'\nimport type {PortableTextChild, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from './util.selection-point'\n\nexport function sliceTextBlock({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\n block: PortableTextTextBlock\n}): PortableTextTextBlock {\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n\n if (!startPoint || !endPoint) {\n return block\n }\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (startBlockKey !== endBlockKey || startBlockKey !== block._key) {\n return block\n }\n\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startChildKey || !endChildKey) {\n return block\n }\n\n let startChildFound = false\n const children: Array<PortableTextChild> = []\n\n for (const child of block.children) {\n if (child._key === startChildKey) {\n startChildFound = true\n\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n children.push({\n ...child,\n text,\n })\n } else {\n children.push(child)\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n\n continue\n }\n\n if (child._key === endChildKey) {\n if (isSpan(context, child)) {\n children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n children.push(child)\n }\n\n break\n }\n\n if (startChildFound) {\n children.push(child)\n }\n }\n\n return {\n ...block,\n children,\n }\n}\n"],"names":["getTextBlockText","block","children","map","child","text","join","isEmptyTextBlock","context","isTextBlock","onlyText","every","isSpan","blockText","sliceTextBlock","startPoint","getSelectionStartPoint","selection","endPoint","getSelectionEndPoint","startBlockKey","getBlockKeyFromSelectionPoint","endBlockKey","_key","startChildKey","getChildKeyFromSelectionPoint","endChildKey","startChildFound","slice","offset","push"],"mappings":";;AAKO,SAASA,iBAAiBC,OAA8B;AAC7D,SAAOA,MAAMC,SAASC,IAAKC,CAAAA,UAAUA,MAAMC,QAAQ,EAAE,EAAEC,KAAK,EAAE;AAChE;ACCO,SAASC,iBACdC,SACAP,OACA;AACA,MAAI,CAACQ,YAAYD,SAASP,KAAK;AAC7B,WAAO;AAGT,QAAMS,WAAWT,MAAMC,SAASS,MAAOP,CAAAA,UAAUQ,OAAOJ,SAASJ,KAAK,CAAC,GACjES,YAAYb,iBAAiBC,KAAK;AAExC,SAAOS,YAAYG,cAAc;AACnC;ACVO,SAASC,eAAe;AAAA,EAC7BN;AAAAA,EACAP;AAIF,GAA0B;AACxB,QAAMc,aAAaC,uBAAuBR,QAAQS,SAAS,GACrDC,WAAWC,qBAAqBX,QAAQS,SAAS;AAEvD,MAAI,CAACF,cAAc,CAACG;AAClB,WAAOjB;AAGT,QAAMmB,gBAAgBC,8BAA8BN,UAAU,GACxDO,cAAcD,8BAA8BH,QAAQ;AAE1D,MAAIE,kBAAkBE,eAAeF,kBAAkBnB,MAAMsB;AAC3D,WAAOtB;AAGT,QAAMuB,gBAAgBC,8BAA8BV,UAAU,GACxDW,cAAcD,8BAA8BP,QAAQ;AAE1D,MAAI,CAACM,iBAAiB,CAACE;AACrB,WAAOzB;AAGT,MAAI0B,kBAAkB;AACtB,QAAMzB,WAAqC,CAAA;AAE3C,aAAWE,SAASH,MAAMC,UAAU;AAClC,QAAIE,MAAMmB,SAASC,eAAe;AAGhC,UAFAG,kBAAkB,IAEdf,OAAOJ,SAASJ,KAAK,GAAG;AAC1B,cAAMC,OACJD,MAAMmB,SAASG,cACXtB,MAAMC,KAAKuB,MAAMb,WAAWc,QAAQX,SAASW,MAAM,IACnDzB,MAAMC,KAAKuB,MAAMb,WAAWc,MAAM;AAExC3B,iBAAS4B,KAAK;AAAA,UACZ,GAAG1B;AAAAA,UACHC;AAAAA,QAAAA,CACD;AAAA,MACH;AACEH,iBAAS4B,KAAK1B,KAAK;AAGrB,UAAIoB,kBAAkBE;AACpB;AAGF;AAAA,IACF;AAEA,QAAItB,MAAMmB,SAASG,aAAa;AAC1Bd,aAAOJ,SAASJ,KAAK,IACvBF,SAAS4B,KAAK;AAAA,QACZ,GAAG1B;AAAAA,QACHC,MAAMD,MAAMC,KAAKuB,MAAM,GAAGV,SAASW,MAAM;AAAA,MAAA,CAC1C,IAED3B,SAAS4B,KAAK1B,KAAK;AAGrB;AAAA,IACF;AAEIuB,uBACFzB,SAAS4B,KAAK1B,KAAK;AAAA,EAEvB;AAEA,SAAO;AAAA,IACL,GAAGH;AAAAA,IACHC;AAAAA,EAAAA;AAEJ;"}
|