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