From 68d26cdf7937f223960265ba13a355d1991a779b Mon Sep 17 00:00:00 2001 From: aeneasr Date: Fri, 18 Nov 2016 11:41:57 +0100 Subject: [PATCH 1/3] added failing test case for inlines causing selection issue #432 --- .../repeatedly-before-inline/index.js | 35 +++++++++++++++++++ .../repeatedly-before-inline/input.yaml | 19 ++++++++++ .../repeatedly-before-inline/output.yaml | 22 ++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/index.js create mode 100644 test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/input.yaml create mode 100644 test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/output.yaml diff --git a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/index.js b/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/index.js new file mode 100644 index 000000000..3a67cc3ca --- /dev/null +++ b/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/index.js @@ -0,0 +1,35 @@ + +import assert from 'assert' + +export default function (state) { + const { document, selection } = state + const texts = document.getTexts() + const first = texts.first() + const range = selection.merge({ + anchorKey: first.key, + anchorOffset: 4, + focusKey: first.key, + focusOffset: 4 + }) + + const next = state + .transform() + .moveTo(range) + .splitBlock() + .apply() + .transform() + .deleteBackward() + .apply() + .transform() + .splitBlock() + .apply() + + const updated = next.document.getTexts().get(1) + + assert.deepEqual( + next.selection.toJS(), + range.collapseToStartOf(updated).toJS() + ) + + return next +} diff --git a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/input.yaml b/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/input.yaml new file mode 100644 index 000000000..49bd05570 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/input.yaml @@ -0,0 +1,19 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: word + - kind: inline + type: link + data: + href: 'website.com' + nodes: + - kind: text + text: hyperlink + - kind: block + type: paragraph + nodes: + - kind: text + text: word \ No newline at end of file diff --git a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/output.yaml b/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/output.yaml new file mode 100644 index 000000000..42973df7a --- /dev/null +++ b/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/output.yaml @@ -0,0 +1,22 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: word + - kind: block + type: paragraph + nodes: + - kind: inline + type: link + data: + href: 'website.com' + nodes: + - kind: text + text: hyperlink + - kind: block + type: paragraph + nodes: + - kind: text + text: word From 7567be22103e41110b99b180148e7ef043612c56 Mon Sep 17 00:00:00 2001 From: Ian Storm Taylor Date: Fri, 18 Nov 2016 11:11:27 -0800 Subject: [PATCH 2/3] simplify before-inline split-block test --- src/transforms/at-current-range.js | 25 ++++++++++++++++--- .../index.js | 16 ++++-------- .../input.yaml | 5 +--- .../output.yaml | 3 --- 4 files changed, 27 insertions(+), 22 deletions(-) rename test/transforms/fixtures/at-current-range/split-block/{repeatedly-before-inline => before-inline}/index.js (66%) rename test/transforms/fixtures/at-current-range/split-block/{repeatedly-before-inline => before-inline}/input.yaml (80%) rename test/transforms/fixtures/at-current-range/split-block/{repeatedly-before-inline => before-inline}/output.yaml (87%) diff --git a/src/transforms/at-current-range.js b/src/transforms/at-current-range.js index cf683a67a..8d593929c 100644 --- a/src/transforms/at-current-range.js +++ b/src/transforms/at-current-range.js @@ -312,10 +312,27 @@ export function splitBlock(transform, depth = 1) { state = transform.state document = state.document - const { startKey } = selection - const startNode = document.getDescendant(startKey) - const nextNode = document.getNextText(startNode.key) - const after = selection.collapseToStartOf(nextNode) + const { startKey, startOffset } = selection + const startText = document.getNode(startKey) + const startBlock = document.getClosestBlock(startKey) + const startInline = startBlock.getFurthestInline(startKey) + const nextText = document.getNextText(startText.key) + let after + + // If the selection is at the start of the highest inline child inside the + // block, the starting text node won't need to be split. + if ( + (startOffset == 0) && + (startText == startInline || startInline.getOffset(startText.key) == 0) + ) { + after = selection.collapseToStartOf(startText) + } + + // Otherwise, we'll need to move the selection forward one to account for the + // text node that was split. + else { + after = selection.collapseToStartOf(nextText) + } return transform.moveTo(after) } diff --git a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/index.js b/test/transforms/fixtures/at-current-range/split-block/before-inline/index.js similarity index 66% rename from test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/index.js rename to test/transforms/fixtures/at-current-range/split-block/before-inline/index.js index 3a67cc3ca..09cb21230 100644 --- a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/index.js +++ b/test/transforms/fixtures/at-current-range/split-block/before-inline/index.js @@ -4,12 +4,12 @@ import assert from 'assert' export default function (state) { const { document, selection } = state const texts = document.getTexts() - const first = texts.first() + const second = texts.get(1) const range = selection.merge({ - anchorKey: first.key, - anchorOffset: 4, - focusKey: first.key, - focusOffset: 4 + anchorKey: second.key, + anchorOffset: 0, + focusKey: second.key, + focusOffset: 0 }) const next = state @@ -17,12 +17,6 @@ export default function (state) { .moveTo(range) .splitBlock() .apply() - .transform() - .deleteBackward() - .apply() - .transform() - .splitBlock() - .apply() const updated = next.document.getTexts().get(1) diff --git a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/input.yaml b/test/transforms/fixtures/at-current-range/split-block/before-inline/input.yaml similarity index 80% rename from test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/input.yaml rename to test/transforms/fixtures/at-current-range/split-block/before-inline/input.yaml index 49bd05570..cd77b2980 100644 --- a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/input.yaml +++ b/test/transforms/fixtures/at-current-range/split-block/before-inline/input.yaml @@ -12,8 +12,5 @@ nodes: nodes: - kind: text text: hyperlink - - kind: block - type: paragraph - nodes: - kind: text - text: word \ No newline at end of file + text: word diff --git a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/output.yaml b/test/transforms/fixtures/at-current-range/split-block/before-inline/output.yaml similarity index 87% rename from test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/output.yaml rename to test/transforms/fixtures/at-current-range/split-block/before-inline/output.yaml index 42973df7a..aeb0b0161 100644 --- a/test/transforms/fixtures/at-current-range/split-block/repeatedly-before-inline/output.yaml +++ b/test/transforms/fixtures/at-current-range/split-block/before-inline/output.yaml @@ -15,8 +15,5 @@ nodes: nodes: - kind: text text: hyperlink - - kind: block - type: paragraph - nodes: - kind: text text: word From 3c6819fdc40f0c8135ce39e89b993496fabd43f6 Mon Sep 17 00:00:00 2001 From: Ian Storm Taylor Date: Fri, 18 Nov 2016 11:33:40 -0800 Subject: [PATCH 3/3] fix logic for empty blocks --- src/transforms/at-current-range.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/transforms/at-current-range.js b/src/transforms/at-current-range.js index 8d593929c..adb130ac3 100644 --- a/src/transforms/at-current-range.js +++ b/src/transforms/at-current-range.js @@ -323,7 +323,8 @@ export function splitBlock(transform, depth = 1) { // block, the starting text node won't need to be split. if ( (startOffset == 0) && - (startText == startInline || startInline.getOffset(startText.key) == 0) + (startBlock.text != '') && + (!startInline || startInline.getOffset(startText.key) == 0) ) { after = selection.collapseToStartOf(startText) }