///import core
///import plugins/inserthtml.js
///import plugins/undo.js
///import plugins/serialize.js
///commands 粘贴
///commandsName PastePlain
///commandsTitle 纯文本粘贴模式
/**
* @description 粘贴
* @author zhanyi
*/
UE.plugins["paste"] = function() {
function getClipboardData(callback) {
var doc = this.document;
if (doc.getElementById("baidu_pastebin")) {
return;
}
var range = this.selection.getRange(),
bk = range.createBookmark(),
//创建剪贴的容器div
pastebin = doc.createElement("div");
pastebin.id = "baidu_pastebin";
// Safari 要求div必须有内容,才能粘贴内容进来
browser.webkit &&
pastebin.appendChild(
doc.createTextNode(domUtils.fillChar + domUtils.fillChar)
);
doc.body.appendChild(pastebin);
//trace:717 隐藏的span不能得到top
//bk.start.innerHTML = ' ';
bk.start.style.display = "";
pastebin.style.cssText =
"position:absolute;width:1px;height:1px;overflow:hidden;left:-1000px;white-space:nowrap;top:" +
//要在现在光标平行的位置加入,否则会出现跳动的问题
domUtils.getXY(bk.start).y +
"px";
range.selectNodeContents(pastebin).select(true);
setTimeout(function() {
if (browser.webkit) {
for (
var i = 0, pastebins = doc.querySelectorAll("#baidu_pastebin"), pi;
(pi = pastebins[i++]);
) {
if (domUtils.isEmptyNode(pi)) {
domUtils.remove(pi);
} else {
pastebin = pi;
break;
}
}
}
try {
pastebin.parentNode.removeChild(pastebin);
} catch (e) {}
range.moveToBookmark(bk).select(true);
callback(pastebin);
}, 0);
}
var me = this;
me.setOpt({
retainOnlyLabelPasted: false
});
var txtContent, htmlContent, address;
function getPureHtml(html) {
return html.replace(/<(\/?)([\w\-]+)([^>]*)>/gi, function(
a,
b,
tagName,
attrs
) {
tagName = tagName.toLowerCase();
if ({ img: 1 }[tagName]) {
return a;
}
attrs = attrs.replace(
/([\w\-]*?)\s*=\s*(("([^"]*)")|('([^']*)')|([^\s>]+))/gi,
function(str, atr, val) {
if (
{
src: 1,
href: 1,
name: 1
}[atr.toLowerCase()]
) {
return atr + "=" + val + " ";
}
return "";
}
);
if (
{
span: 1,
div: 1
}[tagName]
) {
return "";
} else {
return "<" + b + tagName + " " + utils.trim(attrs) + ">";
}
});
}
function filter(div) {
var html;
if (div.firstChild) {
//去掉cut中添加的边界值
var nodes = domUtils.getElementsByTagName(div, "span");
for (var i = 0, ni; (ni = nodes[i++]); ) {
if (ni.id == "_baidu_cut_start" || ni.id == "_baidu_cut_end") {
domUtils.remove(ni);
}
}
if (browser.webkit) {
var brs = div.querySelectorAll("div br");
for (var i = 0, bi; (bi = brs[i++]); ) {
var pN = bi.parentNode;
if (pN.tagName == "DIV" && pN.childNodes.length == 1) {
pN.innerHTML = "
";
domUtils.remove(pN);
}
}
var divs = div.querySelectorAll("#baidu_pastebin");
for (var i = 0, di; (di = divs[i++]); ) {
var tmpP = me.document.createElement("p");
di.parentNode.insertBefore(tmpP, di);
while (di.firstChild) {
tmpP.appendChild(di.firstChild);
}
domUtils.remove(di);
}
var metas = div.querySelectorAll("meta");
for (var i = 0, ci; (ci = metas[i++]); ) {
domUtils.remove(ci);
}
var brs = div.querySelectorAll("br");
for (i = 0; (ci = brs[i++]); ) {
if (/^apple-/i.test(ci.className)) {
domUtils.remove(ci);
}
}
}
if (browser.gecko) {
var dirtyNodes = div.querySelectorAll("[_moz_dirty]");
for (i = 0; (ci = dirtyNodes[i++]); ) {
ci.removeAttribute("_moz_dirty");
}
}
if (!browser.ie) {
var spans = div.querySelectorAll("span.Apple-style-span");
for (var i = 0, ci; (ci = spans[i++]); ) {
domUtils.remove(ci, true);
}
}
//ie下使用innerHTML会产生多余的\r\n字符,也会产生 这里过滤掉
html = div.innerHTML; //.replace(/>(?:(\s| )*?)<');
//过滤word粘贴过来的冗余属性
html = UE.filterWord(html);
//取消了忽略空白的第二个参数,粘贴过来的有些是有空白的,会被套上相关的标签
var root = UE.htmlparser(html);
//如果给了过滤规则就先进行过滤
if (me.options.filterRules) {
UE.filterNode(root, me.options.filterRules);
}
//执行默认的处理
me.filterInputRule(root);
//针对chrome的处理
if (browser.webkit) {
var br = root.lastChild();
if (br && br.type == "element" && br.tagName == "br") {
root.removeChild(br);
}
utils.each(me.body.querySelectorAll("div"), function(node) {
if (domUtils.isEmptyBlock(node)) {
domUtils.remove(node, true);
}
});
}
html = { html: root.toHtml() };
me.fireEvent("beforepaste", html, root);
//抢了默认的粘贴,那后边的内容就不执行了,比如表格粘贴
if (!html.html) {
return;
}
root = UE.htmlparser(html.html, true);
//如果开启了纯文本模式
if (me.queryCommandState("pasteplain") === 1) {
me.execCommand(
"insertHtml",
UE.filterNode(root, me.options.filterTxtRules).toHtml(),
true
);
} else {
//文本模式
UE.filterNode(root, me.options.filterTxtRules);
txtContent = root.toHtml();
//完全模式
htmlContent = html.html;
address = me.selection.getRange().createAddress(true);
me.execCommand(
"insertHtml",
me.getOpt("retainOnlyLabelPasted") === true
? getPureHtml(htmlContent)
: htmlContent,
true
);
}
me.fireEvent("afterpaste", html);
}
}
me.addListener("pasteTransfer", function(cmd, plainType) {
if (address && txtContent && htmlContent && txtContent != htmlContent) {
var range = me.selection.getRange();
range.moveToAddress(address, true);
if (!range.collapsed) {
while (!domUtils.isBody(range.startContainer)) {
var start = range.startContainer;
if (start.nodeType == 1) {
start = start.childNodes[range.startOffset];
if (!start) {
range.setStartBefore(range.startContainer);
continue;
}
var pre = start.previousSibling;
if (
pre &&
pre.nodeType == 3 &&
new RegExp("^[\n\r\t " + domUtils.fillChar + "]*$").test(
pre.nodeValue
)
) {
range.setStartBefore(pre);
}
}
if (range.startOffset == 0) {
range.setStartBefore(range.startContainer);
} else {
break;
}
}
while (!domUtils.isBody(range.endContainer)) {
var end = range.endContainer;
if (end.nodeType == 1) {
end = end.childNodes[range.endOffset];
if (!end) {
range.setEndAfter(range.endContainer);
continue;
}
var next = end.nextSibling;
if (
next &&
next.nodeType == 3 &&
new RegExp("^[\n\r\t" + domUtils.fillChar + "]*$").test(
next.nodeValue
)
) {
range.setEndAfter(next);
}
}
if (
range.endOffset ==
range.endContainer[
range.endContainer.nodeType == 3 ? "nodeValue" : "childNodes"
].length
) {
range.setEndAfter(range.endContainer);
} else {
break;
}
}
}
range.deleteContents();
range.select(true);
me.__hasEnterExecCommand = true;
var html = htmlContent;
if (plainType === 2) {
html = getPureHtml(html);
} else if (plainType) {
html = txtContent;
}
me.execCommand("inserthtml", html, true);
me.__hasEnterExecCommand = false;
var rng = me.selection.getRange();
while (
!domUtils.isBody(rng.startContainer) &&
!rng.startOffset &&
rng.startContainer[
rng.startContainer.nodeType == 3 ? "nodeValue" : "childNodes"
].length
) {
rng.setStartBefore(rng.startContainer);
}
var tmpAddress = rng.createAddress(true);
address.endAddress = tmpAddress.startAddress;
}
});
me.addListener("ready", function() {
domUtils.on(me.body, "cut", function() {
var range = me.selection.getRange();
if (!range.collapsed && me.undoManger) {
me.undoManger.save();
}
});
//ie下beforepaste在点击右键时也会触发,所以用监控键盘才处理
domUtils.on(
me.body,
browser.ie || browser.opera ? "keydown" : "paste",
function(e) {
if (
(browser.ie || browser.opera) &&
((!e.ctrlKey && !e.metaKey) || e.keyCode != "86")
) {
return;
}
getClipboardData.call(me, function(div) {
filter(div);
});
}
);
});
me.commands["paste"] = {
execCommand: function(cmd) {
if (browser.ie) {
getClipboardData.call(me, function(div) {
filter(div);
});
me.document.execCommand("paste");
} else {
alert(me.getLang("pastemsg"));
}
}
};
};