From 57da8da4b42ce84e4f085ca9766435c14807ea65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Sat, 10 Jun 2017 19:34:57 +0200 Subject: [PATCH] Fix selection after transform.wrapInline (#872) * Add failing test for wrapInline * Adapt tests for wrap-twice and whole-block * Adapt transform to move selection correctly * Fix lint errors * Use keys in yaml --- src/transforms/at-current-range.js | 18 +++++++++-- .../wrap-inline/twice/index.js | 10 +++---- .../wrap-inline/whole-block/index.js | 30 +++++++++++++++++++ .../wrap-inline/whole-block/input.yaml | 9 ++++++ .../wrap-inline/whole-block/output.yaml | 18 +++++++++++ 5 files changed, 77 insertions(+), 8 deletions(-) create mode 100644 test/transforms/fixtures/at-current-range/wrap-inline/whole-block/index.js create mode 100644 test/transforms/fixtures/at-current-range/wrap-inline/whole-block/input.yaml create mode 100644 test/transforms/fixtures/at-current-range/wrap-inline/whole-block/output.yaml diff --git a/src/transforms/at-current-range.js b/src/transforms/at-current-range.js index 80909395d..9f0b57a3a 100644 --- a/src/transforms/at-current-range.js +++ b/src/transforms/at-current-range.js @@ -424,7 +424,6 @@ Transforms.wrapInline = (transform, properties) => { let after const { startKey } = selection - const previous = document.getPreviousText(startKey) transform.deselect() transform.wrapInlineAtRange(selection, properties) @@ -437,8 +436,21 @@ Transforms.wrapInline = (transform, properties) => { } else if (selection.startOffset == 0) { - const text = previous ? document.getNextText(previous.key) : document.getFirstText() - after = selection.moveToRangeOf(text) + // Find the inline that has been inserted. + // We want to handle multiple wrap, so we need to take the highest parent + const inline = document.getAncestors(startKey) + .find(parent => ( + parent.kind == 'inline' && + parent.getOffset(startKey) == 0 + )) + + const start = inline ? document.getPreviousText(inline.getFirstText().key) : document.getFirstText() + const end = document.getNextText(inline ? inline.getLastText().key : start.key) + + // Move selection to wrap around the inline + after = selection + .moveAnchorToEndOf(start) + .moveFocusToStartOf(end) } else if (selection.startKey == selection.endKey) { diff --git a/test/transforms/fixtures/at-current-range/wrap-inline/twice/index.js b/test/transforms/fixtures/at-current-range/wrap-inline/twice/index.js index 892f3cb4d..6dbd2db7f 100644 --- a/test/transforms/fixtures/at-current-range/wrap-inline/twice/index.js +++ b/test/transforms/fixtures/at-current-range/wrap-inline/twice/index.js @@ -19,15 +19,15 @@ export default function (state) { .wrapInline('outer') .apply() - const updated = next.document.getTexts().get(1) + const anchor = next.document.getTexts().get(0) + const focus = next.document.getTexts().get(4) - // TODO: seems wrong. assert.deepEqual( next.selection.toJS(), range.merge({ - anchorKey: updated.key, - anchorOffset: 0, - focusKey: updated.key, + anchorKey: anchor.key, + anchorOffset: anchor.length, + focusKey: focus.key, focusOffset: 0 }).toJS() ) diff --git a/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/index.js b/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/index.js new file mode 100644 index 000000000..e68bb24b6 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/index.js @@ -0,0 +1,30 @@ + +import assert from 'assert' + +export default function (state) { + const { selection } = state + const range = selection.merge({ + anchorKey: 'b', + anchorOffset: 0, + focusKey: 'b', + focusOffset: 4 + }) + + const next = state + .transform() + .select(range) + .wrapInline('hashtag') + .apply() + + assert.deepEqual( + next.selection.toJS(), + range.merge({ + anchorKey: '4', + anchorOffset: 0, + focusKey: '5', + focusOffset: 0 + }).toJS() + ) + + return next +} diff --git a/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/input.yaml b/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/input.yaml new file mode 100644 index 000000000..2f577b082 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/input.yaml @@ -0,0 +1,9 @@ + +nodes: + - kind: block + type: paragraph + key: a + nodes: + - kind: text + key: b + text: word diff --git a/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/output.yaml b/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/output.yaml new file mode 100644 index 000000000..3f5f98052 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/wrap-inline/whole-block/output.yaml @@ -0,0 +1,18 @@ + +nodes: + - kind: block + key: a + type: paragraph + nodes: + - kind: text + key: c + text: "" + - kind: inline + type: hashtag + nodes: + - kind: text + key: b + text: word + - kind: text + key: d + text: ""