@portabletext/editor 1.32.0 → 1.33.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.
Files changed (71) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +4 -4
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +19 -11
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/plugin.event-listener.cjs +127 -88
  6. package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
  7. package/lib/_chunks-cjs/selector.get-trimmed-selection.cjs +97 -0
  8. package/lib/_chunks-cjs/selector.get-trimmed-selection.cjs.map +1 -0
  9. package/lib/_chunks-cjs/{parse-blocks.cjs → util.block-offsets-to-selection.cjs} +21 -2
  10. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -0
  11. package/lib/_chunks-cjs/util.reverse-selection.cjs +11 -0
  12. package/lib/_chunks-cjs/util.reverse-selection.cjs.map +1 -1
  13. package/lib/_chunks-es/behavior.core.js +1 -1
  14. package/lib/_chunks-es/behavior.core.js.map +1 -1
  15. package/lib/_chunks-es/behavior.markdown.js +18 -11
  16. package/lib/_chunks-es/behavior.markdown.js.map +1 -1
  17. package/lib/_chunks-es/plugin.event-listener.js +127 -87
  18. package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
  19. package/lib/_chunks-es/selector.get-trimmed-selection.js +100 -0
  20. package/lib/_chunks-es/selector.get-trimmed-selection.js.map +1 -0
  21. package/lib/_chunks-es/{parse-blocks.js → util.block-offsets-to-selection.js} +21 -1
  22. package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -0
  23. package/lib/_chunks-es/util.reverse-selection.js +11 -0
  24. package/lib/_chunks-es/util.reverse-selection.js.map +1 -1
  25. package/lib/behaviors/index.d.cts +1 -0
  26. package/lib/behaviors/index.d.ts +1 -0
  27. package/lib/index.d.cts +60 -0
  28. package/lib/index.d.ts +60 -0
  29. package/lib/plugins/index.cjs +302 -3
  30. package/lib/plugins/index.cjs.map +1 -1
  31. package/lib/plugins/index.d.cts +74 -1
  32. package/lib/plugins/index.d.ts +74 -1
  33. package/lib/plugins/index.js +307 -4
  34. package/lib/plugins/index.js.map +1 -1
  35. package/lib/selectors/index.cjs +51 -1
  36. package/lib/selectors/index.cjs.map +1 -1
  37. package/lib/selectors/index.d.cts +67 -0
  38. package/lib/selectors/index.d.ts +67 -0
  39. package/lib/selectors/index.js +53 -2
  40. package/lib/selectors/index.js.map +1 -1
  41. package/lib/utils/index.cjs +5 -4
  42. package/lib/utils/index.cjs.map +1 -1
  43. package/lib/utils/index.d.cts +16 -0
  44. package/lib/utils/index.d.ts +16 -0
  45. package/lib/utils/index.js +4 -3
  46. package/package.json +7 -7
  47. package/src/behavior-actions/behavior.action.decorator.add.ts +161 -0
  48. package/src/behavior-actions/behavior.action.delete.text.ts +54 -0
  49. package/src/behavior-actions/behavior.actions.ts +5 -43
  50. package/src/behaviors/behavior.markdown-emphasis.ts +392 -0
  51. package/src/behaviors/behavior.markdown.ts +11 -4
  52. package/src/behaviors/behavior.types.ts +1 -0
  53. package/src/editor/plugins/createWithPortableTextMarkModel.ts +2 -97
  54. package/src/internal-utils/get-text-to-emphasize.test.ts +36 -0
  55. package/src/internal-utils/get-text-to-emphasize.ts +18 -0
  56. package/src/plugins/plugin.markdown.tsx +11 -1
  57. package/src/selectors/index.ts +5 -0
  58. package/src/selectors/selector.get-anchor-block.ts +22 -0
  59. package/src/selectors/selector.get-anchor-child.ts +36 -0
  60. package/src/selectors/selector.get-anchor-span.ts +18 -0
  61. package/src/selectors/selector.get-anchor-text-block.ts +20 -0
  62. package/src/selectors/selector.get-trimmed-selection.test.ts +658 -0
  63. package/src/selectors/selector.get-trimmed-selection.ts +175 -0
  64. package/src/utils/index.ts +1 -0
  65. package/src/utils/util.block-offsets-to-selection.ts +36 -0
  66. package/lib/_chunks-cjs/parse-blocks.cjs.map +0 -1
  67. package/lib/_chunks-cjs/util.is-empty-text-block.cjs +0 -14
  68. package/lib/_chunks-cjs/util.is-empty-text-block.cjs.map +0 -1
  69. package/lib/_chunks-es/parse-blocks.js.map +0 -1
  70. package/lib/_chunks-es/util.is-empty-text-block.js +0 -15
  71. package/lib/_chunks-es/util.is-empty-text-block.js.map +0 -1
@@ -3,11 +3,15 @@ import React, { useEffect } from "react";
3
3
  import { useEditor } from "../_chunks-es/plugin.event-listener.js";
4
4
  import { EventListenerPlugin } from "../_chunks-es/plugin.event-listener.js";
5
5
  import { createMarkdownBehaviors } from "../_chunks-es/behavior.markdown.js";
6
+ import { useActorRef } from "@xstate/react";
7
+ import isEqual from "lodash/isEqual.js";
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, blockOffsetToSpanSelectionPoint, getBlockStartPoint, getBlockEndPoint, isEqualSelectionPoints } from "../_chunks-es/util.reverse-selection.js";
11
+ import { getBlockTextBefore } from "../_chunks-es/selector.get-text-before.js";
12
+ import { defineBehavior, raise } from "../_chunks-es/behavior.core.js";
6
13
  import { jsx } from "react/jsx-runtime";
7
- import { isSelectionExpanded, getFocusTextBlock, getSelectionStartPoint, getSelectionEndPoint } from "../_chunks-es/selector.is-at-the-start-of-block.js";
8
- import { getBlockStartPoint, getBlockEndPoint, isEqualSelectionPoints } from "../_chunks-es/util.reverse-selection.js";
9
14
  import { isTextBlock, splitTextBlock, mergeTextBlocks } from "../utils/index.js";
10
- import { defineBehavior, raise } from "../_chunks-es/behavior.core.js";
11
15
  function BehaviorPlugin(props) {
12
16
  const $ = c(4), editor = useEditor();
13
17
  let t0, t1;
@@ -29,9 +33,308 @@ const EditorRefPlugin = React.forwardRef((_, ref) => {
29
33
  return $[0] === Symbol.for("react.memo_cache_sentinel") ? (t0 = () => portableTextEditorRef.current, t1 = [], $[0] = t0, $[1] = t1) : (t0 = $[0], t1 = $[1]), React.useImperativeHandle(ref, t0, t1), null;
30
34
  });
31
35
  EditorRefPlugin.displayName = "EditorRefPlugin";
36
+ const asteriskPairRegex = "(?<!\\*)\\*(?!\\s)([^*\\n]+?)(?<!\\s)\\*(?!\\*)", underscorePairRegex = "(?<!_)_(?!\\s)([^_\\n]+?)(?<!\\s)_(?!_)", italicRegex = new RegExp(`(${asteriskPairRegex}|${underscorePairRegex})$`), doubleAsteriskPairRegex = "(?<!\\*)\\*\\*(?!\\s)([^*\\n]+?)(?<!\\s)\\*\\*(?!\\*)", doubleUnderscorePairRegex = "(?<!_)__(?!\\s)([^_\\n]+?)(?<!\\s)__(?!_)", boldRegex = new RegExp(`(${doubleAsteriskPairRegex}|${doubleUnderscorePairRegex})$`);
37
+ function getTextToItalic(text) {
38
+ return text.match(italicRegex)?.at(0);
39
+ }
40
+ function getTextToBold(text) {
41
+ return text.match(boldRegex)?.at(0);
42
+ }
43
+ function useMarkdownEmphasisBehaviors(props) {
44
+ const $ = c(10), editor = useEditor();
45
+ let t0;
46
+ $[0] !== editor || $[1] !== props.config ? (t0 = props.config.boldDecorator?.({
47
+ schema: editor.getSnapshot().context.schema
48
+ }), $[0] = editor, $[1] = props.config, $[2] = t0) : t0 = $[2];
49
+ let t1;
50
+ $[3] !== editor || $[4] !== props.config ? (t1 = props.config.italicDecorator?.({
51
+ schema: editor.getSnapshot().context.schema
52
+ }), $[3] = editor, $[4] = props.config, $[5] = t1) : t1 = $[5];
53
+ let t2;
54
+ $[6] !== editor || $[7] !== t0 || $[8] !== t1 ? (t2 = {
55
+ input: {
56
+ editor,
57
+ boldDecorator: t0,
58
+ italicDecorator: t1
59
+ }
60
+ }, $[6] = editor, $[7] = t0, $[8] = t1, $[9] = t2) : t2 = $[9], useActorRef(emphasisMachine, t2);
61
+ }
62
+ const emphasisListener = ({
63
+ sendBack,
64
+ input
65
+ }) => input.editor.registerBehavior({
66
+ behavior: defineBehavior({
67
+ on: "insert.text",
68
+ guard: ({
69
+ context,
70
+ event
71
+ }) => {
72
+ const boldDecorator = input.boldDecorator, italicDecorator = input.italicDecorator;
73
+ if (boldDecorator === void 0 && italicDecorator === void 0 || event.text !== "*" && event.text !== "_")
74
+ return !1;
75
+ const focusTextBlock = getFocusTextBlock({
76
+ context
77
+ }), selectionStartPoint = getSelectionStartPoint({
78
+ context
79
+ }), selectionStartOffset = selectionStartPoint ? spanSelectionPointToBlockOffset({
80
+ value: context.value,
81
+ selectionPoint: selectionStartPoint
82
+ }) : void 0;
83
+ if (!focusTextBlock || !selectionStartOffset)
84
+ return !1;
85
+ const textBefore = getBlockTextBefore({
86
+ context
87
+ }), textToItalic = getTextToItalic(`${textBefore}${event.text}`);
88
+ if (textToItalic !== void 0 && italicDecorator !== void 0) {
89
+ const prefixOffsets = {
90
+ anchor: {
91
+ path: focusTextBlock.path,
92
+ offset: textBefore.length - textToItalic.length + 1
93
+ },
94
+ focus: {
95
+ path: focusTextBlock.path,
96
+ offset: textBefore.length - textToItalic.length + 1 + 1
97
+ }
98
+ }, suffixOffsets = {
99
+ anchor: {
100
+ path: focusTextBlock.path,
101
+ offset: selectionStartOffset.offset
102
+ },
103
+ focus: {
104
+ path: focusTextBlock.path,
105
+ offset: selectionStartOffset.offset + 1
106
+ }
107
+ }, anchor = blockOffsetToSpanSelectionPoint({
108
+ value: context.value,
109
+ blockOffset: prefixOffsets.focus
110
+ }), focus = blockOffsetToSpanSelectionPoint({
111
+ value: context.value,
112
+ blockOffset: suffixOffsets.anchor
113
+ });
114
+ return !anchor || !focus ? !1 : {
115
+ prefixOffsets,
116
+ suffixOffsets,
117
+ decorator: italicDecorator,
118
+ selection: {
119
+ anchor,
120
+ focus
121
+ }
122
+ };
123
+ }
124
+ const textToBold = getTextToBold(`${textBefore}${event.text}`);
125
+ if (textToBold !== void 0 && boldDecorator !== void 0) {
126
+ const prefixOffsets = {
127
+ anchor: {
128
+ path: focusTextBlock.path,
129
+ offset: textBefore.length - textToBold.length + 1
130
+ },
131
+ focus: {
132
+ path: focusTextBlock.path,
133
+ offset: textBefore.length - textToBold.length + 1 + 2
134
+ }
135
+ }, suffixOffsets = {
136
+ anchor: {
137
+ path: focusTextBlock.path,
138
+ offset: selectionStartOffset.offset - 1
139
+ },
140
+ focus: {
141
+ path: focusTextBlock.path,
142
+ offset: selectionStartOffset.offset + 1
143
+ }
144
+ }, anchor = blockOffsetToSpanSelectionPoint({
145
+ value: context.value,
146
+ blockOffset: prefixOffsets.focus
147
+ }), focus = blockOffsetToSpanSelectionPoint({
148
+ value: context.value,
149
+ blockOffset: suffixOffsets.anchor
150
+ });
151
+ return !anchor || !focus ? !1 : {
152
+ prefixOffsets,
153
+ suffixOffsets,
154
+ decorator: boldDecorator,
155
+ selection: {
156
+ anchor,
157
+ focus
158
+ }
159
+ };
160
+ }
161
+ return !1;
162
+ },
163
+ actions: [({
164
+ event
165
+ }) => [event], (_, {
166
+ prefixOffsets,
167
+ suffixOffsets,
168
+ decorator,
169
+ selection
170
+ }) => [{
171
+ type: "decorator.add",
172
+ decorator,
173
+ selection
174
+ }, {
175
+ type: "delete.text",
176
+ ...suffixOffsets
177
+ }, {
178
+ type: "delete.text",
179
+ ...prefixOffsets
180
+ }, {
181
+ type: "effect",
182
+ effect: () => {
183
+ sendBack({
184
+ type: "emphasis.add",
185
+ blockOffset: {
186
+ ...suffixOffsets.anchor,
187
+ offset: suffixOffsets.anchor.offset - (prefixOffsets.focus.offset - prefixOffsets.anchor.offset)
188
+ }
189
+ });
190
+ }
191
+ }]]
192
+ })
193
+ }), selectionListenerCallback = ({
194
+ sendBack,
195
+ input
196
+ }) => input.editor.registerBehavior({
197
+ behavior: defineBehavior({
198
+ on: "select",
199
+ guard: ({
200
+ context,
201
+ event
202
+ }) => {
203
+ if (!event.selection)
204
+ return {
205
+ blockOffsets: void 0
206
+ };
207
+ const anchor = spanSelectionPointToBlockOffset({
208
+ value: context.value,
209
+ selectionPoint: event.selection.anchor
210
+ }), focus = spanSelectionPointToBlockOffset({
211
+ value: context.value,
212
+ selectionPoint: event.selection.focus
213
+ });
214
+ return !anchor || !focus ? {
215
+ blockOffsets: void 0
216
+ } : {
217
+ blockOffsets: {
218
+ anchor,
219
+ focus
220
+ }
221
+ };
222
+ },
223
+ actions: [(_, {
224
+ blockOffsets
225
+ }) => [{
226
+ type: "effect",
227
+ effect: () => {
228
+ sendBack({
229
+ type: "selection",
230
+ blockOffsets
231
+ });
232
+ }
233
+ }]]
234
+ })
235
+ }), deleteBackwardListenerCallback = ({
236
+ sendBack,
237
+ input
238
+ }) => input.editor.registerBehavior({
239
+ behavior: defineBehavior({
240
+ on: "delete.backward",
241
+ actions: [() => [{
242
+ type: "history.undo"
243
+ }, {
244
+ type: "effect",
245
+ effect: () => {
246
+ sendBack({
247
+ type: "delete.backward"
248
+ });
249
+ }
250
+ }]]
251
+ })
252
+ }), emphasisMachine = setup({
253
+ types: {
254
+ context: {},
255
+ input: {},
256
+ events: {}
257
+ },
258
+ actors: {
259
+ "emphasis listener": fromCallback(emphasisListener),
260
+ "delete.backward listener": fromCallback(deleteBackwardListenerCallback),
261
+ "selection listener": fromCallback(selectionListenerCallback)
262
+ }
263
+ }).createMachine({
264
+ id: "emphasis",
265
+ context: ({
266
+ input
267
+ }) => ({
268
+ boldDecorator: input.boldDecorator,
269
+ italicDecorator: input.italicDecorator,
270
+ editor: input.editor
271
+ }),
272
+ initial: "idle",
273
+ states: {
274
+ idle: {
275
+ invoke: [{
276
+ src: "emphasis listener",
277
+ input: ({
278
+ context
279
+ }) => ({
280
+ editor: context.editor,
281
+ boldDecorator: context.boldDecorator,
282
+ italicDecorator: context.italicDecorator
283
+ })
284
+ }],
285
+ on: {
286
+ "emphasis.add": {
287
+ target: "emphasis added",
288
+ actions: assign({
289
+ offsetAfterEmphasis: ({
290
+ event
291
+ }) => event.blockOffset
292
+ })
293
+ }
294
+ }
295
+ },
296
+ "emphasis added": {
297
+ exit: [assign({
298
+ offsetAfterEmphasis: void 0
299
+ })],
300
+ invoke: [{
301
+ src: "selection listener",
302
+ input: ({
303
+ context
304
+ }) => ({
305
+ editor: context.editor
306
+ })
307
+ }, {
308
+ src: "delete.backward listener",
309
+ input: ({
310
+ context
311
+ }) => ({
312
+ editor: context.editor
313
+ })
314
+ }],
315
+ on: {
316
+ selection: {
317
+ target: "idle",
318
+ guard: ({
319
+ context,
320
+ event
321
+ }) => !isEqual({
322
+ anchor: context.offsetAfterEmphasis,
323
+ focus: context.offsetAfterEmphasis
324
+ }, event.blockOffsets)
325
+ },
326
+ "delete.backward": {
327
+ target: "idle"
328
+ }
329
+ }
330
+ }
331
+ }
332
+ });
32
333
  function MarkdownPlugin(props) {
33
334
  const editor = useEditor();
34
- return useEffect(() => {
335
+ return useMarkdownEmphasisBehaviors({
336
+ config: props.config
337
+ }), useEffect(() => {
35
338
  const unregisterBehaviors = createMarkdownBehaviors(props.config).map((behavior) => editor.registerBehavior({
36
339
  behavior
37
340
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/plugins/plugin.behavior.tsx","../../src/plugins/plugin.editor-ref.tsx","../../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","import {useEffect} from 'react'\nimport {\n createMarkdownBehaviors,\n type MarkdownBehaviorsConfig,\n} from '../behaviors/behavior.markdown'\nimport {useEditor} from '../editor/editor-provider'\n\n/**\n * @beta\n */\nexport type MarkdownPluginConfig = MarkdownBehaviorsConfig\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 * 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\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","MarkdownPlugin","createMarkdownBehaviors","config","unregisterBehavior","oneLineBehaviors","defineBehavior","on","guard","context","selection","selectors","actions","type","event","placement","focusTextBlock","selectionStartPoint","selectionEndPoint","utils","block","blockStartPoint","blockEndPoint","newFocus","node","path","_key","blockPath","anchor","focus","blockBeforeStartPoint","point","before","blockAfterEndPoint","after","targetBlock","incomingBlock","mergedBlock","blocks","filter","reduce","raise","keyGenerator","_type","schema","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 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 })\n const focus = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: suffixOffsets.anchor,\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 })\n const focus = utils.blockOffsetToSpanSelectionPoint({\n value: context.value,\n blockOffset: suffixOffsets.anchor,\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","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,11 +1,56 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: !0 });
3
- var types = require("@sanity/types"), selector_isAtTheStartOfBlock = require("../_chunks-cjs/selector.is-at-the-start-of-block.cjs"), util_reverseSelection = require("../_chunks-cjs/util.reverse-selection.cjs"), util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), selector_getTextBefore = require("../_chunks-cjs/selector.get-text-before.cjs");
3
+ var types = require("@sanity/types"), selector_isAtTheStartOfBlock = require("../_chunks-cjs/selector.is-at-the-start-of-block.cjs"), util_reverseSelection = require("../_chunks-cjs/util.reverse-selection.cjs"), util_sliceBlocks = require("../_chunks-cjs/util.slice-blocks.cjs"), selector_getTextBefore = require("../_chunks-cjs/selector.get-text-before.cjs"), selector_getTrimmedSelection = require("../_chunks-cjs/selector.get-trimmed-selection.cjs");
4
4
  const getActiveAnnotations = (snapshot) => {
5
5
  if (!snapshot.context.selection)
6
6
  return [];
7
7
  const selectedBlocks = selector_isAtTheStartOfBlock.getSelectedBlocks(snapshot), selectedSpans = selector_isAtTheStartOfBlock.getSelectedSpans(snapshot);
8
8
  return selectedSpans.length === 0 ? [] : selectedBlocks.flatMap((block) => types.isPortableTextTextBlock(block.node) ? block.node.markDefs ?? [] : []).filter((markDef) => selectedSpans.some((span) => span.node.marks?.includes(markDef._key)));
9
+ }, getAnchorBlock = ({
10
+ context
11
+ }) => {
12
+ const key = context.selection && util_reverseSelection.isKeyedSegment(context.selection.anchor.path[0]) ? context.selection.anchor.path[0]._key : void 0, node = key ? context.value.find((block) => block._key === key) : void 0;
13
+ return node && key ? {
14
+ node,
15
+ path: [{
16
+ _key: key
17
+ }]
18
+ } : void 0;
19
+ }, getAnchorTextBlock = ({
20
+ context
21
+ }) => {
22
+ const anchorBlock = getAnchorBlock({
23
+ context
24
+ });
25
+ return anchorBlock && types.isPortableTextTextBlock(anchorBlock.node) ? {
26
+ node: anchorBlock.node,
27
+ path: anchorBlock.path
28
+ } : void 0;
29
+ }, getAnchorChild = ({
30
+ context
31
+ }) => {
32
+ const anchorBlock = getAnchorTextBlock({
33
+ context
34
+ });
35
+ if (!anchorBlock)
36
+ return;
37
+ const key = context.selection && util_reverseSelection.isKeyedSegment(context.selection.anchor.path[2]) ? context.selection.anchor.path[2]._key : void 0, node = key ? anchorBlock.node.children.find((span) => span._key === key) : void 0;
38
+ return node && key ? {
39
+ node,
40
+ path: [...anchorBlock.path, "children", {
41
+ _key: key
42
+ }]
43
+ } : void 0;
44
+ }, getAnchorSpan = ({
45
+ context
46
+ }) => {
47
+ const anchorChild = getAnchorChild({
48
+ context
49
+ });
50
+ return anchorChild && types.isPortableTextSpan(anchorChild.node) ? {
51
+ node: anchorChild.node,
52
+ path: anchorChild.path
53
+ } : void 0;
9
54
  }, getBlockOffsets = ({
10
55
  context
11
56
  }) => {
@@ -164,7 +209,12 @@ exports.isAtTheStartOfBlock = selector_isAtTheStartOfBlock.isAtTheStartOfBlock;
164
209
  exports.isSelectionCollapsed = selector_isAtTheStartOfBlock.isSelectionCollapsed;
165
210
  exports.isSelectionExpanded = selector_isAtTheStartOfBlock.isSelectionExpanded;
166
211
  exports.getBlockTextBefore = selector_getTextBefore.getBlockTextBefore;
212
+ exports.getTrimmedSelection = selector_getTrimmedSelection.getTrimmedSelection;
167
213
  exports.getActiveAnnotations = getActiveAnnotations;
214
+ exports.getAnchorBlock = getAnchorBlock;
215
+ exports.getAnchorChild = getAnchorChild;
216
+ exports.getAnchorSpan = getAnchorSpan;
217
+ exports.getAnchorTextBlock = getAnchorTextBlock;
168
218
  exports.getBlockOffsets = getBlockOffsets;
169
219
  exports.getSelectedSlice = getSelectedSlice;
170
220
  exports.getSelection = getSelection;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../src/selectors/selector.get-active-annotations.ts","../../src/selectors/selector.get-block-offsets.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection.ts","../../src/selectors/selector.get-value.ts","../../src/selectors/selector.is-point-after-selection.ts","../../src/selectors/selector.is-point-before-selection.ts","../../src/selectors/selector.is-overlapping-selection.ts"],"sourcesContent":["import {isPortableTextTextBlock, type PortableTextObject} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveAnnotations: EditorSelector<Array<PortableTextObject>> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot)\n const selectedSpans = getSelectedSpans(snapshot)\n\n if (selectedSpans.length === 0) {\n return []\n }\n\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isPortableTextTextBlock(block.node) ? (block.node.markDefs ?? []) : [],\n )\n\n return selectionMarkDefs.filter((markDef) =>\n selectedSpans.some((span) => span.node.marks?.includes(markDef._key)),\n )\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getBlockOffsets: EditorSelector<\n {start: utils.BlockOffset; end: utils.BlockOffset} | undefined\n> = ({context}) => {\n if (!context.selection) {\n return undefined\n }\n\n const selectionStartPoint = getSelectionStartPoint({context})\n const selectionEndPoint = getSelectionEndPoint({context})\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return undefined\n }\n\n const start = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: selectionStartPoint,\n })\n const end = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: selectionEndPoint,\n })\n\n return start && end ? {start, end} : undefined\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {sliceBlocks} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedSlice: EditorSelector<Array<PortableTextBlock>> = ({\n context,\n}) => {\n return sliceBlocks({blocks: context.value, selection: context.selection})\n}\n","import type {EditorSelection, EditorSelector} from './_exports'\n\n/**\n * @public\n */\nexport const getSelection: EditorSelector<EditorSelection> = ({context}) => {\n return context.selection\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from './_exports'\n\n/**\n * @public\n */\nexport const getValue: EditorSelector<Array<PortableTextBlock>> = ({\n context,\n}) => {\n return context.value\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\n\n/**\n * @public\n */\nexport function isPointAfterSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selection = reverseSelection(snapshot.context.selection)\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const endBlockKey = isKeySegment(selection.focus.path[0])\n ? selection.focus.path[0]._key\n : undefined\n const endChildKey = isKeySegment(selection.focus.path[2])\n ? selection.focus.path[2]._key\n : undefined\n\n if (!pointBlockKey || !endBlockKey) {\n return false\n }\n\n let after = false\n\n for (const block of snapshot.context.value) {\n if (block._key === endBlockKey) {\n if (block._key !== pointBlockKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this block\n\n if (!isPortableTextTextBlock(block)) {\n break\n }\n\n if (!pointChildKey || !endChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (child._key !== pointChildKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this child\n\n after = point.offset > selection.focus.offset\n break\n }\n\n if (child._key === pointChildKey) {\n break\n }\n }\n }\n\n if (block._key === pointBlockKey) {\n break\n }\n }\n\n return after\n }\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\n\n/**\n * @public\n */\nexport function isPointBeforeSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selection = reverseSelection(snapshot.context.selection)\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const startBlockKey = isKeySegment(selection.anchor.path[0])\n ? selection.anchor.path[0]._key\n : undefined\n const startChildKey = isKeySegment(selection.anchor.path[2])\n ? selection.anchor.path[2]._key\n : undefined\n\n if (!pointBlockKey || !startBlockKey) {\n return false\n }\n\n let before = false\n\n for (const block of snapshot.context.value) {\n if (block._key === pointBlockKey) {\n if (block._key !== startBlockKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this block\n\n if (!isPortableTextTextBlock(block)) {\n break\n }\n\n if (!pointChildKey || !startChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === pointChildKey) {\n if (child._key !== startChildKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this child\n\n before = point.offset < selection.anchor.offset\n break\n }\n\n if (child._key === startChildKey) {\n break\n }\n }\n }\n\n if (block._key === startBlockKey) {\n break\n }\n }\n\n return before\n }\n}\n","import type {EditorSelection} from '../types/editor'\nimport type {EditorSelector} from './../editor/editor-selector'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {isPointAfterSelection} from './selector.is-point-after-selection'\nimport {isPointBeforeSelection} from './selector.is-point-before-selection'\n\n/**\n * @public\n */\nexport function isOverlappingSelection(\n selection: EditorSelection,\n): EditorSelector<boolean> {\n return ({context}) => {\n if (!selection || !context.selection) {\n return false\n }\n\n const selectionStartPoint = getSelectionStartPoint({\n context: {\n ...context,\n selection,\n },\n })\n const selectionEndPoint = getSelectionEndPoint({\n context: {\n ...context,\n selection,\n },\n })\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return false\n }\n\n if (!isPointAfterSelection(selectionStartPoint)({context})) {\n return false\n }\n\n if (!isPointBeforeSelection(selectionEndPoint)({context})) {\n return false\n }\n\n return true\n }\n}\n"],"names":["getActiveAnnotations","snapshot","context","selection","selectedBlocks","getSelectedBlocks","selectedSpans","getSelectedSpans","length","flatMap","block","isPortableTextTextBlock","node","markDefs","filter","markDef","some","span","marks","includes","_key","getBlockOffsets","selectionStartPoint","getSelectionStartPoint","selectionEndPoint","getSelectionEndPoint","start","utils","value","selectionPoint","end","undefined","getSelectedSlice","sliceBlocks","blocks","getSelection","getValue","isPointAfterSelection","point","reverseSelection","pointBlockKey","isKeySegment","path","pointChildKey","endBlockKey","focus","endChildKey","after","child","children","offset","isPointBeforeSelection","startBlockKey","anchor","startChildKey","before","isOverlappingSelection"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../../src/selectors/selector.get-active-annotations.ts","../../src/selectors/selector.get-anchor-block.ts","../../src/selectors/selector.get-anchor-text-block.ts","../../src/selectors/selector.get-anchor-child.ts","../../src/selectors/selector.get-anchor-span.ts","../../src/selectors/selector.get-block-offsets.ts","../../src/selectors/selector.get-selected-slice.ts","../../src/selectors/selector.get-selection.ts","../../src/selectors/selector.get-value.ts","../../src/selectors/selector.is-point-after-selection.ts","../../src/selectors/selector.is-point-before-selection.ts","../../src/selectors/selector.is-overlapping-selection.ts"],"sourcesContent":["import {isPortableTextTextBlock, type PortableTextObject} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveAnnotations: EditorSelector<Array<PortableTextObject>> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot)\n const selectedSpans = getSelectedSpans(snapshot)\n\n if (selectedSpans.length === 0) {\n return []\n }\n\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isPortableTextTextBlock(block.node) ? (block.node.markDefs ?? []) : [],\n )\n\n return selectionMarkDefs.filter((markDef) =>\n selectedSpans.some((span) => span.node.marks?.includes(markDef._key)),\n )\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\n\n/**\n * @public\n */\nexport const getAnchorBlock: EditorSelector<\n {node: PortableTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const key = context.selection\n ? isKeyedSegment(context.selection.anchor.path[0])\n ? context.selection.anchor.path[0]._key\n : undefined\n : undefined\n\n const node = key\n ? context.value.find((block) => block._key === key)\n : undefined\n\n return node && key ? {node, path: [{_key: key}]} : undefined\n}\n","import {\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextTextBlock,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getAnchorBlock} from './selector.get-anchor-block'\n\n/**\n * @public\n */\nexport const getAnchorTextBlock: EditorSelector<\n {node: PortableTextTextBlock; path: [KeyedSegment]} | undefined\n> = ({context}) => {\n const anchorBlock = getAnchorBlock({context})\n\n return anchorBlock && isPortableTextTextBlock(anchorBlock.node)\n ? {node: anchorBlock.node, path: anchorBlock.path}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport type {PortableTextObject, PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {isKeyedSegment} from '../utils'\nimport {getAnchorTextBlock} from './selector.get-anchor-text-block'\n\n/**\n * @public\n */\nexport const getAnchorChild: EditorSelector<\n | {\n node: PortableTextObject | PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }\n | undefined\n> = ({context}) => {\n const anchorBlock = getAnchorTextBlock({context})\n\n if (!anchorBlock) {\n return undefined\n }\n\n const key = context.selection\n ? isKeyedSegment(context.selection.anchor.path[2])\n ? context.selection.anchor.path[2]._key\n : undefined\n : undefined\n\n const node = key\n ? anchorBlock.node.children.find((span) => span._key === key)\n : undefined\n\n return node && key\n ? {node, path: [...anchorBlock.path, 'children', {_key: key}]}\n : undefined\n}\n","import type {KeyedSegment} from '@portabletext/patches'\nimport {isPortableTextSpan, type PortableTextSpan} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getAnchorChild} from './selector.get-anchor-child'\n\n/**\n * @public\n */\nexport const getAnchorSpan: EditorSelector<\n | {node: PortableTextSpan; path: [KeyedSegment, 'children', KeyedSegment]}\n | undefined\n> = ({context}) => {\n const anchorChild = getAnchorChild({context})\n\n return anchorChild && isPortableTextSpan(anchorChild.node)\n ? {node: anchorChild.node, path: anchorChild.path}\n : undefined\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport * as utils from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\n\n/**\n * @public\n */\nexport const getBlockOffsets: EditorSelector<\n {start: utils.BlockOffset; end: utils.BlockOffset} | undefined\n> = ({context}) => {\n if (!context.selection) {\n return undefined\n }\n\n const selectionStartPoint = getSelectionStartPoint({context})\n const selectionEndPoint = getSelectionEndPoint({context})\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return undefined\n }\n\n const start = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: selectionStartPoint,\n })\n const end = utils.spanSelectionPointToBlockOffset({\n value: context.value,\n selectionPoint: selectionEndPoint,\n })\n\n return start && end ? {start, end} : undefined\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {sliceBlocks} from '../utils'\n\n/**\n * @public\n */\nexport const getSelectedSlice: EditorSelector<Array<PortableTextBlock>> = ({\n context,\n}) => {\n return sliceBlocks({blocks: context.value, selection: context.selection})\n}\n","import type {EditorSelection, EditorSelector} from './_exports'\n\n/**\n * @public\n */\nexport const getSelection: EditorSelector<EditorSelection> = ({context}) => {\n return context.selection\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorSelector} from './_exports'\n\n/**\n * @public\n */\nexport const getValue: EditorSelector<Array<PortableTextBlock>> = ({\n context,\n}) => {\n return context.value\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\n\n/**\n * @public\n */\nexport function isPointAfterSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selection = reverseSelection(snapshot.context.selection)\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const endBlockKey = isKeySegment(selection.focus.path[0])\n ? selection.focus.path[0]._key\n : undefined\n const endChildKey = isKeySegment(selection.focus.path[2])\n ? selection.focus.path[2]._key\n : undefined\n\n if (!pointBlockKey || !endBlockKey) {\n return false\n }\n\n let after = false\n\n for (const block of snapshot.context.value) {\n if (block._key === endBlockKey) {\n if (block._key !== pointBlockKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this block\n\n if (!isPortableTextTextBlock(block)) {\n break\n }\n\n if (!pointChildKey || !endChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (child._key !== pointChildKey) {\n after = true\n break\n }\n\n // Both the point and the selection end in this child\n\n after = point.offset > selection.focus.offset\n break\n }\n\n if (child._key === pointChildKey) {\n break\n }\n }\n }\n\n if (block._key === pointBlockKey) {\n break\n }\n }\n\n return after\n }\n}\n","import {isKeySegment, isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {reverseSelection} from '../utils/util.reverse-selection'\n\n/**\n * @public\n */\nexport function isPointBeforeSelection(\n point: EditorSelectionPoint,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selection = reverseSelection(snapshot.context.selection)\n\n const pointBlockKey = isKeySegment(point.path[0])\n ? point.path[0]._key\n : undefined\n const pointChildKey = isKeySegment(point.path[2])\n ? point.path[2]._key\n : undefined\n\n const startBlockKey = isKeySegment(selection.anchor.path[0])\n ? selection.anchor.path[0]._key\n : undefined\n const startChildKey = isKeySegment(selection.anchor.path[2])\n ? selection.anchor.path[2]._key\n : undefined\n\n if (!pointBlockKey || !startBlockKey) {\n return false\n }\n\n let before = false\n\n for (const block of snapshot.context.value) {\n if (block._key === pointBlockKey) {\n if (block._key !== startBlockKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this block\n\n if (!isPortableTextTextBlock(block)) {\n break\n }\n\n if (!pointChildKey || !startChildKey) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === pointChildKey) {\n if (child._key !== startChildKey) {\n before = true\n break\n }\n\n // Both the point and the selection start in this child\n\n before = point.offset < selection.anchor.offset\n break\n }\n\n if (child._key === startChildKey) {\n break\n }\n }\n }\n\n if (block._key === startBlockKey) {\n break\n }\n }\n\n return before\n }\n}\n","import type {EditorSelection} from '../types/editor'\nimport type {EditorSelector} from './../editor/editor-selector'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {isPointAfterSelection} from './selector.is-point-after-selection'\nimport {isPointBeforeSelection} from './selector.is-point-before-selection'\n\n/**\n * @public\n */\nexport function isOverlappingSelection(\n selection: EditorSelection,\n): EditorSelector<boolean> {\n return ({context}) => {\n if (!selection || !context.selection) {\n return false\n }\n\n const selectionStartPoint = getSelectionStartPoint({\n context: {\n ...context,\n selection,\n },\n })\n const selectionEndPoint = getSelectionEndPoint({\n context: {\n ...context,\n selection,\n },\n })\n\n if (!selectionStartPoint || !selectionEndPoint) {\n return false\n }\n\n if (!isPointAfterSelection(selectionStartPoint)({context})) {\n return false\n }\n\n if (!isPointBeforeSelection(selectionEndPoint)({context})) {\n return false\n }\n\n return true\n }\n}\n"],"names":["getActiveAnnotations","snapshot","context","selection","selectedBlocks","getSelectedBlocks","selectedSpans","getSelectedSpans","length","flatMap","block","isPortableTextTextBlock","node","markDefs","filter","markDef","some","span","marks","includes","_key","getAnchorBlock","key","isKeyedSegment","anchor","path","undefined","value","find","getAnchorTextBlock","anchorBlock","getAnchorChild","children","getAnchorSpan","anchorChild","isPortableTextSpan","getBlockOffsets","selectionStartPoint","getSelectionStartPoint","selectionEndPoint","getSelectionEndPoint","start","utils","selectionPoint","end","getSelectedSlice","sliceBlocks","blocks","getSelection","getValue","isPointAfterSelection","point","reverseSelection","pointBlockKey","isKeySegment","pointChildKey","endBlockKey","focus","endChildKey","after","child","offset","isPointBeforeSelection","startBlockKey","startChildKey","before","isOverlappingSelection"],"mappings":"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"}