/** * 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 */ import Bookmark from './Bookmark'; import Tools from 'tinymce/core/api/util/Tools'; import TreeWalker from 'tinymce/core/api/dom/TreeWalker'; import RangeUtils from 'tinymce/core/api/dom/RangeUtils'; import { Editor } from 'tinymce/core/api/Editor'; /** * 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 */ const getSelectedElements = function (rootElm: HTMLElement, startNode: Node, endNode: Node) { let walker, node; const 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; }; const unwrapElements = function (editor: Editor, elms: HTMLElement) { let 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)); }; const isLink = function (elm: HTMLElement) { return elm.nodeName === 'A' && elm.hasAttribute('href'); }; const getParentAnchorOrSelf = function (dom, elm: Node) { const anchorElm = dom.getParent(elm, isLink); return anchorElm ? anchorElm : elm; }; const getSelectedAnchors = function (editor: Editor) { let 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; }; const unlinkSelection = function (editor: Editor) { unwrapElements(editor, getSelectedAnchors(editor)); }; export default { unlinkSelection };