diff --git a/packages/slate/src/changes/at-current-range.js b/packages/slate/src/changes/at-current-range.js index 7107b244d..957090482 100644 --- a/packages/slate/src/changes/at-current-range.js +++ b/packages/slate/src/changes/at-current-range.js @@ -217,8 +217,12 @@ Changes.insertText = (change, text, marks) => { Changes.splitBlock = (change, depth = 1) => { const { value } = change - const { selection } = value + const { selection, document } = value + const marks = selection.marks || document.getInsertMarksAtRange(selection) change.splitBlockAtRange(selection, depth).collapseToEnd() + if (marks && marks.size !== 0) { + change.select({ marks }) + } } /** diff --git a/packages/slate/src/changes/at-range.js b/packages/slate/src/changes/at-range.js index 7c549eb76..5d429b90d 100644 --- a/packages/slate/src/changes/at-range.js +++ b/packages/slate/src/changes/at-range.js @@ -992,12 +992,7 @@ Changes.setInlineAtRange = (...args) => { Changes.splitBlockAtRange = (change, range, height = 1, options = {}) => { const normalize = change.getFlag('normalize', options) - if (range.isExpanded) { - change.deleteAtRange(range, { normalize }) - range = range.collapseToStart() - } - - const { startKey, startOffset } = range + const { startKey, startOffset, endOffset, endKey } = range const { value } = change const { document } = value let node = document.assertDescendant(startKey) @@ -1010,7 +1005,19 @@ Changes.splitBlockAtRange = (change, range, height = 1, options = {}) => { h++ } - change.splitDescendantsByKey(node.key, startKey, startOffset, { normalize }) + change.splitDescendantsByKey(node.key, startKey, startOffset, { + normalize: normalize && range.isCollapsed, + }) + + if (range.isExpanded) { + if (range.isBackward) range = range.flip() + const nextBlock = change.value.document.getNextBlock(node.key) + range = range.moveAnchorToStartOf(nextBlock) + if (startKey === endKey) { + range = range.moveFocusTo(range.anchorKey, endOffset - startOffset) + } + change.deleteAtRange(range, { normalize }) + } } /** diff --git a/packages/slate/test/changes/at-current-range/split-block/with-delete-hanging-selection.js b/packages/slate/test/changes/at-current-range/split-block/with-delete-hanging-selection.js new file mode 100644 index 000000000..96f269c1d --- /dev/null +++ b/packages/slate/test/changes/at-current-range/split-block/with-delete-hanging-selection.js @@ -0,0 +1,33 @@ +/** @jsx h */ + +import h from '../../../helpers/h' + +export default function(change) { + change.splitBlock() +} + +export const input = ( + + + zero + + word + + + cat is cute + + + +) + +export const output = ( + + + zero + + + cat is cute + + + +) diff --git a/packages/slate/test/changes/at-current-range/split-block/with-marks.js b/packages/slate/test/changes/at-current-range/split-block/with-marks.js new file mode 100644 index 000000000..e9f808591 --- /dev/null +++ b/packages/slate/test/changes/at-current-range/split-block/with-marks.js @@ -0,0 +1,38 @@ +/** @jsx h */ + +import h from '../../../helpers/h' + +export default function(change) { + change + .addMark('italic') + .splitBlock() + .insertText('cat is cute') +} + +export const input = ( + + + + word + + + + +) + +export const output = ( + + + + word + + + + + cat is cute + + + + + +)