///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'));
}
}
}
};