///import core ///import plugins/inserthtml.js ///commands 插入代码 ///commandsName HighlightCode ///commandsTitle 插入代码 ///commandsDialog dialogs\code\code.html UE.plugins['highlight'] = function() { var me = this; if(!/highlightcode/i.test(me.options.toolbars.join('')))return; me.commands['highlightcode'] = { execCommand: function (cmdName, code, syntax) { if(code && syntax){ var pre = document.createElement("pre"); pre.className = "brush: "+syntax+";toolbar:false;"; pre.style.display = ""; pre.appendChild(document.createTextNode(code)); document.body.appendChild(pre); if(me.queryCommandState("highlightcode")){ me.execCommand("highlightcode"); } me.execCommand('inserthtml', SyntaxHighlighter.highlight(pre,null,true),true); var div = me.document.getElementById(SyntaxHighlighter.getHighlighterDivId()); div.setAttribute('highlighter',pre.className); domUtils.remove(pre); adjustHeight() }else{ var range = this.selection.getRange(), start = domUtils.findParentByTagName(range.startContainer, 'table', true), end = domUtils.findParentByTagName(range.endContainer, 'table', true), codediv; if(start && end && start === end && start.parentNode.className.indexOf("syntaxhighlighter")>-1){ codediv = start.parentNode; if(domUtils.isBody(codediv.parentNode)){ var p = me.document.createElement('p'); p.innerHTML = browser.ie ? '' : '
'; me.body.insertBefore(p,codediv); range.setStart(p,0) }else{ range.setStartBefore(codediv) } range.setCursor(); domUtils.remove(codediv); } } }, queryCommandState: function(){ var range = this.selection.getRange(),start,end; range.adjustmentBoundary(); start = domUtils.findParent(range.startContainer,function(node){ return node.nodeType == 1 && node.tagName == 'DIV' && domUtils.hasClass(node,'syntaxhighlighter') },true); end = domUtils.findParent(range.endContainer,function(node){ return node.nodeType == 1 && node.tagName == 'DIV' && domUtils.hasClass(node,'syntaxhighlighter') },true); return start && end && start == end ? 1 : 0; } }; me.addListener('beforeselectionchange',function(){ me.highlight = me.queryCommandState('highlightcode'); }); me.addListener('afterselectionchange',function(){ me.highlight = 0; }); me.addListener("ready",function(){ //避免重复加载高亮文件 if(typeof XRegExp == "undefined"){ var obj = { id : "syntaxhighlighter_js", src : me.options.highlightJsUrl || me.options.UEDITOR_HOME_URL + "third-party/SyntaxHighlighter/shCore.js", tag : "script", type : "text/javascript", defer : "defer" }; utils.loadFile(document,obj,function(){ changePre(); }); } if(!me.document.getElementById("syntaxhighlighter_css")){ var obj = { id : "syntaxhighlighter_css", tag : "link", rel : "stylesheet", type : "text/css", href : me.options.highlightCssUrl ||me.options.UEDITOR_HOME_URL + "third-party/SyntaxHighlighter/shCoreDefault.css" }; utils.loadFile(me.document,obj); } }); me.addListener("beforegetcontent",function(type,cmd){ for(var i=0,di,divs=domUtils.getElementsByTagName(me.body,'div');di=divs[i++];){ if(di.className == 'container'){ var pN = di.parentNode; while(pN){ if(pN.tagName == 'DIV' && /highlighter/.test(pN.id)){ break; } pN = pN.parentNode; } if(!pN)return; var pre = me.document.createElement('pre'); for(var str=[],c=0,ci;ci=di.childNodes[c++];){ str.push(ci[browser.ie?'innerText':'textContent']); } pre.appendChild(me.document.createTextNode(str.join('\n'))); pre.className = pN.getAttribute('highlighter'); pN.parentNode.insertBefore(pre,pN); domUtils.remove(pN); } } }); me.addListener("aftergetcontent",function(type,cmd){ changePre(); }); function adjustHeight(){ setTimeout(function(){ var div = me.document.getElementById(SyntaxHighlighter.getHighlighterDivId()); if(div){ var tds = div.getElementsByTagName('td'); for(var i=0,li,ri;li=tds[0].childNodes[i];i++){ ri = tds[1].firstChild.childNodes[i]; //trace:1949 if(ri){ ri.style.height = li.style.height = ri.offsetHeight + 'px'; } } } }); } function changePre(){ for(var i=0,pr,pres = domUtils.getElementsByTagName(me.document,"pre");pr=pres[i++];){ if(pr.className.indexOf("brush")>-1){ var pre = document.createElement("pre"),txt,div; pre.className = pr.className; pre.style.display = "none"; pre.appendChild(document.createTextNode(pr[browser.ie?'innerText':'textContent'])); document.body.appendChild(pre); try{ txt = SyntaxHighlighter.highlight(pre,null,true); }catch(e){ domUtils.remove(pre); return ; } div = me.document.createElement("div"); div.innerHTML = txt; div.firstChild.setAttribute('highlighter',pre.className); pr.parentNode.insertBefore(div.firstChild,pr); domUtils.remove(pre); domUtils.remove(pr); adjustHeight() } } } me.addListener("aftersetcontent",function(){ changePre(); }); //全屏时,重新算一下宽度 me.addListener('fullscreenchanged',function(){ var div = domUtils.getElementsByTagName(me.document,'div'); for(var j=0,di;di=div[j++];){ if(/^highlighter/.test(di.id)){ var tds = di.getElementsByTagName('td'); for(var i=0,li,ri;li=tds[0].childNodes[i];i++){ ri = tds[1].firstChild.childNodes[i]; ri.style.height = li.style.height = ri.offsetHeight + 'px'; } } } }) };