123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- ///import core
- ///commands 为非ie浏览器自动添加a标签
- ///commandsName AutoLink
- ///commandsTitle 自动增加链接
- /**
- * @description 为非ie浏览器自动添加a标签
- * @author zhanyi
- */
- UE.plugin.register(
- "autolink",
- function() {
- var cont = 0;
- return !browser.ie
- ? {
- bindEvents: {
- reset: function() {
- cont = 0;
- },
- keydown: function(type, evt) {
- var me = this;
- var keyCode = evt.keyCode || evt.which;
- if (keyCode == 32 || keyCode == 13) {
- var sel = me.selection.getNative(),
- range = sel.getRangeAt(0).cloneRange(),
- offset,
- charCode;
- var start = range.startContainer;
- while (start.nodeType == 1 && range.startOffset > 0) {
- start =
- range.startContainer.childNodes[range.startOffset - 1];
- if (!start) {
- break;
- }
- range.setStart(
- start,
- start.nodeType == 1
- ? start.childNodes.length
- : start.nodeValue.length
- );
- range.collapse(true);
- start = range.startContainer;
- }
- do {
- if (range.startOffset == 0) {
- start = range.startContainer.previousSibling;
- while (start && start.nodeType == 1) {
- start = start.lastChild;
- }
- if (!start || domUtils.isFillChar(start)) {
- break;
- }
- offset = start.nodeValue.length;
- } else {
- start = range.startContainer;
- offset = range.startOffset;
- }
- range.setStart(start, offset - 1);
- charCode = range.toString().charCodeAt(0);
- } while (charCode != 160 && charCode != 32);
- if (
- range
- .toString()
- .replace(new RegExp(domUtils.fillChar, "g"), "")
- .match(/(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i)
- ) {
- while (range.toString().length) {
- if (
- /^(?:https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.)/i.test(
- range.toString()
- )
- ) {
- break;
- }
- try {
- range.setStart(
- range.startContainer,
- range.startOffset + 1
- );
- } catch (e) {
- //trace:2121
- var start = range.startContainer;
- while (!(next = start.nextSibling)) {
- if (domUtils.isBody(start)) {
- return;
- }
- start = start.parentNode;
- }
- range.setStart(next, 0);
- }
- }
- //range的开始边界已经在a标签里的不再处理
- if (
- domUtils.findParentByTagName(
- range.startContainer,
- "a",
- true
- )
- ) {
- return;
- }
- var a = me.document.createElement("a"),
- text = me.document.createTextNode(" "),
- href;
- me.undoManger && me.undoManger.save();
- a.appendChild(range.extractContents());
- a.href = a.innerHTML = a.innerHTML.replace(/<[^>]+>/g, "");
- href = a
- .getAttribute("href")
- .replace(new RegExp(domUtils.fillChar, "g"), "");
- href = /^(?:https?:\/\/)/gi.test(href)
- ? href
- : "http://" + href;
- a.setAttribute("_src", utils.html(href));
- a.href = utils.html(href);
- range.insertNode(a);
- a.parentNode.insertBefore(text, a.nextSibling);
- range.setStart(text, 0);
- range.collapse(true);
- sel.removeAllRanges();
- sel.addRange(range);
- me.undoManger && me.undoManger.save();
- }
- }
- }
- }
- }
- : {};
- },
- function() {
- var keyCodes = {
- 37: 1,
- 38: 1,
- 39: 1,
- 40: 1,
- 13: 1,
- 32: 1
- };
- function checkIsCludeLink(node) {
- if (node.nodeType == 3) {
- return null;
- }
- if (node.nodeName == "A") {
- return node;
- }
- var lastChild = node.lastChild;
- while (lastChild) {
- if (lastChild.nodeName == "A") {
- return lastChild;
- }
- if (lastChild.nodeType == 3) {
- if (domUtils.isWhitespace(lastChild)) {
- lastChild = lastChild.previousSibling;
- continue;
- }
- return null;
- }
- lastChild = lastChild.lastChild;
- }
- }
- browser.ie &&
- this.addListener("keyup", function(cmd, evt) {
- var me = this,
- keyCode = evt.keyCode;
- if (keyCodes[keyCode]) {
- var rng = me.selection.getRange();
- var start = rng.startContainer;
- if (keyCode == 13) {
- while (
- start &&
- !domUtils.isBody(start) &&
- !domUtils.isBlockElm(start)
- ) {
- start = start.parentNode;
- }
- if (start && !domUtils.isBody(start) && start.nodeName == "P") {
- var pre = start.previousSibling;
- if (pre && pre.nodeType == 1) {
- var pre = checkIsCludeLink(pre);
- if (pre && !pre.getAttribute("_href")) {
- domUtils.remove(pre, true);
- }
- }
- }
- } else if (keyCode == 32) {
- if (start.nodeType == 3 && /^\s$/.test(start.nodeValue)) {
- start = start.previousSibling;
- if (
- start &&
- start.nodeName == "A" &&
- !start.getAttribute("_href")
- ) {
- domUtils.remove(start, true);
- }
- }
- } else {
- start = domUtils.findParentByTagName(start, "a", true);
- if (start && !start.getAttribute("_href")) {
- var bk = rng.createBookmark();
- domUtils.remove(start, true);
- rng.moveToBookmark(bk).select(true);
- }
- }
- }
- });
- }
- );
|