From 772aadb70aea0dde702b0115b44dc7c173117430 Mon Sep 17 00:00:00 2001 From: Ian Storm Taylor Date: Fri, 5 Aug 2016 10:32:00 -0700 Subject: [PATCH] fix insertText to do nothing in void nodes --- lib/models/state.js | 9 +++++-- lib/models/transforms.js | 6 ++++- .../insert-text-at-range/inside-void/index.js | 17 ++++++++++++ .../inside-void/input.yaml | 5 ++++ .../inside-void/output.yaml | 5 ++++ .../fixtures/insert-text/inside-void/index.js | 27 +++++++++++++++++++ .../insert-text/inside-void/input.yaml | 5 ++++ .../insert-text/inside-void/output.yaml | 5 ++++ 8 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 test/transforms/fixtures/insert-text-at-range/inside-void/index.js create mode 100644 test/transforms/fixtures/insert-text-at-range/inside-void/input.yaml create mode 100644 test/transforms/fixtures/insert-text-at-range/inside-void/output.yaml create mode 100644 test/transforms/fixtures/insert-text/inside-void/index.js create mode 100644 test/transforms/fixtures/insert-text/inside-void/input.yaml create mode 100644 test/transforms/fixtures/insert-text/inside-void/output.yaml diff --git a/lib/models/state.js b/lib/models/state.js index 252608de2..f0c7e9e5e 100644 --- a/lib/models/state.js +++ b/lib/models/state.js @@ -879,10 +879,15 @@ class State extends new Record(DEFAULTS) { insertText(text, marks) { let state = this let { cursorMarks, document, selection } = state - let after = selection + let after + const isVoid = document.hasVoidParent(state.startText) // Determine what the selection should be after inserting. - if (selection.isExpanded) { + if (isVoid) { + after = selection + } + + else if (selection.isExpanded) { after = selection.collapseToStart().moveForward(text.length) } diff --git a/lib/models/transforms.js b/lib/models/transforms.js index 9548d5c45..bbe57ab3f 100644 --- a/lib/models/transforms.js +++ b/lib/models/transforms.js @@ -444,6 +444,11 @@ const Transforms = { insertTextAtRange(range, string, marks) { let node = this + // If inside a void node, do nothing. + const { startKey, startOffset } = range + const isVoid = node.hasVoidParent(startKey) + if (isVoid) return node + // When still expanded, remove the current range first. if (range.isExpanded) { node = node.deleteAtRange(range) @@ -451,7 +456,6 @@ const Transforms = { } // Insert text at the range's offset. - const { startKey, startOffset } = range let text = node.getDescendant(startKey) text = text.insertText(startOffset, string, marks) node = node.updateDescendant(text) diff --git a/test/transforms/fixtures/insert-text-at-range/inside-void/index.js b/test/transforms/fixtures/insert-text-at-range/inside-void/index.js new file mode 100644 index 000000000..c9b20f9d7 --- /dev/null +++ b/test/transforms/fixtures/insert-text-at-range/inside-void/index.js @@ -0,0 +1,17 @@ + +export default function (state) { + const { document, selection } = state + const texts = document.getTexts() + const first = texts.first() + const range = selection.merge({ + anchorKey: first.key, + anchorOffset: 0, + focusKey: first.key, + focusOffset: 0 + }) + + return state + .transform() + .insertTextAtRange(range, 'a') + .apply() +} diff --git a/test/transforms/fixtures/insert-text-at-range/inside-void/input.yaml b/test/transforms/fixtures/insert-text-at-range/inside-void/input.yaml new file mode 100644 index 000000000..8246cfbed --- /dev/null +++ b/test/transforms/fixtures/insert-text-at-range/inside-void/input.yaml @@ -0,0 +1,5 @@ + +nodes: + - kind: block + type: image + isVoid: true diff --git a/test/transforms/fixtures/insert-text-at-range/inside-void/output.yaml b/test/transforms/fixtures/insert-text-at-range/inside-void/output.yaml new file mode 100644 index 000000000..8246cfbed --- /dev/null +++ b/test/transforms/fixtures/insert-text-at-range/inside-void/output.yaml @@ -0,0 +1,5 @@ + +nodes: + - kind: block + type: image + isVoid: true diff --git a/test/transforms/fixtures/insert-text/inside-void/index.js b/test/transforms/fixtures/insert-text/inside-void/index.js new file mode 100644 index 000000000..b27b6b6d9 --- /dev/null +++ b/test/transforms/fixtures/insert-text/inside-void/index.js @@ -0,0 +1,27 @@ + +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: 0, + focusKey: first.key, + focusOffset: 0 + }) + + const next = state + .transform() + .moveTo(range) + .insertText('a') + .apply() + + assert.deepEqual( + next.selection.toJS(), + range.toJS() + ) + + return next +} diff --git a/test/transforms/fixtures/insert-text/inside-void/input.yaml b/test/transforms/fixtures/insert-text/inside-void/input.yaml new file mode 100644 index 000000000..8246cfbed --- /dev/null +++ b/test/transforms/fixtures/insert-text/inside-void/input.yaml @@ -0,0 +1,5 @@ + +nodes: + - kind: block + type: image + isVoid: true diff --git a/test/transforms/fixtures/insert-text/inside-void/output.yaml b/test/transforms/fixtures/insert-text/inside-void/output.yaml new file mode 100644 index 000000000..8246cfbed --- /dev/null +++ b/test/transforms/fixtures/insert-text/inside-void/output.yaml @@ -0,0 +1,5 @@ + +nodes: + - kind: block + type: image + isVoid: true