diff --git a/.changeset/two-lies-appear.md b/.changeset/two-lies-appear.md
new file mode 100644
index 000000000..f5ebe105a
--- /dev/null
+++ b/.changeset/two-lies-appear.md
@@ -0,0 +1,5 @@
+---
+slate: patch
+---
+
+Fixed a bug in splitting and applying overlapping marks to text nodes.
diff --git a/packages/slate/src/create-editor.ts b/packages/slate/src/create-editor.ts
index aa436ca96..f19d93846 100644
--- a/packages/slate/src/create-editor.ts
+++ b/packages/slate/src/create-editor.ts
@@ -224,8 +224,10 @@ export const createEditor = (): Editor => {
let n = 0
for (let i = 0; i < node.children.length; i++, n++) {
+ const currentNode = Node.get(editor, path)
+ if (Text.isText(currentNode)) continue
const child = node.children[i] as Descendant
- const prev = node.children[i - 1] as Descendant
+ const prev = currentNode.children[n - 1] as Descendant
const isLast = i === node.children.length - 1
const isInlineOrText =
Text.isText(child) ||
diff --git a/packages/slate/src/transforms/node.ts b/packages/slate/src/transforms/node.ts
index 2a4d2d061..0178b9f36 100644
--- a/packages/slate/src/transforms/node.ts
+++ b/packages/slate/src/transforms/node.ts
@@ -592,17 +592,21 @@ export const NodeTransforms: NodeTransforms = {
const rangeRef = Editor.rangeRef(editor, at, { affinity: 'inward' })
const [start, end] = Range.edges(at)
const splitMode = mode === 'lowest' ? 'lowest' : 'highest'
+ const endAtEndOfNode = Editor.isEnd(editor, end, end.path)
Transforms.splitNodes(editor, {
at: end,
match,
mode: splitMode,
voids,
+ always: !endAtEndOfNode,
})
+ const startAtStartOfNode = Editor.isStart(editor, start, start.path)
Transforms.splitNodes(editor, {
at: start,
match,
mode: splitMode,
voids,
+ always: !startAtStartOfNode,
})
at = rangeRef.unref()!
diff --git a/packages/slate/test/transforms/setNodes/text/merge-across.tsx b/packages/slate/test/transforms/setNodes/text/merge-across.tsx
new file mode 100644
index 000000000..7b5b086d8
--- /dev/null
+++ b/packages/slate/test/transforms/setNodes/text/merge-across.tsx
@@ -0,0 +1,41 @@
+/** @jsx jsx */
+import { Transforms, Text } from 'slate'
+import { jsx } from '../../..'
+
+export const run = editor => {
+ Transforms.setNodes(
+ editor,
+ { key: true },
+ { match: Text.isText, split: true }
+ )
+}
+export const input = (
+
+
+
+ One
+
+
+ Two
+
+
+ Three
+
+
+
+)
+export const output = (
+
+
+
+ One
+
+
+
+ Two
+
+
+ Three
+
+
+)