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