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 + + +)