@portabletext/editor 1.53.0 → 1.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/_chunks-cjs/selection-point.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs +144 -6
- package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-selection-expanded.cjs +6 -140
- package/lib/_chunks-cjs/selector.is-selection-expanded.cjs.map +1 -1
- package/lib/_chunks-cjs/util.is-equal-selection-points.cjs.map +1 -1
- package/lib/_chunks-es/selection-point.js.map +1 -1
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +148 -10
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js.map +1 -1
- package/lib/_chunks-es/selector.is-selection-expanded.js +6 -140
- package/lib/_chunks-es/selector.is-selection-expanded.js.map +1 -1
- package/lib/_chunks-es/util.is-equal-selection-points.js.map +1 -1
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +68 -9
- package/lib/behaviors/index.d.ts +68 -9
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.cjs +553 -313
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +69 -13
- package/lib/index.d.ts +69 -13
- package/lib/index.js +534 -294
- package/lib/index.js.map +1 -1
- package/lib/plugins/index.d.cts +69 -9
- package/lib/plugins/index.d.ts +69 -9
- package/lib/selectors/index.cjs +10 -10
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +42 -27
- package/lib/selectors/index.d.ts +42 -27
- package/lib/selectors/index.js +4 -4
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.d.cts +27 -5
- package/lib/utils/index.d.ts +27 -5
- package/package.json +14 -14
- package/src/behaviors/behavior.abstract.annotation.ts +51 -0
- package/src/behaviors/behavior.abstract.delete.ts +55 -0
- package/src/behaviors/behavior.perform-event.ts +6 -15
- package/src/behaviors/behavior.types.action.ts +1 -1
- package/src/behaviors/behavior.types.event.ts +32 -8
- package/src/behaviors/behavior.types.guard.ts +1 -1
- package/src/editor/Editable.tsx +3 -0
- package/src/editor/PortableTextEditor.tsx +1 -6
- package/src/editor/create-editor.ts +5 -0
- package/src/{internal-utils/selection-elements.ts → editor/editor-dom.ts} +29 -21
- package/src/editor/editor-provider.tsx +1 -6
- package/src/editor/hooks/usePortableTextEditorSelection.tsx +6 -46
- package/src/editor/plugins/createWithPatches.ts +1 -5
- package/src/editor.ts +2 -0
- package/src/index.ts +2 -0
- package/src/operations/behavior.operation.child.set.ts +103 -0
- package/src/operations/behavior.operation.child.unset.ts +89 -0
- package/src/operations/behavior.operations.ts +18 -0
- package/src/selectors/index.ts +13 -1
- package/src/selectors/selector.get-active-annotations.ts +2 -1
- package/src/selectors/selector.get-active-list-item.ts +1 -1
- package/src/selectors/selector.get-active-style.ts +1 -1
- package/src/selectors/selector.get-anchor-block.ts +3 -2
- package/src/selectors/selector.get-anchor-child.ts +2 -2
- package/src/selectors/selector.get-anchor-span.ts +2 -3
- package/src/selectors/selector.get-anchor-text-block.ts +3 -2
- package/src/selectors/selector.get-caret-word-selection.ts +1 -1
- package/src/selectors/selector.get-first-block.ts +14 -0
- package/src/selectors/selector.get-focus-block-object.ts +18 -0
- package/src/selectors/selector.get-focus-block.ts +23 -0
- package/src/selectors/selector.get-focus-child.ts +36 -0
- package/src/selectors/selector.get-focus-inline-object.ts +4 -8
- package/src/selectors/selector.get-focus-list-block.ts +18 -0
- package/src/selectors/selector.get-focus-span.ts +18 -0
- package/src/selectors/selector.get-focus-text-block.ts +18 -0
- package/src/selectors/selector.get-last-block.ts +16 -0
- package/src/selectors/selector.get-list-state.ts +2 -1
- package/src/selectors/selector.get-next-block.ts +38 -0
- package/src/selectors/selector.get-next-inline-object.ts +5 -8
- package/src/selectors/selector.get-previous-block.ts +35 -0
- package/src/selectors/selector.get-previous-inline-object.ts +5 -8
- package/src/selectors/selector.get-selected-blocks.ts +49 -0
- package/src/selectors/selector.get-selected-spans.test.ts +96 -0
- package/src/selectors/selector.get-selected-spans.ts +4 -3
- package/src/selectors/selector.get-selected-text-blocks.ts +4 -3
- package/src/selectors/selector.get-selection-end-block.ts +4 -1
- package/src/selectors/selector.get-selection-start-block.ts +4 -1
- package/src/selectors/selector.get-text-before.ts +1 -1
- package/src/selectors/selector.get-trimmed-selection.ts +1 -1
- package/src/selectors/selector.is-active-annotation.ts +1 -1
- package/src/selectors/selector.is-at-the-end-of-block.ts +3 -2
- package/src/selectors/selector.is-at-the-start-of-block.ts +3 -2
- package/src/selectors/selector.is-selecting-entire-blocks.ts +2 -1
- package/src/types/block-offset.ts +2 -2
- package/src/types/paths.ts +13 -0
- package/src/utils/util.block-offset.ts +2 -4
- package/src/utils/util.get-block-end-point.ts +3 -2
- package/src/utils/util.get-block-start-point.ts +3 -2
- package/src/selectors/selectors.ts +0 -299
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selection-point.cjs","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.is-span.ts","../../src/utils/util.slice-blocks.ts","../../src/selection/selection-point.ts"],"sourcesContent":["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\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import 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 {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 refreshKeys: 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 refreshKeys: 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: {refreshKeys: boolean; 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 isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n if (!isTypedObject(block)) {\n return false\n }\n\n if (block._type !== context.schema.block.name) {\n return false\n }\n\n if (!Array.isArray(block.children)) {\n return false\n }\n\n return true\n}\n\nexport function parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean; validateFields: boolean}\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 customFields[key] = block[key]\n }\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : 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 children = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs,\n ...(options.validateFields ? {} : 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 isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: unknown,\n): child is PortableTextSpan {\n if (!isTypedObject(child)) {\n return false\n }\n\n if (child._type !== context.schema.span.name) {\n return false\n }\n\n if (typeof child.text !== 'string') {\n return false\n }\n\n return true\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: {refreshKeys: boolean; validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(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 // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\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 return {\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; 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: options.refreshKeys\n ? context.keyGenerator()\n : typeof object._key === 'string'\n ? object._key\n : context.keyGenerator(),\n ...values,\n }\n}\n","import type {KeyedSegment} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\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:\n | {path: [KeyedSegment, 'children', KeyedSegment]; offset: number}\n | 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 {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport type {EditorSelectionPoint} from '../types/editor'\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: [KeyedSegment]\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, EditorSelectionPoint} from '..'\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 '..'\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 {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 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 {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint, getSelectionStartPoint} from '../utils'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\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 (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(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from '../utils'\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"],"names":["isTypedObject","object","isRecord","_type","value","parseBlocks","context","blocks","options","Array","isArray","flatMap","block","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","isTextBlock","level","undefined","listItem","children","customFields","key","Object","keys","_key","refreshKeys","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","validateFields","style","styles","defaultStyle","at","console","error","lists","list","isSpan","mark","markDefKey","get","decorators","some","decorator","inlineObjects","parseAnnotation","annotation","values","fields","reduce","fieldValues","field","fieldValue","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","path","spanSelectionPointToBlockOffset","blockKey","getBlockKeyFromSelectionPoint","spanKey","getChildKeyFromSelectionPoint","getBlockStartPoint","node","getSelectionEndPoint","selection","backward","anchor","focus","getSelectionStartPoint","getTextBlockText","join","isKeyedSegment","segment","sliceBlocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push","point","blockPathSegment","childPathSegment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selection-point.cjs","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.is-span.ts","../../src/utils/util.slice-blocks.ts","../../src/selection/selection-point.ts"],"sourcesContent":["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\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import 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 {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 refreshKeys: 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 refreshKeys: 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: {refreshKeys: boolean; 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 isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n if (!isTypedObject(block)) {\n return false\n }\n\n if (block._type !== context.schema.block.name) {\n return false\n }\n\n if (!Array.isArray(block.children)) {\n return false\n }\n\n return true\n}\n\nexport function parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean; validateFields: boolean}\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 customFields[key] = block[key]\n }\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : 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 children = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs,\n ...(options.validateFields ? {} : 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 isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: unknown,\n): child is PortableTextSpan {\n if (!isTypedObject(child)) {\n return false\n }\n\n if (child._type !== context.schema.span.name) {\n return false\n }\n\n if (typeof child.text !== 'string') {\n return false\n }\n\n return true\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: {refreshKeys: boolean; validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(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 // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\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 return {\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; 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: {refreshKeys: boolean; 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: options.refreshKeys\n ? context.keyGenerator()\n : typeof object._key === 'string'\n ? object._key\n : context.keyGenerator(),\n ...values,\n }\n}\n","import type {EditorContext} from '../editor/editor-snapshot'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\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 {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\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, EditorSelectionPoint} from '..'\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 '..'\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 {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 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 {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint, getSelectionStartPoint} from '../utils'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\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 (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(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n","import type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from '../utils'\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"],"names":["isTypedObject","object","isRecord","_type","value","parseBlocks","context","blocks","options","Array","isArray","flatMap","block","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","isTextBlock","level","undefined","listItem","children","customFields","key","Object","keys","_key","refreshKeys","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","validateFields","style","styles","defaultStyle","at","console","error","lists","list","isSpan","mark","markDefKey","get","decorators","some","decorator","inlineObjects","parseAnnotation","annotation","values","fields","reduce","fieldValues","field","fieldValue","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","path","spanSelectionPointToBlockOffset","blockKey","getBlockKeyFromSelectionPoint","spanKey","getChildKeyFromSelectionPoint","getBlockStartPoint","node","getSelectionEndPoint","selection","backward","anchor","focus","getSelectionStartPoint","getTextBlockText","join","isKeyedSegment","segment","sliceBlocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push","point","blockPathSegment","childPathSegment"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector.get-text-before.cjs","sources":["../../src/selectors/selector.get-text-before.ts"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectionStartPoint} from '../utils'\nimport {getBlockStartPoint} from '../utils/util.get-block-start-point'\nimport {
|
|
1
|
+
{"version":3,"file":"selector.get-text-before.cjs","sources":["../../src/selectors/selector.get-text-before.ts"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectionStartPoint} from '../utils'\nimport {getBlockStartPoint} from '../utils/util.get-block-start-point'\nimport {getFocusBlock} from './selector.get-focus-block'\nimport {getSelectionText} from './selector.get-selection-text'\n\n/**\n * @public\n */\nexport const getBlockTextBefore: EditorSelector<string> = (snapshot) => {\n if (!snapshot.context.selection) {\n return ''\n }\n\n const startPoint = getSelectionStartPoint(snapshot.context.selection)\n const block = getFocusBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: startPoint,\n focus: startPoint,\n },\n },\n })\n\n if (!block) {\n return ''\n }\n\n const startOfBlock = getBlockStartPoint({\n context: snapshot.context,\n block,\n })\n\n return getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: startOfBlock,\n focus: startPoint,\n },\n },\n })\n}\n"],"names":["getBlockTextBefore","snapshot","context","selection","startPoint","getSelectionStartPoint","block","getFocusBlock","anchor","focus","startOfBlock","getBlockStartPoint","getSelectionText"],"mappings":";;AASO,MAAMA,qBAA8CC,CAAa,aAAA;AAClE,MAAA,CAACA,SAASC,QAAQC;AACb,WAAA;AAGT,QAAMC,aAAaC,eAAAA,uBAAuBJ,SAASC,QAAQC,SAAS,GAC9DG,QAAQC,2CAAc;AAAA,IAE1BL,SAAS;AAAA,MACP,GAAGD,SAASC;AAAAA,MACZC,WAAW;AAAA,QACTK,QAAQJ;AAAAA,QACRK,OAAOL;AAAAA,MAAAA;AAAAA,IACT;AAAA,EACF,CACD;AAED,MAAI,CAACE;AACI,WAAA;AAGT,QAAMI,eAAeC,eAAAA,mBAAmB;AAAA,IACtCT,SAASD,SAASC;AAAAA,IAClBI;AAAAA,EAAAA,CACD;AAED,SAAOM,8CAAiB;AAAA,IAEtBV,SAAS;AAAA,MACP,GAAGD,SAASC;AAAAA,MACZC,WAAW;AAAA,QACTK,QAAQE;AAAAA,QACRD,OAAOL;AAAAA,MAAAA;AAAAA,IACT;AAAA,EACF,CACD;AACH;;"}
|
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var selectionPoint = require("./selection-point.cjs"), selector_isSelectionExpanded = require("./selector.is-selection-expanded.cjs"), util_isEqualSelectionPoints = require("./util.is-equal-selection-points.cjs"), types = require("@sanity/types");
|
|
3
|
-
const
|
|
3
|
+
const getSelectedBlocks = (snapshot) => {
|
|
4
|
+
if (!snapshot.context.selection)
|
|
5
|
+
return [];
|
|
6
|
+
const selectedBlocks = [], startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection), endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection), startKey = selectionPoint.getBlockKeyFromSelectionPoint(startPoint), endKey = selectionPoint.getBlockKeyFromSelectionPoint(endPoint);
|
|
7
|
+
if (!startKey || !endKey)
|
|
8
|
+
return selectedBlocks;
|
|
9
|
+
for (const block of snapshot.context.value) {
|
|
10
|
+
if (block._key === startKey) {
|
|
11
|
+
if (selectedBlocks.push({
|
|
12
|
+
node: block,
|
|
13
|
+
path: [{
|
|
14
|
+
_key: block._key
|
|
15
|
+
}]
|
|
16
|
+
}), startKey === endKey)
|
|
17
|
+
break;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (block._key === endKey) {
|
|
21
|
+
selectedBlocks.push({
|
|
22
|
+
node: block,
|
|
23
|
+
path: [{
|
|
24
|
+
_key: block._key
|
|
25
|
+
}]
|
|
26
|
+
});
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
selectedBlocks.length > 0 && selectedBlocks.push({
|
|
30
|
+
node: block,
|
|
31
|
+
path: [{
|
|
32
|
+
_key: block._key
|
|
33
|
+
}]
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
return selectedBlocks;
|
|
37
|
+
}, getSelectionEndPoint = (snapshot) => {
|
|
4
38
|
if (snapshot.context.selection)
|
|
5
39
|
return snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus;
|
|
6
40
|
}, getSelectedSpans = (snapshot) => {
|
|
@@ -95,7 +129,7 @@ const getSelectionEndPoint = (snapshot) => {
|
|
|
95
129
|
}, getActiveAnnotations = (snapshot) => {
|
|
96
130
|
if (!snapshot.context.selection)
|
|
97
131
|
return [];
|
|
98
|
-
const selectedBlocks =
|
|
132
|
+
const selectedBlocks = getSelectedBlocks(snapshot), selectedSpans = getSelectedSpans(snapshot), focusSpan = selector_isSelectionExpanded.getFocusSpan(snapshot);
|
|
99
133
|
if (selectedSpans.length === 0 || !focusSpan)
|
|
100
134
|
return [];
|
|
101
135
|
if (selectedSpans.length === 1 && selector_isSelectionExpanded.isSelectionCollapsed(snapshot)) {
|
|
@@ -109,7 +143,7 @@ const getSelectionEndPoint = (snapshot) => {
|
|
|
109
143
|
}, getActiveListItem = (snapshot) => {
|
|
110
144
|
if (!snapshot.context.selection)
|
|
111
145
|
return;
|
|
112
|
-
const selectedTextBlocks =
|
|
146
|
+
const selectedTextBlocks = getSelectedBlocks(snapshot).map((block) => block.node).filter((block) => selectionPoint.isTextBlock(snapshot.context, block)), firstTextBlock = selectedTextBlocks.at(0);
|
|
113
147
|
if (!firstTextBlock)
|
|
114
148
|
return;
|
|
115
149
|
const firstListItem = firstTextBlock.listItem;
|
|
@@ -118,7 +152,7 @@ const getSelectionEndPoint = (snapshot) => {
|
|
|
118
152
|
}, getActiveStyle = (snapshot) => {
|
|
119
153
|
if (!snapshot.context.selection)
|
|
120
154
|
return;
|
|
121
|
-
const selectedTextBlocks =
|
|
155
|
+
const selectedTextBlocks = getSelectedBlocks(snapshot).map((block) => block.node).filter((block) => selectionPoint.isTextBlock(snapshot.context, block)), firstTextBlock = selectedTextBlocks.at(0);
|
|
122
156
|
if (!firstTextBlock)
|
|
123
157
|
return;
|
|
124
158
|
const firstStyle = firstTextBlock.style;
|
|
@@ -212,12 +246,107 @@ const getSelectionEndPoint = (snapshot) => {
|
|
|
212
246
|
selection: caretWordSelection
|
|
213
247
|
}
|
|
214
248
|
}) ? caretWordSelection : null;
|
|
249
|
+
}, getFirstBlock = (snapshot) => {
|
|
250
|
+
const node = snapshot.context.value[0];
|
|
251
|
+
return node ? {
|
|
252
|
+
node,
|
|
253
|
+
path: [{
|
|
254
|
+
_key: node._key
|
|
255
|
+
}]
|
|
256
|
+
} : void 0;
|
|
257
|
+
}, getFocusBlockObject = (snapshot) => {
|
|
258
|
+
const focusBlock = selector_isSelectionExpanded.getFocusBlock(snapshot);
|
|
259
|
+
return focusBlock && !selectionPoint.isTextBlock(snapshot.context, focusBlock.node) ? {
|
|
260
|
+
node: focusBlock.node,
|
|
261
|
+
path: focusBlock.path
|
|
262
|
+
} : void 0;
|
|
215
263
|
}, getFocusInlineObject = (snapshot) => {
|
|
216
264
|
const focusChild = selector_isSelectionExpanded.getFocusChild(snapshot);
|
|
217
265
|
return focusChild && !types.isPortableTextSpan(focusChild.node) ? {
|
|
218
266
|
node: focusChild.node,
|
|
219
267
|
path: focusChild.path
|
|
220
268
|
} : void 0;
|
|
269
|
+
}, getFocusListBlock = (snapshot) => {
|
|
270
|
+
const focusTextBlock = selector_isSelectionExpanded.getFocusTextBlock(snapshot);
|
|
271
|
+
return focusTextBlock && selectionPoint.isListBlock(snapshot.context, focusTextBlock.node) ? {
|
|
272
|
+
node: focusTextBlock.node,
|
|
273
|
+
path: focusTextBlock.path
|
|
274
|
+
} : void 0;
|
|
275
|
+
}, getLastBlock = (snapshot) => {
|
|
276
|
+
const node = snapshot.context.value[snapshot.context.value.length - 1] ? snapshot.context.value[snapshot.context.value.length - 1] : void 0;
|
|
277
|
+
return node ? {
|
|
278
|
+
node,
|
|
279
|
+
path: [{
|
|
280
|
+
_key: node._key
|
|
281
|
+
}]
|
|
282
|
+
} : void 0;
|
|
283
|
+
}, getSelectionStartBlock = (snapshot) => {
|
|
284
|
+
const startPoint = selectionPoint.getSelectionStartPoint(snapshot.context.selection);
|
|
285
|
+
if (startPoint)
|
|
286
|
+
return selector_isSelectionExpanded.getFocusBlock({
|
|
287
|
+
context: {
|
|
288
|
+
...snapshot.context,
|
|
289
|
+
selection: {
|
|
290
|
+
anchor: startPoint,
|
|
291
|
+
focus: startPoint
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}, getPreviousBlock = (snapshot) => {
|
|
296
|
+
let previousBlock;
|
|
297
|
+
const selectionStartBlock = getSelectionStartBlock(snapshot);
|
|
298
|
+
if (!selectionStartBlock)
|
|
299
|
+
return;
|
|
300
|
+
let foundSelectionStartBlock = !1;
|
|
301
|
+
for (const block of snapshot.context.value) {
|
|
302
|
+
if (block._key === selectionStartBlock.node._key) {
|
|
303
|
+
foundSelectionStartBlock = !0;
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
previousBlock = {
|
|
307
|
+
node: block,
|
|
308
|
+
path: [{
|
|
309
|
+
_key: block._key
|
|
310
|
+
}]
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
if (foundSelectionStartBlock && previousBlock)
|
|
314
|
+
return previousBlock;
|
|
315
|
+
}, getSelectionEndBlock = (snapshot) => {
|
|
316
|
+
const endPoint = selectionPoint.getSelectionEndPoint(snapshot.context.selection);
|
|
317
|
+
if (endPoint)
|
|
318
|
+
return selector_isSelectionExpanded.getFocusBlock({
|
|
319
|
+
context: {
|
|
320
|
+
...snapshot.context,
|
|
321
|
+
selection: {
|
|
322
|
+
anchor: endPoint,
|
|
323
|
+
focus: endPoint
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}, getNextBlock = (snapshot) => {
|
|
328
|
+
let nextBlock;
|
|
329
|
+
const selectionEndBlock = getSelectionEndBlock(snapshot);
|
|
330
|
+
if (!selectionEndBlock)
|
|
331
|
+
return;
|
|
332
|
+
let foundSelectionEndBlock = !1;
|
|
333
|
+
for (const block of snapshot.context.value) {
|
|
334
|
+
if (block._key === selectionEndBlock.node._key) {
|
|
335
|
+
foundSelectionEndBlock = !0;
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
if (foundSelectionEndBlock) {
|
|
339
|
+
nextBlock = {
|
|
340
|
+
node: block,
|
|
341
|
+
path: [{
|
|
342
|
+
_key: block._key
|
|
343
|
+
}]
|
|
344
|
+
};
|
|
345
|
+
break;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (foundSelectionEndBlock && nextBlock)
|
|
349
|
+
return nextBlock;
|
|
221
350
|
}, getSelectedTextBlocks = (snapshot) => {
|
|
222
351
|
if (!snapshot.context.selection)
|
|
223
352
|
return [];
|
|
@@ -337,7 +466,7 @@ const getSelectionEndPoint = (snapshot) => {
|
|
|
337
466
|
return trimmedSelection;
|
|
338
467
|
};
|
|
339
468
|
function isActiveAnnotation(annotation) {
|
|
340
|
-
return (snapshot) =>
|
|
469
|
+
return (snapshot) => getSelectedBlocks(snapshot).flatMap((block) => selectionPoint.isTextBlock(snapshot.context, block.node) ? block.node.markDefs ?? [] : []).filter((markDef) => markDef._type === annotation && snapshot.beta.activeAnnotations.includes(markDef._key)).length > 0;
|
|
341
470
|
}
|
|
342
471
|
function isActiveDecorator(decorator) {
|
|
343
472
|
return (snapshot) => {
|
|
@@ -506,7 +635,7 @@ function isOverlappingSelection(selection) {
|
|
|
506
635
|
const isSelectingEntireBlocks = (snapshot) => {
|
|
507
636
|
if (!snapshot.context.selection)
|
|
508
637
|
return !1;
|
|
509
|
-
const startPoint = snapshot.context.selection.backward ? snapshot.context.selection.focus : snapshot.context.selection.anchor, endPoint = snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus, startBlock =
|
|
638
|
+
const startPoint = snapshot.context.selection.backward ? snapshot.context.selection.focus : snapshot.context.selection.anchor, endPoint = snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus, startBlock = getSelectionStartBlock(snapshot), endBlock = getSelectionEndBlock(snapshot);
|
|
510
639
|
if (!startBlock || !endBlock)
|
|
511
640
|
return !1;
|
|
512
641
|
const startBlockStartPoint = selectionPoint.getBlockStartPoint({
|
|
@@ -522,11 +651,20 @@ exports.getActiveAnnotations = getActiveAnnotations;
|
|
|
522
651
|
exports.getActiveListItem = getActiveListItem;
|
|
523
652
|
exports.getActiveStyle = getActiveStyle;
|
|
524
653
|
exports.getCaretWordSelection = getCaretWordSelection;
|
|
654
|
+
exports.getFirstBlock = getFirstBlock;
|
|
655
|
+
exports.getFocusBlockObject = getFocusBlockObject;
|
|
525
656
|
exports.getFocusInlineObject = getFocusInlineObject;
|
|
657
|
+
exports.getFocusListBlock = getFocusListBlock;
|
|
658
|
+
exports.getLastBlock = getLastBlock;
|
|
659
|
+
exports.getNextBlock = getNextBlock;
|
|
526
660
|
exports.getNextInlineObject = getNextInlineObject;
|
|
661
|
+
exports.getPreviousBlock = getPreviousBlock;
|
|
662
|
+
exports.getSelectedBlocks = getSelectedBlocks;
|
|
527
663
|
exports.getSelectedSpans = getSelectedSpans;
|
|
528
664
|
exports.getSelectedTextBlocks = getSelectedTextBlocks;
|
|
665
|
+
exports.getSelectionEndBlock = getSelectionEndBlock;
|
|
529
666
|
exports.getSelectionEndPoint = getSelectionEndPoint;
|
|
667
|
+
exports.getSelectionStartBlock = getSelectionStartBlock;
|
|
530
668
|
exports.getTrimmedSelection = getTrimmedSelection;
|
|
531
669
|
exports.isActiveAnnotation = isActiveAnnotation;
|
|
532
670
|
exports.isActiveDecorator = isActiveDecorator;
|