From 86cbb0d49ac3ff99127bd7c1d38eb58913d133e3 Mon Sep 17 00:00:00 2001 From: Per-Kristian Nordnes Date: Fri, 24 Feb 2017 00:06:20 +0100 Subject: [PATCH] Allow document to have no nodes when deleting a single void-block. Partially fixes #505 (#622) --- src/transforms/at-range.js | 4 ++-- src/transforms/normalize.js | 12 ++++++++++-- .../delete-backward/single-non-void-block/index.js | 10 ++++++++++ .../delete-backward/single-non-void-block/input.yaml | 7 +++++++ .../single-non-void-block/output.yaml | 7 +++++++ .../delete-backward/single-void-block/index.js | 10 ++++++++++ .../delete-backward/single-void-block/input.yaml | 5 +++++ .../delete-backward/single-void-block/output.yaml | 2 ++ .../delete-forward/single-non-void-block/index.js | 10 ++++++++++ .../delete-forward/single-non-void-block/input.yaml | 7 +++++++ .../delete-forward/single-non-void-block/output.yaml | 7 +++++++ .../delete-forward/single-void-block/index.js | 10 ++++++++++ .../delete-forward/single-void-block/input.yaml | 5 +++++ .../delete-forward/single-void-block/output.yaml | 2 ++ 14 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/index.js create mode 100644 test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/input.yaml create mode 100644 test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/output.yaml create mode 100644 test/transforms/fixtures/at-current-range/delete-backward/single-void-block/index.js create mode 100644 test/transforms/fixtures/at-current-range/delete-backward/single-void-block/input.yaml create mode 100644 test/transforms/fixtures/at-current-range/delete-backward/single-void-block/output.yaml create mode 100644 test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/index.js create mode 100644 test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/input.yaml create mode 100644 test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/output.yaml create mode 100644 test/transforms/fixtures/at-current-range/delete-forward/single-void-block/index.js create mode 100644 test/transforms/fixtures/at-current-range/delete-forward/single-void-block/input.yaml create mode 100644 test/transforms/fixtures/at-current-range/delete-forward/single-void-block/output.yaml diff --git a/src/transforms/at-range.js b/src/transforms/at-range.js index 0985be0d4..c58e9ce71 100644 --- a/src/transforms/at-range.js +++ b/src/transforms/at-range.js @@ -211,7 +211,7 @@ export function deleteBackwardAtRange(transform, range, n = 1, options = {}) { return } // If the closest is not void, but empty, remove it - if (block && !block.isVoid && block.isEmpty) { + if (block && !block.isVoid && block.isEmpty && document.nodes.size !== 1) { transform.removeNodeByKey(block.key, { normalize }) return } @@ -395,7 +395,7 @@ export function deleteForwardAtRange(transform, range, n = 1, options = {}) { return } // If the closest is not void, but empty, remove it - if (block && !block.isVoid && block.isEmpty) { + if (block && !block.isVoid && block.isEmpty && document.nodes.size !== 1) { transform.removeNodeByKey(block.key, { normalize }) return } diff --git a/src/transforms/normalize.js b/src/transforms/normalize.js index 80e2900e3..93ad987e1 100644 --- a/src/transforms/normalize.js +++ b/src/transforms/normalize.js @@ -60,16 +60,24 @@ export function normalizeNodeByKey(transform, key, schema) { export function normalizeSelection(transform) { let { state } = transform let { document, selection } = state + + // If document is empty, return + if (document.nodes.size === 0) { + return + } + selection = selection.normalize(document) // If the selection is unset, or the anchor or focus key in the selection are - // pointing to nodes that no longer exist, warn and reset the selection. + // pointing to nodes that no longer exist, warn (if not unset) and reset the selection. if ( selection.isUnset || !document.hasDescendant(selection.anchorKey) || !document.hasDescendant(selection.focusKey) ) { - warn('The selection was invalid and was reset to start of the document. The selection in question was:', selection) + if (!selection.isUnset) { + warn('The selection was invalid and was reset to start of the document. The selection in question was:', selection) + } const firstText = document.getFirstText() selection = selection.merge({ diff --git a/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/index.js b/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/index.js new file mode 100644 index 000000000..d0f1fb632 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/index.js @@ -0,0 +1,10 @@ + +export default function (state) { + const { document } = state + const nodeToBeFocused = document.nodes.first() + return state + .transform() + .collapseToEndOf(nodeToBeFocused) + .deleteBackward() + .apply() +} diff --git a/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/input.yaml b/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/input.yaml new file mode 100644 index 000000000..f6de4d08a --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/input.yaml @@ -0,0 +1,7 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: "" diff --git a/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/output.yaml b/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/output.yaml new file mode 100644 index 000000000..f6de4d08a --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-backward/single-non-void-block/output.yaml @@ -0,0 +1,7 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: "" diff --git a/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/index.js b/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/index.js new file mode 100644 index 000000000..d0f1fb632 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/index.js @@ -0,0 +1,10 @@ + +export default function (state) { + const { document } = state + const nodeToBeFocused = document.nodes.first() + return state + .transform() + .collapseToEndOf(nodeToBeFocused) + .deleteBackward() + .apply() +} diff --git a/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/input.yaml b/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/input.yaml new file mode 100644 index 000000000..8246cfbed --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/input.yaml @@ -0,0 +1,5 @@ + +nodes: + - kind: block + type: image + isVoid: true diff --git a/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/output.yaml b/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/output.yaml new file mode 100644 index 000000000..2ff6774b7 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-backward/single-void-block/output.yaml @@ -0,0 +1,2 @@ + +nodes: [] diff --git a/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/index.js b/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/index.js new file mode 100644 index 000000000..f2efe732f --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/index.js @@ -0,0 +1,10 @@ + +export default function (state) { + const { document } = state + const nodeToBeFocused = document.nodes.first() + return state + .transform() + .collapseToStartOf(nodeToBeFocused) + .deleteForward() + .apply() +} diff --git a/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/input.yaml b/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/input.yaml new file mode 100644 index 000000000..f6de4d08a --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/input.yaml @@ -0,0 +1,7 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: "" diff --git a/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/output.yaml b/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/output.yaml new file mode 100644 index 000000000..f6de4d08a --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-forward/single-non-void-block/output.yaml @@ -0,0 +1,7 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: "" diff --git a/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/index.js b/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/index.js new file mode 100644 index 000000000..f2efe732f --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/index.js @@ -0,0 +1,10 @@ + +export default function (state) { + const { document } = state + const nodeToBeFocused = document.nodes.first() + return state + .transform() + .collapseToStartOf(nodeToBeFocused) + .deleteForward() + .apply() +} diff --git a/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/input.yaml b/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/input.yaml new file mode 100644 index 000000000..8246cfbed --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/input.yaml @@ -0,0 +1,5 @@ + +nodes: + - kind: block + type: image + isVoid: true diff --git a/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/output.yaml b/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/output.yaml new file mode 100644 index 000000000..2ff6774b7 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/delete-forward/single-void-block/output.yaml @@ -0,0 +1,2 @@ + +nodes: []