@portabletext/editor 2.6.3 → 2.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs +29 -29
- package/lib/_chunks-cjs/selector.is-selecting-entire-blocks.cjs.map +1 -1
- package/lib/_chunks-cjs/selector.is-selection-expanded.cjs +5 -5
- package/lib/_chunks-cjs/selector.is-selection-expanded.cjs.map +1 -1
- package/lib/_chunks-cjs/util.child-selection-point-to-block-offset.cjs +3 -3
- package/lib/_chunks-cjs/util.child-selection-point-to-block-offset.cjs.map +1 -1
- package/lib/_chunks-cjs/util.is-selection-collapsed.cjs +5 -5
- package/lib/_chunks-cjs/util.is-selection-collapsed.cjs.map +1 -1
- package/lib/_chunks-cjs/util.merge-text-blocks.cjs +2 -6
- package/lib/_chunks-cjs/util.merge-text-blocks.cjs.map +1 -1
- package/lib/_chunks-cjs/util.slice-blocks.cjs +106 -117
- package/lib/_chunks-cjs/util.slice-blocks.cjs.map +1 -1
- package/lib/_chunks-cjs/util.slice-text-block.cjs +3 -3
- package/lib/_chunks-cjs/util.slice-text-block.cjs.map +1 -1
- package/lib/_chunks-dts/behavior.types.action.d.ts +115 -115
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js +3 -2
- package/lib/_chunks-es/selector.is-selecting-entire-blocks.js.map +1 -1
- package/lib/_chunks-es/selector.is-selection-expanded.js +3 -2
- package/lib/_chunks-es/selector.is-selection-expanded.js.map +1 -1
- package/lib/_chunks-es/util.child-selection-point-to-block-offset.js +2 -1
- package/lib/_chunks-es/util.child-selection-point-to-block-offset.js.map +1 -1
- package/lib/_chunks-es/util.is-selection-collapsed.js +2 -1
- package/lib/_chunks-es/util.is-selection-collapsed.js.map +1 -1
- package/lib/_chunks-es/util.merge-text-blocks.js +2 -5
- package/lib/_chunks-es/util.merge-text-blocks.js.map +1 -1
- package/lib/_chunks-es/util.slice-blocks.js +101 -112
- package/lib/_chunks-es/util.slice-blocks.js.map +1 -1
- package/lib/_chunks-es/util.slice-text-block.js +2 -1
- package/lib/_chunks-es/util.slice-text-block.js.map +1 -1
- package/lib/index.cjs +133 -96
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +43 -6
- package/lib/index.js.map +1 -1
- package/lib/plugins/index.cjs +5 -5
- package/lib/plugins/index.cjs.map +1 -1
- package/lib/plugins/index.d.cts +3 -3
- package/lib/plugins/index.d.ts +3 -3
- package/lib/plugins/index.js +6 -5
- package/lib/plugins/index.js.map +1 -1
- package/lib/selectors/index.cjs +3 -3
- package/lib/selectors/index.cjs.map +1 -1
- package/lib/selectors/index.js +2 -1
- package/lib/selectors/index.js.map +1 -1
- package/lib/utils/index.cjs +14 -4
- package/lib/utils/index.cjs.map +1 -1
- package/lib/utils/index.d.cts +2 -9
- package/lib/utils/index.d.ts +4 -11
- package/lib/utils/index.js +4 -3
- package/lib/utils/index.js.map +1 -1
- package/package.json +14 -13
- package/src/behaviors/behavior.abstract.delete.ts +1 -1
- package/src/behaviors/behavior.abstract.deserialize.ts +1 -1
- package/src/behaviors/behavior.abstract.split.ts +2 -1
- package/src/behaviors/behavior.core.block-objects.ts +1 -1
- package/src/behaviors/behavior.core.lists.ts +2 -1
- package/src/behaviors/behavior.markdown.ts +1 -1
- package/src/converters/converter.text-plain.ts +2 -1
- package/src/editor/__tests__/PortableTextEditor.test.tsx +1 -1
- package/src/editor/__tests__/RangeDecorations.test.tsx +1 -1
- package/src/editor/__tests__/self-solving.test.tsx +1 -1
- package/src/editor/components/render-element.tsx +1 -1
- package/src/editor/plugins/__tests__/withEditableAPIDelete.test.tsx +1 -1
- package/src/editor/plugins/__tests__/withEditableAPIGetFragment.test.tsx +2 -3
- package/src/editor/plugins/__tests__/withEditableAPIInsert.test.tsx +1 -1
- package/src/editor/plugins/__tests__/withEditableAPISelectionsOverlapping.test.tsx +1 -1
- package/src/editor/plugins/__tests__/withPortableTextLists.test.tsx +1 -1
- package/src/editor/plugins/__tests__/withPortableTextMarkModel.test.tsx +1 -1
- package/src/editor/plugins/__tests__/withPortableTextSelections.test.tsx +1 -1
- package/src/editor/plugins/__tests__/withUndoRedo.test.tsx +1 -1
- package/src/editor/plugins/createWithObjectKeys.ts +1 -1
- package/src/editor/plugins/createWithPortableTextMarkModel.ts +1 -1
- package/src/editor/plugins/createWithSchemaTypes.ts +2 -5
- package/src/internal-utils/__tests__/valueNormalization.test.tsx +1 -1
- package/src/internal-utils/apply-operation-to-portable-text.test.ts +1 -1
- package/src/internal-utils/build-index-maps.ts +1 -1
- package/src/internal-utils/create-test-snapshot.ts +1 -1
- package/src/internal-utils/drag-selection.test.ts +1 -1
- package/src/internal-utils/editor-selection.ts +1 -1
- package/src/internal-utils/operation-to-patches.ts +1 -1
- package/src/internal-utils/parse-blocks.test.ts +1 -1
- package/src/internal-utils/parse-blocks.ts +1 -38
- package/src/internal-utils/selection-focus-text.ts +1 -1
- package/src/internal-utils/selection-text.ts +1 -1
- package/src/internal-utils/test-editor.tsx +1 -1
- package/src/internal-utils/text-block-key.ts +1 -1
- package/src/internal-utils/text-marks.ts +1 -1
- package/src/internal-utils/text-selection.ts +1 -1
- package/src/internal-utils/to-slate-range.test.ts +1 -1
- package/src/internal-utils/to-slate-range.ts +1 -1
- package/src/internal-utils/validateValue.ts +1 -1
- package/src/internal-utils/value-annotations.ts +1 -1
- package/src/operations/behavior.operation.block.unset.ts +2 -1
- package/src/operations/behavior.operation.delete.ts +98 -2
- package/src/operations/behavior.operation.insert.block.ts +2 -1
- package/src/operations/behavior.operation.select.ts +5 -0
- package/src/plugins/plugin.behavior.tsx +3 -1
- package/src/plugins/plugin.internal.auto-close-brackets.test.tsx +1 -2
- package/src/plugins/plugin.markdown.test.tsx +1 -2
- package/src/selectors/selector.get-active-annotations.ts +1 -1
- package/src/selectors/selector.get-active-list-item.ts +1 -1
- package/src/selectors/selector.get-active-style.ts +1 -1
- package/src/selectors/selector.get-anchor-text-block.ts +1 -1
- package/src/selectors/selector.get-caret-word-selection.test.ts +1 -1
- package/src/selectors/selector.get-focus-block-object.ts +1 -1
- package/src/selectors/selector.get-focus-span.ts +1 -1
- package/src/selectors/selector.get-focus-text-block.ts +1 -1
- package/src/selectors/selector.get-list-state.ts +1 -1
- package/src/selectors/selector.get-next-span.ts +1 -1
- package/src/selectors/selector.get-previous-span.ts +1 -1
- package/src/selectors/selector.get-selected-spans.ts +1 -1
- package/src/selectors/selector.get-selected-text-blocks.ts +1 -1
- package/src/selectors/selector.get-selection-text.ts +1 -1
- package/src/selectors/selector.get-trimmed-selection.test.ts +1 -1
- package/src/selectors/selector.get-trimmed-selection.ts +1 -1
- package/src/selectors/selector.is-active-annotation.ts +1 -1
- package/src/selectors/selector.is-point-after-selection.ts +1 -1
- package/src/selectors/selector.is-point-before-selection.ts +1 -1
- package/src/utils/index.ts +1 -2
- package/src/utils/util.at-the-beginning-of-block.ts +1 -1
- package/src/utils/util.block-offset.ts +1 -1
- package/src/utils/util.child-selection-point-to-block-offset.ts +1 -1
- package/src/utils/util.get-block-end-point.ts +1 -1
- package/src/utils/util.get-block-start-point.ts +1 -1
- package/src/utils/util.is-empty-text-block.ts +1 -1
- package/src/utils/util.merge-text-blocks.ts +1 -1
- package/src/utils/util.slice-blocks.ts +2 -2
- package/src/utils/util.slice-text-block.ts +2 -2
- package/src/utils/util.split-text-block.ts +1 -1
- package/src/internal-utils/terse-pt.test.ts +0 -175
- package/src/internal-utils/terse-pt.ts +0 -150
- package/src/internal-utils/test-key-generator.ts +0 -9
- package/src/utils/util.is-span.ts +0 -12
- package/src/utils/util.is-text-block.ts +0 -13
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var util_sliceBlocks = require("./util.slice-blocks.cjs");
|
|
2
|
+
var schema = require("@portabletext/schema"), util_sliceBlocks = require("./util.slice-blocks.cjs");
|
|
3
3
|
function getBlockEndPoint({
|
|
4
4
|
context,
|
|
5
5
|
block
|
|
6
6
|
}) {
|
|
7
|
-
if (
|
|
7
|
+
if (schema.isTextBlock(context, block.node)) {
|
|
8
8
|
const lastChild = block.node.children[block.node.children.length - 1];
|
|
9
9
|
if (lastChild)
|
|
10
10
|
return {
|
|
11
11
|
path: [...block.path, "children", {
|
|
12
12
|
_key: lastChild._key
|
|
13
13
|
}],
|
|
14
|
-
offset:
|
|
14
|
+
offset: schema.isSpan(context, lastChild) ? lastChild.text.length : 0
|
|
15
15
|
};
|
|
16
16
|
}
|
|
17
17
|
return {
|
|
@@ -20,9 +20,9 @@ function getBlockEndPoint({
|
|
|
20
20
|
};
|
|
21
21
|
}
|
|
22
22
|
function isEmptyTextBlock(context, block) {
|
|
23
|
-
if (!
|
|
23
|
+
if (!schema.isTextBlock(context, block))
|
|
24
24
|
return !1;
|
|
25
|
-
const onlyText = block.children.every((child) =>
|
|
25
|
+
const onlyText = block.children.every((child) => schema.isSpan(context, child)), blockText = util_sliceBlocks.getTextBlockText(block);
|
|
26
26
|
return onlyText && blockText === "";
|
|
27
27
|
}
|
|
28
28
|
function isEqualSelectionPoints(a, b) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.is-selection-collapsed.cjs","sources":["../../src/utils/util.get-block-end-point.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.is-selection-collapsed.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"util.is-selection-collapsed.cjs","sources":["../../src/utils/util.get-block-end-point.ts","../../src/utils/util.is-empty-text-block.ts","../../src/utils/util.is-equal-selection-points.ts","../../src/utils/util.is-selection-collapsed.ts"],"sourcesContent":["import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\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: BlockPath\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 {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\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 {EditorSelection} from '../types/editor'\n\n/**\n * @public\n */\nexport function isSelectionCollapsed(selection: EditorSelection) {\n if (!selection) {\n return false\n }\n\n return (\n JSON.stringify(selection.anchor.path) ===\n JSON.stringify(selection.focus.path) &&\n selection.anchor.offset === selection.focus.offset\n )\n}\n"],"names":["getBlockEndPoint","context","block","isTextBlock","node","lastChild","children","length","path","_key","offset","isSpan","text","isEmptyTextBlock","onlyText","every","child","blockText","getTextBlockText","isEqualSelectionPoints","a","b","JSON","stringify","isSelectionCollapsed","selection","anchor","focus"],"mappings":";;AASO,SAASA,iBAAiB;AAAA,EAC/BC;AAAAA,EACAC;AAOF,GAAyB;AACvB,MAAIC,mBAAYF,SAASC,MAAME,IAAI,GAAG;AACpC,UAAMC,YAAYH,MAAME,KAAKE,SAASJ,MAAME,KAAKE,SAASC,SAAS,CAAC;AAEpE,QAAIF;AACF,aAAO;AAAA,QACLG,MAAM,CAAC,GAAGN,MAAMM,MAAM,YAAY;AAAA,UAACC,MAAMJ,UAAUI;AAAAA,QAAAA,CAAK;AAAA,QACxDC,QAAQC,OAAAA,OAAOV,SAASI,SAAS,IAAIA,UAAUO,KAAKL,SAAS;AAAA,MAAA;AAAA,EAGnE;AAEA,SAAO;AAAA,IACLC,MAAMN,MAAMM;AAAAA,IACZE,QAAQ;AAAA,EAAA;AAEZ;AC1BO,SAASG,iBACdZ,SACAC,OACA;AACA,MAAI,CAACC,OAAAA,YAAYF,SAASC,KAAK;AAC7B,WAAO;AAGT,QAAMY,WAAWZ,MAAMI,SAASS,MAAOC,CAAAA,UAAUL,cAAOV,SAASe,KAAK,CAAC,GACjEC,YAAYC,iBAAAA,iBAAiBhB,KAAK;AAExC,SAAOY,YAAYG,cAAc;AACnC;ACfO,SAASE,uBACdC,GACAC,GACA;AACA,SACED,EAAEV,WAAWW,EAAEX,UAAUY,KAAKC,UAAUH,EAAEZ,IAAI,MAAMc,KAAKC,UAAUF,EAAEb,IAAI;AAE7E;ACPO,SAASgB,qBAAqBC,WAA4B;AAC/D,SAAKA,YAKHH,KAAKC,UAAUE,UAAUC,OAAOlB,IAAI,MAClCc,KAAKC,UAAUE,UAAUE,MAAMnB,IAAI,KACrCiB,UAAUC,OAAOhB,WAAWe,UAAUE,MAAMjB,SANrC;AAQX;;;;;"}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var util_sliceBlocks = require("./util.slice-blocks.cjs");
|
|
3
|
-
function isTextBlock(context, block) {
|
|
4
|
-
return util_sliceBlocks.isTypedObject(block) && block._type === context.schema.block.name;
|
|
5
|
-
}
|
|
2
|
+
var schema = require("@portabletext/schema"), util_sliceBlocks = require("./util.slice-blocks.cjs");
|
|
6
3
|
function mergeTextBlocks({
|
|
7
4
|
context,
|
|
8
5
|
targetBlock,
|
|
@@ -16,12 +13,11 @@ function mergeTextBlocks({
|
|
|
16
13
|
validateFields: !1
|
|
17
14
|
}
|
|
18
15
|
});
|
|
19
|
-
return !parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock) ? targetBlock : {
|
|
16
|
+
return !parsedIncomingBlock || !schema.isTextBlock(context, parsedIncomingBlock) ? targetBlock : {
|
|
20
17
|
...targetBlock,
|
|
21
18
|
children: [...targetBlock.children, ...parsedIncomingBlock.children],
|
|
22
19
|
markDefs: [...targetBlock.markDefs ?? [], ...parsedIncomingBlock.markDefs ?? []]
|
|
23
20
|
};
|
|
24
21
|
}
|
|
25
|
-
exports.isTextBlock = isTextBlock;
|
|
26
22
|
exports.mergeTextBlocks = mergeTextBlocks;
|
|
27
23
|
//# sourceMappingURL=util.merge-text-blocks.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.merge-text-blocks.cjs","sources":["../../src/utils/util.
|
|
1
|
+
{"version":3,"file":"util.merge-text-blocks.cjs","sources":["../../src/utils/util.merge-text-blocks.ts"],"sourcesContent":["import {isTextBlock} from '@portabletext/schema'\nimport type {PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {parseBlock} from '../internal-utils/parse-blocks'\n\n/**\n * @beta\n */\nexport function mergeTextBlocks({\n context,\n targetBlock,\n incomingBlock,\n}: {\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n targetBlock: PortableTextTextBlock\n incomingBlock: PortableTextTextBlock\n}) {\n const parsedIncomingBlock = parseBlock({\n context,\n block: incomingBlock,\n options: {refreshKeys: false, validateFields: false},\n })\n\n if (!parsedIncomingBlock || !isTextBlock(context, parsedIncomingBlock)) {\n return targetBlock\n }\n\n return {\n ...targetBlock,\n children: [...targetBlock.children, ...parsedIncomingBlock.children],\n markDefs: [\n ...(targetBlock.markDefs ?? []),\n ...(parsedIncomingBlock.markDefs ?? []),\n ],\n }\n}\n"],"names":["mergeTextBlocks","context","targetBlock","incomingBlock","parsedIncomingBlock","parseBlock","block","options","refreshKeys","validateFields","isTextBlock","children","markDefs"],"mappings":";;AAQO,SAASA,gBAAgB;AAAA,EAC9BC;AAAAA,EACAC;AAAAA,EACAC;AAKF,GAAG;AACD,QAAMC,sBAAsBC,iBAAAA,WAAW;AAAA,IACrCJ;AAAAA,IACAK,OAAOH;AAAAA,IACPI,SAAS;AAAA,MAACC,aAAa;AAAA,MAAOC,gBAAgB;AAAA,IAAA;AAAA,EAAK,CACpD;AAED,SAAI,CAACL,uBAAuB,CAACM,OAAAA,YAAYT,SAASG,mBAAmB,IAC5DF,cAGF;AAAA,IACL,GAAGA;AAAAA,IACHS,UAAU,CAAC,GAAGT,YAAYS,UAAU,GAAGP,oBAAoBO,QAAQ;AAAA,IACnEC,UAAU,CACR,GAAIV,YAAYU,YAAY,CAAA,GAC5B,GAAIR,oBAAoBQ,YAAY,CAAA,CAAG;AAAA,EAAA;AAG7C;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var schema = require("@portabletext/schema");
|
|
2
3
|
function isKeyedSegment(segment) {
|
|
3
4
|
return typeof segment == "object" && segment !== null && "_key" in segment;
|
|
4
5
|
}
|
|
@@ -12,6 +13,103 @@ function getChildKeyFromSelectionPoint(point) {
|
|
|
12
13
|
if (isKeyedSegment(childPathSegment))
|
|
13
14
|
return childPathSegment._key;
|
|
14
15
|
}
|
|
16
|
+
function blockOffsetToSpanSelectionPoint({
|
|
17
|
+
context,
|
|
18
|
+
blockOffset,
|
|
19
|
+
direction
|
|
20
|
+
}) {
|
|
21
|
+
let offsetLeft = blockOffset.offset, selectionPoint, skippedInlineObject = !1;
|
|
22
|
+
for (const block of context.value)
|
|
23
|
+
if (block._key === blockOffset.path[0]._key && schema.isTextBlock(context, block))
|
|
24
|
+
for (const child of block.children) {
|
|
25
|
+
if (direction === "forward") {
|
|
26
|
+
if (!schema.isSpan(context, child))
|
|
27
|
+
continue;
|
|
28
|
+
if (offsetLeft <= child.text.length) {
|
|
29
|
+
selectionPoint = {
|
|
30
|
+
path: [...blockOffset.path, "children", {
|
|
31
|
+
_key: child._key
|
|
32
|
+
}],
|
|
33
|
+
offset: offsetLeft
|
|
34
|
+
};
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
offsetLeft -= child.text.length;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (!schema.isSpan(context, child)) {
|
|
41
|
+
skippedInlineObject = !0;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {
|
|
45
|
+
skippedInlineObject && (selectionPoint = {
|
|
46
|
+
path: [...blockOffset.path, "children", {
|
|
47
|
+
_key: child._key
|
|
48
|
+
}],
|
|
49
|
+
offset: 0
|
|
50
|
+
});
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
if (offsetLeft > child.text.length) {
|
|
54
|
+
offsetLeft -= child.text.length;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
if (offsetLeft <= child.text.length && (selectionPoint = {
|
|
58
|
+
path: [...blockOffset.path, "children", {
|
|
59
|
+
_key: child._key
|
|
60
|
+
}],
|
|
61
|
+
offset: offsetLeft
|
|
62
|
+
}, offsetLeft -= child.text.length, offsetLeft !== 0))
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
return selectionPoint;
|
|
66
|
+
}
|
|
67
|
+
function spanSelectionPointToBlockOffset({
|
|
68
|
+
context,
|
|
69
|
+
selectionPoint
|
|
70
|
+
}) {
|
|
71
|
+
let offset = 0;
|
|
72
|
+
const blockKey = getBlockKeyFromSelectionPoint(selectionPoint), spanKey = getChildKeyFromSelectionPoint(selectionPoint);
|
|
73
|
+
if (!(!blockKey || !spanKey)) {
|
|
74
|
+
for (const block of context.value)
|
|
75
|
+
if (block._key === blockKey && schema.isTextBlock(context, block)) {
|
|
76
|
+
for (const child of block.children)
|
|
77
|
+
if (schema.isSpan(context, child)) {
|
|
78
|
+
if (child._key === spanKey)
|
|
79
|
+
return {
|
|
80
|
+
path: [{
|
|
81
|
+
_key: block._key
|
|
82
|
+
}],
|
|
83
|
+
offset: offset + selectionPoint.offset
|
|
84
|
+
};
|
|
85
|
+
offset += child.text.length;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function getBlockStartPoint({
|
|
91
|
+
context,
|
|
92
|
+
block
|
|
93
|
+
}) {
|
|
94
|
+
return schema.isTextBlock(context, block.node) ? {
|
|
95
|
+
path: [...block.path, "children", {
|
|
96
|
+
_key: block.node.children[0]._key
|
|
97
|
+
}],
|
|
98
|
+
offset: 0
|
|
99
|
+
} : {
|
|
100
|
+
path: block.path,
|
|
101
|
+
offset: 0
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function getSelectionEndPoint(selection) {
|
|
105
|
+
return selection ? selection.backward ? selection.anchor : selection.focus : null;
|
|
106
|
+
}
|
|
107
|
+
function getSelectionStartPoint(selection) {
|
|
108
|
+
return selection ? selection.backward ? selection.focus : selection.anchor : null;
|
|
109
|
+
}
|
|
110
|
+
function getTextBlockText(block) {
|
|
111
|
+
return block.children.map((child) => child.text ?? "").join("");
|
|
112
|
+
}
|
|
15
113
|
function isTypedObject(object) {
|
|
16
114
|
return isRecord(object) && typeof object._type == "string";
|
|
17
115
|
}
|
|
@@ -68,10 +166,7 @@ function parseBlockObject({
|
|
|
68
166
|
});
|
|
69
167
|
}
|
|
70
168
|
function isListBlock(context, block) {
|
|
71
|
-
return isTextBlock(context, block) && block.level !== void 0 && block.listItem !== void 0;
|
|
72
|
-
}
|
|
73
|
-
function isTextBlock(context, block) {
|
|
74
|
-
return !(!isTypedObject(block) || block._type !== context.schema.block.name || !Array.isArray(block.children));
|
|
169
|
+
return schema.isTextBlock(context, block) && block.level !== void 0 && block.listItem !== void 0;
|
|
75
170
|
}
|
|
76
171
|
function parseTextBlock({
|
|
77
172
|
block,
|
|
@@ -133,9 +228,6 @@ function parseTextBlock({
|
|
|
133
228
|
}
|
|
134
229
|
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;
|
|
135
230
|
}
|
|
136
|
-
function isSpan$1(context, child) {
|
|
137
|
-
return !(!isTypedObject(child) || child._type !== context.schema.span.name || typeof child.text != "string");
|
|
138
|
-
}
|
|
139
231
|
function parseSpan({
|
|
140
232
|
span,
|
|
141
233
|
context,
|
|
@@ -222,106 +314,6 @@ function parseObject({
|
|
|
222
314
|
...values
|
|
223
315
|
};
|
|
224
316
|
}
|
|
225
|
-
function blockOffsetToSpanSelectionPoint({
|
|
226
|
-
context,
|
|
227
|
-
blockOffset,
|
|
228
|
-
direction
|
|
229
|
-
}) {
|
|
230
|
-
let offsetLeft = blockOffset.offset, selectionPoint, skippedInlineObject = !1;
|
|
231
|
-
for (const block of context.value)
|
|
232
|
-
if (block._key === blockOffset.path[0]._key && isTextBlock(context, block))
|
|
233
|
-
for (const child of block.children) {
|
|
234
|
-
if (direction === "forward") {
|
|
235
|
-
if (!isSpan$1(context, child))
|
|
236
|
-
continue;
|
|
237
|
-
if (offsetLeft <= child.text.length) {
|
|
238
|
-
selectionPoint = {
|
|
239
|
-
path: [...blockOffset.path, "children", {
|
|
240
|
-
_key: child._key
|
|
241
|
-
}],
|
|
242
|
-
offset: offsetLeft
|
|
243
|
-
};
|
|
244
|
-
break;
|
|
245
|
-
}
|
|
246
|
-
offsetLeft -= child.text.length;
|
|
247
|
-
continue;
|
|
248
|
-
}
|
|
249
|
-
if (!isSpan$1(context, child)) {
|
|
250
|
-
skippedInlineObject = !0;
|
|
251
|
-
continue;
|
|
252
|
-
}
|
|
253
|
-
if (offsetLeft === 0 && selectionPoint && !skippedInlineObject) {
|
|
254
|
-
skippedInlineObject && (selectionPoint = {
|
|
255
|
-
path: [...blockOffset.path, "children", {
|
|
256
|
-
_key: child._key
|
|
257
|
-
}],
|
|
258
|
-
offset: 0
|
|
259
|
-
});
|
|
260
|
-
break;
|
|
261
|
-
}
|
|
262
|
-
if (offsetLeft > child.text.length) {
|
|
263
|
-
offsetLeft -= child.text.length;
|
|
264
|
-
continue;
|
|
265
|
-
}
|
|
266
|
-
if (offsetLeft <= child.text.length && (selectionPoint = {
|
|
267
|
-
path: [...blockOffset.path, "children", {
|
|
268
|
-
_key: child._key
|
|
269
|
-
}],
|
|
270
|
-
offset: offsetLeft
|
|
271
|
-
}, offsetLeft -= child.text.length, offsetLeft !== 0))
|
|
272
|
-
break;
|
|
273
|
-
}
|
|
274
|
-
return selectionPoint;
|
|
275
|
-
}
|
|
276
|
-
function spanSelectionPointToBlockOffset({
|
|
277
|
-
context,
|
|
278
|
-
selectionPoint
|
|
279
|
-
}) {
|
|
280
|
-
let offset = 0;
|
|
281
|
-
const blockKey = getBlockKeyFromSelectionPoint(selectionPoint), spanKey = getChildKeyFromSelectionPoint(selectionPoint);
|
|
282
|
-
if (!(!blockKey || !spanKey)) {
|
|
283
|
-
for (const block of context.value)
|
|
284
|
-
if (block._key === blockKey && isTextBlock(context, block)) {
|
|
285
|
-
for (const child of block.children)
|
|
286
|
-
if (isSpan$1(context, child)) {
|
|
287
|
-
if (child._key === spanKey)
|
|
288
|
-
return {
|
|
289
|
-
path: [{
|
|
290
|
-
_key: block._key
|
|
291
|
-
}],
|
|
292
|
-
offset: offset + selectionPoint.offset
|
|
293
|
-
};
|
|
294
|
-
offset += child.text.length;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
function getBlockStartPoint({
|
|
300
|
-
context,
|
|
301
|
-
block
|
|
302
|
-
}) {
|
|
303
|
-
return isTextBlock(context, block.node) ? {
|
|
304
|
-
path: [...block.path, "children", {
|
|
305
|
-
_key: block.node.children[0]._key
|
|
306
|
-
}],
|
|
307
|
-
offset: 0
|
|
308
|
-
} : {
|
|
309
|
-
path: block.path,
|
|
310
|
-
offset: 0
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
function getSelectionEndPoint(selection) {
|
|
314
|
-
return selection ? selection.backward ? selection.anchor : selection.focus : null;
|
|
315
|
-
}
|
|
316
|
-
function getSelectionStartPoint(selection) {
|
|
317
|
-
return selection ? selection.backward ? selection.focus : selection.anchor : null;
|
|
318
|
-
}
|
|
319
|
-
function getTextBlockText(block) {
|
|
320
|
-
return block.children.map((child) => child.text ?? "").join("");
|
|
321
|
-
}
|
|
322
|
-
function isSpan(context, child) {
|
|
323
|
-
return child._type === context.schema.span.name;
|
|
324
|
-
}
|
|
325
317
|
function sliceBlocks({
|
|
326
318
|
context,
|
|
327
319
|
blocks
|
|
@@ -336,19 +328,19 @@ function sliceBlocks({
|
|
|
336
328
|
if (!startBlockKey || !endBlockKey)
|
|
337
329
|
return slice;
|
|
338
330
|
for (const block of blocks) {
|
|
339
|
-
if (!isTextBlock(context, block) && block._key === startBlockKey && block._key === endBlockKey) {
|
|
331
|
+
if (!schema.isTextBlock(context, block) && block._key === startBlockKey && block._key === endBlockKey) {
|
|
340
332
|
startBlock = block;
|
|
341
333
|
break;
|
|
342
334
|
}
|
|
343
335
|
if (block._key === startBlockKey) {
|
|
344
|
-
if (!isTextBlock(context, block)) {
|
|
336
|
+
if (!schema.isTextBlock(context, block)) {
|
|
345
337
|
startBlock = block;
|
|
346
338
|
continue;
|
|
347
339
|
}
|
|
348
340
|
if (startChildKey) {
|
|
349
341
|
for (const child of block.children) {
|
|
350
342
|
if (child._key === startChildKey) {
|
|
351
|
-
if (isSpan
|
|
343
|
+
if (schema.isSpan(context, child)) {
|
|
352
344
|
const text = child._key === endChildKey ? child.text.slice(startPoint.offset, endPoint.offset) : child.text.slice(startPoint.offset);
|
|
353
345
|
startBlock = {
|
|
354
346
|
...block,
|
|
@@ -366,7 +358,7 @@ function sliceBlocks({
|
|
|
366
358
|
break;
|
|
367
359
|
continue;
|
|
368
360
|
}
|
|
369
|
-
if (startBlock && isTextBlock(context, startBlock) && (endChildKey && child._key === endChildKey && isSpan
|
|
361
|
+
if (startBlock && schema.isTextBlock(context, startBlock) && (endChildKey && child._key === endChildKey && schema.isSpan(context, child) ? startBlock.children.push({
|
|
370
362
|
...child,
|
|
371
363
|
text: child.text.slice(0, endPoint.offset)
|
|
372
364
|
}) : startBlock.children.push(child), block._key === endBlockKey && endChildKey && child._key === endChildKey))
|
|
@@ -380,7 +372,7 @@ function sliceBlocks({
|
|
|
380
372
|
break;
|
|
381
373
|
}
|
|
382
374
|
if (block._key === endBlockKey) {
|
|
383
|
-
if (!isTextBlock(context, block)) {
|
|
375
|
+
if (!schema.isTextBlock(context, block)) {
|
|
384
376
|
endBlock = block;
|
|
385
377
|
break;
|
|
386
378
|
}
|
|
@@ -390,8 +382,8 @@ function sliceBlocks({
|
|
|
390
382
|
children: []
|
|
391
383
|
};
|
|
392
384
|
for (const child of block.children)
|
|
393
|
-
if (endBlock && isTextBlock(context, endBlock)) {
|
|
394
|
-
if (child._key === endChildKey && isSpan
|
|
385
|
+
if (endBlock && schema.isTextBlock(context, endBlock)) {
|
|
386
|
+
if (child._key === endChildKey && schema.isSpan(context, child)) {
|
|
395
387
|
endBlock.children.push({
|
|
396
388
|
...child,
|
|
397
389
|
text: child.text.slice(0, endPoint.offset)
|
|
@@ -419,9 +411,6 @@ exports.getSelectionStartPoint = getSelectionStartPoint;
|
|
|
419
411
|
exports.getTextBlockText = getTextBlockText;
|
|
420
412
|
exports.isKeyedSegment = isKeyedSegment;
|
|
421
413
|
exports.isListBlock = isListBlock;
|
|
422
|
-
exports.isSpan = isSpan$1;
|
|
423
|
-
exports.isSpan$1 = isSpan;
|
|
424
|
-
exports.isTextBlock = isTextBlock;
|
|
425
414
|
exports.isTypedObject = isTypedObject;
|
|
426
415
|
exports.parseAnnotation = parseAnnotation;
|
|
427
416
|
exports.parseBlock = parseBlock;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.slice-blocks.cjs","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/selection/selection-point.ts","../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/utils/util.is-span.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 type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\n\nexport function getBlockKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const blockPathSegment = point.path.at(0)\n\n if (isKeyedSegment(blockPathSegment)) {\n return blockPathSegment._key\n }\n\n return undefined\n}\n\nexport function getChildKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const childPathSegment = point.path.at(2)\n\n if (isKeyedSegment(childPathSegment)) {\n return childPathSegment._key\n }\n\n return undefined\n}\n","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 validateFields: 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 validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nexport function parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean; validateFields: 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 if (!isTypedObject(block)) {\n return false\n }\n\n if (block._type !== context.schema.block.name) {\n return false\n }\n\n if (!Array.isArray(block.children)) {\n return false\n }\n\n return true\n}\n\nexport function parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean; validateFields: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(block)) {\n if (\n key === '_type' ||\n key === '_key' ||\n key === 'children' ||\n key === 'markDefs' ||\n key === 'style' ||\n key === 'listItem' ||\n key === 'level'\n ) {\n continue\n }\n\n if (options.validateFields) {\n if (context.schema.block.fields?.some((field) => field.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\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 ...customFields,\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 if (!isTypedObject(child)) {\n return false\n }\n\n if (child._type !== context.schema.span.name) {\n return false\n }\n\n if (typeof child.text !== 'string') {\n return false\n }\n\n return true\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; validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(span)) {\n if (\n key !== '_type' &&\n key !== '_key' &&\n key !== 'text' &&\n key !== 'marks'\n ) {\n customFields[key] = span[key]\n }\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 ...(options.validateFields ? {} : customFields),\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; validateFields: 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; validateFields: 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; validateFields: boolean}\n}): PortableTextObject {\n const {_type, _key, ...customFields} = object\n\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = options.validateFields\n ? 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 : customFields\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 {EditorContext} from '../editor/editor-snapshot'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\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: {path: ChildPath; offset: number} | 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 = getBlockKeyFromSelectionPoint(selectionPoint)\n const spanKey = getChildKeyFromSelectionPoint(selectionPoint)\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 {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {isTextBlock} from '../internal-utils/parse-blocks'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\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: BlockPath\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 {EditorSelection, EditorSelectionPoint} from '..'\n\n/**\n * @public\n */\nexport function getSelectionEndPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '..'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\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 {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 {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '..'\nimport {isSpan, isTextBlock} from '../internal-utils/parse-blocks'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from '../utils/util.get-selection-end-point'\nimport {getSelectionStartPoint} from '../utils/util.get-selection-start-point'\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 = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\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":["isKeyedSegment","segment","getBlockKeyFromSelectionPoint","point","blockPathSegment","path","at","_key","getChildKeyFromSelectionPoint","childPathSegment","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","children","customFields","key","Object","keys","validateFields","fields","some","field","refreshKeys","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","map","child","parseSpan","span","parseInlineObject","inlineObject","filter","length","text","marks","style","styles","defaultStyle","console","error","lists","list","isSpan","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","values","reduce","fieldValues","fieldValue","blockOffsetToSpanSelectionPoint","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","spanSelectionPointToBlockOffset","blockKey","spanKey","getBlockStartPoint","node","getSelectionEndPoint","selection","backward","anchor","focus","getSelectionStartPoint","getTextBlockText","join","sliceBlocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"util.slice-blocks.cjs","sources":["../../src/utils/util.is-keyed-segment.ts","../../src/selection/selection-point.ts","../../src/utils/util.block-offset.ts","../../src/utils/util.get-block-start-point.ts","../../src/utils/util.get-selection-end-point.ts","../../src/utils/util.get-selection-start-point.ts","../../src/utils/util.get-text-block-text.ts","../../src/internal-utils/asserters.ts","../../src/internal-utils/parse-blocks.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 type {EditorSelectionPoint} from '../types/editor'\nimport {isKeyedSegment} from '../utils/util.is-keyed-segment'\n\nexport function getBlockKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const blockPathSegment = point.path.at(0)\n\n if (isKeyedSegment(blockPathSegment)) {\n return blockPathSegment._key\n }\n\n return undefined\n}\n\nexport function getChildKeyFromSelectionPoint(point: EditorSelectionPoint) {\n const childPathSegment = point.path.at(2)\n\n if (isKeyedSegment(childPathSegment)) {\n return childPathSegment._key\n }\n\n return undefined\n}\n","import {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {ChildPath} from '../types/paths'\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: {path: ChildPath; offset: number} | 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 = getBlockKeyFromSelectionPoint(selectionPoint)\n const spanKey = getChildKeyFromSelectionPoint(selectionPoint)\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 {isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport type {BlockPath} from '../types/paths'\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: BlockPath\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 {EditorSelection, EditorSelectionPoint} from '..'\n\n/**\n * @public\n */\nexport function getSelectionEndPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.anchor : selection.focus\n ) as TEditorSelectionPoint\n}\n","import type {EditorSelection, EditorSelectionPoint} from '..'\n\n/**\n * @public\n */\nexport function getSelectionStartPoint<\n TEditorSelection extends NonNullable<EditorSelection> | null,\n TEditorSelectionPoint extends\n EditorSelectionPoint | null = TEditorSelection extends NonNullable<EditorSelection>\n ? EditorSelectionPoint\n : null,\n>(selection: TEditorSelection): TEditorSelectionPoint {\n if (!selection) {\n return null as TEditorSelectionPoint\n }\n\n return (\n selection.backward ? selection.focus : selection.anchor\n ) as TEditorSelectionPoint\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 {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 {isTextBlock} from '@portabletext/schema'\nimport 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 validateFields: 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 validateFields: boolean\n }\n}): PortableTextBlock | undefined {\n return (\n parseTextBlock({block, context, options}) ??\n parseBlockObject({blockObject: block, context, options})\n )\n}\n\nexport function parseBlockObject({\n blockObject,\n context,\n options,\n}: {\n blockObject: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean; validateFields: 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 parseTextBlock({\n block,\n context,\n options,\n}: {\n block: unknown\n context: Pick<EditorContext, 'keyGenerator' | 'schema'>\n options: {refreshKeys: boolean; validateFields: boolean}\n}): PortableTextTextBlock | undefined {\n if (!isTypedObject(block)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(block)) {\n if (\n key === '_type' ||\n key === '_key' ||\n key === 'children' ||\n key === 'markDefs' ||\n key === 'style' ||\n key === 'listItem' ||\n key === 'level'\n ) {\n continue\n }\n\n if (options.validateFields) {\n if (context.schema.block.fields?.some((field) => field.name === key)) {\n customFields[key] = block[key]\n }\n } else {\n customFields[key] = block[key]\n }\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 ...customFields,\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 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; validateFields: boolean}\n}): PortableTextSpan | undefined {\n if (!isTypedObject(span)) {\n return undefined\n }\n\n const customFields: Record<string, unknown> = {}\n\n for (const key of Object.keys(span)) {\n if (\n key !== '_type' &&\n key !== '_key' &&\n key !== 'text' &&\n key !== 'marks'\n ) {\n customFields[key] = span[key]\n }\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 ...(options.validateFields ? {} : customFields),\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; validateFields: 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; validateFields: 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; validateFields: boolean}\n}): PortableTextObject {\n const {_type, _key, ...customFields} = object\n\n // Validates all props on the object and only takes those that match\n // the name of a field\n const values = options.validateFields\n ? 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 : customFields\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 {isSpan, isTextBlock} from '@portabletext/schema'\nimport type {PortableTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from '../utils/util.get-selection-end-point'\nimport {getSelectionStartPoint} from '../utils/util.get-selection-start-point'\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 = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\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":["isKeyedSegment","segment","getBlockKeyFromSelectionPoint","point","blockPathSegment","path","at","_key","getChildKeyFromSelectionPoint","childPathSegment","blockOffsetToSpanSelectionPoint","context","blockOffset","direction","offsetLeft","offset","selectionPoint","skippedInlineObject","block","value","isTextBlock","child","children","isSpan","text","length","spanSelectionPointToBlockOffset","blockKey","spanKey","getBlockStartPoint","node","getSelectionEndPoint","selection","backward","anchor","focus","getSelectionStartPoint","getTextBlockText","map","join","isTypedObject","object","isRecord","_type","parseBlocks","blocks","options","Array","isArray","flatMap","parsedBlock","parseBlock","parseTextBlock","parseBlockObject","blockObject","schemaType","schema","blockObjects","find","name","parseObject","keyGenerator","isListBlock","level","undefined","listItem","customFields","key","Object","keys","validateFields","fields","some","field","refreshKeys","unparsedMarkDefs","markDefs","markDefKeyMap","Map","markDef","annotations","parsedAnnotation","set","parseSpan","span","parseInlineObject","inlineObject","filter","marks","style","styles","defaultStyle","console","error","lists","list","mark","markDefKey","get","decorators","decorator","inlineObjects","parseAnnotation","annotation","values","reduce","fieldValues","fieldValue","sliceBlocks","slice","startBlock","middleBlocks","endBlock","startPoint","endPoint","startBlockKey","startChildKey","endBlockKey","endChildKey","push"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var util_sliceBlocks = require("./util.slice-blocks.cjs"), util_childSelectionPointToBlockOffset = require("./util.child-selection-point-to-block-offset.cjs");
|
|
2
|
+
var util_sliceBlocks = require("./util.slice-blocks.cjs"), util_childSelectionPointToBlockOffset = require("./util.child-selection-point-to-block-offset.cjs"), schema = require("@portabletext/schema");
|
|
3
3
|
function selectionPointToBlockOffset({
|
|
4
4
|
context,
|
|
5
5
|
selectionPoint
|
|
@@ -32,7 +32,7 @@ function sliceTextBlock({
|
|
|
32
32
|
const children = [];
|
|
33
33
|
for (const child of block.children) {
|
|
34
34
|
if (child._key === startChildKey) {
|
|
35
|
-
if (startChildFound = !0,
|
|
35
|
+
if (startChildFound = !0, schema.isSpan(context, child)) {
|
|
36
36
|
const text = child._key === endChildKey ? child.text.slice(startPoint.offset, endPoint.offset) : child.text.slice(startPoint.offset);
|
|
37
37
|
children.push({
|
|
38
38
|
...child,
|
|
@@ -45,7 +45,7 @@ function sliceTextBlock({
|
|
|
45
45
|
continue;
|
|
46
46
|
}
|
|
47
47
|
if (child._key === endChildKey) {
|
|
48
|
-
|
|
48
|
+
schema.isSpan(context, child) ? children.push({
|
|
49
49
|
...child,
|
|
50
50
|
text: child.text.slice(0, endPoint.offset)
|
|
51
51
|
}) : children.push(child);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.slice-text-block.cjs","sources":["../../src/utils/util.selection-point-to-block-offset.ts","../../src/utils/util.slice-text-block.ts"],"sourcesContent":["import type {EditorContext} from '../editor/editor-snapshot'\nimport {getBlockKeyFromSelectionPoint} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {childSelectionPointToBlockOffset} from './util.child-selection-point-to-block-offset'\n\n/**\n * @public\n */\nexport function selectionPointToBlockOffset({\n context,\n selectionPoint,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n const blockKey = getBlockKeyFromSelectionPoint(selectionPoint)\n\n if (selectionPoint.path.length === 1 && blockKey !== undefined) {\n return {\n path: [{_key: blockKey}],\n offset: selectionPoint.offset,\n }\n }\n\n return childSelectionPointToBlockOffset({\n context,\n selectionPoint,\n })\n}\n","import
|
|
1
|
+
{"version":3,"file":"util.slice-text-block.cjs","sources":["../../src/utils/util.selection-point-to-block-offset.ts","../../src/utils/util.slice-text-block.ts"],"sourcesContent":["import type {EditorContext} from '../editor/editor-snapshot'\nimport {getBlockKeyFromSelectionPoint} from '../selection/selection-point'\nimport type {BlockOffset} from '../types/block-offset'\nimport type {EditorSelectionPoint} from '../types/editor'\nimport {childSelectionPointToBlockOffset} from './util.child-selection-point-to-block-offset'\n\n/**\n * @public\n */\nexport function selectionPointToBlockOffset({\n context,\n selectionPoint,\n}: {\n context: Pick<EditorContext, 'schema' | 'value'>\n selectionPoint: EditorSelectionPoint\n}): BlockOffset | undefined {\n const blockKey = getBlockKeyFromSelectionPoint(selectionPoint)\n\n if (selectionPoint.path.length === 1 && blockKey !== undefined) {\n return {\n path: [{_key: blockKey}],\n offset: selectionPoint.offset,\n }\n }\n\n return childSelectionPointToBlockOffset({\n context,\n selectionPoint,\n })\n}\n","import {isSpan} from '@portabletext/schema'\nimport type {PortableTextChild, PortableTextTextBlock} from '@sanity/types'\nimport type {EditorContext} from '../editor/editor-snapshot'\nimport {\n getBlockKeyFromSelectionPoint,\n getChildKeyFromSelectionPoint,\n} from '../selection/selection-point'\nimport {getSelectionEndPoint} from './util.get-selection-end-point'\nimport {getSelectionStartPoint} from './util.get-selection-start-point'\n\nexport function sliceTextBlock({\n context,\n block,\n}: {\n context: Pick<EditorContext, 'schema' | 'selection'>\n block: PortableTextTextBlock\n}): PortableTextTextBlock {\n const startPoint = getSelectionStartPoint(context.selection)\n const endPoint = getSelectionEndPoint(context.selection)\n\n if (!startPoint || !endPoint) {\n return block\n }\n\n const startBlockKey = getBlockKeyFromSelectionPoint(startPoint)\n const endBlockKey = getBlockKeyFromSelectionPoint(endPoint)\n\n if (startBlockKey !== endBlockKey || startBlockKey !== block._key) {\n return block\n }\n\n const startChildKey = getChildKeyFromSelectionPoint(startPoint)\n const endChildKey = getChildKeyFromSelectionPoint(endPoint)\n\n if (!startChildKey || !endChildKey) {\n return block\n }\n\n let startChildFound = false\n const children: Array<PortableTextChild> = []\n\n for (const child of block.children) {\n if (child._key === startChildKey) {\n startChildFound = true\n\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 children.push({\n ...child,\n text,\n })\n } else {\n children.push(child)\n }\n\n if (startChildKey === endChildKey) {\n break\n }\n\n continue\n }\n\n if (child._key === endChildKey) {\n if (isSpan(context, child)) {\n children.push({\n ...child,\n text: child.text.slice(0, endPoint.offset),\n })\n } else {\n children.push(child)\n }\n\n break\n }\n\n if (startChildFound) {\n children.push(child)\n }\n }\n\n return {\n ...block,\n children,\n }\n}\n"],"names":["selectionPointToBlockOffset","context","selectionPoint","blockKey","getBlockKeyFromSelectionPoint","path","length","undefined","_key","offset","childSelectionPointToBlockOffset","sliceTextBlock","block","startPoint","getSelectionStartPoint","selection","endPoint","getSelectionEndPoint","startBlockKey","endBlockKey","startChildKey","getChildKeyFromSelectionPoint","endChildKey","startChildFound","children","child","isSpan","text","slice","push"],"mappings":";;AASO,SAASA,4BAA4B;AAAA,EAC1CC;AAAAA,EACAC;AAIF,GAA4B;AAC1B,QAAMC,WAAWC,iBAAAA,8BAA8BF,cAAc;AAE7D,SAAIA,eAAeG,KAAKC,WAAW,KAAKH,aAAaI,SAC5C;AAAA,IACLF,MAAM,CAAC;AAAA,MAACG,MAAML;AAAAA,IAAAA,CAAS;AAAA,IACvBM,QAAQP,eAAeO;AAAAA,EAAAA,IAIpBC,uEAAiC;AAAA,IACtCT;AAAAA,IACAC;AAAAA,EAAAA,CACD;AACH;ACnBO,SAASS,eAAe;AAAA,EAC7BV;AAAAA,EACAW;AAIF,GAA0B;AACxB,QAAMC,aAAaC,iBAAAA,uBAAuBb,QAAQc,SAAS,GACrDC,WAAWC,iBAAAA,qBAAqBhB,QAAQc,SAAS;AAEvD,MAAI,CAACF,cAAc,CAACG;AAClB,WAAOJ;AAGT,QAAMM,gBAAgBd,iBAAAA,8BAA8BS,UAAU,GACxDM,cAAcf,iBAAAA,8BAA8BY,QAAQ;AAE1D,MAAIE,kBAAkBC,eAAeD,kBAAkBN,MAAMJ;AAC3D,WAAOI;AAGT,QAAMQ,gBAAgBC,iBAAAA,8BAA8BR,UAAU,GACxDS,cAAcD,iBAAAA,8BAA8BL,QAAQ;AAE1D,MAAI,CAACI,iBAAiB,CAACE;AACrB,WAAOV;AAGT,MAAIW,kBAAkB;AACtB,QAAMC,WAAqC,CAAA;AAE3C,aAAWC,SAASb,MAAMY,UAAU;AAClC,QAAIC,MAAMjB,SAASY,eAAe;AAGhC,UAFAG,kBAAkB,IAEdG,OAAAA,OAAOzB,SAASwB,KAAK,GAAG;AAC1B,cAAME,OACJF,MAAMjB,SAASc,cACXG,MAAME,KAAKC,MAAMf,WAAWJ,QAAQO,SAASP,MAAM,IACnDgB,MAAME,KAAKC,MAAMf,WAAWJ,MAAM;AAExCe,iBAASK,KAAK;AAAA,UACZ,GAAGJ;AAAAA,UACHE;AAAAA,QAAAA,CACD;AAAA,MACH;AACEH,iBAASK,KAAKJ,KAAK;AAGrB,UAAIL,kBAAkBE;AACpB;AAGF;AAAA,IACF;AAEA,QAAIG,MAAMjB,SAASc,aAAa;AAC1BI,aAAAA,OAAOzB,SAASwB,KAAK,IACvBD,SAASK,KAAK;AAAA,QACZ,GAAGJ;AAAAA,QACHE,MAAMF,MAAME,KAAKC,MAAM,GAAGZ,SAASP,MAAM;AAAA,MAAA,CAC1C,IAEDe,SAASK,KAAKJ,KAAK;AAGrB;AAAA,IACF;AAEIF,uBACFC,SAASK,KAAKJ,KAAK;AAAA,EAEvB;AAEA,SAAO;AAAA,IACL,GAAGb;AAAAA,IACHY;AAAAA,EAAAA;AAEJ;;;"}
|