| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305 | ///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 = '<p><br/></p>';                        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| )*?)</g,'><');            //过滤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'));            }        }    }};
 |