/**
* Unlink.js
*
* Released under LGPL License.
* Copyright (c) 1999-2016 Ephox Corp. All rights reserved
*
* License: http://www.tinymce.com/license
* Contributing: http://www.tinymce.com/contributing
*/
/**
* Unlink implementation that doesn't leave partial links for example it would produce:
* a[bc]de -> a[bc]de
* instead of:
* a[bc]de -> a[bc]de
*/
define("tinymce/inlite/alien/Unlink", [
'tinymce/inlite/alien/Bookmark',
'global!tinymce.util.Tools',
'global!tinymce.dom.TreeWalker',
'global!tinymce.dom.RangeUtils'
], function (Bookmark, Tools, TreeWalker, RangeUtils) {
var getSelectedElements = function (rootElm, startNode, endNode) {
var walker, node, elms = [];
walker = new TreeWalker(startNode, rootElm);
for (node = startNode; node; node = walker.next()) {
if (node.nodeType === 1) {
elms.push(node);
}
if (node === endNode) {
break;
}
}
return elms;
};
var unwrapElements = function (editor, elms) {
var bookmark, dom, selection;
dom = editor.dom;
selection = editor.selection;
bookmark = Bookmark.create(dom, selection.getRng());
Tools.each(elms, function (elm) {
editor.dom.remove(elm, true);
});
selection.setRng(Bookmark.resolve(dom, bookmark));
};
var isLink = function (elm) {
return elm.nodeName === 'A' && elm.hasAttribute('href');
};
var getParentAnchorOrSelf = function (dom, elm) {
var anchorElm = dom.getParent(elm, isLink);
return anchorElm ? anchorElm : elm;
};
var getSelectedAnchors = function (editor) {
var startElm, endElm, rootElm, anchorElms, selection, dom, rng;
selection = editor.selection;
dom = editor.dom;
rng = selection.getRng();
startElm = getParentAnchorOrSelf(dom, RangeUtils.getNode(rng.startContainer, rng.startOffset));
endElm = RangeUtils.getNode(rng.endContainer, rng.endOffset);
rootElm = editor.getBody();
anchorElms = Tools.grep(getSelectedElements(rootElm, startElm, endElm), isLink);
return anchorElms;
};
var unlinkSelection = function (editor) {
unwrapElements(editor, getSelectedAnchors(editor));
};
return {
unlinkSelection: unlinkSelection
};
});