@portabletext/editor 1.33.3 → 1.33.5

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 (67) hide show
  1. package/lib/_chunks-cjs/behavior.core.cjs +11 -204
  2. package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
  3. package/lib/_chunks-cjs/behavior.markdown.cjs +7 -7
  4. package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
  5. package/lib/_chunks-cjs/plugin.event-listener.cjs +196 -25
  6. package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
  7. package/lib/_chunks-cjs/selector.get-text-before.cjs +3 -3
  8. package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
  9. package/lib/_chunks-cjs/selector.is-active-style.cjs +246 -0
  10. package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -0
  11. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +23 -198
  12. package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
  13. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs +3 -3
  14. package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
  15. package/lib/_chunks-cjs/util.reverse-selection.cjs +0 -135
  16. package/lib/_chunks-cjs/util.reverse-selection.cjs.map +1 -1
  17. package/lib/_chunks-cjs/util.slice-blocks.cjs +138 -1
  18. package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
  19. package/lib/_chunks-es/behavior.core.js +9 -202
  20. package/lib/_chunks-es/behavior.core.js.map +1 -1
  21. package/lib/_chunks-es/behavior.markdown.js +1 -1
  22. package/lib/_chunks-es/plugin.event-listener.js +193 -23
  23. package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
  24. package/lib/_chunks-es/selector.get-text-before.js +2 -1
  25. package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
  26. package/lib/_chunks-es/selector.is-active-style.js +249 -0
  27. package/lib/_chunks-es/selector.is-active-style.js.map +1 -0
  28. package/lib/_chunks-es/selector.is-at-the-start-of-block.js +12 -187
  29. package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
  30. package/lib/_chunks-es/util.block-offsets-to-selection.js +1 -1
  31. package/lib/_chunks-es/util.reverse-selection.js +1 -136
  32. package/lib/_chunks-es/util.reverse-selection.js.map +1 -1
  33. package/lib/_chunks-es/util.slice-blocks.js +140 -3
  34. package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
  35. package/lib/index.d.cts +1 -115
  36. package/lib/index.d.ts +1 -115
  37. package/lib/plugins/index.cjs +11 -11
  38. package/lib/plugins/index.cjs.map +1 -1
  39. package/lib/plugins/index.d.cts +1 -115
  40. package/lib/plugins/index.d.ts +1 -115
  41. package/lib/plugins/index.js +1 -1
  42. package/lib/selectors/index.cjs +16 -21
  43. package/lib/selectors/index.cjs.map +1 -1
  44. package/lib/selectors/index.js +7 -11
  45. package/lib/selectors/index.js.map +1 -1
  46. package/lib/utils/index.cjs +13 -13
  47. package/lib/utils/index.cjs.map +1 -1
  48. package/lib/utils/index.js +3 -3
  49. package/package.json +4 -4
  50. package/src/behaviors/behavior.core.annotations.ts +0 -24
  51. package/src/behaviors/behavior.core.decorators.ts +0 -19
  52. package/src/behaviors/behavior.core.insert-break.ts +4 -4
  53. package/src/behaviors/behavior.core.lists.ts +0 -30
  54. package/src/behaviors/behavior.core.ts +2 -17
  55. package/src/behaviors/behavior.default.ts +198 -0
  56. package/src/behaviors/behavior.foundational.ts +12 -12
  57. package/src/converters/converter.text-html.serialize.test.ts +1 -1
  58. package/src/editor/editor-machine.ts +8 -8
  59. package/src/selectors/selector.get-selection-text.ts +14 -89
  60. package/src/utils/util.slice-blocks.ts +12 -1
  61. package/lib/_chunks-cjs/selector.get-trimmed-selection.cjs +0 -97
  62. package/lib/_chunks-cjs/selector.get-trimmed-selection.cjs.map +0 -1
  63. package/lib/_chunks-es/selector.get-trimmed-selection.js +0 -100
  64. package/lib/_chunks-es/selector.get-trimmed-selection.js.map +0 -1
  65. package/src/behaviors/behavior.core.deserialize.ts +0 -60
  66. package/src/behaviors/behavior.core.serialize.ts +0 -44
  67. package/src/behaviors/behavior.core.style.ts +0 -19
@@ -1,102 +1,27 @@
1
1
  import {isPortableTextSpan, isPortableTextTextBlock} from '@sanity/types'
2
2
  import type {EditorSelector} from '../editor/editor-selector'
3
- import {isKeyedSegment} from '../utils/util.is-keyed-segment'
4
- import {reverseSelection} from '../utils/util.reverse-selection'
3
+ import {getSelectedSlice} from './selector.get-selected-slice'
5
4
 
6
5
  /**
7
6
  * @public
8
7
  */
9
8
  export const getSelectionText: EditorSelector<string> = ({context}) => {
10
- let text = ''
9
+ const selectedSlice = getSelectedSlice({context})
11
10
 
12
- const {value, selection} = context
13
-
14
- if (!value || !selection) {
15
- return text
16
- }
17
-
18
- const forwardSelection = selection.backward
19
- ? reverseSelection(selection)
20
- : selection
21
-
22
- if (!forwardSelection) {
23
- return text
24
- }
25
-
26
- const startBlockKey = isKeyedSegment(forwardSelection.anchor.path[0])
27
- ? forwardSelection.anchor.path[0]._key
28
- : undefined
29
- const endBlockKey = isKeyedSegment(forwardSelection.focus.path[0])
30
- ? forwardSelection.focus.path[0]._key
31
- : undefined
32
- const startChildKey = isKeyedSegment(forwardSelection.anchor.path[2])
33
- ? forwardSelection.anchor.path[2]._key
34
- : undefined
35
- const endChildKey = isKeyedSegment(forwardSelection.focus.path[2])
36
- ? forwardSelection.focus.path[2]._key
37
- : undefined
38
- let startFound = false
39
-
40
- if (!startBlockKey || !endBlockKey) {
41
- return text
42
- }
43
-
44
- for (const block of value) {
45
- if (block._key === startBlockKey) {
46
- if (!isPortableTextTextBlock(block)) {
47
- continue
48
- }
49
-
50
- for (const child of block.children) {
51
- if (child._key === startChildKey) {
52
- startFound = true
53
- }
54
-
55
- if (!startFound) {
56
- continue
57
- }
58
-
59
- if (isPortableTextSpan(child) && startChildKey) {
60
- if (child._key === startChildKey && child._key === endChildKey) {
61
- text =
62
- text +
63
- child.text.slice(
64
- forwardSelection.anchor.offset,
65
- forwardSelection.focus.offset,
66
- )
67
- } else if (child._key === startChildKey) {
68
- text = text + child.text.slice(forwardSelection.anchor.offset)
69
- } else if (child._key === endChildKey) {
70
- text = text + child.text.slice(0, forwardSelection.focus.offset)
71
- } else {
72
- text = text + child.text
73
- }
74
- }
75
-
76
- if (child._key === endChildKey) {
77
- break
78
- }
79
- }
80
- continue
11
+ return selectedSlice.reduce((text, block) => {
12
+ if (!isPortableTextTextBlock(block)) {
13
+ return text
81
14
  }
82
15
 
83
- if (block._key === endBlockKey) {
84
- if (!isPortableTextTextBlock(block)) {
85
- continue
86
- }
87
-
88
- for (const child of block.children) {
89
- if (isPortableTextSpan(child) && endChildKey) {
90
- text = text + child.text.slice(0, forwardSelection.focus.offset)
91
- }
92
-
93
- if (child._key === endChildKey) {
94
- break
16
+ return (
17
+ text +
18
+ block.children.reduce((text, child) => {
19
+ if (isPortableTextSpan(child)) {
20
+ return text + child.text
95
21
  }
96
- }
97
- break
98
- }
99
- }
100
22
 
101
- return text
23
+ return text
24
+ }, '')
25
+ )
26
+ }, '')
102
27
  }
@@ -92,7 +92,18 @@ export function sliceBlocks({
92
92
  }
93
93
 
94
94
  if (startBlock && isPortableTextTextBlock(startBlock)) {
95
- startBlock.children.push(child)
95
+ if (
96
+ endChildKey &&
97
+ child._key === endChildKey &&
98
+ isPortableTextSpan(child)
99
+ ) {
100
+ startBlock.children.push({
101
+ ...child,
102
+ text: child.text.slice(0, endPoint.offset),
103
+ })
104
+ } else {
105
+ startBlock.children.push(child)
106
+ }
96
107
 
97
108
  if (
98
109
  block._key === endBlockKey &&
@@ -1,97 +0,0 @@
1
- "use strict";
2
- var types = require("@sanity/types"), util_reverseSelection = require("./util.reverse-selection.cjs"), selector_isAtTheStartOfBlock = require("./selector.is-at-the-start-of-block.cjs");
3
- const getTrimmedSelection = ({
4
- context
5
- }) => {
6
- if (!context.selection)
7
- return context.selection;
8
- const startPoint = selector_isAtTheStartOfBlock.getSelectionStartPoint({
9
- context
10
- }), endPoint = selector_isAtTheStartOfBlock.getSelectionEndPoint({
11
- context
12
- });
13
- if (!startPoint || !endPoint)
14
- return context.selection;
15
- const startBlockKey = util_reverseSelection.isKeyedSegment(startPoint.path[0]) ? startPoint.path[0]._key : null, startChildKey = util_reverseSelection.isKeyedSegment(startPoint.path[2]) ? startPoint.path[2]._key : null, endBlockKey = util_reverseSelection.isKeyedSegment(endPoint.path[0]) ? endPoint.path[0]._key : null, endChildKey = util_reverseSelection.isKeyedSegment(endPoint.path[2]) ? endPoint.path[2]._key : null;
16
- if (!startBlockKey || !endBlockKey)
17
- return context.selection;
18
- let startBlockFound = !1, adjustedStartPoint, trimStartPoint = !1, adjustedEndPoint, trimEndPoint = !1, previousPotentialEndpoint;
19
- for (const block of context.value)
20
- if (!(block._key === startBlockKey && (startBlockFound = !0, types.isPortableTextTextBlock(block) && util_reverseSelection.isEmptyTextBlock(block))) && startBlockFound && types.isPortableTextTextBlock(block)) {
21
- if (block._key === endBlockKey && util_reverseSelection.isEmptyTextBlock(block))
22
- break;
23
- for (const child of block.children) {
24
- if (child._key === endChildKey && (!types.isPortableTextSpan(child) || endPoint.offset === 0)) {
25
- adjustedEndPoint = previousPotentialEndpoint ? {
26
- path: [{
27
- _key: previousPotentialEndpoint.blockKey
28
- }, "children", {
29
- _key: previousPotentialEndpoint.span._key
30
- }],
31
- offset: previousPotentialEndpoint.span.text.length
32
- } : void 0, trimEndPoint = !0;
33
- break;
34
- }
35
- if (trimStartPoint) {
36
- const lonelySpan = types.isPortableTextSpan(child) && block.children.length === 1;
37
- (types.isPortableTextSpan(child) && child.text.length > 0 || lonelySpan) && (adjustedStartPoint = {
38
- path: [{
39
- _key: block._key
40
- }, "children", {
41
- _key: child._key
42
- }],
43
- offset: 0
44
- }, previousPotentialEndpoint = {
45
- blockKey: block._key,
46
- span: child
47
- }, trimStartPoint = !1);
48
- continue;
49
- }
50
- if (child._key === startChildKey) {
51
- if (!types.isPortableTextSpan(child)) {
52
- trimStartPoint = !0;
53
- continue;
54
- }
55
- if (startPoint.offset === child.text.length) {
56
- trimStartPoint = !0, previousPotentialEndpoint = child.text.length > 0 ? {
57
- blockKey: block._key,
58
- span: child
59
- } : previousPotentialEndpoint;
60
- continue;
61
- }
62
- }
63
- previousPotentialEndpoint = types.isPortableTextSpan(child) && child.text.length > 0 ? {
64
- blockKey: block._key,
65
- span: child
66
- } : previousPotentialEndpoint;
67
- }
68
- if (block._key === endBlockKey)
69
- break;
70
- }
71
- const trimmedSelection = context.selection.backward ? {
72
- anchor: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,
73
- focus: adjustedStartPoint ?? startPoint,
74
- backward: !0
75
- } : {
76
- anchor: adjustedStartPoint ?? startPoint,
77
- focus: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint
78
- };
79
- if (selector_isAtTheStartOfBlock.isSelectionCollapsed({
80
- context: {
81
- ...context,
82
- selection: trimmedSelection
83
- }
84
- })) {
85
- const focusTextBlock = selector_isAtTheStartOfBlock.getFocusTextBlock({
86
- context: {
87
- ...context,
88
- selection: trimmedSelection
89
- }
90
- });
91
- if (focusTextBlock && !util_reverseSelection.isEmptyTextBlock(focusTextBlock.node))
92
- return null;
93
- }
94
- return trimmedSelection;
95
- };
96
- exports.getTrimmedSelection = getTrimmedSelection;
97
- //# sourceMappingURL=selector.get-trimmed-selection.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selector.get-trimmed-selection.cjs","sources":["../../src/selectors/selector.get-trimmed-selection.ts"],"sourcesContent":["import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextSpan,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelection, EditorSelectionPoint} from '../types/editor'\nimport {isEmptyTextBlock, isKeyedSegment} from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getTrimmedSelection: EditorSelector<EditorSelection> = ({\n context,\n}) => {\n if (!context.selection) {\n return context.selection\n }\n\n const startPoint = getSelectionStartPoint({context})\n const endPoint = getSelectionEndPoint({context})\n\n if (!startPoint || !endPoint) {\n return context.selection\n }\n\n const startBlockKey = isKeyedSegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : null\n const startChildKey = isKeyedSegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : null\n const endBlockKey = isKeyedSegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : null\n const endChildKey = isKeyedSegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : null\n\n if (!startBlockKey || !endBlockKey) {\n return context.selection\n }\n\n let startBlockFound = false\n let adjustedStartPoint: EditorSelectionPoint | undefined\n let trimStartPoint = false\n let adjustedEndPoint: EditorSelectionPoint | undefined\n let trimEndPoint = false\n let previousPotentialEndpoint:\n | {blockKey: string; span: PortableTextSpan}\n | undefined\n\n for (const block of context.value) {\n if (block._key === startBlockKey) {\n startBlockFound = true\n\n if (isPortableTextTextBlock(block) && isEmptyTextBlock(block)) {\n continue\n }\n }\n\n if (!startBlockFound) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n if (block._key === endBlockKey && isEmptyTextBlock(block)) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (!isPortableTextSpan(child) || endPoint.offset === 0) {\n adjustedEndPoint = previousPotentialEndpoint\n ? {\n path: [\n {_key: previousPotentialEndpoint.blockKey},\n 'children',\n {_key: previousPotentialEndpoint.span._key},\n ],\n offset: previousPotentialEndpoint.span.text.length,\n }\n : undefined\n\n trimEndPoint = true\n break\n }\n }\n\n if (trimStartPoint) {\n const lonelySpan =\n isPortableTextSpan(child) && block.children.length === 1\n\n if (\n (isPortableTextSpan(child) && child.text.length > 0) ||\n lonelySpan\n ) {\n adjustedStartPoint = {\n path: [{_key: block._key}, 'children', {_key: child._key}],\n offset: 0,\n }\n previousPotentialEndpoint = {blockKey: block._key, span: child}\n trimStartPoint = false\n }\n\n continue\n }\n\n if (child._key === startChildKey) {\n if (!isPortableTextSpan(child)) {\n trimStartPoint = true\n continue\n }\n\n if (startPoint.offset === child.text.length) {\n trimStartPoint = true\n previousPotentialEndpoint =\n child.text.length > 0\n ? {blockKey: block._key, span: child}\n : previousPotentialEndpoint\n continue\n }\n }\n\n previousPotentialEndpoint =\n isPortableTextSpan(child) && child.text.length > 0\n ? {blockKey: block._key, span: child}\n : previousPotentialEndpoint\n }\n\n if (block._key === endBlockKey) {\n break\n }\n }\n\n const trimmedSelection = context.selection.backward\n ? {\n anchor: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,\n focus: adjustedStartPoint ?? startPoint,\n backward: true,\n }\n : {\n anchor: adjustedStartPoint ?? startPoint,\n focus: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,\n }\n\n if (\n isSelectionCollapsed({\n context: {\n ...context,\n selection: trimmedSelection,\n },\n })\n ) {\n const focusTextBlock = getFocusTextBlock({\n context: {\n ...context,\n selection: trimmedSelection,\n },\n })\n\n if (focusTextBlock && !isEmptyTextBlock(focusTextBlock.node)) {\n return null\n }\n }\n\n return trimmedSelection\n}\n"],"names":["getTrimmedSelection","context","selection","startPoint","getSelectionStartPoint","endPoint","getSelectionEndPoint","startBlockKey","isKeyedSegment","path","_key","startChildKey","endBlockKey","endChildKey","startBlockFound","adjustedStartPoint","trimStartPoint","adjustedEndPoint","trimEndPoint","previousPotentialEndpoint","block","value","isPortableTextTextBlock","isEmptyTextBlock","child","children","isPortableTextSpan","offset","blockKey","span","text","length","undefined","lonelySpan","trimmedSelection","backward","anchor","focus","isSelectionCollapsed","focusTextBlock","getFocusTextBlock","node"],"mappings":"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"}
@@ -1,100 +0,0 @@
1
- import { isPortableTextTextBlock, isPortableTextSpan } from "@sanity/types";
2
- import { isEmptyTextBlock, isKeyedSegment } from "./util.reverse-selection.js";
3
- import { isSelectionCollapsed, getFocusTextBlock, getSelectionStartPoint, getSelectionEndPoint } from "./selector.is-at-the-start-of-block.js";
4
- const getTrimmedSelection = ({
5
- context
6
- }) => {
7
- if (!context.selection)
8
- return context.selection;
9
- const startPoint = getSelectionStartPoint({
10
- context
11
- }), endPoint = getSelectionEndPoint({
12
- context
13
- });
14
- if (!startPoint || !endPoint)
15
- return context.selection;
16
- const startBlockKey = isKeyedSegment(startPoint.path[0]) ? startPoint.path[0]._key : null, startChildKey = isKeyedSegment(startPoint.path[2]) ? startPoint.path[2]._key : null, endBlockKey = isKeyedSegment(endPoint.path[0]) ? endPoint.path[0]._key : null, endChildKey = isKeyedSegment(endPoint.path[2]) ? endPoint.path[2]._key : null;
17
- if (!startBlockKey || !endBlockKey)
18
- return context.selection;
19
- let startBlockFound = !1, adjustedStartPoint, trimStartPoint = !1, adjustedEndPoint, trimEndPoint = !1, previousPotentialEndpoint;
20
- for (const block of context.value)
21
- if (!(block._key === startBlockKey && (startBlockFound = !0, isPortableTextTextBlock(block) && isEmptyTextBlock(block))) && startBlockFound && isPortableTextTextBlock(block)) {
22
- if (block._key === endBlockKey && isEmptyTextBlock(block))
23
- break;
24
- for (const child of block.children) {
25
- if (child._key === endChildKey && (!isPortableTextSpan(child) || endPoint.offset === 0)) {
26
- adjustedEndPoint = previousPotentialEndpoint ? {
27
- path: [{
28
- _key: previousPotentialEndpoint.blockKey
29
- }, "children", {
30
- _key: previousPotentialEndpoint.span._key
31
- }],
32
- offset: previousPotentialEndpoint.span.text.length
33
- } : void 0, trimEndPoint = !0;
34
- break;
35
- }
36
- if (trimStartPoint) {
37
- const lonelySpan = isPortableTextSpan(child) && block.children.length === 1;
38
- (isPortableTextSpan(child) && child.text.length > 0 || lonelySpan) && (adjustedStartPoint = {
39
- path: [{
40
- _key: block._key
41
- }, "children", {
42
- _key: child._key
43
- }],
44
- offset: 0
45
- }, previousPotentialEndpoint = {
46
- blockKey: block._key,
47
- span: child
48
- }, trimStartPoint = !1);
49
- continue;
50
- }
51
- if (child._key === startChildKey) {
52
- if (!isPortableTextSpan(child)) {
53
- trimStartPoint = !0;
54
- continue;
55
- }
56
- if (startPoint.offset === child.text.length) {
57
- trimStartPoint = !0, previousPotentialEndpoint = child.text.length > 0 ? {
58
- blockKey: block._key,
59
- span: child
60
- } : previousPotentialEndpoint;
61
- continue;
62
- }
63
- }
64
- previousPotentialEndpoint = isPortableTextSpan(child) && child.text.length > 0 ? {
65
- blockKey: block._key,
66
- span: child
67
- } : previousPotentialEndpoint;
68
- }
69
- if (block._key === endBlockKey)
70
- break;
71
- }
72
- const trimmedSelection = context.selection.backward ? {
73
- anchor: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,
74
- focus: adjustedStartPoint ?? startPoint,
75
- backward: !0
76
- } : {
77
- anchor: adjustedStartPoint ?? startPoint,
78
- focus: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint
79
- };
80
- if (isSelectionCollapsed({
81
- context: {
82
- ...context,
83
- selection: trimmedSelection
84
- }
85
- })) {
86
- const focusTextBlock = getFocusTextBlock({
87
- context: {
88
- ...context,
89
- selection: trimmedSelection
90
- }
91
- });
92
- if (focusTextBlock && !isEmptyTextBlock(focusTextBlock.node))
93
- return null;
94
- }
95
- return trimmedSelection;
96
- };
97
- export {
98
- getTrimmedSelection
99
- };
100
- //# sourceMappingURL=selector.get-trimmed-selection.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selector.get-trimmed-selection.js","sources":["../../src/selectors/selector.get-trimmed-selection.ts"],"sourcesContent":["import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextSpan,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport type {EditorSelection, EditorSelectionPoint} from '../types/editor'\nimport {isEmptyTextBlock, isKeyedSegment} from '../utils'\nimport {getSelectionEndPoint} from './selector.get-selection-end-point'\nimport {getSelectionStartPoint} from './selector.get-selection-start-point'\nimport {isSelectionCollapsed} from './selector.is-selection-collapsed'\nimport {getFocusTextBlock} from './selectors'\n\n/**\n * @public\n */\nexport const getTrimmedSelection: EditorSelector<EditorSelection> = ({\n context,\n}) => {\n if (!context.selection) {\n return context.selection\n }\n\n const startPoint = getSelectionStartPoint({context})\n const endPoint = getSelectionEndPoint({context})\n\n if (!startPoint || !endPoint) {\n return context.selection\n }\n\n const startBlockKey = isKeyedSegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : null\n const startChildKey = isKeyedSegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : null\n const endBlockKey = isKeyedSegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : null\n const endChildKey = isKeyedSegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : null\n\n if (!startBlockKey || !endBlockKey) {\n return context.selection\n }\n\n let startBlockFound = false\n let adjustedStartPoint: EditorSelectionPoint | undefined\n let trimStartPoint = false\n let adjustedEndPoint: EditorSelectionPoint | undefined\n let trimEndPoint = false\n let previousPotentialEndpoint:\n | {blockKey: string; span: PortableTextSpan}\n | undefined\n\n for (const block of context.value) {\n if (block._key === startBlockKey) {\n startBlockFound = true\n\n if (isPortableTextTextBlock(block) && isEmptyTextBlock(block)) {\n continue\n }\n }\n\n if (!startBlockFound) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n if (block._key === endBlockKey && isEmptyTextBlock(block)) {\n break\n }\n\n for (const child of block.children) {\n if (child._key === endChildKey) {\n if (!isPortableTextSpan(child) || endPoint.offset === 0) {\n adjustedEndPoint = previousPotentialEndpoint\n ? {\n path: [\n {_key: previousPotentialEndpoint.blockKey},\n 'children',\n {_key: previousPotentialEndpoint.span._key},\n ],\n offset: previousPotentialEndpoint.span.text.length,\n }\n : undefined\n\n trimEndPoint = true\n break\n }\n }\n\n if (trimStartPoint) {\n const lonelySpan =\n isPortableTextSpan(child) && block.children.length === 1\n\n if (\n (isPortableTextSpan(child) && child.text.length > 0) ||\n lonelySpan\n ) {\n adjustedStartPoint = {\n path: [{_key: block._key}, 'children', {_key: child._key}],\n offset: 0,\n }\n previousPotentialEndpoint = {blockKey: block._key, span: child}\n trimStartPoint = false\n }\n\n continue\n }\n\n if (child._key === startChildKey) {\n if (!isPortableTextSpan(child)) {\n trimStartPoint = true\n continue\n }\n\n if (startPoint.offset === child.text.length) {\n trimStartPoint = true\n previousPotentialEndpoint =\n child.text.length > 0\n ? {blockKey: block._key, span: child}\n : previousPotentialEndpoint\n continue\n }\n }\n\n previousPotentialEndpoint =\n isPortableTextSpan(child) && child.text.length > 0\n ? {blockKey: block._key, span: child}\n : previousPotentialEndpoint\n }\n\n if (block._key === endBlockKey) {\n break\n }\n }\n\n const trimmedSelection = context.selection.backward\n ? {\n anchor: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,\n focus: adjustedStartPoint ?? startPoint,\n backward: true,\n }\n : {\n anchor: adjustedStartPoint ?? startPoint,\n focus: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,\n }\n\n if (\n isSelectionCollapsed({\n context: {\n ...context,\n selection: trimmedSelection,\n },\n })\n ) {\n const focusTextBlock = getFocusTextBlock({\n context: {\n ...context,\n selection: trimmedSelection,\n },\n })\n\n if (focusTextBlock && !isEmptyTextBlock(focusTextBlock.node)) {\n return null\n }\n }\n\n return trimmedSelection\n}\n"],"names":["getTrimmedSelection","context","selection","startPoint","getSelectionStartPoint","endPoint","getSelectionEndPoint","startBlockKey","isKeyedSegment","path","_key","startChildKey","endBlockKey","endChildKey","startBlockFound","adjustedStartPoint","trimStartPoint","adjustedEndPoint","trimEndPoint","previousPotentialEndpoint","block","value","isPortableTextTextBlock","isEmptyTextBlock","child","children","isPortableTextSpan","offset","blockKey","span","text","length","undefined","lonelySpan","trimmedSelection","backward","anchor","focus","isSelectionCollapsed","focusTextBlock","getFocusTextBlock","node"],"mappings":"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"}
@@ -1,60 +0,0 @@
1
- import {defineBehavior, raise} from './behavior.types'
2
-
3
- export const coreDeserializeBehaviors = {
4
- 'deserialize': defineBehavior({
5
- on: 'deserialize',
6
- guard: ({context, event}) => {
7
- const deserializeEvents = context.converters.flatMap((converter) => {
8
- const data = event.dataTransfer.getData(converter.mimeType)
9
-
10
- if (!data) {
11
- return []
12
- }
13
-
14
- return [
15
- converter.deserialize({context, event: {type: 'deserialize', data}}),
16
- ]
17
- })
18
-
19
- const firstSuccess = deserializeEvents.find(
20
- (deserializeEvent) =>
21
- deserializeEvent.type === 'deserialization.success',
22
- )
23
-
24
- if (!firstSuccess) {
25
- return {
26
- type: 'deserialization.failure',
27
- mimeType: '*/*',
28
- reason: deserializeEvents
29
- .map((deserializeEvent) =>
30
- deserializeEvent.type === 'deserialization.failure'
31
- ? deserializeEvent.reason
32
- : '',
33
- )
34
- .join(', '),
35
- } as const
36
- }
37
-
38
- return firstSuccess
39
- },
40
- actions: [
41
- ({event}, deserializeEvent) => [
42
- raise({
43
- ...deserializeEvent,
44
- dataTransfer: event.dataTransfer,
45
- }),
46
- ],
47
- ],
48
- }),
49
- 'deserialization.success': defineBehavior({
50
- on: 'deserialization.success',
51
- actions: [
52
- ({event}) => [
53
- raise({
54
- type: 'insert.blocks',
55
- blocks: event.data,
56
- }),
57
- ],
58
- ],
59
- }),
60
- }
@@ -1,44 +0,0 @@
1
- import {defineBehavior, raise} from './behavior.types'
2
-
3
- export const coreSerializeBehaviors = {
4
- 'serialize': defineBehavior({
5
- on: 'serialize',
6
- guard: ({context, event}) => {
7
- if (context.converters.length === 0) {
8
- return false
9
- }
10
-
11
- const serializeEvents = context.converters.map((converter) =>
12
- converter.serialize({context, event}),
13
- )
14
-
15
- if (serializeEvents.length === 0) {
16
- return false
17
- }
18
-
19
- return serializeEvents
20
- },
21
- actions: [
22
- ({event}, serializeEvents) =>
23
- serializeEvents.map((serializeEvent) =>
24
- raise({
25
- ...serializeEvent,
26
- dataTransfer: event.dataTransfer,
27
- }),
28
- ),
29
- ],
30
- }),
31
- 'serialization.success': defineBehavior({
32
- on: 'serialization.success',
33
- actions: [
34
- ({event}) => [
35
- raise({
36
- type: 'data transfer.set',
37
- data: event.data,
38
- dataTransfer: event.dataTransfer,
39
- mimeType: event.mimeType,
40
- }),
41
- ],
42
- ],
43
- }),
44
- }
@@ -1,19 +0,0 @@
1
- import * as selectors from '../selectors'
2
- import {defineBehavior, raise} from './behavior.types'
3
-
4
- const toggleStyleOff = defineBehavior({
5
- on: 'style.toggle',
6
- guard: ({context, event}) => selectors.isActiveStyle(event.style)({context}),
7
- actions: [({event}) => [raise({type: 'style.remove', style: event.style})]],
8
- })
9
-
10
- const toggleStyleOn = defineBehavior({
11
- on: 'style.toggle',
12
- guard: ({context, event}) => !selectors.isActiveStyle(event.style)({context}),
13
- actions: [({event}) => [raise({type: 'style.add', style: event.style})]],
14
- })
15
-
16
- export const coreStyleBehaviors = {
17
- toggleStyleOff,
18
- toggleStyleOn,
19
- }