@portabletext/editor 1.48.7 → 1.48.8
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 +20 -8
- package/lib/_chunks-cjs/behavior.core.cjs.map +1 -1
- package/lib/_chunks-cjs/behavior.markdown.cjs +5 -5
- package/lib/_chunks-cjs/behavior.markdown.cjs.map +1 -1
- package/lib/_chunks-cjs/editor-provider.cjs +121 -90
- package/lib/_chunks-cjs/editor-provider.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-focus-inline-object.cjs +2 -2
- package/lib/_chunks-cjs/selector.get-focus-inline-object.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.get-text-before.cjs +7 -4
- package/lib/_chunks-cjs/selector.get-text-before.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs +63 -47
- package/lib/_chunks-cjs/selector.is-overlapping-selection.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs +29 -23
- package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs.map +1 -1
- package/lib/_chunks-cjs/util.merge-text-blocks.cjs +3 -3
- package/lib/_chunks-cjs/util.merge-text-blocks.cjs.map +1 -1
- package/lib/_chunks-cjs/util.selection-point-to-block-offset.cjs +15 -15
- package/lib/_chunks-cjs/util.selection-point-to-block-offset.cjs.map +1 -1
- package/lib/_chunks-cjs/util.slice-blocks.cjs +258 -38
- package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
- package/lib/_chunks-es/behavior.core.js +21 -10
- package/lib/_chunks-es/behavior.core.js.map +1 -1
- package/lib/_chunks-es/behavior.markdown.js +5 -6
- package/lib/_chunks-es/behavior.markdown.js.map +1 -1
- package/lib/_chunks-es/editor-provider.js +75 -46
- package/lib/_chunks-es/editor-provider.js.map +1 -1
- package/lib/_chunks-es/selector.get-focus-inline-object.js +1 -2
- package/lib/_chunks-es/selector.get-focus-inline-object.js.map +1 -1
- package/lib/_chunks-es/selector.get-text-before.js +7 -4
- package/lib/_chunks-es/selector.get-text-before.js.map +1 -1
- package/lib/_chunks-es/selector.is-overlapping-selection.js +61 -46
- package/lib/_chunks-es/selector.is-overlapping-selection.js.map +1 -1
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +30 -26
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js.map +1 -1
- package/lib/_chunks-es/util.merge-text-blocks.js +1 -1
- package/lib/_chunks-es/util.selection-point-to-block-offset.js +15 -16
- package/lib/_chunks-es/util.selection-point-to-block-offset.js.map +1 -1
- package/lib/_chunks-es/util.slice-blocks.js +258 -38
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/behaviors/index.d.cts +2552 -251
- package/lib/behaviors/index.d.ts +2552 -251
- package/lib/index.cjs +45 -21
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +2350 -51
- package/lib/index.d.ts +2350 -51
- package/lib/index.js +44 -21
- package/lib/index.js.map +1 -1
- package/lib/plugins/index.cjs +16 -7
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +2324 -24
- package/lib/plugins/index.d.ts +2324 -24
- package/lib/plugins/index.js +16 -7
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.cjs +5 -5
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.d.cts +2321 -28
- package/lib/selectors/index.d.ts +2321 -28
- package/lib/selectors/index.js +5 -6
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.cjs +30 -24
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +2350 -44
- package/lib/utils/index.d.ts +2350 -44
- package/lib/utils/index.js +30 -24
- package/lib/utils/index.js.map +1 -1
- package/package.json +1 -2
- package/src/behavior-actions/behavior.action.block.unset.ts +1 -1
- package/src/behavior-actions/behavior.action.decorator.add.ts +20 -5
- package/src/behaviors/behavior.abstract.decorator.ts +1 -1
- package/src/behaviors/behavior.abstract.delete.ts +1 -1
- package/src/behaviors/behavior.abstract.insert.ts +2 -2
- package/src/behaviors/behavior.abstract.select.ts +16 -4
- package/src/behaviors/behavior.abstract.split.ts +9 -6
- package/src/behaviors/behavior.core.block-objects.ts +5 -5
- package/src/behaviors/behavior.core.insert-break.ts +16 -4
- package/src/behaviors/behavior.core.lists.ts +4 -6
- package/src/behaviors/behavior.decorator-pair.ts +13 -4
- package/src/behaviors/behavior.default.ts +1 -1
- package/src/behaviors/behavior.markdown.ts +5 -5
- package/src/converters/converter.portable-text.ts +1 -1
- package/src/converters/converter.text-html.ts +1 -1
- package/src/converters/converter.text-plain.ts +4 -4
- package/src/editor/plugins/__tests__/withEditableAPIGetFragment.test.tsx +10 -2
- package/src/editor/plugins/createWithSchemaTypes.ts +12 -19
- package/src/internal-utils/__tests__/dmpToOperations.test.ts +13 -12
- package/src/internal-utils/drag-selection.ts +16 -4
- package/src/internal-utils/event-position.ts +20 -8
- package/src/internal-utils/parse-blocks.ts +17 -5
- package/src/internal-utils/validateValue.ts +6 -6
- package/src/plugins/plugin.decorator-shortcut.ts +2 -2
- package/src/selectors/selector.get-active-annotations.ts +5 -2
- package/src/selectors/selector.get-active-list-item.ts +4 -3
- package/src/selectors/selector.get-active-style.ts +4 -3
- package/src/selectors/selector.get-anchor-text-block.ts +3 -6
- package/src/selectors/selector.get-block-offsets.ts +2 -2
- package/src/selectors/selector.get-caret-word-selection.ts +11 -5
- package/src/selectors/selector.get-selected-slice.ts +1 -1
- package/src/selectors/selector.get-selected-spans.ts +11 -15
- package/src/selectors/selector.get-selected-text-blocks.ts +3 -3
- package/src/selectors/selector.get-selection-text.ts +3 -3
- package/src/selectors/selector.get-text-before.ts +5 -2
- package/src/selectors/selector.get-trimmed-selection.ts +20 -14
- package/src/selectors/selector.is-active-annotation.ts +4 -2
- package/src/selectors/selector.is-active-decorator.test.ts +3 -3
- package/src/selectors/selector.is-at-the-end-of-block.ts +4 -1
- package/src/selectors/selector.is-at-the-start-of-block.ts +4 -1
- package/src/selectors/selector.is-point-after-selection.ts +7 -6
- package/src/selectors/selector.is-point-before-selection.ts +7 -6
- package/src/selectors/selector.is-selecting-entire-blocks.ts +8 -2
- package/src/selectors/selectors.ts +25 -28
- package/src/utils/util.block-offset-to-block-selection-point.ts +4 -4
- package/src/utils/util.block-offset-to-selection-point.ts +5 -5
- package/src/utils/util.block-offset.test.ts +219 -156
- package/src/utils/util.block-offset.ts +14 -17
- package/src/utils/util.block-offsets-to-selection.ts +5 -5
- package/src/utils/util.child-selection-point-to-block-offset.ts +7 -10
- package/src/utils/util.get-block-end-point.ts +15 -15
- package/src/utils/util.get-block-start-point.ts +13 -12
- package/src/utils/util.is-empty-text-block.ts +9 -8
- package/src/utils/util.selection-point-to-block-offset.ts +4 -4
- package/src/utils/util.slice-blocks.test.ts +178 -121
- package/src/utils/util.slice-blocks.ts +25 -24
- package/src/utils/util.split-text-block.ts +18 -12
- package/lib/_chunks-cjs/parse-blocks.cjs +0 -205
- package/lib/_chunks-cjs/parse-blocks.cjs.map +0 -1
- package/lib/_chunks-es/parse-blocks.js +0 -206
- package/lib/_chunks-es/parse-blocks.js.map +0 -1
- package/src/behavior-actions/behavior.guards.ts +0 -24
|
@@ -1,18 +1,230 @@
|
|
|
1
|
-
|
|
1
|
+
function isTypedObject(object) {
|
|
2
|
+
return isRecord(object) && typeof object._type == "string";
|
|
3
|
+
}
|
|
4
|
+
function isRecord(value) {
|
|
5
|
+
return !!value && (typeof value == "object" || typeof value == "function");
|
|
6
|
+
}
|
|
7
|
+
function parseBlocks({
|
|
8
|
+
context,
|
|
9
|
+
blocks,
|
|
10
|
+
options
|
|
11
|
+
}) {
|
|
12
|
+
return Array.isArray(blocks) ? blocks.flatMap((block) => {
|
|
13
|
+
const parsedBlock = parseBlock({
|
|
14
|
+
context,
|
|
15
|
+
block,
|
|
16
|
+
options
|
|
17
|
+
});
|
|
18
|
+
return parsedBlock ? [parsedBlock] : [];
|
|
19
|
+
}) : [];
|
|
20
|
+
}
|
|
21
|
+
function parseBlock({
|
|
22
|
+
context,
|
|
23
|
+
block,
|
|
24
|
+
options
|
|
25
|
+
}) {
|
|
26
|
+
return parseTextBlock({
|
|
27
|
+
block,
|
|
28
|
+
context,
|
|
29
|
+
options
|
|
30
|
+
}) ?? parseBlockObject({
|
|
31
|
+
blockObject: block,
|
|
32
|
+
context,
|
|
33
|
+
options
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function parseBlockObject({
|
|
37
|
+
blockObject,
|
|
38
|
+
context,
|
|
39
|
+
options
|
|
40
|
+
}) {
|
|
41
|
+
if (!isTypedObject(blockObject))
|
|
42
|
+
return;
|
|
43
|
+
const schemaType = context.schema.blockObjects.find(({
|
|
44
|
+
name
|
|
45
|
+
}) => name === blockObject._type);
|
|
46
|
+
if (schemaType)
|
|
47
|
+
return parseObject({
|
|
48
|
+
object: blockObject,
|
|
49
|
+
context: {
|
|
50
|
+
keyGenerator: context.keyGenerator,
|
|
51
|
+
schemaType
|
|
52
|
+
},
|
|
53
|
+
options
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function isListBlock(context, block) {
|
|
57
|
+
return isTextBlock(context, block) && block.level !== void 0 && block.listItem !== void 0;
|
|
58
|
+
}
|
|
59
|
+
function isTextBlock(context, block) {
|
|
60
|
+
return parseTextBlock({
|
|
61
|
+
block,
|
|
62
|
+
context: {
|
|
63
|
+
schema: context.schema,
|
|
64
|
+
keyGenerator: () => ""
|
|
65
|
+
},
|
|
66
|
+
options: {
|
|
67
|
+
refreshKeys: !1
|
|
68
|
+
}
|
|
69
|
+
}) !== void 0;
|
|
70
|
+
}
|
|
71
|
+
function parseTextBlock({
|
|
72
|
+
block,
|
|
73
|
+
context,
|
|
74
|
+
options
|
|
75
|
+
}) {
|
|
76
|
+
if (!isTypedObject(block) || block._type !== context.schema.block.name)
|
|
77
|
+
return;
|
|
78
|
+
const _key = options.refreshKeys ? context.keyGenerator() : typeof block._key == "string" ? block._key : context.keyGenerator(), unparsedMarkDefs = Array.isArray(block.markDefs) ? block.markDefs : [], markDefKeyMap = /* @__PURE__ */ new Map(), markDefs = unparsedMarkDefs.flatMap((markDef) => {
|
|
79
|
+
if (!isTypedObject(markDef))
|
|
80
|
+
return [];
|
|
81
|
+
const schemaType = context.schema.annotations.find(({
|
|
82
|
+
name
|
|
83
|
+
}) => name === markDef._type);
|
|
84
|
+
if (!schemaType)
|
|
85
|
+
return [];
|
|
86
|
+
if (typeof markDef._key != "string")
|
|
87
|
+
return [];
|
|
88
|
+
const parsedAnnotation = parseObject({
|
|
89
|
+
object: markDef,
|
|
90
|
+
context: {
|
|
91
|
+
schemaType,
|
|
92
|
+
keyGenerator: context.keyGenerator
|
|
93
|
+
},
|
|
94
|
+
options
|
|
95
|
+
});
|
|
96
|
+
return parsedAnnotation ? (markDefKeyMap.set(markDef._key, parsedAnnotation._key), [parsedAnnotation]) : [];
|
|
97
|
+
}), children = (Array.isArray(block.children) ? block.children : []).map((child) => parseSpan({
|
|
98
|
+
span: child,
|
|
99
|
+
context,
|
|
100
|
+
markDefKeyMap,
|
|
101
|
+
options
|
|
102
|
+
}) ?? parseInlineObject({
|
|
103
|
+
inlineObject: child,
|
|
104
|
+
context,
|
|
105
|
+
options
|
|
106
|
+
})).filter((child) => child !== void 0), parsedBlock = {
|
|
107
|
+
_type: context.schema.block.name,
|
|
108
|
+
_key,
|
|
109
|
+
children: children.length > 0 ? children : [{
|
|
110
|
+
_key: context.keyGenerator(),
|
|
111
|
+
_type: context.schema.span.name,
|
|
112
|
+
text: "",
|
|
113
|
+
marks: []
|
|
114
|
+
}],
|
|
115
|
+
markDefs
|
|
116
|
+
};
|
|
117
|
+
if (typeof block.style == "string" && context.schema.styles.find((style) => style.name === block.style))
|
|
118
|
+
parsedBlock.style = block.style;
|
|
119
|
+
else {
|
|
120
|
+
const defaultStyle = context.schema.styles.at(0)?.name;
|
|
121
|
+
defaultStyle !== void 0 ? parsedBlock.style = defaultStyle : console.error("Expected default style");
|
|
122
|
+
}
|
|
123
|
+
return typeof block.listItem == "string" && context.schema.lists.find((list) => list.name === block.listItem) && (parsedBlock.listItem = block.listItem), typeof block.level == "number" && (parsedBlock.level = block.level), parsedBlock;
|
|
124
|
+
}
|
|
125
|
+
function isSpan$1(context, child) {
|
|
126
|
+
return parseSpan({
|
|
127
|
+
span: child,
|
|
128
|
+
markDefKeyMap: /* @__PURE__ */ new Map(),
|
|
129
|
+
context: {
|
|
130
|
+
schema: context.schema,
|
|
131
|
+
keyGenerator: () => ""
|
|
132
|
+
},
|
|
133
|
+
options: {
|
|
134
|
+
refreshKeys: !1
|
|
135
|
+
}
|
|
136
|
+
}) !== void 0;
|
|
137
|
+
}
|
|
138
|
+
function parseSpan({
|
|
139
|
+
span,
|
|
140
|
+
context,
|
|
141
|
+
markDefKeyMap,
|
|
142
|
+
options
|
|
143
|
+
}) {
|
|
144
|
+
if (!isTypedObject(span) || span._type !== context.schema.span.name || span._type !== "span")
|
|
145
|
+
return;
|
|
146
|
+
const marks = (Array.isArray(span.marks) ? span.marks : []).flatMap((mark) => {
|
|
147
|
+
if (typeof mark != "string")
|
|
148
|
+
return [];
|
|
149
|
+
const markDefKey = markDefKeyMap.get(mark);
|
|
150
|
+
return markDefKey !== void 0 ? [markDefKey] : context.schema.decorators.some((decorator) => decorator.name === mark) ? [mark] : [];
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
_type: "span",
|
|
154
|
+
_key: options.refreshKeys ? context.keyGenerator() : typeof span._key == "string" ? span._key : context.keyGenerator(),
|
|
155
|
+
text: typeof span.text == "string" ? span.text : "",
|
|
156
|
+
marks
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
function parseInlineObject({
|
|
160
|
+
inlineObject,
|
|
161
|
+
context,
|
|
162
|
+
options
|
|
163
|
+
}) {
|
|
164
|
+
if (!isTypedObject(inlineObject))
|
|
165
|
+
return;
|
|
166
|
+
const schemaType = context.schema.inlineObjects.find(({
|
|
167
|
+
name
|
|
168
|
+
}) => name === inlineObject._type);
|
|
169
|
+
if (schemaType)
|
|
170
|
+
return parseObject({
|
|
171
|
+
object: inlineObject,
|
|
172
|
+
context: {
|
|
173
|
+
keyGenerator: context.keyGenerator,
|
|
174
|
+
schemaType
|
|
175
|
+
},
|
|
176
|
+
options
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function parseAnnotation({
|
|
180
|
+
annotation,
|
|
181
|
+
context,
|
|
182
|
+
options
|
|
183
|
+
}) {
|
|
184
|
+
if (!isTypedObject(annotation))
|
|
185
|
+
return;
|
|
186
|
+
const schemaType = context.schema.annotations.find(({
|
|
187
|
+
name
|
|
188
|
+
}) => name === annotation._type);
|
|
189
|
+
if (schemaType)
|
|
190
|
+
return parseObject({
|
|
191
|
+
object: annotation,
|
|
192
|
+
context: {
|
|
193
|
+
keyGenerator: context.keyGenerator,
|
|
194
|
+
schemaType
|
|
195
|
+
},
|
|
196
|
+
options
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
function parseObject({
|
|
200
|
+
object,
|
|
201
|
+
context,
|
|
202
|
+
options
|
|
203
|
+
}) {
|
|
204
|
+
const values = context.schemaType.fields.reduce((fieldValues, field) => {
|
|
205
|
+
const fieldValue = object[field.name];
|
|
206
|
+
return fieldValue !== void 0 && (fieldValues[field.name] = fieldValue), fieldValues;
|
|
207
|
+
}, {});
|
|
208
|
+
return {
|
|
209
|
+
_type: context.schemaType.name,
|
|
210
|
+
_key: options.refreshKeys ? context.keyGenerator() : typeof object._key == "string" ? object._key : context.keyGenerator(),
|
|
211
|
+
...values
|
|
212
|
+
};
|
|
213
|
+
}
|
|
2
214
|
function isKeyedSegment(segment) {
|
|
3
215
|
return typeof segment == "object" && segment !== null && "_key" in segment;
|
|
4
216
|
}
|
|
5
217
|
function blockOffsetToSpanSelectionPoint({
|
|
6
|
-
|
|
218
|
+
context,
|
|
7
219
|
blockOffset,
|
|
8
220
|
direction
|
|
9
221
|
}) {
|
|
10
222
|
let offsetLeft = blockOffset.offset, selectionPoint, skippedInlineObject = !1;
|
|
11
|
-
for (const block of value)
|
|
12
|
-
if (block._key === blockOffset.path[0]._key &&
|
|
223
|
+
for (const block of context.value)
|
|
224
|
+
if (block._key === blockOffset.path[0]._key && isTextBlock(context, block))
|
|
13
225
|
for (const child of block.children) {
|
|
14
226
|
if (direction === "forward") {
|
|
15
|
-
if (!
|
|
227
|
+
if (!isSpan$1(context, child))
|
|
16
228
|
continue;
|
|
17
229
|
if (offsetLeft <= child.text.length) {
|
|
18
230
|
selectionPoint = {
|
|
@@ -26,7 +238,7 @@ function blockOffsetToSpanSelectionPoint({
|
|
|
26
238
|
offsetLeft -= child.text.length;
|
|
27
239
|
continue;
|
|
28
240
|
}
|
|
29
|
-
if (!
|
|
241
|
+
if (!isSpan$1(context, child)) {
|
|
30
242
|
skippedInlineObject = !0;
|
|
31
243
|
continue;
|
|
32
244
|
}
|
|
@@ -54,16 +266,16 @@ function blockOffsetToSpanSelectionPoint({
|
|
|
54
266
|
return selectionPoint;
|
|
55
267
|
}
|
|
56
268
|
function spanSelectionPointToBlockOffset({
|
|
57
|
-
|
|
269
|
+
context,
|
|
58
270
|
selectionPoint
|
|
59
271
|
}) {
|
|
60
272
|
let offset = 0;
|
|
61
273
|
const blockKey = isKeyedSegment(selectionPoint.path[0]) ? selectionPoint.path[0]._key : void 0, spanKey = isKeyedSegment(selectionPoint.path[2]) ? selectionPoint.path[2]._key : void 0;
|
|
62
274
|
if (!(!blockKey || !spanKey)) {
|
|
63
|
-
for (const block of value)
|
|
64
|
-
if (block._key === blockKey &&
|
|
275
|
+
for (const block of context.value)
|
|
276
|
+
if (block._key === blockKey && isTextBlock(context, block)) {
|
|
65
277
|
for (const child of block.children)
|
|
66
|
-
if (
|
|
278
|
+
if (isSpan$1(context, child)) {
|
|
67
279
|
if (child._key === spanKey)
|
|
68
280
|
return {
|
|
69
281
|
path: [{
|
|
@@ -77,45 +289,45 @@ function spanSelectionPointToBlockOffset({
|
|
|
77
289
|
}
|
|
78
290
|
}
|
|
79
291
|
function getBlockEndPoint({
|
|
80
|
-
|
|
81
|
-
|
|
292
|
+
context,
|
|
293
|
+
block
|
|
82
294
|
}) {
|
|
83
|
-
if (
|
|
84
|
-
const lastChild = node.children[node.children.length - 1];
|
|
295
|
+
if (isTextBlock(context, block.node)) {
|
|
296
|
+
const lastChild = block.node.children[block.node.children.length - 1];
|
|
85
297
|
if (lastChild)
|
|
86
298
|
return {
|
|
87
|
-
path: [...path, "children", {
|
|
299
|
+
path: [...block.path, "children", {
|
|
88
300
|
_key: lastChild._key
|
|
89
301
|
}],
|
|
90
|
-
offset:
|
|
302
|
+
offset: isSpan$1(context, lastChild) ? lastChild.text.length : 0
|
|
91
303
|
};
|
|
92
304
|
}
|
|
93
305
|
return {
|
|
94
|
-
path,
|
|
306
|
+
path: block.path,
|
|
95
307
|
offset: 0
|
|
96
308
|
};
|
|
97
309
|
}
|
|
98
310
|
function getBlockStartPoint({
|
|
99
|
-
|
|
100
|
-
|
|
311
|
+
context,
|
|
312
|
+
block
|
|
101
313
|
}) {
|
|
102
|
-
return
|
|
103
|
-
path: [...path, "children", {
|
|
104
|
-
_key: node.children[0]._key
|
|
314
|
+
return isTextBlock(context, block.node) ? {
|
|
315
|
+
path: [...block.path, "children", {
|
|
316
|
+
_key: block.node.children[0]._key
|
|
105
317
|
}],
|
|
106
318
|
offset: 0
|
|
107
319
|
} : {
|
|
108
|
-
path,
|
|
320
|
+
path: block.path,
|
|
109
321
|
offset: 0
|
|
110
322
|
};
|
|
111
323
|
}
|
|
112
324
|
function getTextBlockText(block) {
|
|
113
325
|
return block.children.map((child) => child.text ?? "").join("");
|
|
114
326
|
}
|
|
115
|
-
function isEmptyTextBlock(block) {
|
|
116
|
-
if (!
|
|
327
|
+
function isEmptyTextBlock(context, block) {
|
|
328
|
+
if (!isTextBlock(context, block))
|
|
117
329
|
return !1;
|
|
118
|
-
const onlyText = block.children.every(
|
|
330
|
+
const onlyText = block.children.every((child) => isSpan$1(context, child)), blockText = getTextBlockText(block);
|
|
119
331
|
return onlyText && blockText === "";
|
|
120
332
|
}
|
|
121
333
|
function isEqualSelectionPoints(a, b) {
|
|
@@ -136,32 +348,32 @@ function reverseSelection(selection) {
|
|
|
136
348
|
});
|
|
137
349
|
}
|
|
138
350
|
function sliceBlocks({
|
|
139
|
-
|
|
140
|
-
|
|
351
|
+
context,
|
|
352
|
+
blocks
|
|
141
353
|
}) {
|
|
142
354
|
const slice = [];
|
|
143
|
-
if (!selection)
|
|
355
|
+
if (!context.selection)
|
|
144
356
|
return slice;
|
|
145
357
|
let startBlock;
|
|
146
358
|
const middleBlocks = [];
|
|
147
359
|
let endBlock;
|
|
148
|
-
const startPoint = selection.backward ? selection.focus : selection.anchor, endPoint = selection.backward ? selection.anchor : selection.focus, startBlockKey =
|
|
360
|
+
const startPoint = context.selection.backward ? context.selection.focus : context.selection.anchor, endPoint = context.selection.backward ? context.selection.anchor : context.selection.focus, startBlockKey = isKeyedSegment(startPoint.path[0]) ? startPoint.path[0]._key : void 0, endBlockKey = isKeyedSegment(endPoint.path[0]) ? endPoint.path[0]._key : void 0, startChildKey = isKeyedSegment(startPoint.path[2]) ? startPoint.path[2]._key : void 0, endChildKey = isKeyedSegment(endPoint.path[2]) ? endPoint.path[2]._key : void 0;
|
|
149
361
|
if (!startBlockKey || !endBlockKey)
|
|
150
362
|
return slice;
|
|
151
363
|
for (const block of blocks) {
|
|
152
|
-
if (!
|
|
364
|
+
if (!isTextBlock(context, block) && block._key === startBlockKey && block._key === endBlockKey) {
|
|
153
365
|
startBlock = block;
|
|
154
366
|
break;
|
|
155
367
|
}
|
|
156
368
|
if (block._key === startBlockKey) {
|
|
157
|
-
if (!
|
|
369
|
+
if (!isTextBlock(context, block)) {
|
|
158
370
|
startBlock = block;
|
|
159
371
|
continue;
|
|
160
372
|
}
|
|
161
373
|
if (startChildKey) {
|
|
162
374
|
for (const child of block.children) {
|
|
163
375
|
if (child._key === startChildKey) {
|
|
164
|
-
if (
|
|
376
|
+
if (isSpan$1(context, child)) {
|
|
165
377
|
const text = child._key === endChildKey ? child.text.slice(startPoint.offset, endPoint.offset) : child.text.slice(startPoint.offset);
|
|
166
378
|
startBlock = {
|
|
167
379
|
...block,
|
|
@@ -179,7 +391,7 @@ function sliceBlocks({
|
|
|
179
391
|
break;
|
|
180
392
|
continue;
|
|
181
393
|
}
|
|
182
|
-
if (startBlock &&
|
|
394
|
+
if (startBlock && isTextBlock(context, startBlock) && (endChildKey && child._key === endChildKey && isSpan$1(context, child) ? startBlock.children.push({
|
|
183
395
|
...child,
|
|
184
396
|
text: child.text.slice(0, endPoint.offset)
|
|
185
397
|
}) : startBlock.children.push(child), block._key === endBlockKey && endChildKey && child._key === endChildKey))
|
|
@@ -193,7 +405,7 @@ function sliceBlocks({
|
|
|
193
405
|
break;
|
|
194
406
|
}
|
|
195
407
|
if (block._key === endBlockKey) {
|
|
196
|
-
if (!
|
|
408
|
+
if (!isTextBlock(context, block)) {
|
|
197
409
|
endBlock = block;
|
|
198
410
|
break;
|
|
199
411
|
}
|
|
@@ -203,8 +415,8 @@ function sliceBlocks({
|
|
|
203
415
|
children: []
|
|
204
416
|
};
|
|
205
417
|
for (const child of block.children)
|
|
206
|
-
if (endBlock &&
|
|
207
|
-
if (child._key === endChildKey &&
|
|
418
|
+
if (endBlock && isTextBlock(context, endBlock)) {
|
|
419
|
+
if (child._key === endChildKey && isSpan$1(context, child)) {
|
|
208
420
|
endBlock.children.push({
|
|
209
421
|
...child,
|
|
210
422
|
text: child.text.slice(0, endPoint.offset)
|
|
@@ -231,7 +443,15 @@ export {
|
|
|
231
443
|
isEmptyTextBlock,
|
|
232
444
|
isEqualSelectionPoints,
|
|
233
445
|
isKeyedSegment,
|
|
234
|
-
|
|
446
|
+
isListBlock,
|
|
447
|
+
isSpan$1 as isSpan,
|
|
448
|
+
isSpan as isSpan$1,
|
|
449
|
+
isTextBlock,
|
|
450
|
+
isTypedObject,
|
|
451
|
+
parseAnnotation,
|
|
452
|
+
parseBlock,
|
|
453
|
+
parseBlocks,
|
|
454
|
+
parseInlineObject,
|
|
235
455
|
reverseSelection,
|
|
236
456
|
sliceBlocks,
|
|
237
457
|
spanSelectionPointToBlockOffset
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.slice-blocks.js","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.is-span.ts","../../src/utils/util.reverse-selection.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import type {KeyedSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: unknown): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n value,\n blockOffset,\n direction,\n}: {\n value: Array<PortableTextBlock>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint:\n | {path: [KeyedSegment, 'children', KeyedSegment]; offset: number}\n | undefined\n let skippedInlineObject = false\n\n for (const block of value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isPortableTextSpan(child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n value,\n selectionPoint,\n}: {\n value: Array<PortableTextBlock>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const spanKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isPortableTextTextBlock(block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isPortableTextSpan(child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n const lastChild = node.children[node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...path, 'children', {_key: lastChild._key}],\n offset: isPortableTextSpan(lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import {\n isPortableTextTextBlock,\n type KeyedSegment,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n node,\n path,\n}: {\n node: PortableTextBlock\n path: [KeyedSegment]\n}): EditorSelectionPoint {\n if (isPortableTextTextBlock(node)) {\n return {\n path: [...path, 'children', {_key: node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path,\n offset: 0,\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import {\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(block: PortableTextBlock) {\n if (!isPortableTextTextBlock(block)) {\n return false\n }\n\n const onlyText = block.children.every(isPortableTextSpan)\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import type {EditorSelection} from '../types/editor'\n\n/**\n * @public\n */\nexport function reverseSelection<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n>(selection: TEditorSelection): TEditorSelection {\n if (!selection) {\n return selection\n }\n\n if (selection.backward) {\n return {\n anchor: selection.focus,\n focus: selection.anchor,\n backward: false,\n } as TEditorSelection\n }\n\n return {\n anchor: selection.focus,\n focus: selection.anchor,\n backward: true,\n } as TEditorSelection\n}\n","import {\n isKeySegment,\n isPortableTextSpan,\n isPortableTextTextBlock,\n type PortableTextBlock,\n} from '@sanity/types'\nimport type {EditorSelection} from '..'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n blocks,\n selection,\n}: {\n blocks: Array<PortableTextBlock>\n selection: EditorSelection\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\n\n const startPoint = selection.backward ? selection.focus : selection.anchor\n const endPoint = selection.backward ? selection.anchor : 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 const startChildKey = isKeySegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endChildKey = isKeySegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isPortableTextTextBlock(block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isPortableTextTextBlock(block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isPortableTextSpan(child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isPortableTextTextBlock(startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isPortableTextSpan(child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isPortableTextTextBlock(block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isPortableTextTextBlock(endBlock)) {\n if (child._key === endChildKey && isPortableTextSpan(child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n"],"names":["isKeyedSegment","segment","blockOffsetToSpanSelectionPoint","value","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","block","_key","path","isPortableTextTextBlock","child","children","isPortableTextSpan","text","length","spanSelectionPointToBlockOffset","blockKey","undefined","spanKey","getBlockEndPoint","node","lastChild","getBlockStartPoint","getTextBlockText","map","join","isEmptyTextBlock","onlyText","every","blockText","isEqualSelectionPoints","a","b","JSON","stringify","isSpan","context","_type","schema","span","name","reverseSelection","selection","backward","anchor","focus","sliceBlocks","blocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","isKeySegment","endBlockKey","startChildKey","endChildKey","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"util.slice-blocks.js","sources":["../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts","../../src/utils/util.is-keyed-segment.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-end-point.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.is-span.ts","../../src/utils/util.reverse-selection.ts","../../src/utils/util.slice-blocks.ts"],"sourcesContent":["import type {TypedObject} from '@sanity/types'\n\nexport function isTypedObject(object: unknown): object is TypedObject {\n return isRecord(object) && typeof object._type === 'string'\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && (typeof value === 'object' || typeof value === 'function')\n}\n","import type {\n PortableTextBlock,\n PortableTextListBlock,\n PortableTextObject,\n PortableTextSpan,\n PortableTextTextBlock,\n TypedObject,\n} from '@sanity/types'\nimport type {EditorSchema} from '../editor/editor-schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTypedObject} from './asserters'\n\nexport function parseBlocks({\n context,\n blocks,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n blocks: unknown\n options: {\n refreshKeys: boolean\n }\n}): Array<PortableTextBlock> {\n if (!Array.isArray(blocks)) {\n return []\n }\n\n return blocks.flatMap((block) => {\n const parsedBlock = parseBlock({context, block, options})\n\n return parsedBlock ? [parsedBlock] : []\n })\n}\n\nexport function parseBlock({\n context,\n block,\n options,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n block: unknown\n options: {\n refreshKeys: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nfunction parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(blockObject)) {\n return undefined\n }\n\n const schemaType = context.schema.blockObjects.find(\n ({name}) => name === blockObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: blockObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function isListBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextListBlock {\n return (\n isTextBlock(context, block) &&\n block.level !== undefined &&\n block.listItem !== undefined\n )\n}\n\nexport function isTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: unknown,\n): block is PortableTextTextBlock {\n return (\n parseTextBlock({\n block,\n context: {schema: context.schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nfunction parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n if (block._type !== context.schema.block.name) {\n return undefined\n }\n\n const _key = options.refreshKeys\n ? context.keyGenerator()\n : typeof block._key === 'string'\n ? block._key\n : context.keyGenerator()\n\n const unparsedMarkDefs: Array<unknown> = Array.isArray(block.markDefs)\n ? block.markDefs\n : []\n const markDefKeyMap = new Map<string, string>()\n const markDefs = unparsedMarkDefs.flatMap((markDef) => {\n if (!isTypedObject(markDef)) {\n return []\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === markDef._type,\n )\n\n if (!schemaType) {\n return []\n }\n\n if (typeof markDef._key !== 'string') {\n // If the `markDef` doesn't have a `_key` then we don't know what spans\n // it belongs to and therefore we have to discard it.\n return []\n }\n\n const parsedAnnotation = parseObject({\n object: markDef,\n context: {\n schemaType,\n keyGenerator: context.keyGenerator,\n },\n options,\n })\n\n if (!parsedAnnotation) {\n return []\n }\n\n markDefKeyMap.set(markDef._key, parsedAnnotation._key)\n\n return [parsedAnnotation]\n })\n\n const unparsedChildren: Array<unknown> = Array.isArray(block.children)\n ? block.children\n : []\n\n const children = unparsedChildren\n .map(\n (child) =>\n parseSpan({span: child, context, markDefKeyMap, options}) ??\n parseInlineObject({inlineObject: child, context, options}),\n )\n .filter((child) => child !== undefined)\n\n const parsedBlock: PortableTextTextBlock = {\n _type: context.schema.block.name,\n _key,\n children:\n children.length > 0\n ? children\n : [\n {\n _key: context.keyGenerator(),\n _type: context.schema.span.name,\n text: '',\n marks: [],\n },\n ],\n markDefs,\n }\n\n if (\n typeof block.style === 'string' &&\n context.schema.styles.find((style) => style.name === block.style)\n ) {\n parsedBlock.style = block.style\n } else {\n const defaultStyle = context.schema.styles.at(0)?.name\n\n if (defaultStyle !== undefined) {\n parsedBlock.style = defaultStyle\n } else {\n console.error('Expected default style')\n }\n }\n\n if (\n typeof block.listItem === 'string' &&\n context.schema.lists.find((list) => list.name === block.listItem)\n ) {\n parsedBlock.listItem = block.listItem\n }\n\n if (typeof block.level === 'number') {\n parsedBlock.level = block.level\n }\n\n return parsedBlock\n}\n\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: unknown,\n): child is PortableTextSpan {\n return (\n parseSpan({\n span: child,\n markDefKeyMap: new Map(),\n context: {schema: context.schema, keyGenerator: () => ''},\n options: {refreshKeys: false},\n }) !== undefined\n )\n}\n\nexport function parseSpan({\n span,\n context,\n markDefKeyMap,\n options,\n}: {\n span: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n markDefKeyMap: Map<string, string>\n options: {refreshKeys: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\n }\n\n // In reality, the span schema name is always 'span', but we only the check here anyway\n if (span._type !== context.schema.span.name || span._type !== 'span') {\n return undefined\n }\n\n const unparsedMarks: Array<unknown> = Array.isArray(span.marks)\n ? span.marks\n : []\n const marks = unparsedMarks.flatMap((mark) => {\n if (typeof mark !== 'string') {\n return []\n }\n\n const markDefKey = markDefKeyMap.get(mark)\n\n if (markDefKey !== undefined) {\n return [markDefKey]\n }\n\n if (\n context.schema.decorators.some((decorator) => decorator.name === mark)\n ) {\n return [mark]\n }\n\n return []\n })\n\n return {\n _type: 'span',\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof span._key === 'string'\n ? span._key\n : context.keyGenerator(),\n text: typeof span.text === 'string' ? span.text : '',\n marks,\n }\n}\n\nexport function parseInlineObject({\n inlineObject,\n context,\n options,\n}: {\n inlineObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(inlineObject)) {\n return undefined\n }\n\n const schemaType = context.schema.inlineObjects.find(\n ({name}) => name === inlineObject._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: inlineObject,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nexport function parseAnnotation({\n annotation,\n context,\n options,\n}: {\n annotation: TypedObject\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean}\n}): PortableTextObject | undefined {\n if (!isTypedObject(annotation)) {\n return undefined\n }\n\n const schemaType = context.schema.annotations.find(\n ({name}) => name === annotation._type,\n )\n\n if (!schemaType) {\n return undefined\n }\n\n return parseObject({\n object: annotation,\n context: {\n keyGenerator: context.keyGenerator,\n schemaType,\n },\n options,\n })\n}\n\nfunction parseObject({\n object,\n context,\n options,\n}: {\n object: TypedObject\n context: Pick<EditorContext, 'keyGenerator'> & {\n schemaType: EditorSchema['blockObjects'][0]\n }\n options: {refreshKeys: boolean}\n}): PortableTextObject {\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = context.schemaType.fields.reduce<Record<string, unknown>>(\n (fieldValues, field) => {\n const fieldValue = object[field.name]\n\n if (fieldValue !== undefined) {\n fieldValues[field.name] = fieldValue\n }\n\n return fieldValues\n },\n {},\n )\n\n return {\n _type: context.schemaType.name,\n _key: options.refreshKeys\n ? context.keyGenerator()\n : typeof object._key === 'string'\n ? object._key\n : context.keyGenerator(),\n ...values,\n }\n}\n","import type {KeyedSegment} from '@sanity/types'\n\n/**\n * @public\n */\nexport function isKeyedSegment(segment: unknown): segment is KeyedSegment {\n return typeof segment === 'object' && segment !== null && '_key' in segment\n}\n","import type {KeyedSegment} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function blockOffsetToSpanSelectionPoint({\n context,\n blockOffset,\n direction,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n blockOffset: BlockOffset\n direction: 'forward' | 'backward'\n}) {\n let offsetLeft = blockOffset.offset\n let selectionPoint:\n | {path: [KeyedSegment, 'children', KeyedSegment]; offset: number}\n | undefined\n let skippedInlineObject = false\n\n for (const block of context.value) {\n if (block._key !== blockOffset.path[0]._key) {\n continue\n }\n\n if (!isTextBlock(context, block)) {\n continue\n }\n\n for (const child of block.children) {\n if (direction === 'forward') {\n if (!isSpan(context, child)) {\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n break\n }\n\n offsetLeft -= child.text.length\n\n continue\n }\n\n if (!isSpan(context, child)) {\n skippedInlineObject = true\n continue\n }\n\n if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {\n if (skippedInlineObject) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: 0,\n }\n }\n break\n }\n\n if (offsetLeft > child.text.length) {\n offsetLeft -= child.text.length\n continue\n }\n\n if (offsetLeft <= child.text.length) {\n selectionPoint = {\n path: [...blockOffset.path, 'children', {_key: child._key}],\n offset: offsetLeft,\n }\n\n offsetLeft -= child.text.length\n\n if (offsetLeft !== 0) {\n break\n }\n }\n }\n }\n\n return selectionPoint\n}\n\n/**\n * @public\n */\nexport function spanSelectionPointToBlockOffset({\n context,\n selectionPoint,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n let offset = 0\n\n const blockKey = isKeyedSegment(selectionPoint.path[0])\n ? selectionPoint.path[0]._key\n : undefined\n const spanKey = isKeyedSegment(selectionPoint.path[2])\n ? selectionPoint.path[2]._key\n : undefined\n\n if (!blockKey || !spanKey) {\n return undefined\n }\n\n for (const block of context.value) {\n if (block._key !== blockKey) {\n continue\n }\n\n if (!isTextBlock(context, block)) {\n continue\n }\n\n for (const child of block.children) {\n if (!isSpan(context, child)) {\n continue\n }\n\n if (child._key === spanKey) {\n return {\n path: [{_key: block._key}],\n offset: offset + selectionPoint.offset,\n }\n }\n\n offset += child.text.length\n }\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockEndPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n const lastChild = block.node.children[block.node.children.length - 1]\n\n if (lastChild) {\n return {\n path: [...block.path, 'children', {_key: lastChild._key}],\n offset: isSpan(context, lastChild) ? lastChild.text.length : 0,\n }\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import type {KeyedSegment, PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function getBlockStartPoint({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema'>\n block: {\n node: PortableTextBlock\n path: [KeyedSegment]\n }\n}): EditorSelectionPoint {\n if (isTextBlock(context, block.node)) {\n return {\n path: [...block.path, 'children', {_key: block.node.children[0]._key}],\n offset: 0,\n }\n }\n\n return {\n path: block.path,\n offset: 0,\n }\n}\n","import type {PortableTextTextBlock} from '@sanity/types'\n\n/**\n * @public\n */\nexport function getTextBlockText(block: PortableTextTextBlock) {\n return block.children.map((child) => child.text ?? '').join('')\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {getTextBlockText} from './util.get-text-block-text'\n\n/**\n * @public\n */\nexport function isEmptyTextBlock(\n context: Pick<EditorContext, 'schema'>,\n block: PortableTextBlock,\n) {\n if (!isTextBlock(context, block)) {\n return false\n }\n\n const onlyText = block.children.every((child) => isSpan(context, child))\n const blockText = getTextBlockText(block)\n\n return onlyText && blockText === ''\n}\n","import type {EditorSelectionPoint} from '../types/editor'\n\n/**\n * @public\n */\nexport function isEqualSelectionPoints(\n a: EditorSelectionPoint,\n b: EditorSelectionPoint,\n) {\n return (\n a.offset === b.offset && JSON.stringify(a.path) === JSON.stringify(b.path)\n )\n}\n","import type {PortableTextChild, PortableTextSpan} from '@sanity/types'\nimport type {EditorContext} from '..'\n\n/**\n * @public\n */\nexport function isSpan(\n context: Pick<EditorContext, 'schema'>,\n child: PortableTextChild,\n): child is PortableTextSpan {\n return child._type === context.schema.span.name\n}\n","import type {EditorSelection} from '../types/editor'\n\n/**\n * @public\n */\nexport function reverseSelection<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n>(selection: TEditorSelection): TEditorSelection {\n if (!selection) {\n return selection\n }\n\n if (selection.backward) {\n return {\n anchor: selection.focus,\n focus: selection.anchor,\n backward: false,\n } as TEditorSelection\n }\n\n return {\n anchor: selection.focus,\n focus: selection.anchor,\n backward: true,\n } as TEditorSelection\n}\n","import type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {isKeyedSegment} from './util.is-keyed-segment'\n\n/**\n * @public\n */\nexport function sliceBlocks({\n context,\n blocks,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\n blocks: Array<PortableTextBlock>\n}): Array<PortableTextBlock> {\n const slice: Array<PortableTextBlock> = []\n\n if (!context.selection) {\n return slice\n }\n\n let startBlock: PortableTextBlock | undefined\n const middleBlocks: PortableTextBlock[] = []\n let endBlock: PortableTextBlock | undefined\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 = isKeyedSegment(startPoint.path[0])\n ? startPoint.path[0]._key\n : undefined\n const endBlockKey = isKeyedSegment(endPoint.path[0])\n ? endPoint.path[0]._key\n : undefined\n const startChildKey = isKeyedSegment(startPoint.path[2])\n ? startPoint.path[2]._key\n : undefined\n const endChildKey = isKeyedSegment(endPoint.path[2])\n ? endPoint.path[2]._key\n : undefined\n\n if (!startBlockKey || !endBlockKey) {\n return slice\n }\n\n for (const block of blocks) {\n if (!isTextBlock(context, block)) {\n if (block._key === startBlockKey && block._key === endBlockKey) {\n startBlock = block\n break\n }\n }\n\n if (block._key === startBlockKey) {\n if (!isTextBlock(context, block)) {\n startBlock = block\n continue\n }\n\n if (startChildKey) {\n for (const child of block.children) {\n if (child._key === startChildKey) {\n if (isSpan(context, child)) {\n const text =\n child._key === endChildKey\n ? child.text.slice(startPoint.offset, endPoint.offset)\n : child.text.slice(startPoint.offset)\n\n startBlock = {\n ...block,\n children: [\n {\n ...child,\n text,\n },\n ],\n }\n } else {\n startBlock = {\n ...block,\n children: [child],\n }\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n continue\n }\n\n if (startBlock && isTextBlock(context, startBlock)) {\n if (\n endChildKey &&\n child._key === endChildKey &&\n isSpan(context, child)\n ) {\n startBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n startBlock.children.push(child)\n }\n\n if (\n block._key === endBlockKey &&\n endChildKey &&\n child._key === endChildKey\n ) {\n break\n }\n }\n }\n\n if (startBlockKey === endBlockKey) {\n break\n }\n\n continue\n }\n\n startBlock = block\n\n if (startBlockKey === endBlockKey) {\n break\n }\n }\n\n if (block._key === endBlockKey) {\n if (!isTextBlock(context, block)) {\n endBlock = block\n break\n }\n\n if (endChildKey) {\n endBlock = {\n ...block,\n children: [],\n }\n\n for (const child of block.children) {\n if (endBlock && isTextBlock(context, endBlock)) {\n if (child._key === endChildKey && isSpan(context, child)) {\n endBlock.children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n\n break\n }\n\n endBlock.children.push(child)\n\n if (endChildKey && child._key === endChildKey) {\n break\n }\n }\n }\n\n break\n }\n\n endBlock = block\n\n break\n }\n\n if (startBlock) {\n middleBlocks.push(block)\n }\n }\n\n return [\n ...(startBlock ? [startBlock] : []),\n ...middleBlocks,\n ...(endBlock ? [endBlock] : []),\n ]\n}\n"],"names":["isTypedObject","object","isRecord","_type","value","parseBlocks","context","blocks","options","Array","isArray","flatMap","block","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","isTextBlock","level","undefined","listItem","refreshKeys","_key","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","children","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","style","styles","defaultStyle","at","console","error","lists","list","isSpan","mark","markDefKey","get","decorators","some","decorator","inlineObjects","parseAnnotation","annotation","values","fields","reduce","fieldValues","field","fieldValue","isKeyedSegment","segment","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","path","spanSelectionPointToBlockOffset","blockKey","spanKey","getBlockEndPoint","node","lastChild","getBlockStartPoint","getTextBlockText","join","isEmptyTextBlock","onlyText","every","blockText","isEqualSelectionPoints","a","b","JSON","stringify","reverseSelection","selection","backward","anchor","focus","sliceBlocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","endBlockKey","startChildKey","endChildKey","push"],"mappings":"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"}
|