@portabletext/editor 1.33.5 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/_chunks-cjs/behavior.core.cjs +14 -8
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +20 -12
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/plugin.event-listener.cjs +95 -70
- package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
- package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs +103 -46
- package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +14 -8
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +20 -12
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/plugin.event-listener.js +101 -75
- package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
- package/lib/_chunks-es/util.block-offsets-to-selection.js +102 -46
- package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
- package/lib/behaviors/index.d.cts +5 -34
- package/lib/behaviors/index.d.ts +5 -34
- package/lib/index.d.cts +300 -1460
- package/lib/index.d.ts +300 -1460
- package/lib/plugins/index.cjs +60 -43
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +300 -1460
- package/lib/plugins/index.d.ts +300 -1460
- package/lib/plugins/index.js +63 -45
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.d.cts +12 -0
- package/lib/selectors/index.d.ts +12 -0
- package/lib/utils/index.cjs +23 -1
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +11 -0
- package/lib/utils/index.d.ts +11 -0
- package/lib/utils/index.js +25 -2
- package/lib/utils/index.js.map +1 -1
- package/package.json +6 -6
- package/src/behavior-actions/behavior.action.block.set.ts +48 -5
- package/src/behavior-actions/behavior.action.block.unset.ts +77 -3
- package/src/behavior-actions/behavior.action.decorator.add.ts +30 -8
- package/src/behavior-actions/behavior.actions.ts +1 -18
- package/src/behaviors/behavior.core.lists.ts +18 -14
- package/src/behaviors/behavior.markdown-emphasis.ts +82 -41
- package/src/behaviors/behavior.markdown.ts +14 -12
- package/src/behaviors/behavior.types.ts +2 -14
- package/src/converters/converter.portable-text.deserialize.test.ts +3 -2
- package/src/internal-utils/parse-blocks.test.ts +455 -0
- package/src/internal-utils/parse-blocks.ts +202 -87
- package/src/utils/index.ts +1 -0
- package/src/utils/util.child-selection-point-to-block-offset.ts +55 -0
- package/src/behavior-actions/behavior.action.text-block.set.ts +0 -25
- package/src/behavior-actions/behavior.action.text-block.unset.ts +0 -17
package/lib/plugins/index.js
CHANGED
|
@@ -6,12 +6,13 @@ import { createMarkdownBehaviors } from "../_chunks-es/behavior.markdown.js";
|
|
|
6
6
|
import { useActorRef } from "@xstate/react";
|
|
7
7
|
import isEqual from "lodash/isEqual.js";
|
|
8
8
|
import { setup, fromCallback, assign } from "xstate";
|
|
9
|
-
import { getFocusTextBlock, getSelectionStartPoint, isSelectionExpanded, getSelectionEndPoint } from "../_chunks-es/selector.is-at-the-start-of-block.js";
|
|
10
|
-
import { spanSelectionPointToBlockOffset,
|
|
9
|
+
import { getFocusTextBlock, getPreviousInlineObject, getSelectionStartPoint, isSelectionExpanded, getSelectionEndPoint } from "../_chunks-es/selector.is-at-the-start-of-block.js";
|
|
10
|
+
import { spanSelectionPointToBlockOffset, getBlockStartPoint, getBlockEndPoint, isEqualSelectionPoints } from "../_chunks-es/util.slice-blocks.js";
|
|
11
|
+
import { blockOffsetsToSelection } from "../_chunks-es/util.block-offsets-to-selection.js";
|
|
12
|
+
import { childSelectionPointToBlockOffset, isTextBlock, splitTextBlock, mergeTextBlocks } from "../utils/index.js";
|
|
11
13
|
import { getBlockTextBefore } from "../_chunks-es/selector.get-text-before.js";
|
|
12
14
|
import { defineBehavior, raise } from "../_chunks-es/behavior.core.js";
|
|
13
15
|
import { jsx } from "react/jsx-runtime";
|
|
14
|
-
import { isTextBlock, splitTextBlock, mergeTextBlocks } from "../utils/index.js";
|
|
15
16
|
function BehaviorPlugin(props) {
|
|
16
17
|
const $ = c(4), editor = useEditor();
|
|
17
18
|
let t0, t1;
|
|
@@ -70,7 +71,7 @@ const emphasisListener = ({
|
|
|
70
71
|
event
|
|
71
72
|
}) => {
|
|
72
73
|
const boldDecorator = input.boldDecorator, italicDecorator = input.italicDecorator;
|
|
73
|
-
if (boldDecorator === void 0 && italicDecorator === void 0
|
|
74
|
+
if (boldDecorator === void 0 && italicDecorator === void 0)
|
|
74
75
|
return !1;
|
|
75
76
|
const focusTextBlock = getFocusTextBlock({
|
|
76
77
|
context
|
|
@@ -89,38 +90,30 @@ const emphasisListener = ({
|
|
|
89
90
|
const prefixOffsets = {
|
|
90
91
|
anchor: {
|
|
91
92
|
path: focusTextBlock.path,
|
|
92
|
-
|
|
93
|
+
// Example: "foo *bar*".length - "*bar*".length = 4
|
|
94
|
+
offset: `${textBefore}${event.text}`.length - textToItalic.length
|
|
93
95
|
},
|
|
94
96
|
focus: {
|
|
95
97
|
path: focusTextBlock.path,
|
|
96
|
-
|
|
98
|
+
// Example: "foo *bar*".length - "*bar*".length + 1 = 5
|
|
99
|
+
offset: `${textBefore}${event.text}`.length - textToItalic.length + 1
|
|
97
100
|
}
|
|
98
101
|
}, suffixOffsets = {
|
|
99
102
|
anchor: {
|
|
100
103
|
path: focusTextBlock.path,
|
|
101
|
-
|
|
104
|
+
// Example: "foo *bar|" (8) + "*".length - 1 = 8
|
|
105
|
+
offset: selectionStartOffset.offset + event.text.length - 1
|
|
102
106
|
},
|
|
103
107
|
focus: {
|
|
104
108
|
path: focusTextBlock.path,
|
|
105
|
-
|
|
109
|
+
// Example: "foo *bar|" (8) + "*".length = 9
|
|
110
|
+
offset: selectionStartOffset.offset + event.text.length
|
|
106
111
|
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
blockOffset: prefixOffsets.focus,
|
|
110
|
-
direction: "backward"
|
|
111
|
-
}), focus = blockOffsetToSpanSelectionPoint({
|
|
112
|
-
value: context.value,
|
|
113
|
-
blockOffset: suffixOffsets.anchor,
|
|
114
|
-
direction: "forward"
|
|
115
|
-
});
|
|
116
|
-
return !anchor || !focus ? !1 : {
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
117
114
|
prefixOffsets,
|
|
118
115
|
suffixOffsets,
|
|
119
|
-
decorator: italicDecorator
|
|
120
|
-
selection: {
|
|
121
|
-
anchor,
|
|
122
|
-
focus
|
|
123
|
-
}
|
|
116
|
+
decorator: italicDecorator
|
|
124
117
|
};
|
|
125
118
|
}
|
|
126
119
|
const textToBold = getTextToBold(`${textBefore}${event.text}`);
|
|
@@ -128,38 +121,58 @@ const emphasisListener = ({
|
|
|
128
121
|
const prefixOffsets = {
|
|
129
122
|
anchor: {
|
|
130
123
|
path: focusTextBlock.path,
|
|
131
|
-
|
|
124
|
+
// Example: "foo **bar**".length - "**bar**".length = 4
|
|
125
|
+
offset: `${textBefore}${event.text}`.length - textToBold.length
|
|
132
126
|
},
|
|
133
127
|
focus: {
|
|
134
128
|
path: focusTextBlock.path,
|
|
135
|
-
|
|
129
|
+
// Example: "foo **bar**".length - "**bar**".length + 2 = 6
|
|
130
|
+
offset: `${textBefore}${event.text}`.length - textToBold.length + 2
|
|
136
131
|
}
|
|
137
|
-
},
|
|
132
|
+
}, prefixSelection = blockOffsetsToSelection({
|
|
133
|
+
value: context.value,
|
|
134
|
+
offsets: prefixOffsets
|
|
135
|
+
}), inlineObjectBeforePrefixFocus = getPreviousInlineObject({
|
|
136
|
+
context: {
|
|
137
|
+
...context,
|
|
138
|
+
selection: prefixSelection ? {
|
|
139
|
+
anchor: prefixSelection.focus,
|
|
140
|
+
focus: prefixSelection.focus
|
|
141
|
+
} : null
|
|
142
|
+
}
|
|
143
|
+
}), inlineObjectBeforePrefixFocusOffset = inlineObjectBeforePrefixFocus ? childSelectionPointToBlockOffset({
|
|
144
|
+
value: context.value,
|
|
145
|
+
selectionPoint: {
|
|
146
|
+
path: inlineObjectBeforePrefixFocus.path,
|
|
147
|
+
offset: 0
|
|
148
|
+
}
|
|
149
|
+
}) : void 0;
|
|
150
|
+
if (inlineObjectBeforePrefixFocusOffset && inlineObjectBeforePrefixFocusOffset.offset > prefixOffsets.anchor.offset && inlineObjectBeforePrefixFocusOffset.offset < prefixOffsets.focus.offset)
|
|
151
|
+
return !1;
|
|
152
|
+
const suffixOffsets = {
|
|
138
153
|
anchor: {
|
|
139
154
|
path: focusTextBlock.path,
|
|
140
|
-
|
|
155
|
+
// Example: "foo **bar*|" (10) + "*".length - 2 = 9
|
|
156
|
+
offset: selectionStartOffset.offset + event.text.length - 2
|
|
141
157
|
},
|
|
142
158
|
focus: {
|
|
143
159
|
path: focusTextBlock.path,
|
|
144
|
-
|
|
160
|
+
// Example: "foo **bar*|" (10) + "*".length = 11
|
|
161
|
+
offset: selectionStartOffset.offset + event.text.length
|
|
145
162
|
}
|
|
146
|
-
},
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
direction: "backward"
|
|
150
|
-
}), focus = blockOffsetToSpanSelectionPoint({
|
|
163
|
+
}, previousInlineObject = getPreviousInlineObject({
|
|
164
|
+
context
|
|
165
|
+
}), previousInlineObjectOffset = previousInlineObject ? childSelectionPointToBlockOffset({
|
|
151
166
|
value: context.value,
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
167
|
+
selectionPoint: {
|
|
168
|
+
path: previousInlineObject.path,
|
|
169
|
+
offset: 0
|
|
170
|
+
}
|
|
171
|
+
}) : void 0;
|
|
172
|
+
return previousInlineObjectOffset && previousInlineObjectOffset.offset > suffixOffsets.anchor.offset && previousInlineObjectOffset.offset < suffixOffsets.focus.offset ? !1 : {
|
|
156
173
|
prefixOffsets,
|
|
157
174
|
suffixOffsets,
|
|
158
|
-
decorator: boldDecorator
|
|
159
|
-
selection: {
|
|
160
|
-
anchor,
|
|
161
|
-
focus
|
|
162
|
-
}
|
|
175
|
+
decorator: boldDecorator
|
|
163
176
|
};
|
|
164
177
|
}
|
|
165
178
|
return !1;
|
|
@@ -169,18 +182,23 @@ const emphasisListener = ({
|
|
|
169
182
|
}) => [event], (_, {
|
|
170
183
|
prefixOffsets,
|
|
171
184
|
suffixOffsets,
|
|
172
|
-
decorator
|
|
173
|
-
selection
|
|
185
|
+
decorator
|
|
174
186
|
}) => [{
|
|
175
187
|
type: "decorator.add",
|
|
176
188
|
decorator,
|
|
177
|
-
|
|
189
|
+
offsets: {
|
|
190
|
+
anchor: prefixOffsets.focus,
|
|
191
|
+
focus: suffixOffsets.anchor
|
|
192
|
+
}
|
|
178
193
|
}, {
|
|
179
194
|
type: "delete.text",
|
|
180
195
|
...suffixOffsets
|
|
181
196
|
}, {
|
|
182
197
|
type: "delete.text",
|
|
183
198
|
...prefixOffsets
|
|
199
|
+
}, {
|
|
200
|
+
type: "decorator.remove",
|
|
201
|
+
decorator
|
|
184
202
|
}, {
|
|
185
203
|
type: "effect",
|
|
186
204
|
effect: () => {
|
package/lib/plugins/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/plugins/plugin.behavior.tsx","../../src/plugins/plugin.editor-ref.tsx","../../src/internal-utils/get-text-to-emphasize.ts","../../src/behaviors/behavior.markdown-emphasis.ts","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => unregister())\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","import React from 'react'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","const asteriskPairRegex = '(?<!\\\\*)\\\\*(?!\\\\s)([^*\\\\n]+?)(?<!\\\\s)\\\\*(?!\\\\*)'\nconst underscorePairRegex = '(?<!_)_(?!\\\\s)([^_\\\\n]+?)(?<!\\\\s)_(?!_)'\nconst italicRegex = new RegExp(`(${asteriskPairRegex}|${underscorePairRegex})$`)\n\nconst doubleAsteriskPairRegex =\n '(?<!\\\\*)\\\\*\\\\*(?!\\\\s)([^*\\\\n]+?)(?<!\\\\s)\\\\*\\\\*(?!\\\\*)'\nconst doubleUnderscorePairRegex = '(?<!_)__(?!\\\\s)([^_\\\\n]+?)(?<!\\\\s)__(?!_)'\nconst boldRegex = new RegExp(\n `(${doubleAsteriskPairRegex}|${doubleUnderscorePairRegex})$`,\n)\n\nexport function getTextToItalic(text: string) {\n return text.match(italicRegex)?.at(0)\n}\n\nexport function getTextToBold(text: string) {\n return text.match(boldRegex)?.at(0)\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\nimport {\n getTextToBold,\n getTextToItalic,\n} from '../internal-utils/get-text-to-emphasize'\nimport type {EditorSchema} from '../selectors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type MarkdownEmphasisBehaviorsConfig = {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function useMarkdownEmphasisBehaviors(props: {\n config: MarkdownEmphasisBehaviorsConfig\n}) {\n const editor = useEditor()\n\n useActorRef(emphasisMachine, {\n input: {\n editor,\n boldDecorator: props.config.boldDecorator?.({\n schema: editor.getSnapshot().context.schema,\n }),\n italicDecorator: props.config.italicDecorator?.({\n schema: editor.getSnapshot().context.schema,\n }),\n },\n })\n}\n\ntype MarkdownEmphasisEvent =\n | {\n type: 'emphasis.add'\n blockOffset: utils.BlockOffset\n }\n | {\n type: 'selection'\n blockOffsets?: {\n anchor: utils.BlockOffset\n focus: utils.BlockOffset\n }\n }\n | {\n type: 'delete.backward'\n }\n\nconst emphasisListener: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor; boldDecorator?: string; italicDecorator?: string}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const boldDecorator = input.boldDecorator\n const italicDecorator = input.italicDecorator\n\n if (boldDecorator === undefined && italicDecorator === undefined) {\n return false\n }\n\n if (event.text !== '*' && event.text !== '_') {\n return false\n }\n\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionStartOffset = selectionStartPoint\n ? utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartOffset) {\n return false\n }\n\n const textBefore = selectors.getBlockTextBefore({context})\n\n const textToItalic = getTextToItalic(`${textBefore}${event.text}`)\n\n if (textToItalic !== undefined && italicDecorator !== undefined) {\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n offset: textBefore.length - textToItalic.length + 1,\n },\n focus: {\n path: focusTextBlock.path,\n offset: textBefore.length - textToItalic.length + 1 + 1,\n },\n }\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n offset: selectionStartOffset.offset,\n },\n focus: {\n path: focusTextBlock.path,\n offset: selectionStartOffset.offset + 1,\n },\n }\n\n const anchor = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: prefixOffsets.focus,\n direction: 'backward',\n })\n const focus = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: suffixOffsets.anchor,\n direction: 'forward',\n })\n\n if (!anchor || !focus) {\n return false\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator: italicDecorator,\n selection: {anchor, focus},\n }\n }\n\n const textToBold = getTextToBold(`${textBefore}${event.text}`)\n\n if (textToBold !== undefined && boldDecorator !== undefined) {\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n offset: textBefore.length - textToBold.length + 1,\n },\n focus: {\n path: focusTextBlock.path,\n offset: textBefore.length - textToBold.length + 1 + 2,\n },\n }\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n offset: selectionStartOffset.offset - 1,\n },\n focus: {\n path: focusTextBlock.path,\n offset: selectionStartOffset.offset + 1,\n },\n }\n const anchor = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: prefixOffsets.focus,\n direction: 'backward',\n })\n const focus = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: suffixOffsets.anchor,\n direction: 'forward',\n })\n\n if (!anchor || !focus) {\n return false\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator: boldDecorator,\n selection: {anchor, focus},\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {prefixOffsets, suffixOffsets, decorator, selection}) => [\n {\n type: 'decorator.add',\n decorator,\n selection,\n },\n {\n type: 'delete.text',\n ...suffixOffsets,\n },\n {\n type: 'delete.text',\n ...prefixOffsets,\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({\n type: 'emphasis.add',\n blockOffset: {\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n },\n })\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst selectionListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'select',\n guard: ({context, event}) => {\n if (!event.selection) {\n return {blockOffsets: undefined}\n }\n\n const anchor = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: event.selection.anchor,\n })\n const focus = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: event.selection.focus,\n })\n\n if (!anchor || !focus) {\n return {blockOffsets: undefined}\n }\n\n return {\n blockOffsets: {\n anchor,\n focus,\n },\n }\n },\n actions: [\n (_, {blockOffsets}) => [\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'selection', blockOffsets})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst deleteBackwardListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'delete.backward',\n actions: [\n () => [\n {\n type: 'history.undo',\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'delete.backward'})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst emphasisMachine = setup({\n types: {\n context: {} as {\n boldDecorator?: string\n italicDecorator?: string\n offsetAfterEmphasis?: utils.BlockOffset\n editor: Editor\n },\n input: {} as {\n boldDecorator?: string\n italicDecorator?: string\n editor: Editor\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'emphasis',\n context: ({input}) => ({\n boldDecorator: input.boldDecorator,\n italicDecorator: input.italicDecorator,\n editor: input.editor,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n editor: context.editor,\n boldDecorator: context.boldDecorator,\n italicDecorator: context.italicDecorator,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport {\n useMarkdownEmphasisBehaviors,\n type MarkdownEmphasisBehaviorsConfig,\n} from '../behaviors/behavior.markdown-emphasis'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig &\n MarkdownEmphasisBehaviorsConfig\n\n/**\n * @beta\n * Add 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 {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * boldDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strong')?.value,\n * italicDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'em')?.value,\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 * </EditorProvider>\n * )\n * }\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n useMarkdownEmphasisBehaviors({config: props.config})\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [editor, props.config])\n\n return null\n}\n","import {defineBehavior, raise} from '../behaviors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({context}) =>\n context.selection && selectors.isSelectionExpanded({context})\n ? {selection: context.selection}\n : false,\n actions: [(_, {selection}) => [{type: 'delete', selection}]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * Other cases of `insert.block` are allowed.\n *\n * If a text block is inserted and the focus block is fully selected, then\n * the focus block can be replaced with the inserted block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(focusTextBlock)\n const blockEndPoint = utils.getBlockEndPoint(focusTextBlock)\n const newFocus = utils.getBlockEndPoint({\n node: event.block,\n path: [{_key: event.block._key}],\n })\n\n if (\n utils.isEqualSelectionPoints(blockStartPoint, selectionStartPoint) &&\n utils.isEqualSelectionPoints(blockEndPoint, selectionEndPoint)\n ) {\n return {focusTextBlock, newFocus}\n }\n\n return false\n },\n actions: [\n ({event}, {focusTextBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: event.block, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockBeforeStartPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionStartPoint,\n })?.before\n const blockAfterEndPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionEndPoint,\n })?.after\n\n if (!blockBeforeStartPoint || !blockAfterEndPoint) {\n return false\n }\n\n const targetBlock = utils.mergeTextBlocks({\n context,\n targetBlock: blockBeforeStartPoint,\n incomingBlock: event.block,\n })\n\n const newFocus = utils.getBlockEndPoint({\n node: targetBlock,\n path: [{_key: targetBlock._key}],\n })\n\n const mergedBlock = utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock: blockAfterEndPoint,\n })\n\n return {focusTextBlock, mergedBlock, newFocus}\n },\n actions: [\n (_, {focusTextBlock, mergedBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: mergedBlock, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({context, event}) => {\n return event.blocks\n .filter((block) => utils.isTextBlock(context, block))\n .reduce((targetBlock, incomingBlock) => {\n return utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n /**\n * Block objects do not fit in a one-line editor\n */\n defineBehavior({\n on: 'insert.block object',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.text block` is raised as an `insert.block` so it can be handled\n * by the Behaviors above.\n */\n defineBehavior({\n on: 'insert.text block',\n actions: [\n ({context, event}) => [\n raise({\n type: 'insert.block',\n block: {\n _key: context.keyGenerator(),\n _type: context.schema.block.name,\n children: event.textBlock?.children ?? [],\n },\n placement: event.placement,\n }),\n ],\n ],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","EditorRefPlugin","React","forwardRef","_","ref","portableTextEditorRef","useRef","Symbol","for","current","useImperativeHandle","displayName","asteriskPairRegex","underscorePairRegex","italicRegex","RegExp","doubleAsteriskPairRegex","doubleUnderscorePairRegex","boldRegex","getTextToItalic","text","match","at","getTextToBold","useMarkdownEmphasisBehaviors","config","boldDecorator","schema","getSnapshot","context","italicDecorator","t2","input","useActorRef","emphasisMachine","emphasisListener","sendBack","defineBehavior","on","guard","event","undefined","focusTextBlock","selectors","selectionStartPoint","selectionStartOffset","utils","value","selectionPoint","textBefore","textToItalic","prefixOffsets","anchor","path","offset","length","focus","suffixOffsets","blockOffset","direction","decorator","selection","textToBold","actions","type","effect","selectionListenerCallback","blockOffsets","deleteBackwardListenerCallback","setup","types","events","actors","fromCallback","createMachine","id","initial","states","invoke","src","target","assign","offsetAfterEmphasis","exit","isEqual","MarkdownPlugin","createMarkdownBehaviors","unregisterBehavior","oneLineBehaviors","placement","selectionEndPoint","block","blockStartPoint","blockEndPoint","newFocus","node","_key","blockPath","blockBeforeStartPoint","point","before","blockAfterEndPoint","after","targetBlock","incomingBlock","mergedBlock","blocks","filter","reduce","raise","keyGenerator","_type","name","children","textBlock","OneLinePlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/plugins/plugin.behavior.tsx","../../src/plugins/plugin.editor-ref.tsx","../../src/internal-utils/get-text-to-emphasize.ts","../../src/behaviors/behavior.markdown-emphasis.ts","../../src/plugins/plugin.markdown.tsx","../../src/plugins/plugin.one-line.tsx"],"sourcesContent":["import {useEffect} from 'react'\nimport type {Behavior} from '../behaviors'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport function BehaviorPlugin(props: {behaviors: Array<Behavior>}) {\n const editor = useEditor()\n\n useEffect(() => {\n const unregisterBehaviors = props.behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n unregisterBehaviors.forEach((unregister) => unregister())\n }\n }, [editor, props.behaviors])\n\n return null\n}\n","import React from 'react'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport const EditorRefPlugin = React.forwardRef<Editor | null>((_, ref) => {\n const editor = useEditor()\n\n const portableTextEditorRef = React.useRef(editor)\n\n React.useImperativeHandle(ref, () => portableTextEditorRef.current, [])\n\n return null\n})\nEditorRefPlugin.displayName = 'EditorRefPlugin'\n","const asteriskPairRegex = '(?<!\\\\*)\\\\*(?!\\\\s)([^*\\\\n]+?)(?<!\\\\s)\\\\*(?!\\\\*)'\nconst underscorePairRegex = '(?<!_)_(?!\\\\s)([^_\\\\n]+?)(?<!\\\\s)_(?!_)'\nconst italicRegex = new RegExp(`(${asteriskPairRegex}|${underscorePairRegex})$`)\n\nconst doubleAsteriskPairRegex =\n '(?<!\\\\*)\\\\*\\\\*(?!\\\\s)([^*\\\\n]+?)(?<!\\\\s)\\\\*\\\\*(?!\\\\*)'\nconst doubleUnderscorePairRegex = '(?<!_)__(?!\\\\s)([^_\\\\n]+?)(?<!\\\\s)__(?!_)'\nconst boldRegex = new RegExp(\n `(${doubleAsteriskPairRegex}|${doubleUnderscorePairRegex})$`,\n)\n\nexport function getTextToItalic(text: string) {\n return text.match(italicRegex)?.at(0)\n}\n\nexport function getTextToBold(text: string) {\n return text.match(boldRegex)?.at(0)\n}\n","import {useActorRef} from '@xstate/react'\nimport {isEqual} from 'lodash'\nimport {\n assign,\n fromCallback,\n setup,\n type AnyEventObject,\n type CallbackLogicFunction,\n} from 'xstate'\nimport type {Editor} from '../editor/create-editor'\nimport {useEditor} from '../editor/editor-provider'\nimport {\n getTextToBold,\n getTextToItalic,\n} from '../internal-utils/get-text-to-emphasize'\nimport type {EditorSchema} from '../selectors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {defineBehavior} from './behavior.types'\n\n/**\n * @beta\n */\nexport type MarkdownEmphasisBehaviorsConfig = {\n boldDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n italicDecorator?: ({schema}: {schema: EditorSchema}) => string | undefined\n}\n\n/**\n * @beta\n */\nexport function useMarkdownEmphasisBehaviors(props: {\n config: MarkdownEmphasisBehaviorsConfig\n}) {\n const editor = useEditor()\n\n useActorRef(emphasisMachine, {\n input: {\n editor,\n boldDecorator: props.config.boldDecorator?.({\n schema: editor.getSnapshot().context.schema,\n }),\n italicDecorator: props.config.italicDecorator?.({\n schema: editor.getSnapshot().context.schema,\n }),\n },\n })\n}\n\ntype MarkdownEmphasisEvent =\n | {\n type: 'emphasis.add'\n blockOffset: utils.BlockOffset\n }\n | {\n type: 'selection'\n blockOffsets?: {\n anchor: utils.BlockOffset\n focus: utils.BlockOffset\n }\n }\n | {\n type: 'delete.backward'\n }\n\nconst emphasisListener: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor; boldDecorator?: string; italicDecorator?: string}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'insert.text',\n guard: ({context, event}) => {\n const boldDecorator = input.boldDecorator\n const italicDecorator = input.italicDecorator\n\n if (boldDecorator === undefined && italicDecorator === undefined) {\n return false\n }\n\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionStartOffset = selectionStartPoint\n ? utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: selectionStartPoint,\n })\n : undefined\n\n if (!focusTextBlock || !selectionStartOffset) {\n return false\n }\n\n const textBefore = selectors.getBlockTextBefore({context})\n\n const textToItalic = getTextToItalic(`${textBefore}${event.text}`)\n\n if (textToItalic !== undefined && italicDecorator !== undefined) {\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo *bar*\".length - \"*bar*\".length = 4\n offset: `${textBefore}${event.text}`.length - textToItalic.length,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo *bar*\".length - \"*bar*\".length + 1 = 5\n offset:\n `${textBefore}${event.text}`.length - textToItalic.length + 1,\n },\n }\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo *bar|\" (8) + \"*\".length - 1 = 8\n offset: selectionStartOffset.offset + event.text.length - 1,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo *bar|\" (8) + \"*\".length = 9\n offset: selectionStartOffset.offset + event.text.length,\n },\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator: italicDecorator,\n }\n }\n\n const textToBold = getTextToBold(`${textBefore}${event.text}`)\n\n if (textToBold !== undefined && boldDecorator !== undefined) {\n const prefixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length = 4\n offset: `${textBefore}${event.text}`.length - textToBold.length,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar**\".length - \"**bar**\".length + 2 = 6\n offset:\n `${textBefore}${event.text}`.length - textToBold.length + 2,\n },\n }\n\n const prefixSelection = utils.blockOffsetsToSelection({\n value: context.value,\n offsets: prefixOffsets,\n })\n const inlineObjectBeforePrefixFocus =\n selectors.getPreviousInlineObject({\n context: {\n ...context,\n selection: prefixSelection\n ? {\n anchor: prefixSelection.focus,\n focus: prefixSelection.focus,\n }\n : null,\n },\n })\n const inlineObjectBeforePrefixFocusOffset =\n inlineObjectBeforePrefixFocus\n ? utils.childSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: inlineObjectBeforePrefixFocus.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n inlineObjectBeforePrefixFocusOffset &&\n inlineObjectBeforePrefixFocusOffset.offset >\n prefixOffsets.anchor.offset &&\n inlineObjectBeforePrefixFocusOffset.offset <\n prefixOffsets.focus.offset\n ) {\n return false\n }\n\n const suffixOffsets = {\n anchor: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length - 2 = 9\n offset: selectionStartOffset.offset + event.text.length - 2,\n },\n focus: {\n path: focusTextBlock.path,\n // Example: \"foo **bar*|\" (10) + \"*\".length = 11\n offset: selectionStartOffset.offset + event.text.length,\n },\n }\n\n const previousInlineObject = selectors.getPreviousInlineObject({\n context,\n })\n const previousInlineObjectOffset = previousInlineObject\n ? utils.childSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: {\n path: previousInlineObject.path,\n offset: 0,\n },\n })\n : undefined\n\n if (\n previousInlineObjectOffset &&\n previousInlineObjectOffset.offset > suffixOffsets.anchor.offset &&\n previousInlineObjectOffset.offset < suffixOffsets.focus.offset\n ) {\n return false\n }\n\n return {\n prefixOffsets,\n suffixOffsets,\n decorator: boldDecorator,\n }\n }\n\n return false\n },\n actions: [\n ({event}) => [event],\n (_, {prefixOffsets, suffixOffsets, decorator}) => [\n {\n type: 'decorator.add',\n decorator,\n offsets: {\n anchor: prefixOffsets.focus,\n focus: suffixOffsets.anchor,\n },\n },\n {\n type: 'delete.text',\n ...suffixOffsets,\n },\n {\n type: 'delete.text',\n ...prefixOffsets,\n },\n {\n type: 'decorator.remove',\n decorator,\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({\n type: 'emphasis.add',\n blockOffset: {\n ...suffixOffsets.anchor,\n offset:\n suffixOffsets.anchor.offset -\n (prefixOffsets.focus.offset - prefixOffsets.anchor.offset),\n },\n })\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst selectionListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'select',\n guard: ({context, event}) => {\n if (!event.selection) {\n return {blockOffsets: undefined}\n }\n\n const anchor = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: event.selection.anchor,\n })\n const focus = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: event.selection.focus,\n })\n\n if (!anchor || !focus) {\n return {blockOffsets: undefined}\n }\n\n return {\n blockOffsets: {\n anchor,\n focus,\n },\n }\n },\n actions: [\n (_, {blockOffsets}) => [\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'selection', blockOffsets})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst deleteBackwardListenerCallback: CallbackLogicFunction<\n AnyEventObject,\n MarkdownEmphasisEvent,\n {editor: Editor}\n> = ({sendBack, input}) => {\n const unregister = input.editor.registerBehavior({\n behavior: defineBehavior({\n on: 'delete.backward',\n actions: [\n () => [\n {\n type: 'history.undo',\n },\n {\n type: 'effect',\n effect: () => {\n sendBack({type: 'delete.backward'})\n },\n },\n ],\n ],\n }),\n })\n\n return unregister\n}\n\nconst emphasisMachine = setup({\n types: {\n context: {} as {\n boldDecorator?: string\n italicDecorator?: string\n offsetAfterEmphasis?: utils.BlockOffset\n editor: Editor\n },\n input: {} as {\n boldDecorator?: string\n italicDecorator?: string\n editor: Editor\n },\n events: {} as MarkdownEmphasisEvent,\n },\n actors: {\n 'emphasis listener': fromCallback(emphasisListener),\n 'delete.backward listener': fromCallback(deleteBackwardListenerCallback),\n 'selection listener': fromCallback(selectionListenerCallback),\n },\n}).createMachine({\n id: 'emphasis',\n context: ({input}) => ({\n boldDecorator: input.boldDecorator,\n italicDecorator: input.italicDecorator,\n editor: input.editor,\n }),\n initial: 'idle',\n states: {\n 'idle': {\n invoke: [\n {\n src: 'emphasis listener',\n input: ({context}) => ({\n editor: context.editor,\n boldDecorator: context.boldDecorator,\n italicDecorator: context.italicDecorator,\n }),\n },\n ],\n on: {\n 'emphasis.add': {\n target: 'emphasis added',\n actions: assign({\n offsetAfterEmphasis: ({event}) => event.blockOffset,\n }),\n },\n },\n },\n 'emphasis added': {\n exit: [\n assign({\n offsetAfterEmphasis: undefined,\n }),\n ],\n invoke: [\n {\n src: 'selection listener',\n input: ({context}) => ({editor: context.editor}),\n },\n {\n src: 'delete.backward listener',\n input: ({context}) => ({editor: context.editor}),\n },\n ],\n on: {\n 'selection': {\n target: 'idle',\n guard: ({context, event}) => {\n const selectionChanged = !isEqual(\n {\n anchor: context.offsetAfterEmphasis,\n focus: context.offsetAfterEmphasis,\n },\n event.blockOffsets,\n )\n\n return selectionChanged\n },\n },\n 'delete.backward': {\n target: 'idle',\n },\n },\n },\n },\n})\n","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport {\n useMarkdownEmphasisBehaviors,\n type MarkdownEmphasisBehaviorsConfig,\n} from '../behaviors/behavior.markdown-emphasis'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig &\n MarkdownEmphasisBehaviorsConfig\n\n/**\n * @beta\n * Add 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 {MarkdownPlugin} from '@portabletext/editor/plugins'\n *\n * function App() {\n * return (\n * <EditorProvider>\n * <MarkdownPlugin\n * config={{\n * boldDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'strong')?.value,\n * italicDecorator: ({schema}) =>\n * schema.decorators.find((decorator) => decorator.value === 'em')?.value,\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 * </EditorProvider>\n * )\n * }\n */\nexport function MarkdownPlugin(props: {config: MarkdownPluginConfig}) {\n const editor = useEditor()\n useMarkdownEmphasisBehaviors({config: props.config})\n\n useEffect(() => {\n const behaviors = createMarkdownBehaviors(props.config)\n\n const unregisterBehaviors = behaviors.map((behavior) =>\n editor.registerBehavior({behavior}),\n )\n\n return () => {\n for (const unregisterBehavior of unregisterBehaviors) {\n unregisterBehavior()\n }\n }\n }, [editor, props.config])\n\n return null\n}\n","import {defineBehavior, raise} from '../behaviors'\nimport * as selectors from '../selectors'\nimport * as utils from '../utils'\nimport {BehaviorPlugin} from './plugin.behavior'\n\nconst oneLineBehaviors = [\n /**\n * Hitting Enter on an expanded selection should just delete that selection\n * without causing a line break.\n */\n defineBehavior({\n on: 'insert.break',\n guard: ({context}) =>\n context.selection && selectors.isSelectionExpanded({context})\n ? {selection: context.selection}\n : false,\n actions: [(_, {selection}) => [{type: 'delete', selection}]],\n }),\n /**\n * All other cases of `insert.break` should be aborted.\n */\n defineBehavior({\n on: 'insert.break',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.block` `before` or `after` is not allowed in a one-line editor.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({event}) =>\n event.placement === 'before' || event.placement === 'after',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * Other cases of `insert.block` are allowed.\n *\n * If a text block is inserted and the focus block is fully selected, then\n * the focus block can be replaced with the inserted block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockStartPoint = utils.getBlockStartPoint(focusTextBlock)\n const blockEndPoint = utils.getBlockEndPoint(focusTextBlock)\n const newFocus = utils.getBlockEndPoint({\n node: event.block,\n path: [{_key: event.block._key}],\n })\n\n if (\n utils.isEqualSelectionPoints(blockStartPoint, selectionStartPoint) &&\n utils.isEqualSelectionPoints(blockEndPoint, selectionEndPoint)\n ) {\n return {focusTextBlock, newFocus}\n }\n\n return false\n },\n actions: [\n ({event}, {focusTextBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: event.block, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * An ordinary `insert.block` is acceptable if it's a text block. In that\n * case it will get merged into the existing text block.\n */\n defineBehavior({\n on: 'insert.block',\n guard: ({context, event}) => {\n const focusTextBlock = selectors.getFocusTextBlock({context})\n const selectionStartPoint = selectors.getSelectionStartPoint({context})\n const selectionEndPoint = selectors.getSelectionEndPoint({context})\n\n if (\n !focusTextBlock ||\n !utils.isTextBlock(context, event.block) ||\n !selectionStartPoint ||\n !selectionEndPoint\n ) {\n return false\n }\n\n const blockBeforeStartPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionStartPoint,\n })?.before\n const blockAfterEndPoint = utils.splitTextBlock({\n context,\n block: focusTextBlock.node,\n point: selectionEndPoint,\n })?.after\n\n if (!blockBeforeStartPoint || !blockAfterEndPoint) {\n return false\n }\n\n const targetBlock = utils.mergeTextBlocks({\n context,\n targetBlock: blockBeforeStartPoint,\n incomingBlock: event.block,\n })\n\n const newFocus = utils.getBlockEndPoint({\n node: targetBlock,\n path: [{_key: targetBlock._key}],\n })\n\n const mergedBlock = utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock: blockAfterEndPoint,\n })\n\n return {focusTextBlock, mergedBlock, newFocus}\n },\n actions: [\n (_, {focusTextBlock, mergedBlock, newFocus}) => [\n {type: 'delete.block', blockPath: focusTextBlock.path},\n {type: 'insert.block', block: mergedBlock, placement: 'auto'},\n {\n type: 'select',\n selection: {\n anchor: newFocus,\n focus: newFocus,\n },\n },\n ],\n ],\n }),\n /**\n * Fallback Behavior to avoid `insert.block` in case the Behaviors above all\n * end up with a falsy guard.\n */\n defineBehavior({\n on: 'insert.block',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * If multiple blocks are inserted, then the non-text blocks are filtered out\n * and the text blocks are merged into one block\n */\n defineBehavior({\n on: 'insert.blocks',\n guard: ({context, event}) => {\n return event.blocks\n .filter((block) => utils.isTextBlock(context, block))\n .reduce((targetBlock, incomingBlock) => {\n return utils.mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n })\n })\n },\n actions: [\n // `insert.block` is raised so the Behavior above can handle the\n // insertion\n (_, block) => [raise({type: 'insert.block', block, placement: 'auto'})],\n ],\n }),\n /**\n * Block objects do not fit in a one-line editor\n */\n defineBehavior({\n on: 'insert.block object',\n actions: [() => [{type: 'noop'}]],\n }),\n /**\n * `insert.text block` is raised as an `insert.block` so it can be handled\n * by the Behaviors above.\n */\n defineBehavior({\n on: 'insert.text block',\n actions: [\n ({context, event}) => [\n raise({\n type: 'insert.block',\n block: {\n _key: context.keyGenerator(),\n _type: context.schema.block.name,\n children: event.textBlock?.children ?? [],\n },\n placement: event.placement,\n }),\n ],\n ],\n }),\n]\n\n/**\n * @beta\n * Restrict the editor to one line. The plugin takes care of blocking\n * `insert.break` events and smart handling of other `insert.*` events.\n *\n * Place it with as high priority as possible to make sure other plugins don't\n * overwrite `insert.*` events before this plugin gets a chance to do so.\n */\nexport function OneLinePlugin() {\n return <BehaviorPlugin behaviors={oneLineBehaviors} />\n}\n"],"names":["BehaviorPlugin","props","$","_c","editor","useEditor","t0","t1","behaviors","unregisterBehaviors","map","behavior","registerBehavior","forEach","_temp","useEffect","unregister","EditorRefPlugin","React","forwardRef","_","ref","portableTextEditorRef","useRef","Symbol","for","current","useImperativeHandle","displayName","asteriskPairRegex","underscorePairRegex","italicRegex","RegExp","doubleAsteriskPairRegex","doubleUnderscorePairRegex","boldRegex","getTextToItalic","text","match","at","getTextToBold","useMarkdownEmphasisBehaviors","config","boldDecorator","schema","getSnapshot","context","italicDecorator","t2","input","useActorRef","emphasisMachine","emphasisListener","sendBack","defineBehavior","on","guard","event","undefined","focusTextBlock","selectors","selectionStartPoint","selectionStartOffset","utils","value","selectionPoint","textBefore","textToItalic","prefixOffsets","anchor","path","offset","length","focus","suffixOffsets","decorator","textToBold","prefixSelection","offsets","inlineObjectBeforePrefixFocus","selection","inlineObjectBeforePrefixFocusOffset","previousInlineObject","previousInlineObjectOffset","actions","type","effect","blockOffset","selectionListenerCallback","blockOffsets","deleteBackwardListenerCallback","setup","types","events","actors","fromCallback","createMachine","id","initial","states","invoke","src","target","assign","offsetAfterEmphasis","exit","isEqual","MarkdownPlugin","createMarkdownBehaviors","unregisterBehavior","oneLineBehaviors","placement","selectionEndPoint","block","blockStartPoint","blockEndPoint","newFocus","node","_key","blockPath","blockBeforeStartPoint","point","before","blockAfterEndPoint","after","targetBlock","incomingBlock","mergedBlock","blocks","filter","reduce","raise","keyGenerator","_type","name","children","textBlock","OneLinePlugin"],"mappings":"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"}
|
|
@@ -60,6 +60,17 @@ declare function blockOffsetToSpanSelectionPoint({
|
|
|
60
60
|
}
|
|
61
61
|
| undefined
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* @public
|
|
65
|
+
*/
|
|
66
|
+
declare function childSelectionPointToBlockOffset({
|
|
67
|
+
value,
|
|
68
|
+
selectionPoint,
|
|
69
|
+
}: {
|
|
70
|
+
value: Array<PortableTextBlock>
|
|
71
|
+
selectionPoint: EditorSelectionPoint
|
|
72
|
+
}): BlockOffset | undefined
|
|
73
|
+
|
|
63
74
|
declare type Converter<TMIMEType extends MIMEType = MIMEType> = {
|
|
64
75
|
mimeType: TMIMEType
|
|
65
76
|
serialize: Serializer<TMIMEType>
|
|
@@ -695,6 +706,7 @@ declare namespace utils {
|
|
|
695
706
|
blockOffsetToSpanSelectionPoint,
|
|
696
707
|
spanSelectionPointToBlockOffset,
|
|
697
708
|
blockOffsetsToSelection,
|
|
709
|
+
childSelectionPointToBlockOffset,
|
|
698
710
|
getBlockEndPoint,
|
|
699
711
|
getBlockStartPoint,
|
|
700
712
|
getTextBlockText,
|
package/lib/selectors/index.d.ts
CHANGED
|
@@ -60,6 +60,17 @@ declare function blockOffsetToSpanSelectionPoint({
|
|
|
60
60
|
}
|
|
61
61
|
| undefined
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* @public
|
|
65
|
+
*/
|
|
66
|
+
declare function childSelectionPointToBlockOffset({
|
|
67
|
+
value,
|
|
68
|
+
selectionPoint,
|
|
69
|
+
}: {
|
|
70
|
+
value: Array<PortableTextBlock>
|
|
71
|
+
selectionPoint: EditorSelectionPoint
|
|
72
|
+
}): BlockOffset | undefined
|
|
73
|
+
|
|
63
74
|
declare type Converter<TMIMEType extends MIMEType = MIMEType> = {
|
|
64
75
|
mimeType: TMIMEType
|
|
65
76
|
serialize: Serializer<TMIMEType>
|
|
@@ -695,6 +706,7 @@ declare namespace utils {
|
|
|
695
706
|
blockOffsetToSpanSelectionPoint,
|
|
696
707
|
spanSelectionPointToBlockOffset,
|
|
697
708
|
blockOffsetsToSelection,
|
|
709
|
+
childSelectionPointToBlockOffset,
|
|
698
710
|
getBlockEndPoint,
|
|
699
711
|
getBlockStartPoint,
|
|
700
712
|
getTextBlockText,
|
package/lib/utils/index.cjs
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: !0 });
|
|
3
|
-
var util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), util_blockOffsetsToSelection = require("../_chunks-cjs/util.block-offsets-to-selection.cjs"), util_reverseSelection = require("../_chunks-cjs/util.reverse-selection.cjs");
|
|
3
|
+
var util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), util_blockOffsetsToSelection = require("../_chunks-cjs/util.block-offsets-to-selection.cjs"), types = require("@sanity/types"), util_reverseSelection = require("../_chunks-cjs/util.reverse-selection.cjs");
|
|
4
|
+
function childSelectionPointToBlockOffset({
|
|
5
|
+
value,
|
|
6
|
+
selectionPoint
|
|
7
|
+
}) {
|
|
8
|
+
let offset = 0;
|
|
9
|
+
const blockKey = util_sliceBlocks.isKeyedSegment(selectionPoint.path[0]) ? selectionPoint.path[0]._key : void 0, childKey = util_sliceBlocks.isKeyedSegment(selectionPoint.path[2]) ? selectionPoint.path[2]._key : void 0;
|
|
10
|
+
if (!(!blockKey || !childKey)) {
|
|
11
|
+
for (const block of value)
|
|
12
|
+
if (block._key === blockKey && types.isPortableTextTextBlock(block))
|
|
13
|
+
for (const child of block.children) {
|
|
14
|
+
if (child._key === childKey)
|
|
15
|
+
return {
|
|
16
|
+
path: [{
|
|
17
|
+
_key: block._key
|
|
18
|
+
}],
|
|
19
|
+
offset: offset + selectionPoint.offset
|
|
20
|
+
};
|
|
21
|
+
types.isPortableTextSpan(child) && (offset += child.text.length);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
4
25
|
function isTextBlock(context, block) {
|
|
5
26
|
return block._type === context.schema.block.name;
|
|
6
27
|
}
|
|
@@ -75,6 +96,7 @@ exports.sliceBlocks = util_sliceBlocks.sliceBlocks;
|
|
|
75
96
|
exports.spanSelectionPointToBlockOffset = util_sliceBlocks.spanSelectionPointToBlockOffset;
|
|
76
97
|
exports.blockOffsetsToSelection = util_blockOffsetsToSelection.blockOffsetsToSelection;
|
|
77
98
|
exports.reverseSelection = util_reverseSelection.reverseSelection;
|
|
99
|
+
exports.childSelectionPointToBlockOffset = childSelectionPointToBlockOffset;
|
|
78
100
|
exports.isTextBlock = isTextBlock;
|
|
79
101
|
exports.mergeTextBlocks = mergeTextBlocks;
|
|
80
102
|
exports.splitTextBlock = splitTextBlock;
|
package/lib/utils/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import type {PortableTextBlock, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../selectors'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n): block is PortableTextTextBlock {\n return block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport type {EditorContext} from '../selectors'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {isTextBlock, sliceBlocks, type EditorSelectionPoint} from '.'\nimport type {EditorContext} from '../selectors'\nimport {isSpan} from './util.is-span'\n\n/**\n * @beta\n */\nexport function splitTextBlock({\n context,\n block,\n point,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: PortableTextTextBlock\n point: EditorSelectionPoint\n}): {before: PortableTextTextBlock; after: PortableTextTextBlock} | undefined {\n const firstChild = block.children.at(0)\n const lastChild = block.children.at(block.children.length - 1)\n\n if (!firstChild || !lastChild) {\n return undefined\n }\n\n const before = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: {\n path: [{_key: block._key}, 'children', {_key: firstChild._key}],\n offset: 0,\n },\n focus: point,\n },\n }).at(0)\n const after = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: point,\n focus: {\n path: [{_key: block._key}, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n },\n },\n }).at(0)\n\n if (!before || !after) {\n return undefined\n }\n\n if (!isTextBlock(context, before) || !isTextBlock(context, after)) {\n return undefined\n }\n\n return {before, after}\n}\n"],"names":["
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/utils/util.child-selection-point-to-block-offset.ts","../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../behaviors/behavior.types'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function childSelectionPointToBlockOffset({\n value,\n selectionPoint,\n}: {\n value: Array<PortableTextBlock>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const childKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !childKey) {\n return undefined\n }\n\n for (const block of value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (child._key === childKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n if (isPortableTextSpan(child)) {\n offset += child.text.length\n }\n }\n }\n}\n","import type {PortableTextBlock, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../selectors'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n): block is PortableTextTextBlock {\n return block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport type {EditorContext} from '../selectors'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {isTextBlock, sliceBlocks, type EditorSelectionPoint} from '.'\nimport type {EditorContext} from '../selectors'\nimport {isSpan} from './util.is-span'\n\n/**\n * @beta\n */\nexport function splitTextBlock({\n context,\n block,\n point,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: PortableTextTextBlock\n point: EditorSelectionPoint\n}): {before: PortableTextTextBlock; after: PortableTextTextBlock} | undefined {\n const firstChild = block.children.at(0)\n const lastChild = block.children.at(block.children.length - 1)\n\n if (!firstChild || !lastChild) {\n return undefined\n }\n\n const before = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: {\n path: [{_key: block._key}, 'children', {_key: firstChild._key}],\n offset: 0,\n },\n focus: point,\n },\n }).at(0)\n const after = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: point,\n focus: {\n path: [{_key: block._key}, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n },\n },\n }).at(0)\n\n if (!before || !after) {\n return undefined\n }\n\n if (!isTextBlock(context, before) || !isTextBlock(context, after)) {\n return undefined\n }\n\n return {before, after}\n}\n"],"names":["childSelectionPointToBlockOffset","value","selectionPoint","offset","blockKey","isKeyedSegment","path","_key","undefined","childKey","block","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","isTextBlock","context","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","markDefs","splitTextBlock","point","firstChild","at","lastChild","before","sliceBlocks","blocks","selection","anchor","focus","after","isSpan"],"mappings":"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"}
|
package/lib/utils/index.d.cts
CHANGED
|
@@ -58,6 +58,17 @@ export declare function blockOffsetToSpanSelectionPoint({
|
|
|
58
58
|
}
|
|
59
59
|
| undefined
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
64
|
+
export declare function childSelectionPointToBlockOffset({
|
|
65
|
+
value,
|
|
66
|
+
selectionPoint,
|
|
67
|
+
}: {
|
|
68
|
+
value: Array<PortableTextBlock>
|
|
69
|
+
selectionPoint: EditorSelectionPoint
|
|
70
|
+
}): BlockOffset | undefined
|
|
71
|
+
|
|
61
72
|
declare type Converter<TMIMEType extends MIMEType = MIMEType> = {
|
|
62
73
|
mimeType: TMIMEType
|
|
63
74
|
serialize: Serializer<TMIMEType>
|
package/lib/utils/index.d.ts
CHANGED
|
@@ -58,6 +58,17 @@ export declare function blockOffsetToSpanSelectionPoint({
|
|
|
58
58
|
}
|
|
59
59
|
| undefined
|
|
60
60
|
|
|
61
|
+
/**
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
64
|
+
export declare function childSelectionPointToBlockOffset({
|
|
65
|
+
value,
|
|
66
|
+
selectionPoint,
|
|
67
|
+
}: {
|
|
68
|
+
value: Array<PortableTextBlock>
|
|
69
|
+
selectionPoint: EditorSelectionPoint
|
|
70
|
+
}): BlockOffset | undefined
|
|
71
|
+
|
|
61
72
|
declare type Converter<TMIMEType extends MIMEType = MIMEType> = {
|
|
62
73
|
mimeType: TMIMEType
|
|
63
74
|
serialize: Serializer<TMIMEType>
|
package/lib/utils/index.js
CHANGED
|
@@ -1,8 +1,30 @@
|
|
|
1
|
-
import { sliceBlocks, isSpan } from "../_chunks-es/util.slice-blocks.js";
|
|
2
|
-
import { blockOffsetToSpanSelectionPoint, getBlockEndPoint, getBlockStartPoint, getTextBlockText, isEmptyTextBlock, isEqualSelectionPoints,
|
|
1
|
+
import { isKeyedSegment, sliceBlocks, isSpan } from "../_chunks-es/util.slice-blocks.js";
|
|
2
|
+
import { blockOffsetToSpanSelectionPoint, getBlockEndPoint, getBlockStartPoint, getTextBlockText, isEmptyTextBlock, isEqualSelectionPoints, spanSelectionPointToBlockOffset } from "../_chunks-es/util.slice-blocks.js";
|
|
3
3
|
import { parseBlock } from "../_chunks-es/util.block-offsets-to-selection.js";
|
|
4
4
|
import { blockOffsetsToSelection } from "../_chunks-es/util.block-offsets-to-selection.js";
|
|
5
|
+
import { isPortableTextTextBlock, isPortableTextSpan } from "@sanity/types";
|
|
5
6
|
import { reverseSelection } from "../_chunks-es/util.reverse-selection.js";
|
|
7
|
+
function childSelectionPointToBlockOffset({
|
|
8
|
+
value,
|
|
9
|
+
selectionPoint
|
|
10
|
+
}) {
|
|
11
|
+
let offset = 0;
|
|
12
|
+
const blockKey = isKeyedSegment(selectionPoint.path[0]) ? selectionPoint.path[0]._key : void 0, childKey = isKeyedSegment(selectionPoint.path[2]) ? selectionPoint.path[2]._key : void 0;
|
|
13
|
+
if (!(!blockKey || !childKey)) {
|
|
14
|
+
for (const block of value)
|
|
15
|
+
if (block._key === blockKey && isPortableTextTextBlock(block))
|
|
16
|
+
for (const child of block.children) {
|
|
17
|
+
if (child._key === childKey)
|
|
18
|
+
return {
|
|
19
|
+
path: [{
|
|
20
|
+
_key: block._key
|
|
21
|
+
}],
|
|
22
|
+
offset: offset + selectionPoint.offset
|
|
23
|
+
};
|
|
24
|
+
isPortableTextSpan(child) && (offset += child.text.length);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
6
28
|
function isTextBlock(context, block) {
|
|
7
29
|
return block._type === context.schema.block.name;
|
|
8
30
|
}
|
|
@@ -68,6 +90,7 @@ function splitTextBlock({
|
|
|
68
90
|
export {
|
|
69
91
|
blockOffsetToSpanSelectionPoint,
|
|
70
92
|
blockOffsetsToSelection,
|
|
93
|
+
childSelectionPointToBlockOffset,
|
|
71
94
|
getBlockEndPoint,
|
|
72
95
|
getBlockStartPoint,
|
|
73
96
|
getTextBlockText,
|
package/lib/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import type {PortableTextBlock, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../selectors'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n): block is PortableTextTextBlock {\n return block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport type {EditorContext} from '../selectors'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {isTextBlock, sliceBlocks, type EditorSelectionPoint} from '.'\nimport type {EditorContext} from '../selectors'\nimport {isSpan} from './util.is-span'\n\n/**\n * @beta\n */\nexport function splitTextBlock({\n context,\n block,\n point,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: PortableTextTextBlock\n point: EditorSelectionPoint\n}): {before: PortableTextTextBlock; after: PortableTextTextBlock} | undefined {\n const firstChild = block.children.at(0)\n const lastChild = block.children.at(block.children.length - 1)\n\n if (!firstChild || !lastChild) {\n return undefined\n }\n\n const before = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: {\n path: [{_key: block._key}, 'children', {_key: firstChild._key}],\n offset: 0,\n },\n focus: point,\n },\n }).at(0)\n const after = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: point,\n focus: {\n path: [{_key: block._key}, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n },\n },\n }).at(0)\n\n if (!before || !after) {\n return undefined\n }\n\n if (!isTextBlock(context, before) || !isTextBlock(context, after)) {\n return undefined\n }\n\n return {before, after}\n}\n"],"names":["
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/utils/util.child-selection-point-to-block-offset.ts","../../src/utils/util.is-text-block.ts","../../src/utils/util.merge-text-blocks.ts","../../src/utils/util.split-text-block.ts"],"sourcesContent":["import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../behaviors/behavior.types'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function childSelectionPointToBlockOffset({\n value,\n selectionPoint,\n}: {\n value: Array<PortableTextBlock>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const childKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !childKey) {\n return undefined\n }\n\n for (const block of value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (child._key === childKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n if (isPortableTextSpan(child)) {\n offset += child.text.length\n }\n }\n }\n}\n","import type {PortableTextBlock, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../selectors'\n\n/**\n * @public\n */\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n): block is PortableTextTextBlock {\n return block._type === context.schema.block.name\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {parseBlock} from '../internal-utils/parse-blocks'\nimport type {EditorContext} from '../selectors'\nimport {isTextBlock} from './util.is-text-block'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: true},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {isTextBlock, sliceBlocks, type EditorSelectionPoint} from '.'\nimport type {EditorContext} from '../selectors'\nimport {isSpan} from './util.is-span'\n\n/**\n * @beta\n */\nexport function splitTextBlock({\n context,\n block,\n point,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: PortableTextTextBlock\n point: EditorSelectionPoint\n}): {before: PortableTextTextBlock; after: PortableTextTextBlock} | undefined {\n const firstChild = block.children.at(0)\n const lastChild = block.children.at(block.children.length - 1)\n\n if (!firstChild || !lastChild) {\n return undefined\n }\n\n const before = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: {\n path: [{_key: block._key}, 'children', {_key: firstChild._key}],\n offset: 0,\n },\n focus: point,\n },\n }).at(0)\n const after = sliceBlocks({\n blocks: [block],\n selection: {\n anchor: point,\n focus: {\n path: [{_key: block._key}, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n },\n },\n }).at(0)\n\n if (!before || !after) {\n return undefined\n }\n\n if (!isTextBlock(context, before) || !isTextBlock(context, after)) {\n return undefined\n }\n\n return {before, after}\n}\n"],"names":["childSelectionPointToBlockOffset","value","selectionPoint","offset","blockKey","isKeyedSegment","path","_key","undefined","childKey","block","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","isTextBlock","context","_type","schema","name","mergeTextBlocks","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","options","refreshKeys","markDefs","splitTextBlock","point","firstChild","at","lastChild","before","sliceBlocks","blocks","selection","anchor","focus","after","isSpan"],"mappings":";;;;;;AAYO,SAASA,iCAAiC;AAAA,EAC/CC;AAAAA,EACAC;AAIF,GAA4B;AAC1B,MAAIC,SAAS;AAEPC,QAAAA,WAAWC,eAAeH,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAEC,OACvBC,QACEC,WAAWJ,eAAeH,eAAeI,KAAK,CAAC,CAAC,IAClDJ,eAAeI,KAAK,CAAC,EAAEC,OACvBC;AAEA,MAAA,EAAA,CAACJ,YAAY,CAACK;AAIlB,eAAWC,SAAST;AAClB,UAAIS,MAAMH,SAASH,YAIdO,wBAAwBD,KAAK;AAIvBE,mBAAAA,SAASF,MAAMG,UAAU;AAClC,cAAID,MAAML,SAASE;AACV,mBAAA;AAAA,cACLH,MAAM,CAAC;AAAA,gBAACC,MAAMG,MAAMH;AAAAA,cAAAA,CAAK;AAAA,cACzBJ,QAAQA,SAASD,eAAeC;AAAAA,YAClC;AAGEW,6BAAmBF,KAAK,MAC1BT,UAAUS,MAAMG,KAAKC;AAAAA,QAAAA;AAAAA;AAI7B;AChDgBC,SAAAA,YACdC,SACAR,OACgC;AAChC,SAAOA,MAAMS,UAAUD,QAAQE,OAAOV,MAAMW;AAC9C;ACHO,SAASC,gBAAgB;AAAA,EAC9BJ;AAAAA,EACAK;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,WAAW;AAAA,IACrCR;AAAAA,IACAR,OAAOc;AAAAA,IACPG,SAAS;AAAA,MAACC,aAAa;AAAA,IAAA;AAAA,EAAI,CAC5B;AAED,SAAI,CAACH,uBAAuB,CAACR,YAAYC,SAASO,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHV,UAAU,CAAC,GAAGU,YAAYV,UAAU,GAAGY,oBAAoBZ,QAAQ;AAAA,IACnEgB,UAAU,CACR,GAAIN,YAAYM,YAAY,CAAA,GAC5B,GAAIJ,oBAAoBI,YAAY,CAAG,CAAA;AAAA,EAE3C;AACF;AC3BO,SAASC,eAAe;AAAA,EAC7BZ;AAAAA,EACAR;AAAAA,EACAqB;AAKF,GAA8E;AAC5E,QAAMC,aAAatB,MAAMG,SAASoB,GAAG,CAAC,GAChCC,YAAYxB,MAAMG,SAASoB,GAAGvB,MAAMG,SAASG,SAAS,CAAC;AAEzD,MAAA,CAACgB,cAAc,CAACE;AAClB;AAGF,QAAMC,SAASC,YAAY;AAAA,IACzBC,QAAQ,CAAC3B,KAAK;AAAA,IACd4B,WAAW;AAAA,MACTC,QAAQ;AAAA,QACNjC,MAAM,CAAC;AAAA,UAACC,MAAMG,MAAMH;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAMyB,WAAWzB;AAAAA,QAAAA,CAAK;AAAA,QAC9DJ,QAAQ;AAAA,MACV;AAAA,MACAqC,OAAOT;AAAAA,IAAAA;AAAAA,EAEV,CAAA,EAAEE,GAAG,CAAC,GACDQ,QAAQL,YAAY;AAAA,IACxBC,QAAQ,CAAC3B,KAAK;AAAA,IACd4B,WAAW;AAAA,MACTC,QAAQR;AAAAA,MACRS,OAAO;AAAA,QACLlC,MAAM,CAAC;AAAA,UAACC,MAAMG,MAAMH;AAAAA,WAAO,YAAY;AAAA,UAACA,MAAM2B,UAAU3B;AAAAA,QAAAA,CAAK;AAAA,QAC7DJ,QAAQuC,OAAOxB,SAASgB,SAAS,IAAIA,UAAUnB,KAAKC,SAAS;AAAA,MAAA;AAAA,IAC/D;AAAA,EACF,CACD,EAAEiB,GAAG,CAAC;AAEP,MAAI,EAACE,CAAAA,UAAU,CAACM,UAIZ,EAACxB,CAAAA,YAAYC,SAASiB,MAAM,KAAK,CAAClB,YAAYC,SAASuB,KAAK;AAIzD,WAAA;AAAA,MAACN;AAAAA,MAAQM;AAAAA,IAAK;AACvB;"}
|