From 66beb53d8311c422fe21637493136780002d0fc5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Tue, 6 May 2014 11:33:23 +0200 Subject: [PATCH] getElementForNode handles both text and element nodes --- .../documentCanvas/canvas/canvas.test.js | 20 +++++++++- .../documentCanvas/canvas/genericElement.js | 7 +--- .../modules/documentCanvas/canvas/utils.js | 40 ++++++++++--------- .../documentCanvas/canvas/wlxmlListener.js | 2 +- 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/src/editor/modules/documentCanvas/canvas/canvas.test.js b/src/editor/modules/documentCanvas/canvas/canvas.test.js index 9d6d94e..f64754f 100644 --- a/src/editor/modules/documentCanvas/canvas/canvas.test.js +++ b/src/editor/modules/documentCanvas/canvas/canvas.test.js @@ -125,7 +125,7 @@ describe('Listening to document changes', function() { aTextElement; canvas.fromXMLDocument(doc); - aTextElement = utils.getElementForTextNode(aTextNode); + aTextElement = utils.getElementForNode(aTextNode); aTextElement.setText(''); @@ -220,6 +220,24 @@ describe('Default document changes handling', function() { expect(sectionChildren[1].wlxmlNode.getTagName()).to.equal('a'); }); + it('handles moving text node to another parent', function() { + var c = getCanvasFromXML('
Alice
has
a cat.
'), + doc = c.wlxmlDocument, + text = doc.root.contents()[0], + div = doc.root.contents()[1]; + + div.append(text); + + var sectionChildren = c.doc().children(); + expect(sectionChildren.length).to.equal(2); + expect(sectionChildren[0].wlxmlNode.sameNode(div)).to.equal(true); + expect(sectionChildren[1].getText()).to.equal('a cat.'); + + expect(div.contents().length).to.equal(2); + expect(div.contents()[0].getTagName()).to.equal('span'); + expect(div.contents()[1].getText()).to.equal('Alice'); + }); + it('handles change in a text node', function() { var c = getCanvasFromXML('
Alice
'); c.wlxmlDocument.root.contents()[0].setText('cat'); diff --git a/src/editor/modules/documentCanvas/canvas/genericElement.js b/src/editor/modules/documentCanvas/canvas/genericElement.js index f115bd4..4bdc524 100644 --- a/src/editor/modules/documentCanvas/canvas/genericElement.js +++ b/src/editor/modules/documentCanvas/canvas/genericElement.js @@ -104,12 +104,7 @@ $.extend(generic, { } if(event.type === 'nodeMoved') { - /* globals Node */ - if(event.meta.node.nodeType === Node.TEXT_NODE) { - actionArg = utils.getElementForTextNode(event.meta.node); - } else { - actionArg = utils.getElementForNode(event.meta.node); - } + actionArg = utils.getElementForNode(event.meta.node, event.meta.parent); } else { actionArg = event.meta.node; } diff --git a/src/editor/modules/documentCanvas/canvas/utils.js b/src/editor/modules/documentCanvas/canvas/utils.js index 62845e3..130d51c 100644 --- a/src/editor/modules/documentCanvas/canvas/utils.js +++ b/src/editor/modules/documentCanvas/canvas/utils.js @@ -21,13 +21,26 @@ var nearestInDocumentOrder = function(selector, direction, element) { }; -var getElementForNode = function(node) { - - var ptr = node.nodeType === Node.TEXT_NODE ? node.parent() : node; - while(!ptr.getData('canvasElement')) { - ptr = ptr.parent(); +var getElementForNode = function(node, withParent) { + if(node.nodeType === Node.TEXT_NODE) { + return _getElementForTextNode(node, withParent); } - return ptr.getData('canvasElement'); + while(!node.getData('canvasElement')) { + node = node.parent(); + } + return node.getData('canvasElement'); +}; + +var _getElementForTextNode = function(textNode, withParent) { + var parentElement = getElementForNode(withParent || textNode.parent()), + toret; + parentElement.children().some(function(child) { + if(child.wlxmlNode.sameNode(textNode)) { + toret = child; + return true; + } + }); + return toret; }; var getElementForDetachedNode = function(node, originalParent) { @@ -41,17 +54,7 @@ var getElementForDetachedNode = function(node, originalParent) { return ptr.getData('canvasElement'); }; -var getElementForTextNode = function(textNode) { - var parentElement = getElementForNode(textNode.parent()), - toret; - parentElement.children().some(function(child) { - if(child.wlxmlNode.sameNode(textNode)) { - toret = child; - return true; - } - }); - return toret; -}; + return { nearestInDocumentOrder: nearestInDocumentOrder, @@ -59,8 +62,7 @@ return { ZWS: '\u200B' }, getElementForNode: getElementForNode, - getElementForDetachedNode: getElementForDetachedNode, - getElementForTextNode: getElementForTextNode + getElementForDetachedNode: getElementForDetachedNode }; }); diff --git a/src/editor/modules/documentCanvas/canvas/wlxmlListener.js b/src/editor/modules/documentCanvas/canvas/wlxmlListener.js index bb09ec7..54d6134 100644 --- a/src/editor/modules/documentCanvas/canvas/wlxmlListener.js +++ b/src/editor/modules/documentCanvas/canvas/wlxmlListener.js @@ -78,7 +78,7 @@ var handlers = { element.handle(event); }, nodeTextChange: function(event) { - var element = utils.getElementForTextNode(event.meta.node); + var element = utils.getElementForNode(event.meta.node); element.handle(event); }, -- 2.20.1