X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/24ac4f5092661ce053f33d460306bf81d6a3dc8a..83f83c6ba32734d4d6b53125d2eb4adb039ea3de:/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 87911cf..620e652 100644 --- a/src/editor/modules/documentCanvas/canvas/utils.js +++ b/src/editor/modules/documentCanvas/canvas/utils.js @@ -3,13 +3,14 @@ define([ ], function($) { 'use strict'; - +/* globals Node */ var nearestInDocumentOrder = function(selector, direction, element) { var parents = $(element).parents(), parent = parents.length ? $(parents[parents.length-1]) : element; var adj = parent.find(selector).filter(function() { + /*jshint bitwise: false*/ return this.compareDocumentPosition(element) & (direction === 'above' ? Node.DOCUMENT_POSITION_FOLLOWING : Node.DOCUMENT_POSITION_PRECEDING); }); @@ -17,31 +18,58 @@ var nearestInDocumentOrder = function(selector, direction, element) { return adj[direction === 'above' ? adj.length-1 : 0]; } return null; -} +}; + +var getElementForElementRootNode = function(node) { + return node.getData('canvasElement'); +}; + +var getElementForNode = function(node) { + while(!node.getData('canvasElement')) { + node = node.parent(); + } + return node.getData('canvasElement'); +}; -var findCanvasElement = function(node) { - if(node.nodeType === Node.ELEMENT_NODE) { +var getElementForDetachedNode = function(node, originalParent) { + var ptr = originalParent; + if(ptr === null) { return node.getData('canvasElement'); } - if(node.nodeType === Node.TEXT_NODE) { - var parent = node.parent(), - toret; - - parent.children().forEach(function(child) { - if(child.data('wlxmlNode').sameNode(node)) - toret = child; - }); - if(toret) - return toret; + while(!ptr.getData('canvasElement')) { + ptr = ptr.parent(); + } + return ptr.getData('canvasElement'); +}; + +var caretPositionFromPoint = function(x, y) { + /* globals document */ + var range, textNode, offset; + if(document.caretPositionFromPoint) { + range = document.caretPositionFromPoint(x, y); + textNode = range.offsetNode; + offset = range.offset; + } else if(document.caretRangeFromPoint) { + range = document.caretRangeFromPoint(x, y); + textNode = range.startContainer; + offset = range.startOffset; } + return { + textNode: textNode, + offset: offset + }; }; + return { nearestInDocumentOrder: nearestInDocumentOrder, - findCanvasElement: findCanvasElement, unicode: { ZWS: '\u200B' - } + }, + getElementForNode: getElementForNode, + getElementForDetachedNode: getElementForDetachedNode, + getElementForElementRootNode: getElementForElementRootNode, + caretPositionFromPoint: caretPositionFromPoint }; });