@portabletext/editor 3.1.1 → 3.2.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/README.md +7 -0
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.js +75 -1
- package/lib/index.js.map +1 -1
- package/package.json +17 -16
- package/src/behaviors/behavior.abstract.deserialize.ts +26 -0
- package/src/behaviors/behavior.abstract.serialize.ts +5 -0
- package/src/behaviors/behavior.types.behavior.ts +4 -6
- package/src/behaviors/behavior.types.event.ts +2 -4
- package/src/converters/converter.text-markdown.ts +67 -0
- package/src/converters/converters.core.ts +2 -0
- package/src/types/slate.ts +4 -2
- package/src/utils/util.get-selection-end-point.ts +4 -4
- package/src/utils/util.get-selection-start-point.ts +4 -4
package/README.md
CHANGED
|
@@ -428,6 +428,13 @@ Now, you should be able to run `pnpm dev:test-studio` in the `sanity` repo to te
|
|
|
428
428
|
|
|
429
429
|
This monorepo also contains additional libraries that can be used with the Portable Text Editor:
|
|
430
430
|
|
|
431
|
+
### `@portabletext/markdown`
|
|
432
|
+
|
|
433
|
+
> Convert Portable Text to Markdown and back again
|
|
434
|
+
|
|
435
|
+
- 💻 [./packages/markdown](./packages/markdown/)
|
|
436
|
+
- 📦 [@portabletext/markdown](https://www.npmjs.com/package/@portabletext/markdown)
|
|
437
|
+
|
|
431
438
|
### `@portabletext/keyboard-shortcuts`
|
|
432
439
|
|
|
433
440
|
> A TypeScript library for creating platform-aware keyboard shortcuts with automatic detection of Apple vs non-Apple platforms.
|
|
@@ -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/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
|
+
{"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 EditorSelectionPoint | null =\n TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends EditorSelectionPoint | null =\n TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\n}\n","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":"index.js","sources":["../../src/behaviors/behavior.types.action.ts","../../src/behaviors/behavior.types.behavior.ts"],"sourcesContent":["import type {EditorDom} from '../editor/editor-dom'\nimport type {EditorSnapshot} from '../editor/editor-snapshot'\nimport type {PickFromUnion} from '../type-utils'\nimport type {\n CustomBehaviorEvent,\n ExternalBehaviorEvent,\n NativeBehaviorEvent,\n SyntheticBehaviorEvent,\n} from './behavior.types.event'\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | {\n type: 'execute'\n event: SyntheticBehaviorEvent\n }\n | {\n type: 'forward'\n event: NativeBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'raise'\n event: SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'effect'\n effect: (payload: {\n /**\n * Send a Behavior Event back into the Editor.\n *\n * @example\n * ```ts\n * defineBehavior({\n * on: '...',\n * actions: [\n * () => [\n * effect(({send}) => {\n * doSomethingAsync()\n * .then(() => {\n * send({\n * type: '...',\n * })\n * })\n * })\n * ],\n * ],\n * })\n * ```\n */\n send: (event: ExternalBehaviorEvent) => void\n }) => void\n }\n\n/**\n * @beta\n */\nexport function execute(\n event: SyntheticBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'execute'> {\n return {type: 'execute', event}\n}\n\n/**\n * @beta\n */\nexport function forward(\n event: NativeBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'forward'> {\n return {type: 'forward', event}\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport function effect(\n effect: PickFromUnion<BehaviorAction, 'type', 'effect'>['effect'],\n): PickFromUnion<BehaviorAction, 'type', 'effect'> {\n return {type: 'effect', effect}\n}\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n dom: EditorDom\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n","import type {BehaviorActionSet} from './behavior.types.action'\nimport type {\n BehaviorEvent,\n BehaviorEventTypeNamespace,\n CustomBehaviorEvent,\n ResolveBehaviorEvent,\n} from './behavior.types.event'\nimport type {BehaviorGuard} from './behavior.types.guard'\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] =\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/behaviors/behavior.types.action.ts","../../src/behaviors/behavior.types.behavior.ts"],"sourcesContent":["import type {EditorDom} from '../editor/editor-dom'\nimport type {EditorSnapshot} from '../editor/editor-snapshot'\nimport type {PickFromUnion} from '../type-utils'\nimport type {\n CustomBehaviorEvent,\n ExternalBehaviorEvent,\n NativeBehaviorEvent,\n SyntheticBehaviorEvent,\n} from './behavior.types.event'\n\n/**\n * @beta\n */\nexport type BehaviorAction =\n | {\n type: 'execute'\n event: SyntheticBehaviorEvent\n }\n | {\n type: 'forward'\n event: NativeBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'raise'\n event: SyntheticBehaviorEvent | CustomBehaviorEvent\n }\n | {\n type: 'effect'\n effect: (payload: {\n /**\n * Send a Behavior Event back into the Editor.\n *\n * @example\n * ```ts\n * defineBehavior({\n * on: '...',\n * actions: [\n * () => [\n * effect(({send}) => {\n * doSomethingAsync()\n * .then(() => {\n * send({\n * type: '...',\n * })\n * })\n * })\n * ],\n * ],\n * })\n * ```\n */\n send: (event: ExternalBehaviorEvent) => void\n }) => void\n }\n\n/**\n * @beta\n */\nexport function execute(\n event: SyntheticBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'execute'> {\n return {type: 'execute', event}\n}\n\n/**\n * @beta\n */\nexport function forward(\n event: NativeBehaviorEvent | SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'forward'> {\n return {type: 'forward', event}\n}\n\n/**\n * @beta\n */\nexport function raise(\n event: SyntheticBehaviorEvent | CustomBehaviorEvent,\n): PickFromUnion<BehaviorAction, 'type', 'raise'> {\n return {type: 'raise', event}\n}\n\n/**\n * @beta\n */\nexport function effect(\n effect: PickFromUnion<BehaviorAction, 'type', 'effect'>['effect'],\n): PickFromUnion<BehaviorAction, 'type', 'effect'> {\n return {type: 'effect', effect}\n}\n\n/**\n * @beta\n */\nexport type BehaviorActionSet<TBehaviorEvent, TGuardResponse> = (\n payload: {\n snapshot: EditorSnapshot\n event: TBehaviorEvent\n dom: EditorDom\n },\n guardResponse: TGuardResponse,\n) => Array<BehaviorAction>\n","import type {BehaviorActionSet} from './behavior.types.action'\nimport type {\n BehaviorEvent,\n BehaviorEventTypeNamespace,\n CustomBehaviorEvent,\n ResolveBehaviorEvent,\n} from './behavior.types.event'\nimport type {BehaviorGuard} from './behavior.types.guard'\n\n/**\n * @beta\n */\nexport type Behavior<\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] =\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends ResolveBehaviorEvent<TBehaviorEventType> =\n ResolveBehaviorEvent<TBehaviorEventType>,\n> = {\n /**\n * Editor Event that triggers this Behavior.\n */\n on: TBehaviorEventType\n /**\n * Predicate function that determines if the Behavior should be executed.\n * Returning a non-nullable value from the guard will pass the value to the\n * actions and execute them.\n */\n guard?: BehaviorGuard<TBehaviorEvent, TGuardResponse>\n /**\n * Array of Behavior Action sets.\n * Each set represents a step in the history stack.\n */\n actions: Array<BehaviorActionSet<TBehaviorEvent, TGuardResponse>>\n}\n\n/**\n * @beta\n *\n * @example\n *\n * ```tsx\n * const noLowerCaseA = defineBehavior({\n * on: 'insert.text',\n * guard: ({event, snapshot}) => event.text === 'a',\n * actions: [({event, snapshot}) => [{type: 'insert.text', text: 'A'}]],\n * })\n * ```\n *\n */\nexport function defineBehavior<\n TPayload extends Record<string, unknown>,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = CustomBehaviorEvent['type'],\n TGuardResponse = true,\n>(\n behavior: Behavior<\n TBehaviorEventType,\n TGuardResponse,\n ResolveBehaviorEvent<TBehaviorEventType, TPayload>\n >,\n): Behavior\nexport function defineBehavior<\n TPayload extends never = never,\n TBehaviorEventType extends\n | '*'\n | `${BehaviorEventTypeNamespace}.*`\n | BehaviorEvent['type'] = BehaviorEvent['type'],\n TGuardResponse = true,\n TBehaviorEvent extends ResolveBehaviorEvent<TBehaviorEventType, TPayload> =\n ResolveBehaviorEvent<TBehaviorEventType, TPayload>,\n>(\n behavior: Behavior<TBehaviorEventType, TGuardResponse, TBehaviorEvent>,\n): Behavior {\n return behavior as unknown as Behavior\n}\n"],"names":["execute","event","type","forward","raise","effect","defineBehavior","behavior"],"mappings":"AA0DO,SAASA,QACdC,OACkD;AAClD,SAAO;AAAA,IAACC,MAAM;AAAA,IAAWD;AAAAA,EAAAA;AAC3B;AAKO,SAASE,QACdF,OACkD;AAClD,SAAO;AAAA,IAACC,MAAM;AAAA,IAAWD;AAAAA,EAAAA;AAC3B;AAKO,SAASG,MACdH,OACgD;AAChD,SAAO;AAAA,IAACC,MAAM;AAAA,IAASD;AAAAA,EAAAA;AACzB;AAKO,SAASI,OACdA,SACiD;AACjD,SAAO;AAAA,IAACH,MAAM;AAAA,IAAUG,QAAAA;AAAAA,EAAAA;AAC1B;ACpBO,SAASC,eAUdC,UACU;AACV,SAAOA;AACT;"}
|
package/lib/index.js
CHANGED
|
@@ -19,6 +19,7 @@ import { setup, fromCallback, assign, and, enqueueActions, emit, assertEvent, ra
|
|
|
19
19
|
import { compileSchemaDefinitionToPortableTextMemberSchemaTypes, createPortableTextMemberSchemaTypes, portableTextMemberSchemaTypesToSchema } from "@portabletext/sanity-bridge";
|
|
20
20
|
import { htmlToBlocks } from "@portabletext/block-tools";
|
|
21
21
|
import { toHTML } from "@portabletext/to-html";
|
|
22
|
+
import { markdownToPortableText, portableTextToMarkdown } from "@portabletext/markdown";
|
|
22
23
|
import { Schema } from "@sanity/schema";
|
|
23
24
|
import flatten from "lodash/flatten.js";
|
|
24
25
|
import { set, applyAll, unset, insert, setIfMissing, diffMatchPatch as diffMatchPatch$1 } from "@portabletext/patches";
|
|
@@ -2734,6 +2735,57 @@ function createConverterTextHtml(legacySchema) {
|
|
|
2734
2735
|
}
|
|
2735
2736
|
};
|
|
2736
2737
|
}
|
|
2738
|
+
const converterTextMarkdown = {
|
|
2739
|
+
mimeType: "text/markdown",
|
|
2740
|
+
serialize: ({
|
|
2741
|
+
snapshot,
|
|
2742
|
+
event
|
|
2743
|
+
}) => {
|
|
2744
|
+
if (!snapshot.context.selection)
|
|
2745
|
+
return {
|
|
2746
|
+
type: "serialization.failure",
|
|
2747
|
+
mimeType: "text/markdown",
|
|
2748
|
+
reason: "No selection",
|
|
2749
|
+
originEvent: event.originEvent
|
|
2750
|
+
};
|
|
2751
|
+
const blocks = getSelectedValue(snapshot);
|
|
2752
|
+
return {
|
|
2753
|
+
type: "serialization.success",
|
|
2754
|
+
data: portableTextToMarkdown(blocks),
|
|
2755
|
+
mimeType: "text/markdown",
|
|
2756
|
+
originEvent: event.originEvent
|
|
2757
|
+
};
|
|
2758
|
+
},
|
|
2759
|
+
deserialize: ({
|
|
2760
|
+
snapshot,
|
|
2761
|
+
event
|
|
2762
|
+
}) => {
|
|
2763
|
+
const parsedBlocks = markdownToPortableText(event.data, {
|
|
2764
|
+
keyGenerator: snapshot.context.keyGenerator,
|
|
2765
|
+
schema: snapshot.context.schema
|
|
2766
|
+
}).flatMap((block) => {
|
|
2767
|
+
const parsedBlock = parseBlock({
|
|
2768
|
+
context: snapshot.context,
|
|
2769
|
+
block,
|
|
2770
|
+
options: {
|
|
2771
|
+
normalize: !1,
|
|
2772
|
+
removeUnusedMarkDefs: !0,
|
|
2773
|
+
validateFields: !1
|
|
2774
|
+
}
|
|
2775
|
+
});
|
|
2776
|
+
return parsedBlock ? [parsedBlock] : [];
|
|
2777
|
+
});
|
|
2778
|
+
return parsedBlocks.length === 0 ? {
|
|
2779
|
+
type: "deserialization.failure",
|
|
2780
|
+
mimeType: "text/markdown",
|
|
2781
|
+
reason: "No blocks deserialized"
|
|
2782
|
+
} : {
|
|
2783
|
+
type: "deserialization.success",
|
|
2784
|
+
data: parsedBlocks,
|
|
2785
|
+
mimeType: "text/markdown"
|
|
2786
|
+
};
|
|
2787
|
+
}
|
|
2788
|
+
};
|
|
2737
2789
|
function createConverterTextPlain(legacySchema) {
|
|
2738
2790
|
return {
|
|
2739
2791
|
mimeType: "text/plain",
|
|
@@ -2797,7 +2849,7 @@ function escapeHtml(str) {
|
|
|
2797
2849
|
return String(str).replace(/[&<>"'`=/]/g, (s) => entityMap[s]);
|
|
2798
2850
|
}
|
|
2799
2851
|
function createCoreConverters(legacySchema) {
|
|
2800
|
-
return [converterJson, converterPortableText, createConverterTextHtml(legacySchema), createConverterTextPlain(legacySchema)];
|
|
2852
|
+
return [converterJson, converterPortableText, converterTextMarkdown, createConverterTextHtml(legacySchema), createConverterTextPlain(legacySchema)];
|
|
2801
2853
|
}
|
|
2802
2854
|
function compileType(rawType) {
|
|
2803
2855
|
return Schema.compile({
|
|
@@ -8459,6 +8511,14 @@ const abstractAnnotationBehaviors = [defineBehavior({
|
|
|
8459
8511
|
data: json,
|
|
8460
8512
|
originEvent: event.originEvent
|
|
8461
8513
|
};
|
|
8514
|
+
const markdown = event.originEvent.originEvent.dataTransfer.getData("text/markdown");
|
|
8515
|
+
if (markdown)
|
|
8516
|
+
return {
|
|
8517
|
+
type: "deserialize.data",
|
|
8518
|
+
mimeType: "text/markdown",
|
|
8519
|
+
data: markdown,
|
|
8520
|
+
originEvent: event.originEvent
|
|
8521
|
+
};
|
|
8462
8522
|
const html = event.originEvent.originEvent.dataTransfer.getData("text/html");
|
|
8463
8523
|
if (html)
|
|
8464
8524
|
return {
|
|
@@ -8589,6 +8649,16 @@ const abstractAnnotationBehaviors = [defineBehavior({
|
|
|
8589
8649
|
};
|
|
8590
8650
|
}
|
|
8591
8651
|
if (event.mimeType === "application/json") {
|
|
8652
|
+
const markdown = event.originEvent.originEvent.dataTransfer.getData("text/markdown");
|
|
8653
|
+
if (markdown)
|
|
8654
|
+
return {
|
|
8655
|
+
type: "deserialize.data",
|
|
8656
|
+
mimeType: "text/markdown",
|
|
8657
|
+
data: markdown,
|
|
8658
|
+
originEvent: event.originEvent
|
|
8659
|
+
};
|
|
8660
|
+
}
|
|
8661
|
+
if (event.mimeType === "text/markdown") {
|
|
8592
8662
|
const html = event.originEvent.originEvent.dataTransfer.getData("text/html");
|
|
8593
8663
|
if (html)
|
|
8594
8664
|
return {
|
|
@@ -9466,6 +9536,10 @@ const abstractAnnotationBehaviors = [defineBehavior({
|
|
|
9466
9536
|
type: "serialize.data",
|
|
9467
9537
|
mimeType: "application/json",
|
|
9468
9538
|
originEvent: event.originEvent
|
|
9539
|
+
}), raise({
|
|
9540
|
+
type: "serialize.data",
|
|
9541
|
+
mimeType: "text/markdown",
|
|
9542
|
+
originEvent: event.originEvent
|
|
9469
9543
|
}), raise({
|
|
9470
9544
|
type: "serialize.data",
|
|
9471
9545
|
mimeType: "text/html",
|