@portabletext/editor 1.20.0 → 1.21.1
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.core.cjs +8 -68
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-text-before.cjs +11 -39
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/util.get-block-start-point.cjs +30 -0
- package/lib/_chunks-cjs/util.get-block-start-point.cjs.map +1 -0
- package/lib/_chunks-cjs/util.is-empty-text-block.cjs +71 -0
- package/lib/_chunks-cjs/util.is-empty-text-block.cjs.map +1 -0
- package/lib/_chunks-cjs/util.is-keyed-segment.cjs +6 -0
- package/lib/_chunks-cjs/util.is-keyed-segment.cjs.map +1 -0
- package/lib/_chunks-es/behavior.core.js +7 -66
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/selector.get-text-before.js +5 -31
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/util.get-block-start-point.js +31 -0
- package/lib/_chunks-es/util.get-block-start-point.js.map +1 -0
- package/lib/_chunks-es/util.is-empty-text-block.js +73 -0
- package/lib/_chunks-es/util.is-empty-text-block.js.map +1 -0
- package/lib/_chunks-es/util.is-keyed-segment.js +7 -0
- package/lib/_chunks-es/util.is-keyed-segment.js.map +1 -0
- package/lib/behaviors/index.cjs +7 -7
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +179 -119
- package/lib/behaviors/index.d.ts +179 -119
- package/lib/behaviors/index.js +3 -2
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.cjs +112 -21
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +870 -141
- package/lib/index.d.ts +870 -141
- package/lib/index.js +111 -19
- package/lib/index.js.map +1 -1
- package/lib/selectors/index.cjs +73 -1
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +14 -0
- package/lib/selectors/index.d.ts +14 -0
- package/lib/selectors/index.js +73 -0
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.cjs +11 -0
- package/lib/utils/index.cjs.map +1 -0
- package/lib/utils/index.d.cts +87 -0
- package/lib/utils/index.d.ts +87 -0
- package/lib/utils/index.js +13 -0
- package/lib/utils/index.js.map +1 -0
- package/package.json +15 -9
- package/src/behavior-actions/behavior.action-utils.insert-block.ts +1 -1
- package/src/behavior-actions/behavior.action.insert-block-object.ts +1 -1
- package/src/behavior-actions/behavior.action.insert-inline-object.ts +1 -1
- package/src/behavior-actions/behavior.action.text-block.set.ts +1 -1
- package/src/behavior-actions/behavior.action.text-block.unset.ts +1 -1
- package/src/behavior-actions/behavior.actions.ts +5 -5
- package/src/behaviors/behavior.code-editor.ts +1 -1
- package/src/behaviors/behavior.core.block-objects.ts +2 -2
- package/src/behaviors/behavior.core.decorators.ts +1 -1
- package/src/behaviors/behavior.core.lists.ts +2 -2
- package/src/behaviors/behavior.emoji-picker.ts +1 -1
- package/src/behaviors/behavior.links.ts +1 -1
- package/src/behaviors/behavior.markdown.ts +2 -2
- package/src/behaviors/behavior.types.ts +52 -19
- package/src/behaviors/index.ts +1 -0
- package/src/editor/Editable.tsx +12 -12
- package/src/editor/PortableTextEditor.tsx +2 -2
- package/src/editor/components/DraggableBlock.tsx +2 -2
- package/src/editor/components/Element.tsx +3 -3
- package/src/editor/components/Leaf.tsx +1 -1
- package/src/editor/components/Synchronizer.tsx +1 -1
- package/src/editor/create-editor.ts +22 -20
- package/src/editor/create-slate-editor.tsx +5 -2
- package/src/editor/editor-machine.ts +115 -23
- package/src/editor/get-value.ts +2 -2
- package/src/editor/hooks/usePortableTextEditorSelection.tsx +1 -1
- package/src/editor/mutation-machine.ts +2 -2
- package/src/editor/plugins/create-with-event-listeners.ts +50 -4
- package/src/editor/plugins/createWithEditableAPI.ts +7 -7
- package/src/editor/plugins/createWithHotKeys.ts +2 -2
- package/src/editor/plugins/createWithInsertData.ts +7 -7
- package/src/editor/plugins/createWithMaxBlocks.ts +2 -2
- package/src/editor/plugins/createWithObjectKeys.ts +2 -2
- package/src/editor/plugins/createWithPatches.ts +10 -10
- package/src/editor/plugins/createWithPlaceholderBlock.ts +3 -3
- package/src/editor/plugins/createWithPortableTextBlockStyle.ts +1 -1
- package/src/editor/plugins/createWithPortableTextMarkModel.ts +4 -4
- package/src/editor/plugins/createWithPortableTextSelections.ts +6 -6
- package/src/editor/plugins/createWithSchemaTypes.ts +1 -1
- package/src/editor/plugins/createWithUndoRedo.ts +5 -5
- package/src/editor/plugins/createWithUtils.ts +2 -2
- package/src/editor/plugins/with-plugins.ts +1 -1
- package/src/editor/sync-machine.ts +8 -5
- package/src/index.ts +5 -1
- package/src/selectors/index.ts +2 -0
- package/src/selectors/selector.get-selection-text.test.ts +75 -0
- package/src/selectors/selector.get-selection-text.ts +3 -3
- package/src/selectors/selector.get-text-before.ts +7 -4
- package/src/selectors/selector.is-point-after-selection.ts +82 -0
- package/src/selectors/selector.is-point-before-selection.ts +82 -0
- package/src/utils/_exports/index.ts +1 -0
- package/src/utils/index.ts +11 -0
- package/src/{editor/utils/utils.block-offset.test.ts → utils/util.block-offset.test.ts} +1 -1
- package/src/{editor/utils/utils.block-offset.ts → utils/util.block-offset.ts} +23 -7
- package/src/{editor/utils/utils.get-start-point.ts → utils/util.get-block-start-point.ts} +5 -2
- package/src/utils/util.get-text-block-text.ts +8 -0
- package/src/{editor/utils/utils.ts → utils/util.is-empty-text-block.ts} +4 -5
- package/src/{editor/utils/utils.is-keyed-segment.ts → utils/util.is-keyed-segment.ts} +3 -0
- package/src/{editor/utils/utils.reverse-selection.ts → utils/util.reverse-selection.ts} +4 -1
- /package/src/{utils → internal-utils}/__tests__/dmpToOperations.test.ts +0 -0
- /package/src/{utils → internal-utils}/__tests__/operationToPatches.test.ts +0 -0
- /package/src/{utils → internal-utils}/__tests__/patchToOperations.test.ts +0 -0
- /package/src/{utils → internal-utils}/__tests__/ranges.test.ts +0 -0
- /package/src/{utils → internal-utils}/__tests__/valueNormalization.test.tsx +0 -0
- /package/src/{utils → internal-utils}/__tests__/values.test.ts +0 -0
- /package/src/{utils → internal-utils}/applyPatch.ts +0 -0
- /package/src/{utils → internal-utils}/debug.ts +0 -0
- /package/src/{utils → internal-utils}/is-hotkey.test.ts +0 -0
- /package/src/{utils → internal-utils}/is-hotkey.ts +0 -0
- /package/src/{utils → internal-utils}/looks-like-url.test.ts +0 -0
- /package/src/{utils → internal-utils}/looks-like-url.ts +0 -0
- /package/src/{utils → internal-utils}/operationToPatches.ts +0 -0
- /package/src/{utils → internal-utils}/paths.ts +0 -0
- /package/src/{utils → internal-utils}/ranges.ts +0 -0
- /package/src/{utils → internal-utils}/schema.ts +0 -0
- /package/src/{utils → internal-utils}/selection.ts +0 -0
- /package/src/{utils → internal-utils}/sibling-utils.ts +0 -0
- /package/src/{utils → internal-utils}/validateValue.ts +0 -0
- /package/src/{utils → internal-utils}/values.ts +0 -0
- /package/src/{utils → internal-utils}/weakMaps.ts +0 -0
- /package/src/{utils → internal-utils}/withChanges.ts +0 -0
- /package/src/{utils → internal-utils}/withUndoRedo.ts +0 -0
- /package/src/{utils → internal-utils}/withoutPatching.ts +0 -0
package/lib/behaviors/index.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { defineBehavior, isHotkey, spanSelectionPointToBlockOffset, getTextBlockText } from "../_chunks-es/behavior.core.js";
|
|
1
|
+
import { defineBehavior, isHotkey } from "../_chunks-es/behavior.core.js";
|
|
3
2
|
import { coreBehavior, coreBehaviors, raise } from "../_chunks-es/behavior.core.js";
|
|
3
|
+
import { getFirstBlock, getSelectedBlocks, getLastBlock, getFocusTextBlock, isSelectionCollapsed, getFocusSpan, getFocusBlock } from "../_chunks-es/selector.is-selection-collapsed.js";
|
|
4
4
|
import { createActor, setup, assign, assertEvent } from "xstate";
|
|
5
5
|
import { getBlockTextBefore } from "../_chunks-es/selector.get-text-before.js";
|
|
6
6
|
import { isPortableTextTextBlock } from "@sanity/types";
|
|
7
|
+
import { spanSelectionPointToBlockOffset, getTextBlockText } from "../_chunks-es/util.is-empty-text-block.js";
|
|
7
8
|
function createCodeEditorBehaviors(config) {
|
|
8
9
|
return [defineBehavior({
|
|
9
10
|
on: "key.down",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/utils/looks-like-url.ts","../../src/behaviors/behavior.links.ts","../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @beta\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.keyboardEvent,\n )\n const firstBlock = selectors.getFirstBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block up',\n at,\n })),\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.keyboardEvent,\n )\n const lastBlock = selectors.getLastBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block down',\n at,\n })),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport * as selectors from '../selectors'\nimport {isHotkey} from '../utils/is-hotkey'\nimport {defineBehavior} from './behavior.types'\n\nconst emojiCharRegEx = /^[a-zA-Z-_0-9]{1}$/\nconst incompleteEmojiRegEx = /:([a-zA-Z-_0-9]+)$/\nconst emojiRegEx = /:([a-zA-Z-_0-9]+):$/\n\n/**\n * @beta\n */\nexport type EmojiPickerBehaviorsConfig<TEmojiMatch> = {\n /**\n * Match emojis by keyword.\n */\n matchEmojis: ({keyword}: {keyword: string}) => Array<TEmojiMatch>\n onMatchesChanged: ({matches}: {matches: Array<TEmojiMatch>}) => void\n onSelectedIndexChanged: ({selectedIndex}: {selectedIndex: number}) => void\n /**\n * Parse an emoji match to a string that will be inserted into the editor.\n */\n parseMatch: ({match}: {match: TEmojiMatch}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function createEmojiPickerBehaviors<TEmojiMatch>(\n config: EmojiPickerBehaviorsConfig<TEmojiMatch>,\n) {\n const emojiPickerActor = createActor(createEmojiPickerMachine<TEmojiMatch>())\n emojiPickerActor.start()\n emojiPickerActor.subscribe((state) => {\n config.onMatchesChanged({matches: state.context.matches})\n config.onSelectedIndexChanged({selectedIndex: state.context.selectedIndex})\n })\n\n return [\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n if (event.text === ':') {\n return false\n }\n\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}${event.text}`.match(\n incompleteEmojiRegEx,\n )?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isColon = event.text === ':'\n\n if (!isColon) {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 2\n\n if (emoji) {\n return {\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length + 1,\n }\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ':',\n },\n ],\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const isEscape = isHotkey('Escape', event.keyboardEvent)\n\n if (isEscape) {\n return {action: 'reset' as const}\n }\n\n const isEnter = isHotkey('Enter', event.keyboardEvent)\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (isEnter || isTab) {\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n if (!emoji) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 1\n\n if (emoji) {\n return {\n action: 'select' as const,\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length,\n }\n }\n\n return false\n }\n\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n\n if (isArrowDown && matches.length > 0) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp && matches.length > 0) {\n return {action: 'navigate up' as const}\n }\n\n return false\n },\n actions: [\n (_, params) => {\n if (params.action === 'select') {\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ]\n }\n\n if (params.action === 'navigate up') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate up'})\n },\n },\n ]\n }\n\n if (params.action === 'navigate down') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate down'})\n },\n },\n ]\n }\n\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'reset'})\n },\n },\n ]\n },\n ],\n }),\n defineBehavior({\n on: 'delete.backward',\n guard: ({context, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n ]\n}\n\nfunction createEmojiPickerMachine<TEmojiSearchResult>() {\n return setup({\n types: {\n context: {} as {\n matches: Array<TEmojiSearchResult>\n selectedIndex: number\n },\n events: {} as\n | {\n type: 'emojis found'\n matches: Array<TEmojiSearchResult>\n }\n | {\n type: 'navigate down' | 'navigate up' | 'select' | 'reset'\n },\n },\n actions: {\n 'assign matches': assign({\n matches: ({event}) => {\n assertEvent(event, 'emojis found')\n return event.matches\n },\n }),\n 'reset matches': assign({\n matches: [],\n }),\n 'reset selected index': assign({\n selectedIndex: 0,\n }),\n 'increment selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === context.matches.length - 1) {\n return 0\n }\n return context.selectedIndex + 1\n },\n }),\n 'decrement selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === 0) {\n return context.matches.length - 1\n }\n return context.selectedIndex - 1\n },\n }),\n },\n guards: {\n 'no matches': ({context}) => context.matches.length === 0,\n },\n }).createMachine({\n id: 'emoji picker',\n context: {\n matches: [],\n selectedIndex: 0,\n },\n initial: 'idle',\n states: {\n 'idle': {\n on: {\n 'emojis found': {\n actions: 'assign matches',\n target: 'showing matches',\n },\n },\n },\n 'showing matches': {\n always: {\n guard: 'no matches',\n target: 'idle',\n },\n exit: ['reset selected index'],\n on: {\n 'emojis found': {\n actions: 'assign matches',\n },\n 'navigate down': {\n actions: 'increment selected index',\n },\n 'navigate up': {\n actions: 'decrement selected index',\n },\n 'reset': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n 'select': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n },\n },\n },\n })\n}\n","export function looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n const url = new URL(text)\n\n if (!sensibleProtocols.includes(url.protocol)) {\n return false\n }\n\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n\nconst sensibleProtocols = ['http:', 'https:', 'mailto:', 'tel:']\n","import type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {looksLikeUrl} from '../utils/looks-like-url'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: EditorSchema\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @beta\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n {\n type: 'annotation.add',\n annotation,\n },\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const focusSpan = selectors.getFocusSpan({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n {\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n },\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport {getTextBlockText} from '../editor/utils/utils'\nimport {spanSelectionPointToBlockOffset} from '../editor/utils/utils.block-offset'\nimport * as selectors from '../selectors'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {defineBehavior} from './behavior.types'\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 */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!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?.(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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, 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?.(context)\n const focusBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const textBefore = getBlockTextBefore({context})\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 (textBefore === `${hrCharacter}${hrCharacter}`) {\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 object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusBlock({context})\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 (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\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 (!caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: 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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(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: 'text block.set',\n style: defaultStyle,\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(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?.(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: 'text block.set',\n listItem,\n level: 1,\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","context","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","keyboardEvent","firstBlock","selectors","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","onSelectedIndexChanged","selectedIndex","text","test","emojis","focusBlock","emojiKeyword","match","undefined","matchEmojis","keyword","params","effect","send","getSnapshot","emoji","parseMatch","textBefore","emojiStringLength","textBeforeLength","anchor","offset","focus","action","isEnter","isTab","isArrowDown","isArrowUp","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","looksLikeUrl","url","URL","sensibleProtocols","includes","protocol","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","data","getData","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","selection","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","blockquoteStyle","style","props","automaticHr","hrCharacter","hrObject","horizontalRuleObject","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","hrRegExp","hrCharacters","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/behaviors/behavior.code-editor.ts","../../src/behaviors/behavior.emoji-picker.ts","../../src/internal-utils/looks-like-url.ts","../../src/behaviors/behavior.links.ts","../../src/behaviors/behavior.markdown.ts"],"sourcesContent":["import {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type CodeEditorBehaviorsConfig = {\n moveBlockUpShortcut: string\n moveBlockDownShortcut: string\n}\n\n/**\n * @beta\n */\nexport function createCodeEditorBehaviors(config: CodeEditorBehaviorsConfig) {\n return [\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveUpShortcut = isHotkey(\n config.moveBlockUpShortcut,\n event.keyboardEvent,\n )\n const firstBlock = selectors.getFirstBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksAbove =\n firstBlock?.node._key !== selectedBlocks[0]?.node._key\n\n if (!isMoveUpShortcut || !blocksAbove) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path)}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block up',\n at,\n })),\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const isMoveDownShortcut = isHotkey(\n config.moveBlockDownShortcut,\n event.keyboardEvent,\n )\n const lastBlock = selectors.getLastBlock({context})\n const selectedBlocks = selectors.getSelectedBlocks({context})\n const blocksBelow =\n lastBlock?.node._key !==\n selectedBlocks[selectedBlocks.length - 1]?.node._key\n\n if (!isMoveDownShortcut || !blocksBelow) {\n return false\n }\n\n return {paths: selectedBlocks.map((block) => block.path).reverse()}\n },\n actions: [\n (_, {paths}) =>\n paths.map((at) => ({\n type: 'move.block down',\n at,\n })),\n ],\n }),\n ]\n}\n","import {assertEvent, assign, createActor, setup} from 'xstate'\nimport {isHotkey} from '../internal-utils/is-hotkey'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types'\n\nconst emojiCharRegEx = /^[a-zA-Z-_0-9]{1}$/\nconst incompleteEmojiRegEx = /:([a-zA-Z-_0-9]+)$/\nconst emojiRegEx = /:([a-zA-Z-_0-9]+):$/\n\n/**\n * @beta\n */\nexport type EmojiPickerBehaviorsConfig<TEmojiMatch> = {\n /**\n * Match emojis by keyword.\n */\n matchEmojis: ({keyword}: {keyword: string}) => Array<TEmojiMatch>\n onMatchesChanged: ({matches}: {matches: Array<TEmojiMatch>}) => void\n onSelectedIndexChanged: ({selectedIndex}: {selectedIndex: number}) => void\n /**\n * Parse an emoji match to a string that will be inserted into the editor.\n */\n parseMatch: ({match}: {match: TEmojiMatch}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function createEmojiPickerBehaviors<TEmojiMatch>(\n config: EmojiPickerBehaviorsConfig<TEmojiMatch>,\n) {\n const emojiPickerActor = createActor(createEmojiPickerMachine<TEmojiMatch>())\n emojiPickerActor.start()\n emojiPickerActor.subscribe((state) => {\n config.onMatchesChanged({matches: state.context.matches})\n config.onSelectedIndexChanged({selectedIndex: state.context.selectedIndex})\n })\n\n return [\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n if (event.text === ':') {\n return false\n }\n\n const isEmojiChar = emojiCharRegEx.test(event.text)\n\n if (!isEmojiChar) {\n return {emojis: []}\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}${event.text}`.match(\n incompleteEmojiRegEx,\n )?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isColon = event.text === ':'\n\n if (!isColon) {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = `${textBefore}:`.match(emojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 2\n\n if (emoji) {\n return {\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length + 1,\n }\n }\n\n return false\n },\n actions: [\n () => [\n {\n type: 'insert.text',\n text: ':',\n },\n ],\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ],\n ],\n }),\n defineBehavior({\n on: 'key.down',\n guard: ({context, event}) => {\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const isEscape = isHotkey('Escape', event.keyboardEvent)\n\n if (isEscape) {\n return {action: 'reset' as const}\n }\n\n const isEnter = isHotkey('Enter', event.keyboardEvent)\n const isTab = isHotkey('Tab', event.keyboardEvent)\n\n if (isEnter || isTab) {\n const selectedIndex =\n emojiPickerActor.getSnapshot().context.selectedIndex\n\n const emoji = matches[selectedIndex]\n ? config.parseMatch({match: matches[selectedIndex]})\n : undefined\n\n if (!emoji) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore.match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return false\n }\n\n const emojiStringLength = emojiKeyword.length + 1\n\n if (emoji) {\n return {\n action: 'select' as const,\n focusBlock,\n emoji,\n emojiStringLength,\n textBeforeLength: textBefore.length,\n }\n }\n\n return false\n }\n\n const isArrowDown = isHotkey('ArrowDown', event.keyboardEvent)\n const isArrowUp = isHotkey('ArrowUp', event.keyboardEvent)\n\n if (isArrowDown && matches.length > 0) {\n return {action: 'navigate down' as const}\n }\n\n if (isArrowUp && matches.length > 0) {\n return {action: 'navigate up' as const}\n }\n\n return false\n },\n actions: [\n (_, params) => {\n if (params.action === 'select') {\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'select'})\n },\n },\n {\n type: 'delete.text',\n anchor: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength - params.emojiStringLength,\n },\n focus: {\n path: params.focusBlock.path,\n offset: params.textBeforeLength,\n },\n },\n {\n type: 'insert.text',\n text: params.emoji,\n },\n ]\n }\n\n if (params.action === 'navigate up') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate up'})\n },\n },\n ]\n }\n\n if (params.action === 'navigate down') {\n return [\n // If we are navigating then we want to hijack the key event and\n // turn it into a noop.\n {\n type: 'noop',\n },\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'navigate down'})\n },\n },\n ]\n }\n\n return [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({type: 'reset'})\n },\n },\n ]\n },\n ],\n }),\n defineBehavior({\n on: 'delete.backward',\n guard: ({context, event}) => {\n if (event.unit !== 'character') {\n return false\n }\n\n const matches = emojiPickerActor.getSnapshot().context.matches\n\n if (matches.length === 0) {\n return false\n }\n\n const focusBlock = selectors.getFocusTextBlock({context})\n const textBefore = selectors.getBlockTextBefore({context})\n const emojiKeyword = textBefore\n .slice(0, textBefore.length - 1)\n .match(incompleteEmojiRegEx)?.[1]\n\n if (!focusBlock || emojiKeyword === undefined) {\n return {emojis: []}\n }\n\n const emojis = config.matchEmojis({keyword: emojiKeyword})\n\n return {emojis}\n },\n actions: [\n (_, params) => [\n {\n type: 'effect',\n effect: () => {\n emojiPickerActor.send({\n type: 'emojis found',\n matches: params.emojis,\n })\n },\n },\n ],\n ],\n }),\n ]\n}\n\nfunction createEmojiPickerMachine<TEmojiSearchResult>() {\n return setup({\n types: {\n context: {} as {\n matches: Array<TEmojiSearchResult>\n selectedIndex: number\n },\n events: {} as\n | {\n type: 'emojis found'\n matches: Array<TEmojiSearchResult>\n }\n | {\n type: 'navigate down' | 'navigate up' | 'select' | 'reset'\n },\n },\n actions: {\n 'assign matches': assign({\n matches: ({event}) => {\n assertEvent(event, 'emojis found')\n return event.matches\n },\n }),\n 'reset matches': assign({\n matches: [],\n }),\n 'reset selected index': assign({\n selectedIndex: 0,\n }),\n 'increment selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === context.matches.length - 1) {\n return 0\n }\n return context.selectedIndex + 1\n },\n }),\n 'decrement selected index': assign({\n selectedIndex: ({context}) => {\n if (context.selectedIndex === 0) {\n return context.matches.length - 1\n }\n return context.selectedIndex - 1\n },\n }),\n },\n guards: {\n 'no matches': ({context}) => context.matches.length === 0,\n },\n }).createMachine({\n id: 'emoji picker',\n context: {\n matches: [],\n selectedIndex: 0,\n },\n initial: 'idle',\n states: {\n 'idle': {\n on: {\n 'emojis found': {\n actions: 'assign matches',\n target: 'showing matches',\n },\n },\n },\n 'showing matches': {\n always: {\n guard: 'no matches',\n target: 'idle',\n },\n exit: ['reset selected index'],\n on: {\n 'emojis found': {\n actions: 'assign matches',\n },\n 'navigate down': {\n actions: 'increment selected index',\n },\n 'navigate up': {\n actions: 'decrement selected index',\n },\n 'reset': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n 'select': {\n target: 'idle',\n actions: ['reset selected index', 'reset matches'],\n },\n },\n },\n },\n })\n}\n","export function looksLikeUrl(text: string) {\n let looksLikeUrl = false\n try {\n const url = new URL(text)\n\n if (!sensibleProtocols.includes(url.protocol)) {\n return false\n }\n\n looksLikeUrl = true\n } catch {}\n return looksLikeUrl\n}\n\nconst sensibleProtocols = ['http:', 'https:', 'mailto:', 'tel:']\n","import type {EditorSchema} from '../editor/define-schema'\nimport {looksLikeUrl} from '../internal-utils/looks-like-url'\nimport * as selectors from '../selectors'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type LinkBehaviorsConfig = {\n linkAnnotation?: (context: {\n schema: EditorSchema\n url: string\n }) => {name: string; value: {[prop: string]: unknown}} | undefined\n}\n\n/**\n * @beta\n */\nexport function createLinkBehaviors(config: LinkBehaviorsConfig) {\n const pasteLinkOnSelection = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (annotation && !selectionCollapsed) {\n return {annotation}\n }\n\n return false\n },\n actions: [\n (_, {annotation}) => [\n {\n type: 'annotation.add',\n annotation,\n },\n ],\n ],\n })\n const pasteLinkAtCaret = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const focusSpan = selectors.getFocusSpan({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!focusSpan || !selectionCollapsed) {\n return false\n }\n\n const text = event.data.getData('text/plain')\n const url = looksLikeUrl(text) ? text : undefined\n const annotation =\n url !== undefined\n ? config.linkAnnotation?.({url, schema: context.schema})\n : undefined\n\n if (url && annotation && selectionCollapsed) {\n return {focusSpan, annotation, url}\n }\n\n return false\n },\n actions: [\n (_, {annotation, url}) => [\n {\n type: 'insert.span',\n text: url,\n annotations: [annotation],\n },\n ],\n ],\n })\n\n const linkBehaviors = [pasteLinkOnSelection, pasteLinkAtCaret]\n\n return linkBehaviors\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSchema} from '../editor/define-schema'\nimport * as selectors from '../selectors'\nimport {getBlockTextBefore} from '../selectors/selector.get-text-before'\nimport {spanSelectionPointToBlockOffset} from '../utils/util.block-offset'\nimport {getTextBlockText} from '../utils/util.get-text-block-text'\nimport {defineBehavior} from './behavior.types'\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 */\nexport function createMarkdownBehaviors(config: MarkdownBehaviorsConfig) {\n const automaticBlockquoteOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!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?.(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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const automaticHr = defineBehavior({\n on: 'insert.text',\n guard: ({context, 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?.(context)\n const focusBlock = selectors.getFocusTextBlock({context})\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n\n if (!hrObject || !focusBlock || !selectionCollapsed) {\n return false\n }\n\n const textBefore = getBlockTextBefore({context})\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 (textBefore === `${hrCharacter}${hrCharacter}`) {\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 object',\n placement: 'before',\n blockObject: hrObject,\n },\n {\n type: 'delete.text',\n ...hrBlockOffsets,\n },\n ],\n ],\n })\n const automaticHrOnPaste = defineBehavior({\n on: 'paste',\n guard: ({context, event}) => {\n const text = event.data.getData('text/plain')\n const hrRegExp = /^(---)$|(___)$|(\\*\\*\\*)$/gm\n const hrCharacters = text.match(hrRegExp)?.[0]\n const hrObject = config.horizontalRuleObject?.(context)\n const focusBlock = selectors.getFocusBlock({context})\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 (_, {hrObject, focusBlock}) =>\n isPortableTextTextBlock(focusBlock.node)\n ? [\n {\n type: 'insert.text block',\n textBlock: {children: focusBlock.node.children},\n placement: 'after',\n },\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n {type: 'delete.block', blockPath: focusBlock.path},\n ]\n : [\n {\n type: 'insert.block object',\n blockObject: hrObject,\n placement: 'after',\n },\n ],\n ],\n })\n const automaticHeadingOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\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 (!caretAtTheEndOfHeading) {\n return false\n }\n\n const style =\n level !== undefined\n ? config.headingStyle?.({schema: 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: 'text block.unset',\n props: ['listItem', 'level'],\n at: focusTextBlock.path,\n },\n {\n type: 'text block.set',\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const clearStyleOnBackspace = defineBehavior({\n on: 'delete.backward',\n guard: ({context}) => {\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const atTheBeginningOfBLock =\n focusTextBlock.node.children[0]._key === focusSpan.node._key &&\n context.selection?.focus.offset === 0\n\n const defaultStyle = config.defaultStyle?.(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: 'text block.set',\n style: defaultStyle,\n at: focusTextBlock.path,\n },\n ],\n ],\n })\n const automaticListOnSpace = defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const isSpace = event.text === ' '\n\n if (!isSpace) {\n return false\n }\n\n const selectionCollapsed = selectors.isSelectionCollapsed({context})\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const focusSpan = selectors.getFocusSpan({context})\n\n if (!selectionCollapsed || !focusTextBlock || !focusSpan) {\n return false\n }\n\n const blockOffset = spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: [\n {_key: focusTextBlock.node._key},\n 'children',\n {_key: focusSpan.node._key},\n ],\n offset: context.selection?.focus.offset ?? 0,\n },\n })\n\n if (!blockOffset) {\n return false\n }\n\n const blockText = getTextBlockText(focusTextBlock.node)\n const defaultStyle = config.defaultStyle?.(context)\n const looksLikeUnorderedList = /^(-|\\*)/.test(blockText)\n const unorderedListStyle = config.unorderedListStyle?.(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?.(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: 'text block.set',\n listItem,\n level: 1,\n style,\n at: focusTextBlock.path,\n },\n {\n type: 'delete.text',\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 const markdownBehaviors = [\n automaticBlockquoteOnSpace,\n automaticHeadingOnSpace,\n automaticHr,\n automaticHrOnPaste,\n clearStyleOnBackspace,\n automaticListOnSpace,\n ]\n\n return markdownBehaviors\n}\n"],"names":["createCodeEditorBehaviors","config","defineBehavior","on","guard","context","event","isMoveUpShortcut","isHotkey","moveBlockUpShortcut","keyboardEvent","firstBlock","selectors","selectedBlocks","blocksAbove","node","_key","paths","map","block","path","actions","_","at","type","isMoveDownShortcut","moveBlockDownShortcut","lastBlock","blocksBelow","length","reverse","emojiCharRegEx","incompleteEmojiRegEx","emojiRegEx","createEmojiPickerBehaviors","emojiPickerActor","createActor","createEmojiPickerMachine","start","subscribe","state","onMatchesChanged","matches","onSelectedIndexChanged","selectedIndex","text","test","emojis","focusBlock","emojiKeyword","match","undefined","matchEmojis","keyword","params","effect","send","getSnapshot","emoji","parseMatch","textBefore","emojiStringLength","textBeforeLength","anchor","offset","focus","action","isEnter","isTab","isArrowDown","isArrowUp","unit","slice","setup","types","events","assign","assertEvent","guards","no matches","createMachine","id","initial","states","target","always","exit","looksLikeUrl","url","URL","sensibleProtocols","includes","protocol","createLinkBehaviors","pasteLinkOnSelection","selectionCollapsed","data","getData","annotation","linkAnnotation","schema","pasteLinkAtCaret","focusSpan","annotations","createMarkdownBehaviors","automaticBlockquoteOnSpace","focusTextBlock","blockOffset","spanSelectionPointToBlockOffset","value","selectionPoint","selection","blockText","getTextBlockText","caretAtTheEndOfQuote","looksLikeMarkdownQuote","blockquoteStyle","style","props","automaticHr","hrCharacter","hrObject","horizontalRuleObject","getBlockTextBefore","hrBlockOffsets","placement","blockObject","automaticHrOnPaste","hrRegExp","hrCharacters","isPortableTextTextBlock","textBlock","children","blockPath","automaticHeadingOnSpace","markdownHeadingSearch","exec","level","headingStyle","clearStyleOnBackspace","atTheBeginningOfBLock","defaultStyle","automaticListOnSpace","looksLikeUnorderedList","unorderedListStyle","caretAtTheEndOfUnorderedList","listItem","listItemLength","looksLikeOrderedList","orderedListStyle","caretAtTheEndOfOrderedList"],"mappings":"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"}
|
package/lib/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: !0 });
|
|
3
|
-
var schema = require("@sanity/schema"), types = require("@sanity/types"), startCase = require("lodash.startcase"), jsxRuntime = require("react/jsx-runtime"), react = require("@xstate/react"), isEqual = require("lodash/isEqual.js"), noop = require("lodash/noop.js"), React = require("react"), slate = require("slate"), slateReact = require("slate-react"), debug$k = require("debug"), reactCompilerRuntime = require("react-compiler-runtime"), uniq = require("lodash/uniq.js"), rxjs = require("rxjs"), useEffectEvent = require("use-effect-event"), xstate = require("xstate"), patches = require("@portabletext/patches"), flatten = require("lodash/flatten.js"), isPlainObject = require("lodash/isPlainObject.js"), get = require("lodash/get.js"), isUndefined = require("lodash/isUndefined.js"), omitBy = require("lodash/omitBy.js"), selector_isSelectionCollapsed = require("./_chunks-cjs/selector.is-selection-collapsed.cjs"), behavior_core = require("./_chunks-cjs/behavior.core.cjs"), getRandomValues = require("get-random-values-esm"), blockTools = require("@sanity/block-tools");
|
|
3
|
+
var schema = require("@sanity/schema"), types = require("@sanity/types"), startCase = require("lodash.startcase"), jsxRuntime = require("react/jsx-runtime"), react = require("@xstate/react"), isEqual = require("lodash/isEqual.js"), noop = require("lodash/noop.js"), React = require("react"), slate = require("slate"), slateReact = require("slate-react"), debug$k = require("debug"), reactCompilerRuntime = require("react-compiler-runtime"), uniq = require("lodash/uniq.js"), rxjs = require("rxjs"), useEffectEvent = require("use-effect-event"), xstate = require("xstate"), patches = require("@portabletext/patches"), flatten = require("lodash/flatten.js"), isPlainObject = require("lodash/isPlainObject.js"), get = require("lodash/get.js"), isUndefined = require("lodash/isUndefined.js"), omitBy = require("lodash/omitBy.js"), selector_isSelectionCollapsed = require("./_chunks-cjs/selector.is-selection-collapsed.cjs"), util_isEmptyTextBlock = require("./_chunks-cjs/util.is-empty-text-block.cjs"), behavior_core = require("./_chunks-cjs/behavior.core.cjs"), getRandomValues = require("get-random-values-esm"), blockTools = require("@sanity/block-tools");
|
|
4
4
|
function _interopDefaultCompat(e) {
|
|
5
5
|
return e && typeof e == "object" && "default" in e ? e : { default: e };
|
|
6
6
|
}
|
|
@@ -2769,6 +2769,14 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2769
2769
|
});
|
|
2770
2770
|
break;
|
|
2771
2771
|
}
|
|
2772
|
+
case "custom.*": {
|
|
2773
|
+
editorActor.send({
|
|
2774
|
+
type: "custom behavior event",
|
|
2775
|
+
behaviorEvent: event.event,
|
|
2776
|
+
editor
|
|
2777
|
+
});
|
|
2778
|
+
break;
|
|
2779
|
+
}
|
|
2772
2780
|
case "decorator.toggle": {
|
|
2773
2781
|
editorActor.send({
|
|
2774
2782
|
type: "behavior event",
|
|
@@ -2853,9 +2861,18 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2853
2861
|
};
|
|
2854
2862
|
});
|
|
2855
2863
|
const {
|
|
2864
|
+
deleteBackward,
|
|
2865
|
+
deleteForward,
|
|
2866
|
+
insertBreak,
|
|
2867
|
+
insertSoftBreak,
|
|
2868
|
+
insertText,
|
|
2856
2869
|
select
|
|
2857
2870
|
} = editor;
|
|
2858
2871
|
return editor.deleteBackward = (unit) => {
|
|
2872
|
+
if (isApplyingBehaviorActions(editor)) {
|
|
2873
|
+
deleteBackward(unit);
|
|
2874
|
+
return;
|
|
2875
|
+
}
|
|
2859
2876
|
editorActor.send({
|
|
2860
2877
|
type: "behavior event",
|
|
2861
2878
|
behaviorEvent: {
|
|
@@ -2865,6 +2882,10 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2865
2882
|
editor
|
|
2866
2883
|
});
|
|
2867
2884
|
}, editor.deleteForward = (unit) => {
|
|
2885
|
+
if (isApplyingBehaviorActions(editor)) {
|
|
2886
|
+
deleteForward(unit);
|
|
2887
|
+
return;
|
|
2888
|
+
}
|
|
2868
2889
|
editorActor.send({
|
|
2869
2890
|
type: "behavior event",
|
|
2870
2891
|
behaviorEvent: {
|
|
@@ -2874,6 +2895,10 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2874
2895
|
editor
|
|
2875
2896
|
});
|
|
2876
2897
|
}, editor.insertBreak = () => {
|
|
2898
|
+
if (isApplyingBehaviorActions(editor)) {
|
|
2899
|
+
insertBreak();
|
|
2900
|
+
return;
|
|
2901
|
+
}
|
|
2877
2902
|
editorActor.send({
|
|
2878
2903
|
type: "behavior event",
|
|
2879
2904
|
behaviorEvent: {
|
|
@@ -2882,6 +2907,10 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2882
2907
|
editor
|
|
2883
2908
|
});
|
|
2884
2909
|
}, editor.insertSoftBreak = () => {
|
|
2910
|
+
if (isApplyingBehaviorActions(editor)) {
|
|
2911
|
+
insertSoftBreak();
|
|
2912
|
+
return;
|
|
2913
|
+
}
|
|
2885
2914
|
editorActor.send({
|
|
2886
2915
|
type: "behavior event",
|
|
2887
2916
|
behaviorEvent: {
|
|
@@ -2890,6 +2919,10 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2890
2919
|
editor
|
|
2891
2920
|
});
|
|
2892
2921
|
}, editor.insertText = (text, options) => {
|
|
2922
|
+
if (isApplyingBehaviorActions(editor)) {
|
|
2923
|
+
insertText(text, options);
|
|
2924
|
+
return;
|
|
2925
|
+
}
|
|
2893
2926
|
editorActor.send({
|
|
2894
2927
|
type: "behavior event",
|
|
2895
2928
|
behaviorEvent: {
|
|
@@ -2897,7 +2930,10 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2897
2930
|
text,
|
|
2898
2931
|
options
|
|
2899
2932
|
},
|
|
2900
|
-
editor
|
|
2933
|
+
editor,
|
|
2934
|
+
defaultActionCallback: () => {
|
|
2935
|
+
insertText(text, options);
|
|
2936
|
+
}
|
|
2901
2937
|
});
|
|
2902
2938
|
}, editor.select = (location) => {
|
|
2903
2939
|
if (isApplyingBehaviorActions(editor)) {
|
|
@@ -2911,7 +2947,10 @@ function createWithEventListeners(editorActor, subscriptions) {
|
|
|
2911
2947
|
type: "select",
|
|
2912
2948
|
selection: toPortableTextRange(fromSlateValue(editor.children, editorActor.getSnapshot().context.schema.block.name, KEY_TO_VALUE_ELEMENT.get(editor)), range, editorActor.getSnapshot().context.schema)
|
|
2913
2949
|
},
|
|
2914
|
-
editor
|
|
2950
|
+
editor,
|
|
2951
|
+
defaultActionCallback: () => {
|
|
2952
|
+
select(location);
|
|
2953
|
+
}
|
|
2915
2954
|
});
|
|
2916
2955
|
}, editor;
|
|
2917
2956
|
};
|
|
@@ -5108,10 +5147,10 @@ const insertBlockObjectActionImplementation = ({
|
|
|
5108
5147
|
context,
|
|
5109
5148
|
action
|
|
5110
5149
|
}) => {
|
|
5111
|
-
const value = fromSlateValue(action.editor.children, context.schema.block.name, KEY_TO_VALUE_ELEMENT.get(action.editor)), anchor =
|
|
5150
|
+
const value = fromSlateValue(action.editor.children, context.schema.block.name, KEY_TO_VALUE_ELEMENT.get(action.editor)), anchor = util_isEmptyTextBlock.blockOffsetToSpanSelectionPoint({
|
|
5112
5151
|
value,
|
|
5113
5152
|
blockOffset: action.anchor
|
|
5114
|
-
}), focus =
|
|
5153
|
+
}), focus = util_isEmptyTextBlock.blockOffsetToSpanSelectionPoint({
|
|
5115
5154
|
value,
|
|
5116
5155
|
blockOffset: action.focus
|
|
5117
5156
|
});
|
|
@@ -5587,20 +5626,36 @@ const editorMachine = xstate.setup({
|
|
|
5587
5626
|
event,
|
|
5588
5627
|
enqueue
|
|
5589
5628
|
}) => {
|
|
5590
|
-
xstate.assertEvent(event, ["behavior event"]);
|
|
5591
|
-
const defaultAction = event.behaviorEvent.type === "copy" || event.behaviorEvent.type === "key.down" || event.behaviorEvent.type === "key.up" || event.behaviorEvent.type === "paste" ? void 0 : {
|
|
5629
|
+
xstate.assertEvent(event, ["behavior event", "custom behavior event"]);
|
|
5630
|
+
const defaultAction = event.type === "custom behavior event" || event.behaviorEvent.type === "copy" || event.behaviorEvent.type === "key.down" || event.behaviorEvent.type === "key.up" || event.behaviorEvent.type === "paste" ? void 0 : {
|
|
5592
5631
|
...event.behaviorEvent,
|
|
5593
5632
|
editor: event.editor
|
|
5594
|
-
}, eventBehaviors = [...context.behaviors.values()].filter((behavior) => behavior.on === event.behaviorEvent.type);
|
|
5633
|
+
}, defaultActionCallback = event.type === "behavior event" ? event.defaultActionCallback : void 0, eventBehaviors = [...context.behaviors.values()].filter((behavior) => behavior.on === event.behaviorEvent.type);
|
|
5595
5634
|
if (eventBehaviors.length === 0) {
|
|
5635
|
+
if (defaultActionCallback) {
|
|
5636
|
+
withApplyingBehaviorActions(event.editor, () => {
|
|
5637
|
+
slate.Editor.withoutNormalizing(event.editor, () => {
|
|
5638
|
+
try {
|
|
5639
|
+
defaultActionCallback();
|
|
5640
|
+
} catch (error) {
|
|
5641
|
+
console.error(new Error(`Performing action "${event.behaviorEvent.type}" failed due to: ${error.message}`));
|
|
5642
|
+
}
|
|
5643
|
+
});
|
|
5644
|
+
});
|
|
5645
|
+
return;
|
|
5646
|
+
}
|
|
5596
5647
|
if (!defaultAction)
|
|
5597
5648
|
return;
|
|
5598
5649
|
withApplyingBehaviorActions(event.editor, () => {
|
|
5599
5650
|
slate.Editor.withoutNormalizing(event.editor, () => {
|
|
5600
|
-
|
|
5601
|
-
|
|
5602
|
-
|
|
5603
|
-
|
|
5651
|
+
try {
|
|
5652
|
+
performAction({
|
|
5653
|
+
context,
|
|
5654
|
+
action: defaultAction
|
|
5655
|
+
});
|
|
5656
|
+
} catch (error) {
|
|
5657
|
+
console.error(new Error(`Performing action "${defaultAction.type}" as a result of "${event.behaviorEvent.type}" failed due to: ${error.message}`));
|
|
5658
|
+
}
|
|
5604
5659
|
});
|
|
5605
5660
|
}), event.editor.onChange();
|
|
5606
5661
|
return;
|
|
@@ -5632,7 +5687,11 @@ const editorMachine = xstate.setup({
|
|
|
5632
5687
|
slate.Editor.withoutNormalizing(event.editor, () => {
|
|
5633
5688
|
for (const actionIntend of actionIntends) {
|
|
5634
5689
|
if (actionIntend.type === "raise") {
|
|
5635
|
-
enqueue.raise({
|
|
5690
|
+
behavior_core.isCustomBehaviorEvent(actionIntend.event) ? enqueue.raise({
|
|
5691
|
+
type: "custom behavior event",
|
|
5692
|
+
behaviorEvent: actionIntend.event,
|
|
5693
|
+
editor: event.editor
|
|
5694
|
+
}) : enqueue.raise({
|
|
5636
5695
|
type: "behavior event",
|
|
5637
5696
|
behaviorEvent: actionIntend.event,
|
|
5638
5697
|
editor: event.editor
|
|
@@ -5643,10 +5702,15 @@ const editorMachine = xstate.setup({
|
|
|
5643
5702
|
...actionIntend,
|
|
5644
5703
|
editor: event.editor
|
|
5645
5704
|
};
|
|
5646
|
-
|
|
5647
|
-
|
|
5648
|
-
|
|
5649
|
-
|
|
5705
|
+
try {
|
|
5706
|
+
performAction({
|
|
5707
|
+
context,
|
|
5708
|
+
action
|
|
5709
|
+
});
|
|
5710
|
+
} catch (error) {
|
|
5711
|
+
console.error(new Error(`Performing action "${action.type}" as a result of "${event.behaviorEvent.type}" failed due to: ${error.message}`));
|
|
5712
|
+
break;
|
|
5713
|
+
}
|
|
5650
5714
|
}
|
|
5651
5715
|
});
|
|
5652
5716
|
}), event.editor.onChange();
|
|
@@ -5656,14 +5720,30 @@ const editorMachine = xstate.setup({
|
|
|
5656
5720
|
}
|
|
5657
5721
|
}
|
|
5658
5722
|
if (!behaviorOverwritten) {
|
|
5723
|
+
if (defaultActionCallback) {
|
|
5724
|
+
withApplyingBehaviorActions(event.editor, () => {
|
|
5725
|
+
slate.Editor.withoutNormalizing(event.editor, () => {
|
|
5726
|
+
try {
|
|
5727
|
+
defaultActionCallback();
|
|
5728
|
+
} catch (error) {
|
|
5729
|
+
console.error(new Error(`Performing "${event.behaviorEvent.type}" failed due to: ${error.message}`));
|
|
5730
|
+
}
|
|
5731
|
+
});
|
|
5732
|
+
});
|
|
5733
|
+
return;
|
|
5734
|
+
}
|
|
5659
5735
|
if (!defaultAction)
|
|
5660
5736
|
return;
|
|
5661
5737
|
withApplyingBehaviorActions(event.editor, () => {
|
|
5662
5738
|
slate.Editor.withoutNormalizing(event.editor, () => {
|
|
5663
|
-
|
|
5664
|
-
|
|
5665
|
-
|
|
5666
|
-
|
|
5739
|
+
try {
|
|
5740
|
+
performAction({
|
|
5741
|
+
context,
|
|
5742
|
+
action: defaultAction
|
|
5743
|
+
});
|
|
5744
|
+
} catch (error) {
|
|
5745
|
+
console.error(new Error(`Performing action "${defaultAction.type}" as a result of "${event.behaviorEvent.type}" failed due to: ${error.message}`));
|
|
5746
|
+
}
|
|
5667
5747
|
});
|
|
5668
5748
|
}), event.editor.onChange();
|
|
5669
5749
|
}
|
|
@@ -5810,6 +5890,9 @@ const editorMachine = xstate.setup({
|
|
|
5810
5890
|
"behavior event": {
|
|
5811
5891
|
actions: "handle behavior event"
|
|
5812
5892
|
},
|
|
5893
|
+
"custom behavior event": {
|
|
5894
|
+
actions: "handle behavior event"
|
|
5895
|
+
},
|
|
5813
5896
|
"annotation.*": {
|
|
5814
5897
|
actions: xstate.emit(({
|
|
5815
5898
|
event
|
|
@@ -5820,6 +5903,14 @@ const editorMachine = xstate.setup({
|
|
|
5820
5903
|
event
|
|
5821
5904
|
}) => event)
|
|
5822
5905
|
},
|
|
5906
|
+
"custom.*": {
|
|
5907
|
+
actions: xstate.emit(({
|
|
5908
|
+
event
|
|
5909
|
+
}) => ({
|
|
5910
|
+
type: "custom.*",
|
|
5911
|
+
event
|
|
5912
|
+
}))
|
|
5913
|
+
},
|
|
5823
5914
|
"decorator.*": {
|
|
5824
5915
|
actions: xstate.emit(({
|
|
5825
5916
|
event
|