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