From 70ee777f377c97b6fd08d1d63729a85de93a4d00 Mon Sep 17 00:00:00 2001 From: Ian Storm Taylor Date: Fri, 7 Oct 2016 16:02:18 -0700 Subject: [PATCH] handle joining and inserting text nodes for moveNodeByKey --- src/transforms/at-range.js | 4 --- src/transforms/by-key.js | 33 ++++++++++++++++++- .../block/index.js | 2 +- .../block/input.yaml | 4 +-- .../by-key/move-node-by-key/block/output.yaml | 12 +++++++ .../inline}/index.js | 3 +- .../inline/input.yaml | 4 +-- .../inline/output.yaml} | 9 ++--- .../by-key/move-node-by-key/text/index.js | 11 +++++++ .../by-key/move-node-by-key/text/input.yaml | 12 +++++++ .../text/output.yaml | 5 +++ .../remove-node-by-key/block/output.yaml | 7 ---- .../by-key/remove-node-by-key/inline/index.js | 10 ------ .../remove-node-by-key/inline/output.yaml | 10 ------ .../middle-inline/output.yaml | 7 ---- .../by-key/remove-node-by-key/text/index.js | 10 ------ .../by-key/remove-node-by-key/text/input.yaml | 7 ---- 17 files changed, 84 insertions(+), 66 deletions(-) rename test/transforms/fixtures/by-key/{remove-node-by-key => move-node-by-key}/block/index.js (78%) rename test/transforms/fixtures/by-key/{remove-node-by-key => move-node-by-key}/block/input.yaml (77%) create mode 100644 test/transforms/fixtures/by-key/move-node-by-key/block/output.yaml rename test/transforms/fixtures/by-key/{remove-node-by-key/middle-inline => move-node-by-key/inline}/index.js (65%) rename test/transforms/fixtures/by-key/{remove-node-by-key => move-node-by-key}/inline/input.yaml (81%) rename test/transforms/fixtures/by-key/{remove-node-by-key/middle-inline/input.yaml => move-node-by-key/inline/output.yaml} (60%) create mode 100644 test/transforms/fixtures/by-key/move-node-by-key/text/index.js create mode 100644 test/transforms/fixtures/by-key/move-node-by-key/text/input.yaml rename test/transforms/fixtures/by-key/{remove-node-by-key => move-node-by-key}/text/output.yaml (51%) delete mode 100644 test/transforms/fixtures/by-key/remove-node-by-key/block/output.yaml delete mode 100644 test/transforms/fixtures/by-key/remove-node-by-key/inline/index.js delete mode 100644 test/transforms/fixtures/by-key/remove-node-by-key/inline/output.yaml delete mode 100644 test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/output.yaml delete mode 100644 test/transforms/fixtures/by-key/remove-node-by-key/text/index.js delete mode 100644 test/transforms/fixtures/by-key/remove-node-by-key/text/input.yaml diff --git a/src/transforms/at-range.js b/src/transforms/at-range.js index 367a0d63b..ce1612ce2 100644 --- a/src/transforms/at-range.js +++ b/src/transforms/at-range.js @@ -94,7 +94,6 @@ export function deleteAtRange(transform, range) { const lonely = document.getFurthest(endBlock, p => p.nodes.size == 1) || endBlock transform.removeNodeByKey(lonely.key) - transform.normalizeDocument() return transform } @@ -523,7 +522,6 @@ export function splitBlockAtRange(transform, range, height = 1) { } transform.splitNodeByKey(node.key, offset) - transform.normalizeDocument() return transform } @@ -672,7 +670,6 @@ export function unwrapBlockAtRange(transform, range, properties) { } }) - transform.normalizeDocument() return transform } @@ -714,7 +711,6 @@ export function unwrapInlineAtRange(transform, range, properties) { }) }) - transform.normalizeDocument() return transform } diff --git a/src/transforms/by-key.js b/src/transforms/by-key.js index 1be0b1c7b..b38146ea3 100644 --- a/src/transforms/by-key.js +++ b/src/transforms/by-key.js @@ -107,9 +107,39 @@ export function joinNodeByKey(transform, key, withKey) { export function moveNodeByKey(transform, key, newKey, newIndex) { const { state } = transform const { document } = state + const node = document.assertDescendant(key) + const prevParent = document.getParent(key) const path = document.getPath(key) const newPath = document.getPath(newKey) - return transform.moveNodeOperation(path, newPath, newIndex) + const parent = document.key == newKey ? document : document.assertDescendant(newKey) + const previous = newIndex == 0 ? null : parent.nodes.get(newIndex - 1) + const next = parent.nodes.get(newIndex) + transform.moveNodeOperation(path, newPath, newIndex) + + // If the node to move is a text node, and it will be moved adjacent to + // another text node, join them together. + if (node.kind == 'text') { + if (next && next.kind == 'text') { + transform.joinNodeByKey(next.key, node.key) + } + + if (previous && previous.kind == 'text') { + transform.joinNodeByKey(node.key, previous.key) + } + } + + // If the node to be moved is the last child of its parent, then create a new + // empty text node in its place. + if (prevParent.nodes.size == 1) { + if (prevParent.kind == 'block') { + const text = Text.create() + transform.insertNodeByKey(prevParent.key, 0, text) + } else { + transform.removeNodeByKey(prevParent.key) + } + } + + return transform } /** @@ -161,6 +191,7 @@ export function removeNodeByKey(transform, key) { (previous && previous.kind == 'text') && (next && next.kind == 'text') ) { + debugger transform.joinNodeByKey(next.key, previous.key) } diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/block/index.js b/test/transforms/fixtures/by-key/move-node-by-key/block/index.js similarity index 78% rename from test/transforms/fixtures/by-key/remove-node-by-key/block/index.js rename to test/transforms/fixtures/by-key/move-node-by-key/block/index.js index 92ee63209..59bfe59e5 100644 --- a/test/transforms/fixtures/by-key/remove-node-by-key/block/index.js +++ b/test/transforms/fixtures/by-key/move-node-by-key/block/index.js @@ -5,6 +5,6 @@ export default function (state) { return state .transform() - .removeNodeByKey(first.key) + .moveNodeByKey(first.key, document.key, 1) .apply() } diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/block/input.yaml b/test/transforms/fixtures/by-key/move-node-by-key/block/input.yaml similarity index 77% rename from test/transforms/fixtures/by-key/remove-node-by-key/block/input.yaml rename to test/transforms/fixtures/by-key/move-node-by-key/block/input.yaml index 881deb1d9..ee05966e8 100644 --- a/test/transforms/fixtures/by-key/remove-node-by-key/block/input.yaml +++ b/test/transforms/fixtures/by-key/move-node-by-key/block/input.yaml @@ -4,9 +4,9 @@ nodes: type: paragraph nodes: - kind: text - text: word + text: one - kind: block type: paragraph nodes: - kind: text - text: another + text: two diff --git a/test/transforms/fixtures/by-key/move-node-by-key/block/output.yaml b/test/transforms/fixtures/by-key/move-node-by-key/block/output.yaml new file mode 100644 index 000000000..0be0b6c01 --- /dev/null +++ b/test/transforms/fixtures/by-key/move-node-by-key/block/output.yaml @@ -0,0 +1,12 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: two + - kind: block + type: paragraph + nodes: + - kind: text + text: one diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/index.js b/test/transforms/fixtures/by-key/move-node-by-key/inline/index.js similarity index 65% rename from test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/index.js rename to test/transforms/fixtures/by-key/move-node-by-key/inline/index.js index 1a88ca23a..5227152ee 100644 --- a/test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/index.js +++ b/test/transforms/fixtures/by-key/move-node-by-key/inline/index.js @@ -1,10 +1,11 @@ export default function (state) { const { document, selection } = state + const block = document.getBlocks().first() const first = document.getInlines().first() return state .transform() - .removeNodeByKey(first.key) + .moveNodeByKey(first.key, block.key, 1) .apply() } diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/inline/input.yaml b/test/transforms/fixtures/by-key/move-node-by-key/inline/input.yaml similarity index 81% rename from test/transforms/fixtures/by-key/remove-node-by-key/inline/input.yaml rename to test/transforms/fixtures/by-key/move-node-by-key/inline/input.yaml index c17ccbcf2..496aeb02a 100644 --- a/test/transforms/fixtures/by-key/remove-node-by-key/inline/input.yaml +++ b/test/transforms/fixtures/by-key/move-node-by-key/inline/input.yaml @@ -7,9 +7,9 @@ nodes: type: link nodes: - kind: text - text: word + text: one - kind: inline type: link nodes: - kind: text - text: another + text: two diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/input.yaml b/test/transforms/fixtures/by-key/move-node-by-key/inline/output.yaml similarity index 60% rename from test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/input.yaml rename to test/transforms/fixtures/by-key/move-node-by-key/inline/output.yaml index 0fa3c627c..6f46511d3 100644 --- a/test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/input.yaml +++ b/test/transforms/fixtures/by-key/move-node-by-key/inline/output.yaml @@ -3,12 +3,13 @@ nodes: - kind: block type: paragraph nodes: - - kind: text - text: one - kind: inline type: link nodes: - kind: text text: two - - kind: text - text: three + - kind: inline + type: link + nodes: + - kind: text + text: one diff --git a/test/transforms/fixtures/by-key/move-node-by-key/text/index.js b/test/transforms/fixtures/by-key/move-node-by-key/text/index.js new file mode 100644 index 000000000..c08e67853 --- /dev/null +++ b/test/transforms/fixtures/by-key/move-node-by-key/text/index.js @@ -0,0 +1,11 @@ + +export default function (state) { + const { document, selection } = state + const text = document.getTexts().last() + const block = document.getBlocks().first() + + return state + .transform() + .moveNodeByKey(text.key, block.key, 1) + .apply() +} diff --git a/test/transforms/fixtures/by-key/move-node-by-key/text/input.yaml b/test/transforms/fixtures/by-key/move-node-by-key/text/input.yaml new file mode 100644 index 000000000..ee05966e8 --- /dev/null +++ b/test/transforms/fixtures/by-key/move-node-by-key/text/input.yaml @@ -0,0 +1,12 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: one + - kind: block + type: paragraph + nodes: + - kind: text + text: two diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/text/output.yaml b/test/transforms/fixtures/by-key/move-node-by-key/text/output.yaml similarity index 51% rename from test/transforms/fixtures/by-key/remove-node-by-key/text/output.yaml rename to test/transforms/fixtures/by-key/move-node-by-key/text/output.yaml index f6de4d08a..a4cad435b 100644 --- a/test/transforms/fixtures/by-key/remove-node-by-key/text/output.yaml +++ b/test/transforms/fixtures/by-key/move-node-by-key/text/output.yaml @@ -1,5 +1,10 @@ nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: onetwo - kind: block type: paragraph nodes: diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/block/output.yaml b/test/transforms/fixtures/by-key/remove-node-by-key/block/output.yaml deleted file mode 100644 index 6c07a315f..000000000 --- a/test/transforms/fixtures/by-key/remove-node-by-key/block/output.yaml +++ /dev/null @@ -1,7 +0,0 @@ - -nodes: - - kind: block - type: paragraph - nodes: - - kind: text - text: another diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/inline/index.js b/test/transforms/fixtures/by-key/remove-node-by-key/inline/index.js deleted file mode 100644 index 1a88ca23a..000000000 --- a/test/transforms/fixtures/by-key/remove-node-by-key/inline/index.js +++ /dev/null @@ -1,10 +0,0 @@ - -export default function (state) { - const { document, selection } = state - const first = document.getInlines().first() - - return state - .transform() - .removeNodeByKey(first.key) - .apply() -} diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/inline/output.yaml b/test/transforms/fixtures/by-key/remove-node-by-key/inline/output.yaml deleted file mode 100644 index df7991b4d..000000000 --- a/test/transforms/fixtures/by-key/remove-node-by-key/inline/output.yaml +++ /dev/null @@ -1,10 +0,0 @@ - -nodes: - - kind: block - type: paragraph - nodes: - - kind: inline - type: link - nodes: - - kind: text - text: another diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/output.yaml b/test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/output.yaml deleted file mode 100644 index ab9dcade9..000000000 --- a/test/transforms/fixtures/by-key/remove-node-by-key/middle-inline/output.yaml +++ /dev/null @@ -1,7 +0,0 @@ - -nodes: - - kind: block - type: paragraph - nodes: - - kind: text - text: onethree diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/text/index.js b/test/transforms/fixtures/by-key/remove-node-by-key/text/index.js deleted file mode 100644 index 809d05121..000000000 --- a/test/transforms/fixtures/by-key/remove-node-by-key/text/index.js +++ /dev/null @@ -1,10 +0,0 @@ - -export default function (state) { - const { document, selection } = state - const first = document.getTexts().first() - - return state - .transform() - .removeNodeByKey(first.key) - .apply() -} diff --git a/test/transforms/fixtures/by-key/remove-node-by-key/text/input.yaml b/test/transforms/fixtures/by-key/remove-node-by-key/text/input.yaml deleted file mode 100644 index 27f668fe2..000000000 --- a/test/transforms/fixtures/by-key/remove-node-by-key/text/input.yaml +++ /dev/null @@ -1,7 +0,0 @@ - -nodes: - - kind: block - type: paragraph - nodes: - - kind: text - text: word