X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/2c0f5a6242a51bab12bd383b0097cba6027020dd..872eb8cad5640b85c8d9286ef0af0237bf825f00:/src/editor/modules/documentCanvas/canvas/utils.js diff --git a/src/editor/modules/documentCanvas/canvas/utils.js b/src/editor/modules/documentCanvas/canvas/utils.js index 9f5ee46..4e262a0 100644 --- a/src/editor/modules/documentCanvas/canvas/utils.js +++ b/src/editor/modules/documentCanvas/canvas/utils.js @@ -3,7 +3,7 @@ define([ ], function($) { 'use strict'; - +/* globals Node */ var nearestInDocumentOrder = function(selector, direction, element) { var parents = $(element).parents(), @@ -20,38 +20,68 @@ var nearestInDocumentOrder = function(selector, direction, element) { return null; }; -var findCanvasElement = function(node) { - if(node.nodeType === Node.ELEMENT_NODE) { - return node.getData('canvasElement'); - } +var getElementForElementRootNode = function(node, withParent) { if(node.nodeType === Node.TEXT_NODE) { - return findCanvasElementInParent(node, node.parent()); + return _getElementForRootTextNode(node, withParent); } + return node.getData('canvasElement'); }; -/** - * We take child and its parent as arguments separatly to - * handle situation where child was removed from WLXMLDocument - * and it lost reference to its parent (but we may still have it on canvas). -*/ -var findCanvasElementInParent = function(wlxmlChildNode, wlxmlParentNode) { - var parentElement = findCanvasElement(wlxmlParentNode), +var _getElementForRootTextNode = function(textNode, withParent) { + var parentElement = getElementForNode(withParent || textNode.parent()), toret; - parentElement.children().forEach(function(child) { - if(child.data('wlxmlNode').sameNode(wlxmlChildNode)) { + parentElement.children().some(function(child) { + if(child.wlxmlNode.sameNode(textNode)) { toret = child; + return true; } }); return toret; }; +var getElementForNode = function(node, withParent) { + if(node.nodeType === Node.TEXT_NODE) { + return _getElementForTextNode(node, withParent); + } + 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 || parentElement; +}; + +var getElementForDetachedNode = function(node, originalParent) { + var ptr = originalParent; + if(ptr === null) { + return node.getData('canvasElement'); + } + while(!ptr.getData('canvasElement')) { + ptr = ptr.parent(); + } + return ptr.getData('canvasElement'); +}; + + + return { nearestInDocumentOrder: nearestInDocumentOrder, - findCanvasElement: findCanvasElement, - findCanvasElementInParent: findCanvasElementInParent, unicode: { ZWS: '\u200B' - } + }, + getElementForNode: getElementForNode, + getElementForDetachedNode: getElementForDetachedNode, + getElementForElementRootNode: getElementForElementRootNode }; });