@portabletext/editor 1.34.0 → 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/_chunks-cjs/behavior.core.cjs +57 -118
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +27 -67
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/plugin.event-listener.cjs +53 -71
- package/lib/_chunks-cjs/plugin.event-listener.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-text-before.cjs +5 -7
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-active-style.cjs +22 -36
- package/lib/_chunks-cjs/selector.is-active-style.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs +68 -153
- package/lib/_chunks-cjs/selector.is-at-the-start-of-block.cjs.map +1 -1
- package/lib/_chunks-cjs/util.block-offsets-to-selection.cjs.map +1 -1
- package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +57 -118
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +27 -67
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/plugin.event-listener.js +53 -71
- package/lib/_chunks-es/plugin.event-listener.js.map +1 -1
- package/lib/_chunks-es/selector.get-text-before.js +5 -7
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/selector.is-active-style.js +22 -36
- package/lib/_chunks-es/selector.is-active-style.js.map +1 -1
- package/lib/_chunks-es/selector.is-at-the-start-of-block.js +68 -153
- package/lib/_chunks-es/selector.is-at-the-start-of-block.js.map +1 -1
- package/lib/_chunks-es/util.block-offsets-to-selection.js.map +1 -1
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/behaviors/index.cjs +18 -48
- package/lib/behaviors/index.cjs.map +1 -1
- package/lib/behaviors/index.d.cts +28 -16
- package/lib/behaviors/index.d.ts +28 -16
- package/lib/behaviors/index.js +18 -48
- package/lib/behaviors/index.js.map +1 -1
- package/lib/index.d.cts +132 -71
- package/lib/index.d.ts +132 -71
- package/lib/plugins/index.cjs +182 -186
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +147 -82
- package/lib/plugins/index.d.ts +147 -82
- package/lib/plugins/index.js +182 -186
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.cjs +22 -50
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +9 -200
- package/lib/selectors/index.d.ts +9 -200
- package/lib/selectors/index.js +22 -50
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +15 -7
- package/lib/utils/index.d.ts +15 -7
- package/lib/utils/index.js.map +1 -1
- package/package.json +6 -6
- package/src/behaviors/behavior.code-editor.ts +6 -6
- package/src/behaviors/behavior.core.annotations.ts +5 -4
- package/src/behaviors/behavior.core.block-objects.ts +17 -17
- package/src/behaviors/behavior.core.decorators.ts +12 -8
- package/src/behaviors/behavior.core.insert-break.ts +27 -29
- package/src/behaviors/behavior.core.lists.ts +19 -19
- package/src/behaviors/behavior.decorator-pair.ts +200 -0
- package/src/behaviors/behavior.default.ts +35 -30
- package/src/behaviors/behavior.emoji-picker.ts +12 -12
- package/src/behaviors/behavior.links.ts +7 -7
- package/src/behaviors/behavior.markdown.ts +41 -42
- package/src/behaviors/behavior.types.ts +15 -18
- package/src/behaviors/index.ts +0 -1
- package/src/converters/converter.json.ts +6 -6
- package/src/converters/converter.portable-text.deserialize.test.ts +28 -26
- package/src/converters/converter.portable-text.ts +6 -6
- package/src/converters/converter.text-html.deserialize.test.ts +17 -15
- package/src/converters/converter.text-html.serialize.test.ts +57 -53
- package/src/converters/converter.text-html.ts +14 -10
- package/src/converters/converter.text-plain.test.ts +17 -15
- package/src/converters/converter.text-plain.ts +15 -11
- package/src/converters/converter.types.ts +8 -7
- package/src/editor/editor-machine.ts +6 -1
- package/src/editor/plugins/create-with-event-listeners.ts +0 -5
- package/src/index.ts +3 -3
- package/src/internal-utils/get-text-to-emphasize.ts +29 -7
- package/src/plugins/plugin.decorator-shortcut.ts +235 -0
- package/src/plugins/plugin.markdown.tsx +56 -8
- package/src/plugins/plugin.one-line.tsx +17 -17
- package/src/selectors/selector.get-active-list-item.ts +4 -4
- package/src/selectors/selector.get-active-style.ts +6 -6
- package/src/selectors/selector.get-anchor-block.ts +5 -5
- package/src/selectors/selector.get-anchor-child.ts +5 -5
- package/src/selectors/selector.get-anchor-span.ts +2 -2
- package/src/selectors/selector.get-anchor-text-block.ts +2 -2
- package/src/selectors/selector.get-block-offsets.ts +8 -7
- package/src/selectors/selector.get-caret-word-selection.ts +19 -16
- package/src/selectors/selector.get-next-inline-object.ts +4 -4
- package/src/selectors/selector.get-previous-inline-object.ts +4 -4
- package/src/selectors/selector.get-selected-slice.ts +7 -4
- package/src/selectors/selector.get-selected-spans.ts +9 -9
- package/src/selectors/selector.get-selection-end-point.ts +5 -5
- package/src/selectors/selector.get-selection-start-point.ts +5 -5
- package/src/selectors/selector.get-selection-text.ts +2 -2
- package/src/selectors/selector.get-selection.ts +2 -2
- package/src/selectors/selector.get-text-before.ts +8 -8
- package/src/selectors/selector.get-trimmed-selection.ts +15 -13
- package/src/selectors/selector.get-value.ts +4 -4
- package/src/selectors/selector.is-at-the-end-of-block.ts +6 -3
- package/src/selectors/selector.is-at-the-start-of-block.ts +3 -3
- package/src/selectors/selector.is-overlapping-selection.ts +8 -6
- package/src/selectors/selector.is-selection-collapsed.ts +6 -5
- package/src/selectors/selector.is-selection-expanded.ts +2 -2
- package/src/selectors/selectors.ts +59 -59
- package/src/types/block-offset.ts +9 -0
- package/src/utils/index.ts +0 -1
- package/src/utils/util.block-offset.ts +1 -1
- package/src/utils/util.block-offsets-to-selection.ts +1 -1
- package/src/utils/util.child-selection-point-to-block-offset.ts +1 -1
- package/src/behaviors/behavior.markdown-emphasis.ts +0 -437
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { getBlockStartPoint, isKeyedSegment } from "./util.slice-blocks.js";
|
|
2
2
|
import { reverseSelection } from "./util.reverse-selection.js";
|
|
3
3
|
import { getSelectionText } from "./selector.is-at-the-start-of-block.js";
|
|
4
|
-
const getBlockTextBefore = ({
|
|
5
|
-
context
|
|
6
|
-
}) => {
|
|
7
|
-
if (!context.selection)
|
|
4
|
+
const getBlockTextBefore = (snapshot) => {
|
|
5
|
+
if (!snapshot.context.selection)
|
|
8
6
|
return "";
|
|
9
|
-
const point = (context.selection.backward ? reverseSelection(context.selection) : context.selection).anchor, key = isKeyedSegment(point.path[0]) ? point.path[0]._key : void 0, block = key ? context.value.find((block2) => block2._key === key) : void 0;
|
|
7
|
+
const point = (snapshot.context.selection.backward ? reverseSelection(snapshot.context.selection) : snapshot.context.selection).anchor, key = isKeyedSegment(point.path[0]) ? point.path[0]._key : void 0, block = key ? snapshot.context.value.find((block2) => block2._key === key) : void 0;
|
|
10
8
|
if (!block)
|
|
11
9
|
return "";
|
|
12
10
|
const startOfBlock = getBlockStartPoint({
|
|
@@ -16,9 +14,9 @@ const getBlockTextBefore = ({
|
|
|
16
14
|
}]
|
|
17
15
|
});
|
|
18
16
|
return getSelectionText({
|
|
17
|
+
...snapshot,
|
|
19
18
|
context: {
|
|
20
|
-
...context,
|
|
21
|
-
value: context.value,
|
|
19
|
+
...snapshot.context,
|
|
22
20
|
selection: {
|
|
23
21
|
anchor: startOfBlock,
|
|
24
22
|
focus: point
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector.get-text-before.js","sources":["../../src/selectors/selector.get-text-before.ts"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\nimport {getBlockStartPoint} from '../utils/util.get-block-start-point'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\nimport {reverseSelection} from '../utils/util.reverse-selection'\nimport {getSelectionText} from './selector.get-selection-text'\n\n/**\n * @public\n */\nexport const getBlockTextBefore: EditorSelector<string> = (
|
|
1
|
+
{"version":3,"file":"selector.get-text-before.js","sources":["../../src/selectors/selector.get-text-before.ts"],"sourcesContent":["import type {EditorSelector} from '../editor/editor-selector'\nimport {getBlockStartPoint} from '../utils/util.get-block-start-point'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\nimport {reverseSelection} from '../utils/util.reverse-selection'\nimport {getSelectionText} from './selector.get-selection-text'\n\n/**\n * @public\n */\nexport const getBlockTextBefore: EditorSelector<string> = (snapshot) => {\n if (!snapshot.context.selection) {\n return ''\n }\n\n const selection = snapshot.context.selection.backward\n ? reverseSelection(snapshot.context.selection)\n : snapshot.context.selection\n const point = selection.anchor\n const key = isKeyedSegment(point.path[0]) ? point.path[0]._key : undefined\n\n const block = key\n ? snapshot.context.value.find((block) => block._key === key)\n : undefined\n\n if (!block) {\n return ''\n }\n\n const startOfBlock = getBlockStartPoint({\n node: block,\n path: [{_key: block._key}],\n })\n\n return getSelectionText({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: {\n anchor: startOfBlock,\n focus: point,\n },\n },\n })\n}\n"],"names":["getBlockTextBefore","snapshot","context","selection","point","backward","reverseSelection","anchor","key","isKeyedSegment","path","_key","undefined","block","value","find","startOfBlock","getBlockStartPoint","node","getSelectionText","focus"],"mappings":";;;AASO,MAAMA,qBAA8CC,CAAa,aAAA;AAClE,MAAA,CAACA,SAASC,QAAQC;AACb,WAAA;AAMT,QAAMC,SAHYH,SAASC,QAAQC,UAAUE,WACzCC,iBAAiBL,SAASC,QAAQC,SAAS,IAC3CF,SAASC,QAAQC,WACGI,QAClBC,MAAMC,eAAeL,MAAMM,KAAK,CAAC,CAAC,IAAIN,MAAMM,KAAK,CAAC,EAAEC,OAAOC,QAE3DC,QAAQL,MACVP,SAASC,QAAQY,MAAMC,KAAMF,CAAAA,WAAUA,OAAMF,SAASH,GAAG,IACzDI;AAEJ,MAAI,CAACC;AACI,WAAA;AAGT,QAAMG,eAAeC,mBAAmB;AAAA,IACtCC,MAAML;AAAAA,IACNH,MAAM,CAAC;AAAA,MAACC,MAAME,MAAMF;AAAAA,IAAK,CAAA;AAAA,EAAA,CAC1B;AAED,SAAOQ,iBAAiB;AAAA,IACtB,GAAGlB;AAAAA,IACHC,SAAS;AAAA,MACP,GAAGD,SAASC;AAAAA,MACZC,WAAW;AAAA,QACTI,QAAQS;AAAAA,QACRI,OAAOhB;AAAAA,MAAAA;AAAAA,IACT;AAAA,EACF,CACD;AACH;"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { isKeySegment, isPortableTextTextBlock, isPortableTextSpan } from "@sanity/types";
|
|
2
2
|
import { isEmptyTextBlock, isKeyedSegment } from "./util.slice-blocks.js";
|
|
3
3
|
import { getSelectedBlocks, createGuards, isSelectionCollapsed, getFocusTextBlock, getSelectionStartPoint, getSelectionEndPoint, getFocusSpan, isSelectionExpanded } from "./selector.is-at-the-start-of-block.js";
|
|
4
|
-
const getSelectedSpans = ({
|
|
5
|
-
context
|
|
6
|
-
}) => {
|
|
7
|
-
if (!context.selection)
|
|
4
|
+
const getSelectedSpans = (snapshot) => {
|
|
5
|
+
if (!snapshot.context.selection)
|
|
8
6
|
return [];
|
|
9
|
-
const selectedSpans = [], startPoint = context.selection.backward ? context.selection.focus : context.selection.anchor, endPoint = context.selection.backward ? context.selection.anchor : context.selection.focus, startBlockKey = isKeySegment(startPoint.path[0]) ? startPoint.path[0]._key : void 0, endBlockKey = isKeySegment(endPoint.path[0]) ? endPoint.path[0]._key : void 0;
|
|
7
|
+
const selectedSpans = [], startPoint = snapshot.context.selection.backward ? snapshot.context.selection.focus : snapshot.context.selection.anchor, endPoint = snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus, startBlockKey = isKeySegment(startPoint.path[0]) ? startPoint.path[0]._key : void 0, endBlockKey = isKeySegment(endPoint.path[0]) ? endPoint.path[0]._key : void 0;
|
|
10
8
|
if (!startBlockKey || !endBlockKey)
|
|
11
9
|
return selectedSpans;
|
|
12
10
|
const startSpanKey = isKeySegment(startPoint.path[2]) ? startPoint.path[2]._key : void 0, endSpanKey = isKeySegment(endPoint.path[2]) ? endPoint.path[2]._key : void 0;
|
|
13
|
-
for (const block of context.value)
|
|
11
|
+
for (const block of snapshot.context.value)
|
|
14
12
|
if (isPortableTextTextBlock(block)) {
|
|
15
13
|
if (block._key === startBlockKey) {
|
|
16
14
|
for (const child of block.children)
|
|
@@ -88,49 +86,35 @@ const getSelectedSpans = ({
|
|
|
88
86
|
});
|
|
89
87
|
}
|
|
90
88
|
return selectedSpans;
|
|
91
|
-
}, getActiveListItem = ({
|
|
92
|
-
context
|
|
93
|
-
}) => {
|
|
94
|
-
if (!context.selection)
|
|
89
|
+
}, getActiveListItem = (snapshot) => {
|
|
90
|
+
if (!snapshot.context.selection)
|
|
95
91
|
return;
|
|
96
|
-
const guards = createGuards(context), selectedTextBlocks = getSelectedBlocks(
|
|
97
|
-
context
|
|
98
|
-
}).map((block) => block.node).filter(guards.isTextBlock), firstTextBlock = selectedTextBlocks.at(0);
|
|
92
|
+
const guards = createGuards(snapshot.context), selectedTextBlocks = getSelectedBlocks(snapshot).map((block) => block.node).filter(guards.isTextBlock), firstTextBlock = selectedTextBlocks.at(0);
|
|
99
93
|
if (!firstTextBlock)
|
|
100
94
|
return;
|
|
101
95
|
const firstListItem = firstTextBlock.listItem;
|
|
102
96
|
if (firstListItem && selectedTextBlocks.every((block) => block.listItem === firstListItem))
|
|
103
97
|
return firstListItem;
|
|
104
|
-
}, getActiveStyle = ({
|
|
105
|
-
context
|
|
106
|
-
}) => {
|
|
107
|
-
if (!context.selection)
|
|
98
|
+
}, getActiveStyle = (snapshot) => {
|
|
99
|
+
if (!snapshot.context.selection)
|
|
108
100
|
return;
|
|
109
|
-
const guards = createGuards(context), selectedTextBlocks = getSelectedBlocks(
|
|
110
|
-
context
|
|
111
|
-
}).map((block) => block.node).filter(guards.isTextBlock), firstTextBlock = selectedTextBlocks.at(0);
|
|
101
|
+
const guards = createGuards(snapshot.context), selectedTextBlocks = getSelectedBlocks(snapshot).map((block) => block.node).filter(guards.isTextBlock), firstTextBlock = selectedTextBlocks.at(0);
|
|
112
102
|
if (!firstTextBlock)
|
|
113
103
|
return;
|
|
114
104
|
const firstStyle = firstTextBlock.style;
|
|
115
105
|
if (firstStyle && selectedTextBlocks.every((block) => block.style === firstStyle))
|
|
116
106
|
return firstStyle;
|
|
117
|
-
}, getTrimmedSelection = ({
|
|
118
|
-
context
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return context.selection;
|
|
122
|
-
const startPoint = getSelectionStartPoint({
|
|
123
|
-
context
|
|
124
|
-
}), endPoint = getSelectionEndPoint({
|
|
125
|
-
context
|
|
126
|
-
});
|
|
107
|
+
}, getTrimmedSelection = (snapshot) => {
|
|
108
|
+
if (!snapshot.context.selection)
|
|
109
|
+
return snapshot.context.selection;
|
|
110
|
+
const startPoint = getSelectionStartPoint(snapshot), endPoint = getSelectionEndPoint(snapshot);
|
|
127
111
|
if (!startPoint || !endPoint)
|
|
128
|
-
return context.selection;
|
|
112
|
+
return snapshot.context.selection;
|
|
129
113
|
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;
|
|
130
114
|
if (!startBlockKey || !endBlockKey)
|
|
131
|
-
return context.selection;
|
|
115
|
+
return snapshot.context.selection;
|
|
132
116
|
let startBlockFound = !1, adjustedStartPoint, trimStartPoint = !1, adjustedEndPoint, trimEndPoint = !1, previousPotentialEndpoint;
|
|
133
|
-
for (const block of context.value)
|
|
117
|
+
for (const block of snapshot.context.value)
|
|
134
118
|
if (!(block._key === startBlockKey && (startBlockFound = !0, isPortableTextTextBlock(block) && isEmptyTextBlock(block))) && startBlockFound && isPortableTextTextBlock(block)) {
|
|
135
119
|
if (block._key === endBlockKey && isEmptyTextBlock(block))
|
|
136
120
|
break;
|
|
@@ -182,7 +166,7 @@ const getSelectedSpans = ({
|
|
|
182
166
|
if (block._key === endBlockKey)
|
|
183
167
|
break;
|
|
184
168
|
}
|
|
185
|
-
const trimmedSelection = context.selection.backward ? {
|
|
169
|
+
const trimmedSelection = snapshot.context.selection.backward ? {
|
|
186
170
|
anchor: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint,
|
|
187
171
|
focus: adjustedStartPoint ?? startPoint,
|
|
188
172
|
backward: !0
|
|
@@ -191,14 +175,16 @@ const getSelectedSpans = ({
|
|
|
191
175
|
focus: trimEndPoint && adjustedEndPoint ? adjustedEndPoint : endPoint
|
|
192
176
|
};
|
|
193
177
|
if (isSelectionCollapsed({
|
|
178
|
+
...snapshot,
|
|
194
179
|
context: {
|
|
195
|
-
...context,
|
|
180
|
+
...snapshot.context,
|
|
196
181
|
selection: trimmedSelection
|
|
197
182
|
}
|
|
198
183
|
})) {
|
|
199
184
|
const focusTextBlock = getFocusTextBlock({
|
|
185
|
+
...snapshot,
|
|
200
186
|
context: {
|
|
201
|
-
...context,
|
|
187
|
+
...snapshot.context,
|
|
202
188
|
selection: trimmedSelection
|
|
203
189
|
}
|
|
204
190
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selector.is-active-style.js","sources":["../../src/selectors/selector.get-selected-spans.ts","../../src/selectors/selector.get-active-list-item.ts","../../src/selectors/selector.get-active-style.ts","../../src/selectors/selector.get-trimmed-selection.ts","../../src/selectors/selector.is-active-annotation.ts","../../src/selectors/selector.is-active-decorator.ts","../../src/selectors/selector.is-active-list-item.ts","../../src/selectors/selector.is-active-style.ts"],"sourcesContent":["import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextSpan,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectedSpans: EditorSelector<\n Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }>\n> = ({context}) => {\n if (!context.selection) {\n return []\n }\n\n const selectedSpans: Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }> = []\n\n const startPoint = context.selection.backward\n ? context.selection.focus\n : context.selection.anchor\n const endPoint = context.selection.backward\n ? context.selection.anchor\n : context.selection.focus\n\n const startBlockKey = isKeySegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : undefined\n const endBlockKey = isKeySegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return selectedSpans\n }\n\n const startSpanKey = isKeySegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endSpanKey = isKeySegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\n\n for (const block of context.value) {\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n if (block._key === startBlockKey) {\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (startSpanKey && child._key === startSpanKey) {\n if (startPoint.offset < child.text.length) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n\n if (startSpanKey === endSpanKey) {\n break\n }\n\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n if (endPoint.offset > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n break\n }\n\n if (selectedSpans.length > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n if (block._key === endBlockKey) {\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n if (endPoint.offset > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n break\n }\n\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n\n break\n }\n\n if (selectedSpans.length > 0) {\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n }\n }\n\n return selectedSpans\n}\n","import type {PortableTextListBlock} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveListItem: EditorSelector<\n PortableTextListBlock['listItem'] | undefined\n> = ({context}) => {\n if (!context.selection) {\n return undefined\n }\n\n const guards = createGuards(context)\n const selectedBlocks = getSelectedBlocks({context}).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter(guards.isTextBlock)\n\n const firstTextBlock = selectedTextBlocks.at(0)\n\n if (!firstTextBlock) {\n return undefined\n }\n\n const firstListItem = firstTextBlock.listItem\n\n if (!firstListItem) {\n return undefined\n }\n\n if (selectedTextBlocks.every((block) => block.listItem === firstListItem)) {\n return firstListItem\n }\n\n return undefined\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveStyle: EditorSelector<PortableTextTextBlock['style']> = ({\n context,\n}) => {\n if (!context.selection) {\n return undefined\n }\n\n const guards = createGuards(context)\n const selectedBlocks = getSelectedBlocks({context}).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter(guards.isTextBlock)\n\n const firstTextBlock = selectedTextBlocks.at(0)\n\n if (!firstTextBlock) {\n return undefined\n }\n\n const firstStyle = firstTextBlock.style\n\n if (!firstStyle) {\n return undefined\n }\n\n if (selectedTextBlocks.every((block) => block.style === firstStyle)) {\n return firstStyle\n }\n\n return undefined\n}\n","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","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\nimport {getFocusSpan, getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport function isActiveAnnotation(\n annotation: string,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n const selectedSpans = isSelectionExpanded(snapshot)\n ? getSelectedSpans(snapshot)\n : focusSpan\n ? [focusSpan]\n : []\n\n if (selectedSpans.length === 0) {\n return false\n }\n\n if (\n selectedSpans.some(\n (span) => !span.node.marks || span.node.marks?.length === 0,\n )\n ) {\n return false\n }\n\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isPortableTextTextBlock(block.node) ? (block.node.markDefs ?? []) : [],\n )\n\n return selectedSpans.every((span) => {\n const spanMarkDefs =\n span.node.marks?.flatMap((mark) => {\n const markDef = selectionMarkDefs.find(\n (markDef) => markDef._key === mark,\n )\n\n return markDef ? [markDef._type] : []\n }) ?? []\n\n return spanMarkDefs.includes(annotation)\n })\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\n\n/**\n * @public\n */\nexport function isActiveDecorator(decorator: string): EditorSelector<boolean> {\n return (snapshot) => {\n if (isSelectionExpanded(snapshot)) {\n const selectedSpans = getSelectedSpans(snapshot)\n\n return (\n selectedSpans.length > 0 &&\n selectedSpans.every((span) => span.node.marks?.includes(decorator))\n )\n }\n\n return snapshot.context.activeDecorators.includes(decorator)\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getActiveListItem} from './selector.get-active-list-item'\n\n/**\n * @public\n */\nexport function isActiveListItem(listItem: string): EditorSelector<boolean> {\n return (snapshot) => {\n const activeListItem = getActiveListItem(snapshot)\n\n return activeListItem === listItem\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getActiveStyle} from './selector.get-active-style'\n\n/**\n * @public\n */\nexport function isActiveStyle(style: string): EditorSelector<boolean> {\n return (snapshot) => {\n const activeStyle = getActiveStyle(snapshot)\n\n return activeStyle === style\n }\n}\n"],"names":["getSelectedSpans","context","selection","selectedSpans","startPoint","backward","focus","anchor","endPoint","startBlockKey","isKeySegment","path","_key","undefined","endBlockKey","startSpanKey","endSpanKey","block","value","isPortableTextTextBlock","child","children","isPortableTextSpan","offset","text","length","push","node","getActiveListItem","guards","createGuards","selectedTextBlocks","getSelectedBlocks","map","filter","isTextBlock","firstTextBlock","at","firstListItem","listItem","every","getActiveStyle","firstStyle","style","getTrimmedSelection","getSelectionStartPoint","getSelectionEndPoint","isKeyedSegment","startChildKey","endChildKey","startBlockFound","adjustedStartPoint","trimStartPoint","adjustedEndPoint","trimEndPoint","previousPotentialEndpoint","isEmptyTextBlock","blockKey","span","lonelySpan","trimmedSelection","isSelectionCollapsed","focusTextBlock","getFocusTextBlock","isActiveAnnotation","annotation","snapshot","selectedBlocks","focusSpan","getFocusSpan","isSelectionExpanded","some","marks","selectionMarkDefs","flatMap","markDefs","mark","markDef","find","_type","includes","isActiveDecorator","decorator","activeDecorators","isActiveListItem","isActiveStyle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"selector.is-active-style.js","sources":["../../src/selectors/selector.get-selected-spans.ts","../../src/selectors/selector.get-active-list-item.ts","../../src/selectors/selector.get-active-style.ts","../../src/selectors/selector.get-trimmed-selection.ts","../../src/selectors/selector.is-active-annotation.ts","../../src/selectors/selector.is-active-decorator.ts","../../src/selectors/selector.is-active-list-item.ts","../../src/selectors/selector.is-active-style.ts"],"sourcesContent":["import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextSpan,\n} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\n\n/**\n * @public\n */\nexport const getSelectedSpans: EditorSelector<\n Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }>\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return []\n }\n\n const selectedSpans: Array<{\n node: PortableTextSpan\n path: [KeyedSegment, 'children', KeyedSegment]\n }> = []\n\n const startPoint = snapshot.context.selection.backward\n ? snapshot.context.selection.focus\n : snapshot.context.selection.anchor\n const endPoint = snapshot.context.selection.backward\n ? snapshot.context.selection.anchor\n : snapshot.context.selection.focus\n\n const startBlockKey = isKeySegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : undefined\n const endBlockKey = isKeySegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return selectedSpans\n }\n\n const startSpanKey = isKeySegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endSpanKey = isKeySegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\n\n for (const block of snapshot.context.value) {\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n if (block._key === startBlockKey) {\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (startSpanKey && child._key === startSpanKey) {\n if (startPoint.offset < child.text.length) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n\n if (startSpanKey === endSpanKey) {\n break\n }\n\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n if (endPoint.offset > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n break\n }\n\n if (selectedSpans.length > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n if (block._key === endBlockKey) {\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (endSpanKey && child._key === endSpanKey) {\n if (endPoint.offset > 0) {\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n break\n }\n\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n\n break\n }\n\n if (selectedSpans.length > 0) {\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n selectedSpans.push({\n node: child,\n path: [{_key: block._key}, 'children', {_key: child._key}],\n })\n }\n }\n }\n\n return selectedSpans\n}\n","import type {PortableTextListBlock} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveListItem: EditorSelector<\n PortableTextListBlock['listItem'] | undefined\n> = (snapshot) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const guards = createGuards(snapshot.context)\n const selectedBlocks = getSelectedBlocks(snapshot).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter(guards.isTextBlock)\n\n const firstTextBlock = selectedTextBlocks.at(0)\n\n if (!firstTextBlock) {\n return undefined\n }\n\n const firstListItem = firstTextBlock.listItem\n\n if (!firstListItem) {\n return undefined\n }\n\n if (selectedTextBlocks.every((block) => block.listItem === firstListItem)) {\n return firstListItem\n }\n\n return undefined\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\nimport {createGuards} from '../behavior-actions/behavior.guards'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport const getActiveStyle: EditorSelector<PortableTextTextBlock['style']> = (\n snapshot,\n) => {\n if (!snapshot.context.selection) {\n return undefined\n }\n\n const guards = createGuards(snapshot.context)\n const selectedBlocks = getSelectedBlocks(snapshot).map((block) => block.node)\n const selectedTextBlocks = selectedBlocks.filter(guards.isTextBlock)\n\n const firstTextBlock = selectedTextBlocks.at(0)\n\n if (!firstTextBlock) {\n return undefined\n }\n\n const firstStyle = firstTextBlock.style\n\n if (!firstStyle) {\n return undefined\n }\n\n if (selectedTextBlocks.every((block) => block.style === firstStyle)) {\n return firstStyle\n }\n\n return undefined\n}\n","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 snapshot,\n) => {\n if (!snapshot.context.selection) {\n return snapshot.context.selection\n }\n\n const startPoint = getSelectionStartPoint(snapshot)\n const endPoint = getSelectionEndPoint(snapshot)\n\n if (!startPoint || !endPoint) {\n return snapshot.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 snapshot.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 snapshot.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 = snapshot.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 ...snapshot,\n context: {\n ...snapshot.context,\n selection: trimmedSelection,\n },\n })\n ) {\n const focusTextBlock = getFocusTextBlock({\n ...snapshot,\n context: {\n ...snapshot.context,\n selection: trimmedSelection,\n },\n })\n\n if (focusTextBlock && !isEmptyTextBlock(focusTextBlock.node)) {\n return null\n }\n }\n\n return trimmedSelection\n}\n","import {isPortableTextTextBlock} from '@sanity/types'\nimport type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\nimport {getFocusSpan, getSelectedBlocks} from './selectors'\n\n/**\n * @public\n */\nexport function isActiveAnnotation(\n annotation: string,\n): EditorSelector<boolean> {\n return (snapshot) => {\n if (!snapshot.context.selection) {\n return false\n }\n\n const selectedBlocks = getSelectedBlocks(snapshot)\n const focusSpan = getFocusSpan(snapshot)\n\n const selectedSpans = isSelectionExpanded(snapshot)\n ? getSelectedSpans(snapshot)\n : focusSpan\n ? [focusSpan]\n : []\n\n if (selectedSpans.length === 0) {\n return false\n }\n\n if (\n selectedSpans.some(\n (span) => !span.node.marks || span.node.marks?.length === 0,\n )\n ) {\n return false\n }\n\n const selectionMarkDefs = selectedBlocks.flatMap((block) =>\n isPortableTextTextBlock(block.node) ? (block.node.markDefs ?? []) : [],\n )\n\n return selectedSpans.every((span) => {\n const spanMarkDefs =\n span.node.marks?.flatMap((mark) => {\n const markDef = selectionMarkDefs.find(\n (markDef) => markDef._key === mark,\n )\n\n return markDef ? [markDef._type] : []\n }) ?? []\n\n return spanMarkDefs.includes(annotation)\n })\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getSelectedSpans} from './selector.get-selected-spans'\nimport {isSelectionExpanded} from './selector.is-selection-expanded'\n\n/**\n * @public\n */\nexport function isActiveDecorator(decorator: string): EditorSelector<boolean> {\n return (snapshot) => {\n if (isSelectionExpanded(snapshot)) {\n const selectedSpans = getSelectedSpans(snapshot)\n\n return (\n selectedSpans.length > 0 &&\n selectedSpans.every((span) => span.node.marks?.includes(decorator))\n )\n }\n\n return snapshot.context.activeDecorators.includes(decorator)\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getActiveListItem} from './selector.get-active-list-item'\n\n/**\n * @public\n */\nexport function isActiveListItem(listItem: string): EditorSelector<boolean> {\n return (snapshot) => {\n const activeListItem = getActiveListItem(snapshot)\n\n return activeListItem === listItem\n }\n}\n","import type {EditorSelector} from '../editor/editor-selector'\nimport {getActiveStyle} from './selector.get-active-style'\n\n/**\n * @public\n */\nexport function isActiveStyle(style: string): EditorSelector<boolean> {\n return (snapshot) => {\n const activeStyle = getActiveStyle(snapshot)\n\n return activeStyle === style\n }\n}\n"],"names":["getSelectedSpans","snapshot","context","selection","selectedSpans","startPoint","backward","focus","anchor","endPoint","startBlockKey","isKeySegment","path","_key","undefined","endBlockKey","startSpanKey","endSpanKey","block","value","isPortableTextTextBlock","child","children","isPortableTextSpan","offset","text","length","push","node","getActiveListItem","guards","createGuards","selectedTextBlocks","getSelectedBlocks","map","filter","isTextBlock","firstTextBlock","at","firstListItem","listItem","every","getActiveStyle","firstStyle","style","getTrimmedSelection","getSelectionStartPoint","getSelectionEndPoint","isKeyedSegment","startChildKey","endChildKey","startBlockFound","adjustedStartPoint","trimStartPoint","adjustedEndPoint","trimEndPoint","previousPotentialEndpoint","isEmptyTextBlock","blockKey","span","lonelySpan","trimmedSelection","isSelectionCollapsed","focusTextBlock","getFocusTextBlock","isActiveAnnotation","annotation","selectedBlocks","focusSpan","getFocusSpan","isSelectionExpanded","some","marks","selectionMarkDefs","flatMap","markDefs","mark","markDef","find","_type","includes","isActiveDecorator","decorator","activeDecorators","isActiveListItem","isActiveStyle"],"mappings":";;;AAYO,MAAMA,mBAKRC,CAAa,aAAA;AACZ,MAAA,CAACA,SAASC,QAAQC;AACpB,WAAO,CAAE;AAGLC,QAAAA,gBAGD,CAAA,GAECC,aAAaJ,SAASC,QAAQC,UAAUG,WAC1CL,SAASC,QAAQC,UAAUI,QAC3BN,SAASC,QAAQC,UAAUK,QACzBC,WAAWR,SAASC,QAAQC,UAAUG,WACxCL,SAASC,QAAQC,UAAUK,SAC3BP,SAASC,QAAQC,UAAUI,OAEzBG,gBAAgBC,aAAaN,WAAWO,KAAK,CAAC,CAAC,IACjDP,WAAWO,KAAK,CAAC,EAAEC,OACnBC,QACEC,cAAcJ,aAAaF,SAASG,KAAK,CAAC,CAAC,IAC7CH,SAASG,KAAK,CAAC,EAAEC,OACjBC;AAEA,MAAA,CAACJ,iBAAiB,CAACK;AACdX,WAAAA;AAGHY,QAAAA,eAAeL,aAAaN,WAAWO,KAAK,CAAC,CAAC,IAChDP,WAAWO,KAAK,CAAC,EAAEC,OACnBC,QACEG,aAAaN,aAAaF,SAASG,KAAK,CAAC,CAAC,IAC5CH,SAASG,KAAK,CAAC,EAAEC,OACjBC;AAEOI,aAAAA,SAASjB,SAASC,QAAQiB;AAC9BC,QAAAA,wBAAwBF,KAAK,GAIlC;AAAIA,UAAAA,MAAML,SAASH,eAAe;AAChC,mBAAWW,SAASH,MAAMI;AACnBC,cAAAA,mBAAmBF,KAAK,GAI7B;AAAIL,gBAAAA,gBAAgBK,MAAMR,SAASG,cAAc;AAQ/C,kBAPIX,WAAWmB,SAASH,MAAMI,KAAKC,UACjCtB,cAAcuB,KAAK;AAAA,gBACjBC,MAAMP;AAAAA,gBACNT,MAAM,CAAC;AAAA,kBAACC,MAAMK,MAAML;AAAAA,mBAAO,YAAY;AAAA,kBAACA,MAAMQ,MAAMR;AAAAA,gBAAK,CAAA;AAAA,cAAA,CAC1D,GAGCG,iBAAiBC;AACnB;AAGF;AAAA,YAAA;AAGEA,gBAAAA,cAAcI,MAAMR,SAASI,YAAY;AACvCR,uBAASe,SAAS,KACpBpB,cAAcuB,KAAK;AAAA,gBACjBC,MAAMP;AAAAA,gBACNT,MAAM,CAAC;AAAA,kBAACC,MAAMK,MAAML;AAAAA,mBAAO,YAAY;AAAA,kBAACA,MAAMQ,MAAMR;AAAAA,gBAAK,CAAA;AAAA,cAAA,CAC1D;AAEH;AAAA,YAAA;AAGET,0BAAcsB,SAAS,KACzBtB,cAAcuB,KAAK;AAAA,cACjBC,MAAMP;AAAAA,cACNT,MAAM,CAAC;AAAA,gBAACC,MAAMK,MAAML;AAAAA,iBAAO,YAAY;AAAA,gBAACA,MAAMQ,MAAMR;AAAAA,cAAK,CAAA;AAAA,YAAA,CAC1D;AAAA,UAAA;AAIL,YAAIH,kBAAkBK;AACpB;AAGF;AAAA,MAAA;AAGEG,UAAAA,MAAML,SAASE,aAAa;AAC9B,mBAAWM,SAASH,MAAMI;AACnBC,cAAAA,mBAAmBF,KAAK,GAI7B;AAAIJ,gBAAAA,cAAcI,MAAMR,SAASI,YAAY;AACvCR,uBAASe,SAAS,KACpBpB,cAAcuB,KAAK;AAAA,gBACjBC,MAAMP;AAAAA,gBACNT,MAAM,CAAC;AAAA,kBAACC,MAAMK,MAAML;AAAAA,mBAAO,YAAY;AAAA,kBAACA,MAAMQ,MAAMR;AAAAA,gBAAK,CAAA;AAAA,cAAA,CAC1D;AAEH;AAAA,YAAA;AAGFT,0BAAcuB,KAAK;AAAA,cACjBC,MAAMP;AAAAA,cACNT,MAAM,CAAC;AAAA,gBAACC,MAAMK,MAAML;AAAAA,iBAAO,YAAY;AAAA,gBAACA,MAAMQ,MAAMR;AAAAA,cAAK,CAAA;AAAA,YAAA,CAC1D;AAAA,UAAA;AAGH;AAAA,MAAA;AAGF,UAAIT,cAAcsB,SAAS;AACzB,mBAAWL,SAASH,MAAMI;AACnBC,6BAAmBF,KAAK,KAI7BjB,cAAcuB,KAAK;AAAA,YACjBC,MAAMP;AAAAA,YACNT,MAAM,CAAC;AAAA,cAACC,MAAMK,MAAML;AAAAA,eAAO,YAAY;AAAA,cAACA,MAAMQ,MAAMR;AAAAA,YAAK,CAAA;AAAA,UAAA,CAC1D;AAAA,IAAA;AAKAT,SAAAA;AACT,GCvIayB,oBAER5B,CAAa,aAAA;AACZ,MAAA,CAACA,SAASC,QAAQC;AACpB;AAGI2B,QAAAA,SAASC,aAAa9B,SAASC,OAAO,GAEtC8B,qBADiBC,kBAAkBhC,QAAQ,EAAEiC,IAAKhB,WAAUA,MAAMU,IAAI,EAClCO,OAAOL,OAAOM,WAAW,GAE7DC,iBAAiBL,mBAAmBM,GAAG,CAAC;AAE9C,MAAI,CAACD;AACH;AAGF,QAAME,gBAAgBF,eAAeG;AAErC,MAAKD,iBAIDP,mBAAmBS,MAAOvB,CAAUA,UAAAA,MAAMsB,aAAaD,aAAa;AAC/DA,WAAAA;AAIX,GC5BaG,iBACXzC,CACG,aAAA;AACC,MAAA,CAACA,SAASC,QAAQC;AACpB;AAGI2B,QAAAA,SAASC,aAAa9B,SAASC,OAAO,GAEtC8B,qBADiBC,kBAAkBhC,QAAQ,EAAEiC,IAAKhB,WAAUA,MAAMU,IAAI,EAClCO,OAAOL,OAAOM,WAAW,GAE7DC,iBAAiBL,mBAAmBM,GAAG,CAAC;AAE9C,MAAI,CAACD;AACH;AAGF,QAAMM,aAAaN,eAAeO;AAElC,MAAKD,cAIDX,mBAAmBS,MAAOvB,CAAUA,UAAAA,MAAM0B,UAAUD,UAAU;AACzDA,WAAAA;AAIX,GCpBaE,sBACX5C,CACG,aAAA;AACC,MAAA,CAACA,SAASC,QAAQC;AACpB,WAAOF,SAASC,QAAQC;AAG1B,QAAME,aAAayC,uBAAuB7C,QAAQ,GAC5CQ,WAAWsC,qBAAqB9C,QAAQ;AAE1C,MAAA,CAACI,cAAc,CAACI;AAClB,WAAOR,SAASC,QAAQC;AAGpBO,QAAAA,gBAAgBsC,eAAe3C,WAAWO,KAAK,CAAC,CAAC,IACnDP,WAAWO,KAAK,CAAC,EAAEC,OACnB,MACEoC,gBAAgBD,eAAe3C,WAAWO,KAAK,CAAC,CAAC,IACnDP,WAAWO,KAAK,CAAC,EAAEC,OACnB,MACEE,cAAciC,eAAevC,SAASG,KAAK,CAAC,CAAC,IAC/CH,SAASG,KAAK,CAAC,EAAEC,OACjB,MACEqC,cAAcF,eAAevC,SAASG,KAAK,CAAC,CAAC,IAC/CH,SAASG,KAAK,CAAC,EAAEC,OACjB;AAEA,MAAA,CAACH,iBAAiB,CAACK;AACrB,WAAOd,SAASC,QAAQC;AAG1B,MAAIgD,kBAAkB,IAClBC,oBACAC,iBAAiB,IACjBC,kBACAC,eAAe,IACfC;AAIOtC,aAAAA,SAASjB,SAASC,QAAQiB;AACnC,QAAID,EAAML,MAAAA,SAASH,kBACjByC,kBAAkB,IAEd/B,wBAAwBF,KAAK,KAAKuC,iBAAiBvC,KAAK,OAKzDiC,mBAIA/B,wBAAwBF,KAAK,GAIlC;AAAA,UAAIA,MAAML,SAASE,eAAe0C,iBAAiBvC,KAAK;AACtD;AAGSG,iBAAAA,SAASH,MAAMI,UAAU;AAC9BD,YAAAA,MAAMR,SAASqC,gBACb,CAAC3B,mBAAmBF,KAAK,KAAKZ,SAASe,WAAW,IAAG;AACvD8B,6BAAmBE,4BACf;AAAA,YACE5C,MAAM,CACJ;AAAA,cAACC,MAAM2C,0BAA0BE;AAAAA,eACjC,YACA;AAAA,cAAC7C,MAAM2C,0BAA0BG,KAAK9C;AAAAA,YAAAA,CAAK;AAAA,YAE7CW,QAAQgC,0BAA0BG,KAAKlC,KAAKC;AAAAA,UAAAA,IAE9CZ,QAEJyC,eAAe;AACf;AAAA,QAAA;AAIJ,YAAIF,gBAAgB;AAClB,gBAAMO,aACJrC,mBAAmBF,KAAK,KAAKH,MAAMI,SAASI,WAAW;AAGtDH,WAAAA,mBAAmBF,KAAK,KAAKA,MAAMI,KAAKC,SAAS,KAClDkC,gBAEAR,qBAAqB;AAAA,YACnBxC,MAAM,CAAC;AAAA,cAACC,MAAMK,MAAML;AAAAA,eAAO,YAAY;AAAA,cAACA,MAAMQ,MAAMR;AAAAA,YAAAA,CAAK;AAAA,YACzDW,QAAQ;AAAA,aAEVgC,4BAA4B;AAAA,YAACE,UAAUxC,MAAML;AAAAA,YAAM8C,MAAMtC;AAAAA,UAAAA,GACzDgC,iBAAiB;AAGnB;AAAA,QAAA;AAGEhC,YAAAA,MAAMR,SAASoC,eAAe;AAC5B,cAAA,CAAC1B,mBAAmBF,KAAK,GAAG;AACb,6BAAA;AACjB;AAAA,UAAA;AAGF,cAAIhB,WAAWmB,WAAWH,MAAMI,KAAKC,QAAQ;AAC3C2B,6BAAiB,IACjBG,4BACEnC,MAAMI,KAAKC,SAAS,IAChB;AAAA,cAACgC,UAAUxC,MAAML;AAAAA,cAAM8C,MAAMtC;AAAAA,YAAAA,IAC7BmC;AACN;AAAA,UAAA;AAAA,QACF;AAGFA,oCACEjC,mBAAmBF,KAAK,KAAKA,MAAMI,KAAKC,SAAS,IAC7C;AAAA,UAACgC,UAAUxC,MAAML;AAAAA,UAAM8C,MAAMtC;AAAAA,QAAAA,IAC7BmC;AAAAA,MAAAA;AAGR,UAAItC,MAAML,SAASE;AACjB;AAAA,IAAA;AAIJ,QAAM8C,mBAAmB5D,SAASC,QAAQC,UAAUG,WAChD;AAAA,IACEE,QAAQ+C,gBAAgBD,mBAAmBA,mBAAmB7C;AAAAA,IAC9DF,OAAO6C,sBAAsB/C;AAAAA,IAC7BC,UAAU;AAAA,EAAA,IAEZ;AAAA,IACEE,QAAQ4C,sBAAsB/C;AAAAA,IAC9BE,OAAOgD,gBAAgBD,mBAAmBA,mBAAmB7C;AAAAA,EAC/D;AAEJ,MACEqD,qBAAqB;AAAA,IACnB,GAAG7D;AAAAA,IACHC,SAAS;AAAA,MACP,GAAGD,SAASC;AAAAA,MACZC,WAAW0D;AAAAA,IAAAA;AAAAA,EACb,CACD,GACD;AACA,UAAME,iBAAiBC,kBAAkB;AAAA,MACvC,GAAG/D;AAAAA,MACHC,SAAS;AAAA,QACP,GAAGD,SAASC;AAAAA,QACZC,WAAW0D;AAAAA,MAAAA;AAAAA,IACb,CACD;AAED,QAAIE,kBAAkB,CAACN,iBAAiBM,eAAenC,IAAI;AAClD,aAAA;AAAA,EAAA;AAIJiC,SAAAA;AACT;ACvKO,SAASI,mBACdC,YACyB;AACzB,SAAQjE,CAAa,aAAA;AACf,QAAA,CAACA,SAASC,QAAQC;AACb,aAAA;AAGT,UAAMgE,iBAAiBlC,kBAAkBhC,QAAQ,GAC3CmE,YAAYC,aAAapE,QAAQ,GAEjCG,gBAAgBkE,oBAAoBrE,QAAQ,IAC9CD,iBAAiBC,QAAQ,IACzBmE,YACE,CAACA,SAAS,IACV,CAAE;AAMR,QAJIhE,cAAcsB,WAAW,KAK3BtB,cAAcmE,KACXZ,CAAS,SAAA,CAACA,KAAK/B,KAAK4C,SAASb,KAAK/B,KAAK4C,OAAO9C,WAAW,CAC5D;AAEO,aAAA;AAGT,UAAM+C,oBAAoBN,eAAeO,QAASxD,CAAAA,UAChDE,wBAAwBF,MAAMU,IAAI,IAAKV,MAAMU,KAAK+C,YAAY,CAAA,IAAM,CAAA,CACtE;AAEA,WAAOvE,cAAcqC,MAAOkB,CAAAA,UAExBA,KAAK/B,KAAK4C,OAAOE,QAASE,CAAS,SAAA;AACjC,YAAMC,UAAUJ,kBAAkBK,KAC/BD,CAAAA,aAAYA,SAAQhE,SAAS+D,IAChC;AAEA,aAAOC,UAAU,CAACA,QAAQE,KAAK,IAAI,CAAE;AAAA,IACtC,CAAA,KAAK,CAEYC,GAAAA,SAASd,UAAU,CACxC;AAAA,EACH;AACF;AChDO,SAASe,kBAAkBC,WAA4C;AAC5E,SAAQjF,CAAa,aAAA;AACfqE,QAAAA,oBAAoBrE,QAAQ,GAAG;AAC3BG,YAAAA,gBAAgBJ,iBAAiBC,QAAQ;AAG7CG,aAAAA,cAAcsB,SAAS,KACvBtB,cAAcqC,MAAOkB,CAASA,SAAAA,KAAK/B,KAAK4C,OAAOQ,SAASE,SAAS,CAAC;AAAA,IAAA;AAItE,WAAOjF,SAASC,QAAQiF,iBAAiBH,SAASE,SAAS;AAAA,EAC7D;AACF;ACdO,SAASE,iBAAiB5C,UAA2C;AAClEvC,SAAAA,CAAAA,aACiB4B,kBAAkB5B,QAAQ,MAEvBuC;AAE9B;ACNO,SAAS6C,cAAczC,OAAwC;AAC5D3C,SAAAA,CAAAA,aACcyC,eAAezC,QAAQ,MAEpB2C;AAE3B;"}
|
|
@@ -14,100 +14,72 @@ function createGuards({
|
|
|
14
14
|
isTextBlock
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
|
-
const getFocusBlock = ({
|
|
18
|
-
context
|
|
19
|
-
}) => {
|
|
20
|
-
const key = context.selection && isKeySegment(context.selection.focus.path[0]) ? context.selection.focus.path[0]._key : void 0, node = key ? context.value.find((block) => block._key === key) : void 0;
|
|
17
|
+
const getFocusBlock = (snapshot) => {
|
|
18
|
+
const key = snapshot.context.selection && isKeySegment(snapshot.context.selection.focus.path[0]) ? snapshot.context.selection.focus.path[0]._key : void 0, node = key ? snapshot.context.value.find((block) => block._key === key) : void 0;
|
|
21
19
|
return node && key ? {
|
|
22
20
|
node,
|
|
23
21
|
path: [{
|
|
24
22
|
_key: key
|
|
25
23
|
}]
|
|
26
24
|
} : void 0;
|
|
27
|
-
}, getFocusListBlock = ({
|
|
28
|
-
context
|
|
29
|
-
}) => {
|
|
30
|
-
const guards = createGuards(context), focusBlock = getFocusBlock({
|
|
31
|
-
context
|
|
32
|
-
});
|
|
25
|
+
}, getFocusListBlock = (snapshot) => {
|
|
26
|
+
const guards = createGuards(snapshot.context), focusBlock = getFocusBlock(snapshot);
|
|
33
27
|
return focusBlock && guards.isListBlock(focusBlock.node) ? {
|
|
34
28
|
node: focusBlock.node,
|
|
35
29
|
path: focusBlock.path
|
|
36
30
|
} : void 0;
|
|
37
|
-
}, getFocusTextBlock = ({
|
|
38
|
-
|
|
39
|
-
}) => {
|
|
40
|
-
const focusBlock = getFocusBlock({
|
|
41
|
-
context
|
|
42
|
-
});
|
|
31
|
+
}, getFocusTextBlock = (snapshot) => {
|
|
32
|
+
const focusBlock = getFocusBlock(snapshot);
|
|
43
33
|
return focusBlock && isPortableTextTextBlock(focusBlock.node) ? {
|
|
44
34
|
node: focusBlock.node,
|
|
45
35
|
path: focusBlock.path
|
|
46
36
|
} : void 0;
|
|
47
|
-
}, getFocusBlockObject = ({
|
|
48
|
-
|
|
49
|
-
}) => {
|
|
50
|
-
const focusBlock = getFocusBlock({
|
|
51
|
-
context
|
|
52
|
-
});
|
|
37
|
+
}, getFocusBlockObject = (snapshot) => {
|
|
38
|
+
const focusBlock = getFocusBlock(snapshot);
|
|
53
39
|
return focusBlock && !isPortableTextTextBlock(focusBlock.node) ? {
|
|
54
40
|
node: focusBlock.node,
|
|
55
41
|
path: focusBlock.path
|
|
56
42
|
} : void 0;
|
|
57
|
-
}, getFocusChild = ({
|
|
58
|
-
|
|
59
|
-
}) => {
|
|
60
|
-
const focusBlock = getFocusTextBlock({
|
|
61
|
-
context
|
|
62
|
-
});
|
|
43
|
+
}, getFocusChild = (snapshot) => {
|
|
44
|
+
const focusBlock = getFocusTextBlock(snapshot);
|
|
63
45
|
if (!focusBlock)
|
|
64
46
|
return;
|
|
65
|
-
const key = context.selection && isKeySegment(context.selection.focus.path[2]) ? context.selection.focus.path[2]._key : void 0, node = key ? focusBlock.node.children.find((span) => span._key === key) : void 0;
|
|
47
|
+
const key = snapshot.context.selection && isKeySegment(snapshot.context.selection.focus.path[2]) ? snapshot.context.selection.focus.path[2]._key : void 0, node = key ? focusBlock.node.children.find((span) => span._key === key) : void 0;
|
|
66
48
|
return node && key ? {
|
|
67
49
|
node,
|
|
68
50
|
path: [...focusBlock.path, "children", {
|
|
69
51
|
_key: key
|
|
70
52
|
}]
|
|
71
53
|
} : void 0;
|
|
72
|
-
}, getFocusSpan = ({
|
|
73
|
-
|
|
74
|
-
}) => {
|
|
75
|
-
const focusChild = getFocusChild({
|
|
76
|
-
context
|
|
77
|
-
});
|
|
54
|
+
}, getFocusSpan = (snapshot) => {
|
|
55
|
+
const focusChild = getFocusChild(snapshot);
|
|
78
56
|
return focusChild && isPortableTextSpan(focusChild.node) ? {
|
|
79
57
|
node: focusChild.node,
|
|
80
58
|
path: focusChild.path
|
|
81
59
|
} : void 0;
|
|
82
|
-
}, getFirstBlock = ({
|
|
83
|
-
context
|
|
84
|
-
}) => {
|
|
85
|
-
const node = context.value[0];
|
|
60
|
+
}, getFirstBlock = (snapshot) => {
|
|
61
|
+
const node = snapshot.context.value[0];
|
|
86
62
|
return node ? {
|
|
87
63
|
node,
|
|
88
64
|
path: [{
|
|
89
65
|
_key: node._key
|
|
90
66
|
}]
|
|
91
67
|
} : void 0;
|
|
92
|
-
}, getLastBlock = ({
|
|
93
|
-
context
|
|
94
|
-
}) => {
|
|
95
|
-
const node = context.value[context.value.length - 1] ? context.value[context.value.length - 1] : void 0;
|
|
68
|
+
}, getLastBlock = (snapshot) => {
|
|
69
|
+
const node = snapshot.context.value[snapshot.context.value.length - 1] ? snapshot.context.value[snapshot.context.value.length - 1] : void 0;
|
|
96
70
|
return node ? {
|
|
97
71
|
node,
|
|
98
72
|
path: [{
|
|
99
73
|
_key: node._key
|
|
100
74
|
}]
|
|
101
75
|
} : void 0;
|
|
102
|
-
}, getSelectedBlocks = ({
|
|
103
|
-
context
|
|
104
|
-
}) => {
|
|
105
|
-
if (!context.selection)
|
|
76
|
+
}, getSelectedBlocks = (snapshot) => {
|
|
77
|
+
if (!snapshot.context.selection)
|
|
106
78
|
return [];
|
|
107
|
-
const selectedBlocks = [], startKey = context.selection.backward ? isKeySegment(context.selection.focus.path[0]) ? context.selection.focus.path[0]._key : void 0 : isKeySegment(context.selection.anchor.path[0]) ? context.selection.anchor.path[0]._key : void 0, endKey = context.selection.backward ? isKeySegment(context.selection.anchor.path[0]) ? context.selection.anchor.path[0]._key : void 0 : isKeySegment(context.selection.focus.path[0]) ? context.selection.focus.path[0]._key : void 0;
|
|
79
|
+
const selectedBlocks = [], startKey = snapshot.context.selection.backward ? isKeySegment(snapshot.context.selection.focus.path[0]) ? snapshot.context.selection.focus.path[0]._key : void 0 : isKeySegment(snapshot.context.selection.anchor.path[0]) ? snapshot.context.selection.anchor.path[0]._key : void 0, endKey = snapshot.context.selection.backward ? isKeySegment(snapshot.context.selection.anchor.path[0]) ? snapshot.context.selection.anchor.path[0]._key : void 0 : isKeySegment(snapshot.context.selection.focus.path[0]) ? snapshot.context.selection.focus.path[0]._key : void 0;
|
|
108
80
|
if (!startKey || !endKey)
|
|
109
81
|
return selectedBlocks;
|
|
110
|
-
for (const block of context.value) {
|
|
82
|
+
for (const block of snapshot.context.value) {
|
|
111
83
|
if (block._key === startKey) {
|
|
112
84
|
if (selectedBlocks.push({
|
|
113
85
|
node: block,
|
|
@@ -135,41 +107,33 @@ const getFocusBlock = ({
|
|
|
135
107
|
});
|
|
136
108
|
}
|
|
137
109
|
return selectedBlocks;
|
|
138
|
-
}, getSelectionStartBlock = ({
|
|
139
|
-
context
|
|
140
|
-
}) => {
|
|
141
|
-
if (!context.selection)
|
|
110
|
+
}, getSelectionStartBlock = (snapshot) => {
|
|
111
|
+
if (!snapshot.context.selection)
|
|
142
112
|
return;
|
|
143
|
-
const key = context.selection.backward ? isKeySegment(context.selection.focus.path[0]) ? context.selection.focus.path[0]._key : void 0 : isKeySegment(context.selection.anchor.path[0]) ? context.selection.anchor.path[0]._key : void 0, node = key ? context.value.find((block) => block._key === key) : void 0;
|
|
113
|
+
const key = snapshot.context.selection.backward ? isKeySegment(snapshot.context.selection.focus.path[0]) ? snapshot.context.selection.focus.path[0]._key : void 0 : isKeySegment(snapshot.context.selection.anchor.path[0]) ? snapshot.context.selection.anchor.path[0]._key : void 0, node = key ? snapshot.context.value.find((block) => block._key === key) : void 0;
|
|
144
114
|
return node && key ? {
|
|
145
115
|
node,
|
|
146
116
|
path: [{
|
|
147
117
|
_key: key
|
|
148
118
|
}]
|
|
149
119
|
} : void 0;
|
|
150
|
-
}, getSelectionEndBlock = ({
|
|
151
|
-
context
|
|
152
|
-
}) => {
|
|
153
|
-
if (!context.selection)
|
|
120
|
+
}, getSelectionEndBlock = (snapshot) => {
|
|
121
|
+
if (!snapshot.context.selection)
|
|
154
122
|
return;
|
|
155
|
-
const key = context.selection.backward ? isKeySegment(context.selection.anchor.path[0]) ? context.selection.anchor.path[0]._key : void 0 : isKeySegment(context.selection.focus.path[0]) ? context.selection.focus.path[0]._key : void 0, node = key ? context.value.find((block) => block._key === key) : void 0;
|
|
123
|
+
const key = snapshot.context.selection.backward ? isKeySegment(snapshot.context.selection.anchor.path[0]) ? snapshot.context.selection.anchor.path[0]._key : void 0 : isKeySegment(snapshot.context.selection.focus.path[0]) ? snapshot.context.selection.focus.path[0]._key : void 0, node = key ? snapshot.context.value.find((block) => block._key === key) : void 0;
|
|
156
124
|
return node && key ? {
|
|
157
125
|
node,
|
|
158
126
|
path: [{
|
|
159
127
|
_key: key
|
|
160
128
|
}]
|
|
161
129
|
} : void 0;
|
|
162
|
-
}, getPreviousBlock = ({
|
|
163
|
-
context
|
|
164
|
-
}) => {
|
|
130
|
+
}, getPreviousBlock = (snapshot) => {
|
|
165
131
|
let previousBlock;
|
|
166
|
-
const selectionStartBlock = getSelectionStartBlock(
|
|
167
|
-
context
|
|
168
|
-
});
|
|
132
|
+
const selectionStartBlock = getSelectionStartBlock(snapshot);
|
|
169
133
|
if (!selectionStartBlock)
|
|
170
134
|
return;
|
|
171
135
|
let foundSelectionStartBlock = !1;
|
|
172
|
-
for (const block of context.value) {
|
|
136
|
+
for (const block of snapshot.context.value) {
|
|
173
137
|
if (block._key === selectionStartBlock.node._key) {
|
|
174
138
|
foundSelectionStartBlock = !0;
|
|
175
139
|
break;
|
|
@@ -183,17 +147,13 @@ const getFocusBlock = ({
|
|
|
183
147
|
}
|
|
184
148
|
if (foundSelectionStartBlock && previousBlock)
|
|
185
149
|
return previousBlock;
|
|
186
|
-
}, getNextBlock = ({
|
|
187
|
-
context
|
|
188
|
-
}) => {
|
|
150
|
+
}, getNextBlock = (snapshot) => {
|
|
189
151
|
let nextBlock;
|
|
190
|
-
const selectionEndBlock = getSelectionEndBlock(
|
|
191
|
-
context
|
|
192
|
-
});
|
|
152
|
+
const selectionEndBlock = getSelectionEndBlock(snapshot);
|
|
193
153
|
if (!selectionEndBlock)
|
|
194
154
|
return;
|
|
195
155
|
let foundSelectionEndBlock = !1;
|
|
196
|
-
for (const block of context.value) {
|
|
156
|
+
for (const block of snapshot.context.value) {
|
|
197
157
|
if (block._key === selectionEndBlock.node._key) {
|
|
198
158
|
foundSelectionEndBlock = !0;
|
|
199
159
|
continue;
|
|
@@ -210,24 +170,14 @@ const getFocusBlock = ({
|
|
|
210
170
|
}
|
|
211
171
|
if (foundSelectionEndBlock && nextBlock)
|
|
212
172
|
return nextBlock;
|
|
213
|
-
}, getSelectionEndPoint = ({
|
|
214
|
-
context
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
if (context.selection)
|
|
222
|
-
return context.selection.backward ? context.selection.focus : context.selection.anchor;
|
|
223
|
-
}, getNextInlineObject = ({
|
|
224
|
-
context
|
|
225
|
-
}) => {
|
|
226
|
-
const focusTextBlock = getFocusTextBlock({
|
|
227
|
-
context
|
|
228
|
-
}), selectionEndPoint = getSelectionEndPoint({
|
|
229
|
-
context
|
|
230
|
-
}), selectionEndPointChildKey = selectionEndPoint && isKeySegment(selectionEndPoint.path[2]) ? selectionEndPoint.path[2]._key : void 0;
|
|
173
|
+
}, getSelectionEndPoint = (snapshot) => {
|
|
174
|
+
if (snapshot.context.selection)
|
|
175
|
+
return snapshot.context.selection.backward ? snapshot.context.selection.anchor : snapshot.context.selection.focus;
|
|
176
|
+
}, getSelectionStartPoint = (snapshot) => {
|
|
177
|
+
if (snapshot.context.selection)
|
|
178
|
+
return snapshot.context.selection.backward ? snapshot.context.selection.focus : snapshot.context.selection.anchor;
|
|
179
|
+
}, getNextInlineObject = (snapshot) => {
|
|
180
|
+
const focusTextBlock = getFocusTextBlock(snapshot), selectionEndPoint = getSelectionEndPoint(snapshot), selectionEndPointChildKey = selectionEndPoint && isKeySegment(selectionEndPoint.path[2]) ? selectionEndPoint.path[2]._key : void 0;
|
|
231
181
|
if (!focusTextBlock || !selectionEndPointChildKey)
|
|
232
182
|
return;
|
|
233
183
|
let endPointChildFound = !1, inlineObject;
|
|
@@ -236,7 +186,7 @@ const getFocusBlock = ({
|
|
|
236
186
|
endPointChildFound = !0;
|
|
237
187
|
continue;
|
|
238
188
|
}
|
|
239
|
-
if (!isSpan(context, child) && endPointChildFound) {
|
|
189
|
+
if (!isSpan(snapshot.context, child) && endPointChildFound) {
|
|
240
190
|
inlineObject = {
|
|
241
191
|
node: child,
|
|
242
192
|
path: [...focusTextBlock.path, "children", {
|
|
@@ -247,21 +197,15 @@ const getFocusBlock = ({
|
|
|
247
197
|
}
|
|
248
198
|
}
|
|
249
199
|
return inlineObject;
|
|
250
|
-
}, getPreviousInlineObject = ({
|
|
251
|
-
|
|
252
|
-
}) => {
|
|
253
|
-
const focusTextBlock = getFocusTextBlock({
|
|
254
|
-
context
|
|
255
|
-
}), selectionStartPoint = getSelectionStartPoint({
|
|
256
|
-
context
|
|
257
|
-
}), selectionStartPointChildKey = selectionStartPoint && isKeySegment(selectionStartPoint.path[2]) ? selectionStartPoint.path[2]._key : void 0;
|
|
200
|
+
}, getPreviousInlineObject = (snapshot) => {
|
|
201
|
+
const focusTextBlock = getFocusTextBlock(snapshot), selectionStartPoint = getSelectionStartPoint(snapshot), selectionStartPointChildKey = selectionStartPoint && isKeySegment(selectionStartPoint.path[2]) ? selectionStartPoint.path[2]._key : void 0;
|
|
258
202
|
if (!focusTextBlock || !selectionStartPointChildKey)
|
|
259
203
|
return;
|
|
260
204
|
let inlineObject;
|
|
261
205
|
for (const child of focusTextBlock.node.children) {
|
|
262
206
|
if (child._key === selectionStartPointChildKey)
|
|
263
207
|
break;
|
|
264
|
-
isSpan(context, child) || (inlineObject = {
|
|
208
|
+
isSpan(snapshot.context, child) || (inlineObject = {
|
|
265
209
|
node: child,
|
|
266
210
|
path: [...focusTextBlock.path, "children", {
|
|
267
211
|
_key: child._key
|
|
@@ -269,43 +213,22 @@ const getFocusBlock = ({
|
|
|
269
213
|
});
|
|
270
214
|
}
|
|
271
215
|
return inlineObject;
|
|
272
|
-
}, getSelectedSlice = ({
|
|
273
|
-
context
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
}), getSelectionText = ({
|
|
278
|
-
context
|
|
279
|
-
}) => getSelectedSlice({
|
|
280
|
-
context
|
|
281
|
-
}).reduce((text, block) => isPortableTextTextBlock(block) ? text + block.children.reduce((text2, child) => isPortableTextSpan(child) ? text2 + child.text : text2, "") : text, ""), isSelectionCollapsed = ({
|
|
282
|
-
context
|
|
283
|
-
}) => context.selection ? JSON.stringify(context.selection.anchor.path) === JSON.stringify(context.selection.focus.path) && context.selection?.anchor.offset === context.selection?.focus.offset : !1, isSelectionExpanded = ({
|
|
284
|
-
context
|
|
285
|
-
}) => !isSelectionCollapsed({
|
|
286
|
-
context
|
|
287
|
-
}), getCaretWordSelection = ({
|
|
288
|
-
context
|
|
289
|
-
}) => {
|
|
290
|
-
if (!context.selection || !isSelectionCollapsed({
|
|
291
|
-
context
|
|
292
|
-
}))
|
|
216
|
+
}, getSelectedSlice = (snapshot) => sliceBlocks({
|
|
217
|
+
blocks: snapshot.context.value,
|
|
218
|
+
selection: snapshot.context.selection
|
|
219
|
+
}), getSelectionText = (snapshot) => getSelectedSlice(snapshot).reduce((text, block) => isPortableTextTextBlock(block) ? text + block.children.reduce((text2, child) => isPortableTextSpan(child) ? text2 + child.text : text2, "") : text, ""), isSelectionCollapsed = (snapshot) => snapshot.context.selection ? JSON.stringify(snapshot.context.selection.anchor.path) === JSON.stringify(snapshot.context.selection.focus.path) && snapshot.context.selection?.anchor.offset === snapshot.context.selection?.focus.offset : !1, isSelectionExpanded = (snapshot) => !isSelectionCollapsed(snapshot), getCaretWordSelection = (snapshot) => {
|
|
220
|
+
if (!snapshot.context.selection || !isSelectionCollapsed(snapshot))
|
|
293
221
|
return null;
|
|
294
|
-
const focusTextBlock = getFocusTextBlock({
|
|
295
|
-
context
|
|
296
|
-
}), selectionStartPoint = getSelectionStartPoint({
|
|
297
|
-
context
|
|
298
|
-
}), selectionStartOffset = selectionStartPoint ? spanSelectionPointToBlockOffset({
|
|
299
|
-
value: context.value,
|
|
222
|
+
const focusTextBlock = getFocusTextBlock(snapshot), selectionStartPoint = getSelectionStartPoint(snapshot), selectionStartOffset = selectionStartPoint ? spanSelectionPointToBlockOffset({
|
|
223
|
+
value: snapshot.context.value,
|
|
300
224
|
selectionPoint: selectionStartPoint
|
|
301
225
|
}) : void 0;
|
|
302
226
|
if (!focusTextBlock || !selectionStartPoint || !selectionStartOffset)
|
|
303
227
|
return null;
|
|
304
|
-
const previousInlineObject = getPreviousInlineObject({
|
|
305
|
-
|
|
306
|
-
}), blockStartPoint = getBlockStartPoint(focusTextBlock), textDirectlyBefore = getSelectionText({
|
|
228
|
+
const previousInlineObject = getPreviousInlineObject(snapshot), blockStartPoint = getBlockStartPoint(focusTextBlock), textDirectlyBefore = getSelectionText({
|
|
229
|
+
...snapshot,
|
|
307
230
|
context: {
|
|
308
|
-
...context,
|
|
231
|
+
...snapshot.context,
|
|
309
232
|
selection: {
|
|
310
233
|
anchor: previousInlineObject ? {
|
|
311
234
|
path: previousInlineObject.path,
|
|
@@ -314,11 +237,10 @@ const getFocusBlock = ({
|
|
|
314
237
|
focus: selectionStartPoint
|
|
315
238
|
}
|
|
316
239
|
}
|
|
317
|
-
}).split(/\s+/).at(-1), nextInlineObject = getNextInlineObject({
|
|
318
|
-
|
|
319
|
-
}), blockEndPoint = getBlockEndPoint(focusTextBlock), textDirectlyAfter = getSelectionText({
|
|
240
|
+
}).split(/\s+/).at(-1), nextInlineObject = getNextInlineObject(snapshot), blockEndPoint = getBlockEndPoint(focusTextBlock), textDirectlyAfter = getSelectionText({
|
|
241
|
+
...snapshot,
|
|
320
242
|
context: {
|
|
321
|
-
...context,
|
|
243
|
+
...snapshot.context,
|
|
322
244
|
selection: {
|
|
323
245
|
anchor: selectionStartPoint,
|
|
324
246
|
focus: nextInlineObject ? {
|
|
@@ -337,11 +259,11 @@ const getFocusBlock = ({
|
|
|
337
259
|
...selectionStartOffset,
|
|
338
260
|
offset: selectionStartOffset.offset + textDirectlyAfter.length
|
|
339
261
|
} : selectionStartOffset, caretWordStartSelectionPoint = blockOffsetToSpanSelectionPoint({
|
|
340
|
-
value: context.value,
|
|
262
|
+
value: snapshot.context.value,
|
|
341
263
|
blockOffset: caretWordStartOffset,
|
|
342
264
|
direction: "backward"
|
|
343
265
|
}), caretWordEndSelectionPoint = blockOffsetToSpanSelectionPoint({
|
|
344
|
-
value: context.value,
|
|
266
|
+
value: snapshot.context.value,
|
|
345
267
|
blockOffset: caretWordEndOffset,
|
|
346
268
|
direction: "forward"
|
|
347
269
|
});
|
|
@@ -352,34 +274,27 @@ const getFocusBlock = ({
|
|
|
352
274
|
focus: caretWordEndSelectionPoint
|
|
353
275
|
};
|
|
354
276
|
return isSelectionExpanded({
|
|
277
|
+
...snapshot,
|
|
355
278
|
context: {
|
|
356
|
-
...context,
|
|
279
|
+
...snapshot.context,
|
|
357
280
|
selection: caretWordSelection
|
|
358
281
|
}
|
|
359
282
|
}) ? caretWordSelection : null;
|
|
360
283
|
};
|
|
361
284
|
function isAtTheEndOfBlock(block) {
|
|
362
|
-
return ({
|
|
363
|
-
context
|
|
364
|
-
}) => {
|
|
365
|
-
if (!context.selection || !isSelectionCollapsed({
|
|
366
|
-
context
|
|
367
|
-
}))
|
|
285
|
+
return (snapshot) => {
|
|
286
|
+
if (!snapshot.context.selection || !isSelectionCollapsed(snapshot))
|
|
368
287
|
return !1;
|
|
369
288
|
const blockEndPoint = getBlockEndPoint(block);
|
|
370
|
-
return isEqualSelectionPoints(context.selection.focus, blockEndPoint);
|
|
289
|
+
return isEqualSelectionPoints(snapshot.context.selection.focus, blockEndPoint);
|
|
371
290
|
};
|
|
372
291
|
}
|
|
373
292
|
function isAtTheStartOfBlock(block) {
|
|
374
|
-
return ({
|
|
375
|
-
context
|
|
376
|
-
}) => {
|
|
377
|
-
if (!context.selection || !isSelectionCollapsed({
|
|
378
|
-
context
|
|
379
|
-
}))
|
|
293
|
+
return (snapshot) => {
|
|
294
|
+
if (!snapshot.context.selection || !isSelectionCollapsed(snapshot))
|
|
380
295
|
return !1;
|
|
381
296
|
const blockStartPoint = getBlockStartPoint(block);
|
|
382
|
-
return isEqualSelectionPoints(context.selection.focus, blockStartPoint);
|
|
297
|
+
return isEqualSelectionPoints(snapshot.context.selection.focus, blockStartPoint);
|
|
383
298
|
};
|
|
384
299
|
}
|
|
385
300
|
export {
|