From: Aleksander Ɓukasz Date: Mon, 4 Aug 2014 10:28:24 +0000 (+0200) Subject: editor: removing span on delete with only one character X-Git-Url: https://git.mdrn.pl/fnpeditor.git/commitdiff_plain/90a5dc9b9157cd3c02e9505661b7a22b953fae2e?ds=inline;hp=-c editor: removing span on delete with only one character --- 90a5dc9b9157cd3c02e9505661b7a22b953fae2e diff --git a/src/editor/modules/documentCanvas/canvas/keyboard.js b/src/editor/modules/documentCanvas/canvas/keyboard.js index f8aca73..18b6cfd 100644 --- a/src/editor/modules/documentCanvas/canvas/keyboard.js +++ b/src/editor/modules/documentCanvas/canvas/keyboard.js @@ -389,6 +389,24 @@ var handleKeyEvent = function(e, s) { }; // todo: whileRemoveWholetext var keyEventHandlers = [ + { + applies: function(e, s) { + return s.type === 'caret' && + s.element.wlxmlNode.parent().is({tagName: 'span'}) && + s.element.wlxmlNode.getText().length === 1 && + s.offset === 1 && + (e.key === KEYS.BACKSPACE); + }, + run: function(e, s) { + var params = {}, + prevTextNode = s.element.canvas.getPreviousTextElement(s.element).wlxmlNode; + e.preventDefault(); + s.element.wlxmlNode.parent().detach(params); + s.canvas.setCurrentElement( + (params.ret && params.ret.mergedTo) || prevTextNode, + {caretTo: params.ret ? params.ret.previousLen : (prevTextNode ? prevTextNode.getText().length : 0)}); + } + }, { applies: function(e, s) { return s.type === 'caret' && ( diff --git a/src/editor/plugins/core/core.test.js b/src/editor/plugins/core/core.test.js index 5afa23d..67e3e7e 100644 --- a/src/editor/plugins/core/core.test.js +++ b/src/editor/plugins/core/core.test.js @@ -409,6 +409,22 @@ describe('Keyboard interactions', function() { describe('backspace at the beginning of a span', function() { afterEach(removeCanvas); + it('deletes span if it contains only one character', function() { + var c = getCanvasFromXML('
Aliceha cat
'), + k = new Keyboard(c); + + k.withCaret('h|').press(K.BACKSPACE); + + var rootContents = c.wlxmlDocument.root.contents(); + expect(rootContents.length).to.equal(1); + expect(rootContents[0].getText()).to.equal('Alicea cat'); + + var selection = c.getSelection(); + expect(selection.type).to.equal('caret'); + expect(selection.element.sameNode(getTextElement('Alicea cat', c))).to.equal(true); + expect(selection.offset).to.equal(5); + }); + it('deletes from the end of the preceding text element', function() { var c = getCanvasFromXML('
Alicehas a cat
'), k = new Keyboard(c);