diff --git a/packages/slate/src/transforms/node.ts b/packages/slate/src/transforms/node.ts index 521f89d9e..4fac582a8 100644 --- a/packages/slate/src/transforms/node.ts +++ b/packages/slate/src/transforms/node.ts @@ -381,8 +381,7 @@ export const NodeTransforms: NodeTransforms = { const emptyAncestor = Editor.above(editor, { at: path, mode: 'highest', - match: n => - levels.includes(n) && Element.isElement(n) && n.children.length === 1, + match: n => levels.includes(n) && hasSingleChildNest(editor, n), }) const emptyRef = emptyAncestor && Editor.pathRef(editor, emptyAncestor[1]) @@ -963,6 +962,23 @@ export const NodeTransforms: NodeTransforms = { }, } +const hasSingleChildNest = (editor: Editor, node: Node): boolean => { + if (Element.isElement(node)) { + const element = node as Element + if (Editor.isVoid(editor, node)) { + return true + } else if (element.children.length === 1) { + return hasSingleChildNest(editor, element.children[0]) + } else { + return false + } + } else if (Editor.isEditor(node)) { + return false + } else { + return true + } +} + /** * Convert a range into a point by deleting it's content. */ diff --git a/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-multi-child.tsx b/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-multi-child.tsx new file mode 100644 index 000000000..61eaf01a7 --- /dev/null +++ b/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-multi-child.tsx @@ -0,0 +1,63 @@ +/** @jsx jsx */ +import { jsx } from '../../..' +import { Transforms } from 'slate' + +export const run = editor => { + Transforms.mergeNodes(editor, { + at: { + path: [0, 1, 1, 0, 0, 0], + offset: 0, + }, + }) +} + +export const input = ( + + + + 123 + + + + 45 + + + + + c + + + + edf + + + + + + + +) + +export const output = ( + + + + 123 + + + + 45c + + + + + + edf + + + + + + + +) diff --git a/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-only-child.tsx b/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-only-child.tsx new file mode 100644 index 000000000..72562bbc4 --- /dev/null +++ b/packages/slate/test/transforms/mergeNodes/depth-block/block-nested-only-child.tsx @@ -0,0 +1,49 @@ +/** @jsx jsx */ +import { jsx } from '../../..' +import { Transforms } from 'slate' + +export const run = editor => { + Transforms.mergeNodes(editor, { + at: { + path: [0, 1, 1, 0, 0, 0], + offset: 0, + }, + }) +} + +export const input = ( + + + + 123 + + + + 45 + + + + + c + + + + + + +) + +export const output = ( + + + + 123 + + + + 45c + + + + +)