| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540 | /** * 插入代码插件 * @file * @since 1.2.6.1 */UE.plugins['insertcode'] = function() {    var me = this;    me.ready(function(){        utils.cssRule('pre','pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}',            me.document)    });    me.setOpt('insertcode',{            'as3':'ActionScript3',            'bash':'Bash/Shell',            'cpp':'C/C++',            'css':'Css',            'cf':'CodeFunction',            'c#':'C#',            'delphi':'Delphi',            'diff':'Diff',            'erlang':'Erlang',            'groovy':'Groovy',            'html':'Html',            'java':'Java',            'jfx':'JavaFx',            'js':'Javascript',            'pl':'Perl',            'php':'Php',            'plain':'Plain Text',            'ps':'PowerShell',            'python':'Python',            'ruby':'Ruby',            'scala':'Scala',            'sql':'Sql',            'vb':'Vb',            'xml':'Xml'    });    /**     * 插入代码     * @command insertcode     * @method execCommand     * @param { String } cmd 命令字符串     * @param { String } lang 插入代码的语言     * @example     * ```javascript     * editor.execCommand( 'insertcode', 'javascript' );     * ```     */    /**     * 如果选区所在位置是插入插入代码区域,返回代码的语言     * @command insertcode     * @method queryCommandValue     * @param { String } cmd 命令字符串     * @return { String } 返回代码的语言     * @example     * ```javascript     * editor.queryCommandValue( 'insertcode' );     * ```     */    me.commands['insertcode'] = {        execCommand : function(cmd,lang){            var me = this,                rng = me.selection.getRange(),                pre = domUtils.findParentByTagName(rng.startContainer,'pre',true);            if(pre){                pre.className = 'brush:'+lang+';toolbar:false;';            }else{                var code = '';                if(rng.collapsed){                    code = browser.ie && browser.ie11below ? (browser.version <= 8 ? ' ':''):'<br/>';                }else{                    var frag = rng.extractContents();                    var div = me.document.createElement('div');                    div.appendChild(frag);                    utils.each(UE.filterNode(UE.htmlparser(div.innerHTML.replace(/[\r\t]/g,'')),me.options.filterTxtRules).children,function(node){                        if(browser.ie && browser.ie11below && browser.version > 8){                            if(node.type =='element'){                                if(node.tagName == 'br'){                                    code += '\n'                                }else if(!dtd.$empty[node.tagName]){                                    utils.each(node.children,function(cn){                                        if(cn.type =='element'){                                            if(cn.tagName == 'br'){                                                code += '\n'                                            }else if(!dtd.$empty[node.tagName]){                                                code += cn.innerText();                                            }                                        }else{                                            code += cn.data                                        }                                    })                                    if(!/\n$/.test(code)){                                        code += '\n';                                    }                                }                            }else{                                code += node.data + '\n'                            }                            if(!node.nextSibling() && /\n$/.test(code)){                                code = code.replace(/\n$/,'');                            }                        }else{                            if(browser.ie && browser.ie11below){                                if(node.type =='element'){                                    if(node.tagName == 'br'){                                        code += '<br>'                                    }else if(!dtd.$empty[node.tagName]){                                        utils.each(node.children,function(cn){                                            if(cn.type =='element'){                                                if(cn.tagName == 'br'){                                                    code += '<br>'                                                }else if(!dtd.$empty[node.tagName]){                                                    code += cn.innerText();                                                }                                            }else{                                                code += cn.data                                            }                                        });                                        if(!/br>$/.test(code)){                                            code += '<br>';                                        }                                    }                                }else{                                    code += node.data + '<br>'                                }                                if(!node.nextSibling() && /<br>$/.test(code)){                                    code = code.replace(/<br>$/,'');                                }                            }else{                                code += (node.type == 'element' ? (dtd.$empty[node.tagName] ?  '' : node.innerText()) : node.data);                                if(!/br\/?\s*>$/.test(code)){                                    if(!node.nextSibling())                                        return;                                    code += '<br>'                                }                            }                        }                    });                }                me.execCommand('inserthtml','<pre id="coder"class="brush:'+lang+';toolbar:false">'+code+'</pre>',true);                pre = me.document.getElementById('coder');                domUtils.removeAttributes(pre,'id');                var tmpNode = pre.previousSibling;                if(tmpNode && (tmpNode.nodeType == 3 && tmpNode.nodeValue.length == 1 && browser.ie && browser.version == 6 ||  domUtils.isEmptyBlock(tmpNode))){                    domUtils.remove(tmpNode)                }                var rng = me.selection.getRange();                if(domUtils.isEmptyBlock(pre)){                    rng.setStart(pre,0).setCursor(false,true)                }else{                    rng.selectNodeContents(pre).select()                }            }        },        queryCommandValue : function(){            var path = this.selection.getStartElementPath();            var lang = '';            utils.each(path,function(node){                if(node.nodeName =='PRE'){                    var match = node.className.match(/brush:([^;]+)/);                    lang = match && match[1] ? match[1] : '';                    return false;                }            });            return lang;        }    };    me.addInputRule(function(root){       utils.each(root.getNodesByTagName('pre'),function(pre){           var brs = pre.getNodesByTagName('br');           if(brs.length){               browser.ie && browser.ie11below && browser.version > 8 && utils.each(brs,function(br){                   var txt = UE.uNode.createText('\n');                   br.parentNode.insertBefore(txt,br);                   br.parentNode.removeChild(br);               });               return;            }           if(browser.ie && browser.ie11below && browser.version > 8)                return;            var code = pre.innerText().split(/\n/);            pre.innerHTML('');            utils.each(code,function(c){                if(c.length){                    pre.appendChild(UE.uNode.createText(c));                }                pre.appendChild(UE.uNode.createElement('br'))            })       })    });    me.addOutputRule(function(root){        utils.each(root.getNodesByTagName('pre'),function(pre){            var code = '';            utils.each(pre.children,function(n){               if(n.type == 'text'){                   //在ie下文本内容有可能末尾带有\n要去掉                   //trace:3396                   code += n.data.replace(/[ ]/g,' ').replace(/\n$/,'');               }else{                   if(n.tagName == 'br'){                       code  += '\n'                   }else{                       code += (!dtd.$empty[n.tagName] ? '' : n.innerText());                   }               }            });            pre.innerText(code.replace(/( |\n)+$/,''))        })    });    //不需要判断highlight的command列表    me.notNeedCodeQuery ={        help:1,        undo:1,        redo:1,        source:1,        print:1,        searchreplace:1,        fullscreen:1,        preview:1,        insertparagraph:1,        elementpath:1,        insertcode:1,        inserthtml:1,        selectall:1    };    //将queyCommamndState重置    var orgQuery = me.queryCommandState;    me.queryCommandState = function(cmd){        var me = this;        if(!me.notNeedCodeQuery[cmd.toLowerCase()] && me.selection && me.queryCommandValue('insertcode')){            return -1;        }        return UE.Editor.prototype.queryCommandState.apply(this,arguments)    };    me.addListener('beforeenterkeydown',function(){        var rng = me.selection.getRange();        var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true);        if(pre){            me.fireEvent('saveScene');            if(!rng.collapsed){               rng.deleteContents();            }            if(!browser.ie || browser.ie9above){                var tmpNode = me.document.createElement('br'),pre;                rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true);                var next = tmpNode.nextSibling;                if(!next && (!browser.ie || browser.version > 10)){                    rng.insertNode(tmpNode.cloneNode(false));                }else{                    rng.setStartAfter(tmpNode);                }                pre = tmpNode.previousSibling;                var tmp;                while(pre ){                    tmp = pre;                    pre = pre.previousSibling;                    if(!pre || pre.nodeName == 'BR'){                        pre = tmp;                        break;                    }                }                if(pre){                    var str = '';                    while(pre && pre.nodeName != 'BR' &&  new RegExp('^[\\s'+domUtils.fillChar+']*$').test(pre.nodeValue)){                        str += pre.nodeValue;                        pre = pre.nextSibling;                    }                    if(pre.nodeName != 'BR'){                        var match = pre.nodeValue.match(new RegExp('^([\\s'+domUtils.fillChar+']+)'));                        if(match && match[1]){                            str += match[1]                        }                    }                    if(str){                        str = me.document.createTextNode(str);                        rng.insertNode(str).setStartAfter(str);                    }                }                rng.collapse(true).select(true);            }else{                if(browser.version > 8){                    var txt = me.document.createTextNode('\n');                    var start = rng.startContainer;                    if(rng.startOffset == 0){                        var preNode = start.previousSibling;                        if(preNode){                            rng.insertNode(txt);                            var fillchar = me.document.createTextNode(' ');                            rng.setStartAfter(txt).insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true)                        }                    }else{                        rng.insertNode(txt).setStartAfter(txt);                        var fillchar = me.document.createTextNode(' ');                        start = rng.startContainer.childNodes[rng.startOffset];                        if(start && !/^\n/.test(start.nodeValue)){                            rng.setStartBefore(txt)                        }                        rng.insertNode(fillchar).setStart(fillchar,0).collapse(true).select(true)                    }                }else{                    var tmpNode = me.document.createElement('br');                    rng.insertNode(tmpNode);                    rng.insertNode(me.document.createTextNode(domUtils.fillChar));                    rng.setStartAfter(tmpNode);                    pre = tmpNode.previousSibling;                    var tmp;                    while(pre ){                        tmp = pre;                        pre = pre.previousSibling;                        if(!pre || pre.nodeName == 'BR'){                            pre = tmp;                            break;                        }                    }                    if(pre){                        var str = '';                        while(pre && pre.nodeName != 'BR' &&  new RegExp('^[ '+domUtils.fillChar+']*$').test(pre.nodeValue)){                            str += pre.nodeValue;                            pre = pre.nextSibling;                        }                        if(pre.nodeName != 'BR'){                            var match = pre.nodeValue.match(new RegExp('^([ '+domUtils.fillChar+']+)'));                            if(match && match[1]){                                str += match[1]                            }                        }                        str = me.document.createTextNode(str);                        rng.insertNode(str).setStartAfter(str);                    }                    rng.collapse(true).select();                }            }            me.fireEvent('saveScene');            return true;        }    });    me.addListener('tabkeydown',function(cmd,evt){        var rng = me.selection.getRange();        var pre = domUtils.findParentByTagName(rng.startContainer,'pre',true);        if(pre){            me.fireEvent('saveScene');            if(evt.shiftKey){            }else{                if(!rng.collapsed){                    var bk = rng.createBookmark();                    var start = bk.start.previousSibling;                    while(start){                        if(pre.firstChild === start && !domUtils.isBr(start)){                            pre.insertBefore(me.document.createTextNode('    '),start);                            break;                        }                        if(domUtils.isBr(start)){                            pre.insertBefore(me.document.createTextNode('    '),start.nextSibling);                            break;                        }                        start = start.previousSibling;                    }                    var end = bk.end;                    start = bk.start.nextSibling;                    if(pre.firstChild === bk.start){                        pre.insertBefore(me.document.createTextNode('    '),start.nextSibling)                    }                    while(start && start !== end){                        if(domUtils.isBr(start) && start.nextSibling){                            if(start.nextSibling === end){                                break;                            }                            pre.insertBefore(me.document.createTextNode('    '),start.nextSibling)                        }                        start = start.nextSibling;                    }                    rng.moveToBookmark(bk).select();                }else{                    var tmpNode = me.document.createTextNode('    ');                    rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true).select(true);                }            }            me.fireEvent('saveScene');            return true;        }    });    me.addListener('beforeinserthtml',function(evtName,html){        var me = this,            rng = me.selection.getRange(),            pre = domUtils.findParentByTagName(rng.startContainer,'pre',true);        if(pre){            if(!rng.collapsed){                rng.deleteContents()            }            var htmlstr = '';            if(browser.ie && browser.version > 8){                utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){                    if(node.type =='element'){                        if(node.tagName == 'br'){                            htmlstr += '\n'                        }else if(!dtd.$empty[node.tagName]){                            utils.each(node.children,function(cn){                                if(cn.type =='element'){                                    if(cn.tagName == 'br'){                                        htmlstr += '\n'                                    }else if(!dtd.$empty[node.tagName]){                                        htmlstr += cn.innerText();                                    }                                }else{                                    htmlstr += cn.data                                }                            })                            if(!/\n$/.test(htmlstr)){                                htmlstr += '\n';                            }                        }                    }else{                        htmlstr += node.data + '\n'                    }                    if(!node.nextSibling() && /\n$/.test(htmlstr)){                        htmlstr = htmlstr.replace(/\n$/,'');                    }                });                var tmpNode = me.document.createTextNode(utils.html(htmlstr.replace(/ /g,' ')));                rng.insertNode(tmpNode).selectNode(tmpNode).select();            }else{                var frag = me.document.createDocumentFragment();                utils.each(UE.filterNode(UE.htmlparser(html),me.options.filterTxtRules).children,function(node){                    if(node.type =='element'){                        if(node.tagName == 'br'){                            frag.appendChild(me.document.createElement('br'))                        }else if(!dtd.$empty[node.tagName]){                            utils.each(node.children,function(cn){                                if(cn.type =='element'){                                    if(cn.tagName == 'br'){                                        frag.appendChild(me.document.createElement('br'))                                    }else if(!dtd.$empty[node.tagName]){                                        frag.appendChild(me.document.createTextNode(utils.html(cn.innerText().replace(/ /g,' '))));                                    }                                }else{                                    frag.appendChild(me.document.createTextNode(utils.html( cn.data.replace(/ /g,' '))));                                }                            })                            if(frag.lastChild.nodeName != 'BR'){                                frag.appendChild(me.document.createElement('br'))                            }                        }                    }else{                        frag.appendChild(me.document.createTextNode(utils.html( node.data.replace(/ /g,' '))));                    }                    if(!node.nextSibling() && frag.lastChild.nodeName == 'BR'){                       frag.removeChild(frag.lastChild)                    }                });                rng.insertNode(frag).select();            }            return true;        }    });    //方向键的处理    me.addListener('keydown',function(cmd,evt){        var me = this,keyCode = evt.keyCode || evt.which;        if(keyCode == 40){            var rng = me.selection.getRange(),pre,start = rng.startContainer;            if(rng.collapsed && (pre = domUtils.findParentByTagName(rng.startContainer,'pre',true)) && !pre.nextSibling){                var last = pre.lastChild                while(last && last.nodeName == 'BR'){                    last = last.previousSibling;                }                if(last === start || rng.startContainer === pre && rng.startOffset == pre.childNodes.length){                    me.execCommand('insertparagraph');                    domUtils.preventDefault(evt)                }            }        }    });    //trace:3395    me.addListener('delkeydown',function(type,evt){        var rng = this.selection.getRange();        rng.txtToElmBoundary(true);        var start = rng.startContainer;        if(domUtils.isTagNode(start,'pre') && rng.collapsed && domUtils.isStartInblock(rng)){            var p = me.document.createElement('p');            domUtils.fillNode(me.document,p);            start.parentNode.insertBefore(p,start);            domUtils.remove(start);            rng.setStart(p,0).setCursor(false,true);            domUtils.preventDefault(evt);            return true;        }    })};
 |