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