305 Star 1.5K Fork 291

GVPNotadd/Neditor

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
autolink.js 6.85 KB
一键复制 编辑 原始数据 按行查看 历史
Phinome 提交于 8年前 . prettier format file
///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);
}
}
}
});
}
);
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/notadd/neditor.git
git@gitee.com:notadd/neditor.git
notadd
neditor
Neditor
master

搜索帮助