@portabletext/editor 1.45.1 → 1.45.3
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/behavior.markdown.cjs +8 -8
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/editor-provider.cjs +36 -39
- package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
- package/lib/_chunks-cjs/parse-blocks.cjs +4 -1
- package/lib/_chunks-cjs/parse-blocks.cjs.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +9 -9
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/editor-provider.js +36 -39
- package/lib/_chunks-es/editor-provider.js.map +1 -1
- package/lib/_chunks-es/parse-blocks.js +4 -1
- package/lib/_chunks-es/parse-blocks.js.map +1 -1
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +1 -1
- package/lib/behaviors/index.cjs +4 -4
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +282 -282
- package/lib/behaviors/index.d.ts +282 -282
- package/lib/behaviors/index.js +4 -4
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.d.cts +8 -8
- package/lib/index.d.ts +8 -8
- package/lib/plugins/index.cjs +4 -4
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +8 -8
- package/lib/plugins/index.d.ts +8 -8
- package/lib/plugins/index.js +4 -4
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.d.cts +8 -8
- package/lib/selectors/index.d.ts +8 -8
- package/lib/utils/index.d.cts +8 -8
- package/lib/utils/index.d.ts +8 -8
- package/package.json +6 -6
- package/src/behavior-actions/behavior.action.insert.text.ts +2 -1
- package/src/behavior-actions/behavior.actions.ts +0 -9
- package/src/behaviors/behavior.abstract.delete.ts +42 -0
- package/src/behaviors/behavior.decorator-pair.ts +5 -4
- package/src/behaviors/behavior.default.ts +2 -0
- package/src/behaviors/behavior.emoji-picker.ts +5 -4
- package/src/behaviors/behavior.markdown.ts +9 -8
- package/src/behaviors/behavior.types.event.ts +8 -8
- package/src/internal-utils/parse-blocks.ts +6 -1
- package/src/behavior-actions/behavior.action.delete.text.ts +0 -53
|
@@ -187,7 +187,10 @@ function parseObject({
|
|
|
187
187
|
context,
|
|
188
188
|
options
|
|
189
189
|
}) {
|
|
190
|
-
const values = context.schemaType.fields.reduce((fieldValues, field) =>
|
|
190
|
+
const values = context.schemaType.fields.reduce((fieldValues, field) => {
|
|
191
|
+
const fieldValue = object[field.name];
|
|
192
|
+
return fieldValue !== void 0 && (fieldValues[field.name] = fieldValue), fieldValues;
|
|
193
|
+
}, {});
|
|
191
194
|
return {
|
|
192
195
|
_type: context.schemaType.name,
|
|
193
196
|
_key: options.refreshKeys ? context.keyGenerator() : typeof object._key == "string" ? object._key : context.keyGenerator(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-blocks.cjs","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.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 ObjectSchemaType,\n PortableTextBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n TypedObject,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-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 }\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 }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: 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 isTextBlock(\n schema: EditorSchema,\n block: unknown,\n): block is PortableTextTextBlock {\n return (\n parseTextBlock({\n block,\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\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 // Spread the entire block to allow custom properties on it\n ...block,\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 }\n\n /**\n * Reset text block .style if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.style !== 'string' ||\n !context.schema.styles.find((style) => style.value === block.style)\n ) {\n const defaultStyle = context.schema.styles.at(0)?.value\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n delete parsedBlock.style\n }\n }\n\n /**\n * Reset text block .listItem if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.listItem !== 'string' ||\n !context.schema.lists.find((list) => list.value === block.listItem)\n ) {\n delete parsedBlock.listItem\n }\n\n /**\n * Reset text block .level if it's somehow set to an invalid type\n */\n if (typeof parsedBlock.level !== 'number') {\n delete parsedBlock.level\n }\n\n return parsedBlock\n}\n\nexport function isSpan(\n schema: EditorSchema,\n child: PortableTextSpan | PortableTextObject,\n): child is PortableTextSpan {\n return (\n parseSpan({\n span: child,\n markDefKeyMap: new Map(),\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\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: {refreshKeys: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\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.value === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n return {\n // Spread the entire span to allow custom properties on it\n ...span,\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 }\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}\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}\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'> & {schemaType: ObjectSchemaType}\n options: {refreshKeys: boolean}\n}): PortableTextObject {\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = context.schemaType.fields.reduce<Record<string, unknown>>(\n (fieldValues, field) => {\n fieldValues[field.name] = object[field.name]\n return fieldValues\n },\n {},\n )\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"],"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","isTextBlock","refreshKeys","undefined","_key","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","children","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","style","styles","defaultStyle","at","listItem","lists","list","level","mark","markDefKey","get","decorators","some","decorator","inlineObjects","parseAnnotation","annotation","values","fields","reduce","fieldValues","field"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"parse-blocks.cjs","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.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 ObjectSchemaType,\n PortableTextBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n TypedObject,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-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 }\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 }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: 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 isTextBlock(\n schema: EditorSchema,\n block: unknown,\n): block is PortableTextTextBlock {\n return (\n parseTextBlock({\n block,\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\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 // Spread the entire block to allow custom properties on it\n ...block,\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 }\n\n /**\n * Reset text block .style if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.style !== 'string' ||\n !context.schema.styles.find((style) => style.value === block.style)\n ) {\n const defaultStyle = context.schema.styles.at(0)?.value\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n delete parsedBlock.style\n }\n }\n\n /**\n * Reset text block .listItem if it's somehow set to an invalid type\n */\n if (\n typeof parsedBlock.listItem !== 'string' ||\n !context.schema.lists.find((list) => list.value === block.listItem)\n ) {\n delete parsedBlock.listItem\n }\n\n /**\n * Reset text block .level if it's somehow set to an invalid type\n */\n if (typeof parsedBlock.level !== 'number') {\n delete parsedBlock.level\n }\n\n return parsedBlock\n}\n\nexport function isSpan(\n schema: EditorSchema,\n child: PortableTextSpan | PortableTextObject,\n): child is PortableTextSpan {\n return (\n parseSpan({\n span: child,\n markDefKeyMap: new Map(),\n context: {schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\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: {refreshKeys: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\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.value === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n return {\n // Spread the entire span to allow custom properties on it\n ...span,\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 }\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}\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}\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'> & {schemaType: ObjectSchemaType}\n options: {refreshKeys: boolean}\n}): PortableTextObject {\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = 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\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"],"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","isTextBlock","refreshKeys","undefined","_key","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","children","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","style","styles","defaultStyle","at","listItem","lists","list","level","mark","markDefKey","get","decorators","some","decorator","inlineObjects","parseAnnotation","annotation","values","fields","reduce","fieldValues","field","fieldValue"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { isPortableTextTextBlock } from "@sanity/types";
|
|
|
2
2
|
import { isSelectionCollapsed, getFocusTextBlock, getFocusSpan, getPreviousInlineObject, getFocusBlock } from "./selector.is-overlapping-selection.js";
|
|
3
3
|
import { spanSelectionPointToBlockOffset, getTextBlockText } from "./util.slice-blocks.js";
|
|
4
4
|
import { getBlockTextBefore } from "./selector.get-text-before.js";
|
|
5
|
-
import { defineBehavior } from "./behavior.core.js";
|
|
5
|
+
import { defineBehavior, raise } from "./behavior.core.js";
|
|
6
6
|
function createMarkdownBehaviors(config) {
|
|
7
7
|
const automaticBlockquoteOnSpace = defineBehavior({
|
|
8
8
|
on: "insert.text",
|
|
@@ -50,7 +50,7 @@ function createMarkdownBehaviors(config) {
|
|
|
50
50
|
style
|
|
51
51
|
},
|
|
52
52
|
at: focusTextBlock.path
|
|
53
|
-
}, {
|
|
53
|
+
}, raise({
|
|
54
54
|
type: "delete.text",
|
|
55
55
|
at: {
|
|
56
56
|
anchor: {
|
|
@@ -62,7 +62,7 @@ function createMarkdownBehaviors(config) {
|
|
|
62
62
|
offset: 2
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
-
}]]
|
|
65
|
+
})]]
|
|
66
66
|
}), automaticHr = defineBehavior({
|
|
67
67
|
on: "insert.text",
|
|
68
68
|
guard: ({
|
|
@@ -107,10 +107,10 @@ function createMarkdownBehaviors(config) {
|
|
|
107
107
|
_type: hrObject.name,
|
|
108
108
|
...hrObject.value ?? {}
|
|
109
109
|
}
|
|
110
|
-
}, {
|
|
110
|
+
}, raise({
|
|
111
111
|
type: "delete.text",
|
|
112
112
|
at: hrBlockOffsets
|
|
113
|
-
}]]
|
|
113
|
+
})]]
|
|
114
114
|
}), automaticHrOnPaste = defineBehavior({
|
|
115
115
|
on: "clipboard.paste",
|
|
116
116
|
guard: ({
|
|
@@ -212,7 +212,7 @@ function createMarkdownBehaviors(config) {
|
|
|
212
212
|
style
|
|
213
213
|
},
|
|
214
214
|
at: focusTextBlock.path
|
|
215
|
-
}, {
|
|
215
|
+
}, raise({
|
|
216
216
|
type: "delete.text",
|
|
217
217
|
at: {
|
|
218
218
|
anchor: {
|
|
@@ -224,7 +224,7 @@ function createMarkdownBehaviors(config) {
|
|
|
224
224
|
offset: level + 1
|
|
225
225
|
}
|
|
226
226
|
}
|
|
227
|
-
}]]
|
|
227
|
+
})]]
|
|
228
228
|
}), clearStyleOnBackspace = defineBehavior({
|
|
229
229
|
on: "delete.backward",
|
|
230
230
|
guard: ({
|
|
@@ -304,7 +304,7 @@ function createMarkdownBehaviors(config) {
|
|
|
304
304
|
style
|
|
305
305
|
},
|
|
306
306
|
at: focusTextBlock.path
|
|
307
|
-
}, {
|
|
307
|
+
}, raise({
|
|
308
308
|
type: "delete.text",
|
|
309
309
|
at: {
|
|
310
310
|
anchor: {
|
|
@@ -316,7 +316,7 @@ function createMarkdownBehaviors(config) {
|
|
|
316
316
|
offset: listItemLength + 1
|
|
317
317
|
}
|
|
318
318
|
}
|
|
319
|
-
}]]
|
|
319
|
+
})]]
|
|
320
320
|
});
|
|
321
321
|
return [automaticBlockquoteOnSpace, automaticHeadingOnSpace, automaticHr, automaticHrOnPaste, clearStyleOnBackspace, automaticListOnSpace];
|
|
322
322
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"behavior.markdown.js","sources":["../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n * Create markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {createMarkdownBehaviors, coreBehaviors} from '@portabletext/editor/behaviors'\n *\n * function App() {\n * return (\n * <EditorProvider\n * initialConfig={{\n * behaviors: [\n * ...coreBehaviors,\n * ...createMarkdownBehaviors({\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }),\n * ]\n * }}\n * >\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n *\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(snapshot.context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n },\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (\n !previousInlineObject &&\n textBefore === `${hrCharacter}${hrCharacter}`\n ) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block',\n placement: 'before',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n },\n {\n type: 'delete.text',\n at: hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = selectors.getFocusBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n ({snapshot}, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusBlock.node.children,\n },\n placement: 'after',\n },\n {\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n },\n {type: 'delete.block', at: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n },\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n {\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(snapshot.context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(snapshot.context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n },\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","snapshot","event","text","selectionCollapsed","selectors","focusTextBlock","focusSpan","previousInlineObject","blockOffset","spanSelectionPointToBlockOffset","value","context","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","undefined","style","actions","type","_","props","at","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","hrBlockOffsets","placement","block","_type","name","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","isPortableTextTextBlock","schema","children","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"behavior.markdown.js","sources":["../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {raise} from './behavior.types.action'\nimport {defineBehavior} from './behavior.types.behavior'\n\n/**\n * @beta\n */\nexport type MarkdownBehaviorsConfig = {\n horizontalRuleObject?: (context: {\n schema: EditorSchema\n }) => {name: string; value?: {[prop: string]: unknown}} | undefined\n defaultStyle?: (context: {schema: EditorSchema}) => string | undefined\n headingStyle?: (context: {\n schema: EditorSchema\n level: number\n }) => string | undefined\n blockquoteStyle?: (context: {schema: EditorSchema}) => string | undefined\n unorderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n orderedListStyle?: (context: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n * Create markdown behaviors for common markdown actions such as converting ### to headings, --- to HRs, and more.\n *\n * @example\n * Configure the bundled markdown behaviors\n * ```ts\n * import {EditorProvider} from '@portabletext/editor'\n * import {createMarkdownBehaviors, coreBehaviors} from '@portabletext/editor/behaviors'\n *\n * function App() {\n * return (\n * <EditorProvider\n * initialConfig={{\n * behaviors: [\n * ...coreBehaviors,\n * ...createMarkdownBehaviors({\n * horizontalRuleObject: ({schema}) => {\n * const name = schema.blockObjects.find(\n * (object) => object.name === 'break',\n * )?.name\n * return name ? {name} : undefined\n * },\n * defaultStyle: ({schema}) => schema.styles[0].value,\n * headingStyle: ({schema, level}) =>\n * schema.styles.find((style) => style.value === `h${level}`)\n * ?.value,\n * blockquoteStyle: ({schema}) =>\n * schema.styles.find((style) => style.value === 'blockquote')\n * ?.value,\n * unorderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'bullet')?.value,\n * orderedListStyle: ({schema}) =>\n * schema.lists.find((list) => list.value === 'number')?.value,\n * }),\n * ]\n * }}\n * >\n * {...}\n * </EditorProvider>\n * )\n * }\n * ```\n *\n */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const caretAtTheEndOfQuote = blockOffset.offset === 1\n const looksLikeMarkdownQuote = /^>/.test(blockText)\n const blockquoteStyle = config.blockquoteStyle?.(snapshot.context)\n\n if (\n caretAtTheEndOfQuote &&\n looksLikeMarkdownQuote &&\n blockquoteStyle !== undefined\n ) {\n return {focusTextBlock, style: blockquoteStyle}\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ' ',\n },\n ],\n (_, {focusTextBlock, style}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n raise({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: 2,\n },\n },\n }),\n ],\n ],\n })\n const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const hrCharacter =\n event.text === '-'\n ? '-'\n : event.text === '*'\n ? '*'\n : event.text === '_'\n ? '_'\n : undefined\n\n if (hrCharacter === undefined) {\n return false\n }\n\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = selectors.getFocusTextBlock(snapshot)\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const textBefore = selectors.getBlockTextBefore(snapshot)\n const hrBlockOffsets = {\n anchor: {\n path: focusBlock.path,\n offset: 0,\n },\n focus: {\n path: focusBlock.path,\n offset: 3,\n },\n }\n\n if (\n !previousInlineObject &&\n textBefore === `${hrCharacter}${hrCharacter}`\n ) {\n return {hrObject, focusBlock, hrCharacter, hrBlockOffsets}\n }\n\n return false\n },\n actions: [\n (_, {hrCharacter}) => [\n {\n type: 'insert.text',\n text: hrCharacter,\n },\n ],\n (_, {hrObject, hrBlockOffsets}) => [\n {\n type: 'insert.block',\n placement: 'before',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n },\n raise({\n type: 'delete.text',\n at: hrBlockOffsets,\n }),\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'clipboard.paste',\n guard: ({snapshot, event}) => {\n const text = event.originEvent.dataTransfer.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(snapshot.context)\n const focusBlock = selectors.getFocusBlock(snapshot)\n\n if (!hrCharacters || !hrObject || !focusBlock) {\n return false\n }\n\n return {hrCharacters, hrObject, focusBlock}\n },\n actions: [\n (_, {hrCharacters}) => [\n {\n type: 'insert.text',\n text: hrCharacters,\n },\n ],\n ({snapshot}, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.block',\n block: {\n _type: snapshot.context.schema.block.name,\n children: focusBlock.node.children,\n },\n placement: 'after',\n },\n {\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n },\n {type: 'delete.block', at: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block',\n block: {\n _type: hrObject.name,\n ...(hrObject.value ?? {}),\n },\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockText = getTextBlockText(focusTextBlock.node)\n const markdownHeadingSearch = /^#+/.exec(blockText)\n const level = markdownHeadingSearch\n ? markdownHeadingSearch[0].length\n : undefined\n const caretAtTheEndOfHeading = blockOffset.offset === level\n\n if (previousInlineObject || !caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: snapshot.context.schema, level})\n : undefined\n\n if (level !== undefined && style !== undefined) {\n return {\n focusTextBlock,\n style: style,\n level,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, level}) => [\n {\n type: 'block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'block.set',\n props: {style},\n at: focusTextBlock.path,\n },\n raise({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: level + 1,\n },\n },\n }),\n ],\n ],\n })\n const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({snapshot}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n snapshot.context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n\n if (\n atTheBeginningOfBLock &&\n defaultStyle &&\n focusTextBlock.node.style !== defaultStyle\n ) {\n return {defaultStyle, focusTextBlock}\n }\n\n return false\n },\n actions: [\n (_, {defaultStyle, focusTextBlock}) => [\n {\n type: 'block.set',\n props: {style: defaultStyle},\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({snapshot, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed(snapshot)\n const focusTextBlock = selectors.getFocusTextBlock(snapshot)\n const focusSpan = selectors.getFocusSpan(snapshot)\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject(snapshot)\n const blockOffset = spanSelectionPointToBlockOffset({\n value: snapshot.context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: snapshot.context.selection?.focus.offset ?? 0,\n },\n })\n\n if (previousInlineObject || !blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(snapshot.context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(snapshot.context)\n const caretAtTheEndOfUnorderedList = blockOffset.offset === 1\n\n if (\n defaultStyle &&\n caretAtTheEndOfUnorderedList &&\n looksLikeUnorderedList &&\n unorderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: unorderedListStyle,\n listItemLength: 1,\n style: defaultStyle,\n }\n }\n\n const looksLikeOrderedList = /^1\\./.test(blockText)\n const orderedListStyle = config.orderedListStyle?.(snapshot.context)\n const caretAtTheEndOfOrderedList = blockOffset.offset === 2\n\n if (\n defaultStyle &&\n caretAtTheEndOfOrderedList &&\n looksLikeOrderedList &&\n orderedListStyle !== undefined\n ) {\n return {\n focusTextBlock,\n listItem: orderedListStyle,\n listItemLength: 2,\n style: defaultStyle,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {focusTextBlock, style, listItem, listItemLength}) => [\n {\n type: 'block.set',\n props: {\n listItem,\n level: 1,\n style,\n },\n at: focusTextBlock.path,\n },\n raise({\n type: 'delete.text',\n at: {\n anchor: {\n path: focusTextBlock.path,\n offset: 0,\n },\n focus: {\n path: focusTextBlock.path,\n offset: listItemLength + 1,\n },\n },\n }),\n ],\n ],\n })\n\n const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createMarkdownBehaviors","config","automaticBlockquoteOnSpace","defineBehavior","on","guard","snapshot","event","text","selectionCollapsed","selectors","focusTextBlock","focusSpan","previousInlineObject","blockOffset","spanSelectionPointToBlockOffset","value","context","selectionPoint","path","_key","node","offset","selection","focus","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","test","blockquoteStyle","undefined","style","actions","type","_","props","at","raise","anchor","automaticHr","hrCharacter","hrObject","horizontalRuleObject","focusBlock","textBefore","hrBlockOffsets","placement","block","_type","name","automaticHrOnPaste","originEvent","dataTransfer","getData","hrRegExp","hrCharacters","match","isPortableTextTextBlock","schema","children","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","length","caretAtTheEndOfHeading","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|
|
@@ -2699,7 +2699,7 @@ function createOperationToPatches(types) {
|
|
|
2699
2699
|
const insertTextActionImplementation = ({
|
|
2700
2700
|
action
|
|
2701
2701
|
}) => {
|
|
2702
|
-
|
|
2702
|
+
Transforms.insertText(action.editor, action.text);
|
|
2703
2703
|
};
|
|
2704
2704
|
function isPortableTextSpan(node) {
|
|
2705
2705
|
return node._type === "span" && "text" in node && typeof node.text == "string" && (typeof node.marks > "u" || Array.isArray(node.marks) && node.marks.every((mark) => typeof mark == "string"));
|
|
@@ -3788,35 +3788,6 @@ const decoratorAddActionImplementation = ({
|
|
|
3788
3788
|
action
|
|
3789
3789
|
}) => {
|
|
3790
3790
|
action.editor.deleteForward(action.unit);
|
|
3791
|
-
}, deleteTextActionImplementation = ({
|
|
3792
|
-
context,
|
|
3793
|
-
action
|
|
3794
|
-
}) => {
|
|
3795
|
-
const value = fromSlateValue(action.editor.children, context.schema.block.name, KEY_TO_VALUE_ELEMENT.get(action.editor)), selection = blockOffsetsToSelection({
|
|
3796
|
-
value,
|
|
3797
|
-
offsets: action.at
|
|
3798
|
-
});
|
|
3799
|
-
if (!selection)
|
|
3800
|
-
throw new Error("Unable to find selection from block offsets");
|
|
3801
|
-
const trimmedSelection = getTrimmedSelection({
|
|
3802
|
-
context: {
|
|
3803
|
-
converters: [],
|
|
3804
|
-
schema: context.schema,
|
|
3805
|
-
keyGenerator: context.keyGenerator,
|
|
3806
|
-
activeDecorators: [],
|
|
3807
|
-
readOnly: !1,
|
|
3808
|
-
value,
|
|
3809
|
-
selection
|
|
3810
|
-
}
|
|
3811
|
-
});
|
|
3812
|
-
if (!trimmedSelection)
|
|
3813
|
-
throw new Error("Unable to find trimmed selection");
|
|
3814
|
-
const range = toSlateRange(trimmedSelection, action.editor);
|
|
3815
|
-
if (!range)
|
|
3816
|
-
throw new Error("Unable to find Slate range from trimmed selection");
|
|
3817
|
-
Transforms.delete(action.editor, {
|
|
3818
|
-
at: range
|
|
3819
|
-
});
|
|
3820
3791
|
}, effectActionImplementation = ({
|
|
3821
3792
|
action
|
|
3822
3793
|
}) => {
|
|
@@ -4130,7 +4101,6 @@ const moveBlockActionImplementation = ({
|
|
|
4130
4101
|
"delete.backward": deleteBackwardActionImplementation,
|
|
4131
4102
|
"delete.forward": deleteForwardActionImplementation,
|
|
4132
4103
|
"delete.block": deleteBlockActionImplementation,
|
|
4133
|
-
"delete.text": deleteTextActionImplementation,
|
|
4134
4104
|
"history.redo": historyRedoActionImplementation,
|
|
4135
4105
|
"history.undo": historyUndoActionImplementation,
|
|
4136
4106
|
"insert.block": insertBlockActionImplementation,
|
|
@@ -4225,13 +4195,6 @@ function performAction({
|
|
|
4225
4195
|
});
|
|
4226
4196
|
break;
|
|
4227
4197
|
}
|
|
4228
|
-
case "delete.text": {
|
|
4229
|
-
behaviorActionImplementations["delete.text"]({
|
|
4230
|
-
context,
|
|
4231
|
-
action
|
|
4232
|
-
});
|
|
4233
|
-
break;
|
|
4234
|
-
}
|
|
4235
4198
|
case "effect": {
|
|
4236
4199
|
behaviorActionImplementations.effect({
|
|
4237
4200
|
context,
|
|
@@ -5308,6 +5271,39 @@ const abstractAnnotationBehaviors = [defineBehavior({
|
|
|
5308
5271
|
...event,
|
|
5309
5272
|
type: "decorator.add"
|
|
5310
5273
|
})]]
|
|
5274
|
+
})], abstractDeleteBehaviors = [defineBehavior({
|
|
5275
|
+
on: "delete.text",
|
|
5276
|
+
guard: ({
|
|
5277
|
+
snapshot,
|
|
5278
|
+
event
|
|
5279
|
+
}) => {
|
|
5280
|
+
const selection = blockOffsetsToSelection({
|
|
5281
|
+
value: snapshot.context.value,
|
|
5282
|
+
offsets: event.at
|
|
5283
|
+
});
|
|
5284
|
+
if (!selection)
|
|
5285
|
+
return !1;
|
|
5286
|
+
const trimmedSelection = getTrimmedSelection({
|
|
5287
|
+
context: {
|
|
5288
|
+
converters: [],
|
|
5289
|
+
schema: snapshot.context.schema,
|
|
5290
|
+
keyGenerator: snapshot.context.keyGenerator,
|
|
5291
|
+
activeDecorators: [],
|
|
5292
|
+
readOnly: !1,
|
|
5293
|
+
value: snapshot.context.value,
|
|
5294
|
+
selection
|
|
5295
|
+
}
|
|
5296
|
+
});
|
|
5297
|
+
return trimmedSelection ? {
|
|
5298
|
+
selection: trimmedSelection
|
|
5299
|
+
} : !1;
|
|
5300
|
+
},
|
|
5301
|
+
actions: [(_, {
|
|
5302
|
+
selection
|
|
5303
|
+
}) => [raise({
|
|
5304
|
+
type: "delete",
|
|
5305
|
+
at: selection
|
|
5306
|
+
})]]
|
|
5311
5307
|
})], abstractInsertBehaviors = [defineBehavior({
|
|
5312
5308
|
on: "insert.blocks",
|
|
5313
5309
|
guard: ({
|
|
@@ -5972,6 +5968,7 @@ const abstractAnnotationBehaviors = [defineBehavior({
|
|
|
5972
5968
|
}),
|
|
5973
5969
|
...abstractAnnotationBehaviors,
|
|
5974
5970
|
...abstractDecoratorBehaviors,
|
|
5971
|
+
...abstractDeleteBehaviors,
|
|
5975
5972
|
...abstractInsertBehaviors,
|
|
5976
5973
|
...abstractListItemBehaviors,
|
|
5977
5974
|
...abstractMoveBehaviors,
|
|
@@ -5980,7 +5977,7 @@ const abstractAnnotationBehaviors = [defineBehavior({
|
|
|
5980
5977
|
raiseDeserializationSuccessOrFailure,
|
|
5981
5978
|
raiseSerializationSuccessOrFailure,
|
|
5982
5979
|
raiseInsertSoftBreak
|
|
5983
|
-
], abstractBehaviorEventTypes = ["annotation.toggle", "decorator.toggle", "deserialize", "deserialization.success", "deserialization.failure", "insert.blocks", "insert.break", "insert.soft break", "list item.add", "list item.remove", "list item.toggle", "move.block down", "move.block up", "select.previous block", "select.next block", "serialize", "serialization.success", "serialization.failure", "style.add", "style.remove", "style.toggle"];
|
|
5980
|
+
], abstractBehaviorEventTypes = ["annotation.toggle", "decorator.toggle", "delete.text", "deserialize", "deserialization.success", "deserialization.failure", "insert.blocks", "insert.break", "insert.soft break", "list item.add", "list item.remove", "list item.toggle", "move.block down", "move.block up", "select.previous block", "select.next block", "serialize", "serialization.success", "serialization.failure", "style.add", "style.remove", "style.toggle"];
|
|
5984
5981
|
function isAbstractBehaviorEvent(event) {
|
|
5985
5982
|
return abstractBehaviorEventTypes.includes(event.type);
|
|
5986
5983
|
}
|