From 270c2ab2195c430413b3fbac39379811d41b0798 Mon Sep 17 00:00:00 2001 From: Nikita Zyulyaev Date: Wed, 26 Oct 2016 21:30:45 +0300 Subject: [PATCH] Fix inserting fragment at the end of current text node (#405) * fix insertFragment * insert multi-block fragment at the end of current text node test case --- src/transforms/at-current-range.js | 7 +--- .../end-block-multiple-blocks/fragment.yaml | 17 ++++++++ .../end-block-multiple-blocks/index.js | 41 +++++++++++++++++++ .../end-block-multiple-blocks/input.yaml | 7 ++++ .../end-block-multiple-blocks/output.yaml | 17 ++++++++ 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/fragment.yaml create mode 100644 test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/index.js create mode 100644 test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/input.yaml create mode 100644 test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/output.yaml diff --git a/src/transforms/at-current-range.js b/src/transforms/at-current-range.js index 767247091..fad058576 100644 --- a/src/transforms/at-current-range.js +++ b/src/transforms/at-current-range.js @@ -262,6 +262,7 @@ export function insertFragment(transform, fragment) { const lastText = fragment.getTexts().last() const lastInline = fragment.getClosestInline(lastText) const beforeTexts = document.getTexts() + const appending = selection.hasEdgeAtEndOf(document.getDescendant(selection.endKey)) transform.unsetSelection() transform.insertFragmentAtRange(selection, fragment) @@ -270,17 +271,13 @@ export function insertFragment(transform, fragment) { const keys = beforeTexts.map(text => text.key) const news = document.getTexts().filter(n => !keys.includes(n.key)) - const text = news.size ? news.takeLast(2).first() : null + const text = appending ? news.last() : news.takeLast(2).first() let after if (text && lastInline) { after = selection.collapseToEndOf(text) } - else if (text && lastInline) { - after = selection.collapseToStart() - } - else if (text) { after = selection .collapseToStartOf(text) diff --git a/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/fragment.yaml b/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/fragment.yaml new file mode 100644 index 000000000..e1fea2c54 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/fragment.yaml @@ -0,0 +1,17 @@ + +nodes: + - kind: block + type: list-item + nodes: + - kind: text + text: fragment + - kind: block + type: list-item + nodes: + - kind: text + text: second fragment + - kind: block + type: list-item + nodes: + - kind: text + text: third fragment diff --git a/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/index.js b/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/index.js new file mode 100644 index 000000000..79217cfcb --- /dev/null +++ b/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/index.js @@ -0,0 +1,41 @@ + +import assert from 'assert' +import path from 'path' +import readMetadata from 'read-metadata' +import { Raw } from '../../../../../..' + +export default function (state) { + const file = path.resolve(__dirname, 'fragment.yaml') + const raw = readMetadata.sync(file) + const fragment = Raw.deserialize(raw, { terse: true }).document + + const { document, selection } = state + const texts = document.getTexts() + const first = texts.first() + const range = selection.merge({ + anchorKey: first.key, + anchorOffset: first.length, + focusKey: first.key, + focusOffset: first.length + }) + + const next = state + .transform() + .moveTo(range) + .insertFragment(fragment) + .apply() + + const last = next.document.getTexts().last() + + assert.deepEqual( + next.selection.toJS(), + range.merge({ + anchorKey: last.key, + anchorOffset: last.length, + focusKey: last.key, + focusOffset: last.length + }).toJS() + ) + + return next +} diff --git a/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/input.yaml b/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/input.yaml new file mode 100644 index 000000000..27f668fe2 --- /dev/null +++ b/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/input.yaml @@ -0,0 +1,7 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: word diff --git a/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/output.yaml b/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/output.yaml new file mode 100644 index 000000000..66415017e --- /dev/null +++ b/test/transforms/fixtures/at-current-range/insert-fragment/end-block-multiple-blocks/output.yaml @@ -0,0 +1,17 @@ + +nodes: + - kind: block + type: paragraph + nodes: + - kind: text + text: wordfragment + - kind: block + type: list-item + nodes: + - kind: text + text: second fragment + - kind: block + type: list-item + nodes: + - kind: text + text: third fragment \ No newline at end of file