highlightcode.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. ///import core
  2. ///import plugins/inserthtml.js
  3. ///commands 插入代码
  4. ///commandsName HighlightCode
  5. ///commandsTitle 插入代码
  6. ///commandsDialog dialogs\highlightcode
  7. UE.plugins['highlightcode'] = function() {
  8. var me = this;
  9. if(!/highlightcode/i.test(me.options.toolbars.join(''))){
  10. return;
  11. }
  12. me.commands['highlightcode'] = {
  13. execCommand: function (cmdName, code, syntax) {
  14. var range = this.selection.getRange(),
  15. start = domUtils.findParentByTagName(range.startContainer, 'table', true),
  16. end = domUtils.findParentByTagName(range.endContainer, 'table', true);
  17. if(start && end && start === end && domUtils.hasClass(start,'syntaxhighlighter')){
  18. if(start.nextSibling){
  19. range.setStart(start.nextSibling,0)
  20. }else{
  21. if(start.previousSibling){
  22. range.setStartAtLast(start.previousSibling)
  23. }else{
  24. var p = me.document.createElement('p');
  25. domUtils.fillNode(me.document,p);
  26. start.parentNode.insertBefore(p,start);
  27. range.setStart(p,0)
  28. }
  29. }
  30. range.setCursor(false,true);
  31. domUtils.remove(start);
  32. }
  33. if(code && syntax){
  34. me.execCommand('inserthtml','<pre id="highlightcode_id" class="brush: '+syntax+';toolbar:false;">'+utils.unhtml(code)+'</pre>',true);
  35. var pre = me.document.getElementById('highlightcode_id');
  36. if(pre){
  37. domUtils.removeAttributes(pre,'id');
  38. me.window.SyntaxHighlighter.highlight(pre);
  39. }
  40. }
  41. },
  42. queryCommandState: function(){
  43. return queryHighlight.call(this);
  44. }
  45. };
  46. function queryHighlight(){
  47. try{
  48. var range = this.selection.getRange(),start,end;
  49. range.adjustmentBoundary();
  50. start = domUtils.findParent(range.startContainer,function(node){
  51. return node.nodeType == 1 && node.tagName == 'TABLE' && domUtils.hasClass(node,'syntaxhighlighter');
  52. },true);
  53. end = domUtils.findParent(range.endContainer,function(node){
  54. return node.nodeType == 1 && node.tagName == 'TABLE' && domUtils.hasClass(node,'syntaxhighlighter');
  55. },true);
  56. return start && end && start == end ? 1 : 0;
  57. }catch(e){
  58. return 0;
  59. }
  60. }
  61. //不需要判断highlight的command列表
  62. me.notNeedHighlightQuery ={
  63. help:1,
  64. undo:1,
  65. redo:1,
  66. source:1,
  67. print:1,
  68. searchreplace:1,
  69. fullscreen:1,
  70. preview:1,
  71. insertparagraph:1,
  72. elementpath:1,
  73. highlightcode:1
  74. };
  75. //将queyCommamndState重置
  76. var orgQuery = me.queryCommandState;
  77. me.queryCommandState = function(cmd){
  78. if(!me.notNeedHighlightQuery[cmd.toLowerCase()] && queryHighlight.call(this) == 1){
  79. return -1;
  80. }
  81. return orgQuery.apply(this,arguments)
  82. };
  83. me.addListener('beforeselectionchange afterselectionchange',function(type){
  84. me.highlight = /^b/.test(type) ? me.queryCommandState('highlightcode') : 0;
  85. });
  86. me.addListener("ready",function(){
  87. //避免重复加载高亮文件
  88. if(typeof me.XRegExp == "undefined"){
  89. utils.loadFile(me.document,{
  90. id : "syntaxhighlighter_js",
  91. src : me.options.highlightJsUrl || me.options.UEDITOR_HOME_URL + "third-party/SyntaxHighlighter/shCore.js",
  92. tag : "script",
  93. type : "text/javascript",
  94. defer : "defer"
  95. },function(){
  96. changePre.call(me);
  97. });
  98. }
  99. if(!me.document.getElementById("syntaxhighlighter_css")){
  100. utils.loadFile(me.document,{
  101. id : "syntaxhighlighter_css",
  102. tag : "link",
  103. rel : "stylesheet",
  104. type : "text/css",
  105. href : me.options.highlightCssUrl ||me.options.UEDITOR_HOME_URL + "third-party/SyntaxHighlighter/shCoreDefault.css"
  106. });
  107. }
  108. });
  109. me.addListener("beforegetcontent beforegetscene",function(){
  110. utils.each(domUtils.getElementsByTagName(me.body,'table','syntaxhighlighter'),function(di){
  111. var str = [],parentCode = '';
  112. utils.each(di.getElementsByTagName('code'),function(ci){
  113. if(parentCode !== ci.parentNode){
  114. parentCode = ci.parentNode;
  115. //去掉左右空格,针对ie的不能回退的问题
  116. str.push(utils.trim(parentCode[browser.ie?'innerText':'textContent']))
  117. }
  118. });
  119. var pre = domUtils.createElement(me.document,'pre',{
  120. 'class' : 'brush: '+di.className.replace(/\s+/g,' ').split(' ')[1]+';toolbar:false;'
  121. });
  122. pre.appendChild(me.document.createTextNode(str.join('\n')));
  123. di.parentNode.replaceChild(pre,di);
  124. });
  125. });
  126. me.addListener("aftergetcontent aftersetcontent aftergetscene",changePre);
  127. //避免table插件对于代码高亮的影响
  128. me.addListener('excludetable excludeNodeinautotype',function (cmd,target){
  129. if(target && domUtils.findParent(target,function(node){
  130. return domUtils.hasClass(node,'syntaxhighlighter');
  131. },true)){
  132. return true;
  133. }
  134. });
  135. function changePre(){
  136. var me = this;
  137. if(!me.window||!me.window.SyntaxHighlighter)return;
  138. utils.each(domUtils.getElementsByTagName(me.document,"pre"),function(pi){
  139. if(domUtils.hasClass(pi,'brush')){
  140. me.window.SyntaxHighlighter.highlight(pi);
  141. }
  142. });
  143. }
  144. me.addListener('getAllHtml',function(type,headHtml){
  145. var coreHtml = '';
  146. for(var i= 0,ci,divs=domUtils.getElementsByTagName(me.document,'table');ci=divs[i++];){
  147. if(domUtils.hasClass(ci,'syntaxhighlighter')){
  148. coreHtml = '<script type="text/javascript">window.onload = function(){SyntaxHighlighter.highlight();' +
  149. 'setTimeout(function(){ '+
  150. " var tables = document.getElementsByTagName('table');"+
  151. " for(var t= 0,ti;ti=tables[t++];){"+
  152. " if(/SyntaxHighlighter/i.test(ti.className)){"+
  153. " var tds = ti.getElementsByTagName('td');"+
  154. " for(var i=0,li,ri;li=tds[0].childNodes[i];i++){"+
  155. " ri = tds[1].firstChild.childNodes[i];"+
  156. " if(ri){"+
  157. " ri.style.height = li.style.height = ri.offsetHeight + 'px';"+
  158. " }"+
  159. " }"+
  160. " }"+
  161. " }"+
  162. '},100)' +
  163. '}</script>'
  164. break;
  165. }
  166. }
  167. if(!coreHtml){
  168. var tmpNode;
  169. if(tmpNode = me.document.getElementById('syntaxhighlighter_css')){
  170. domUtils.remove(tmpNode)
  171. }
  172. if(tmpNode = me.document.getElementById('syntaxhighlighter_js')){
  173. domUtils.remove(tmpNode)
  174. }
  175. }
  176. coreHtml && headHtml.push(coreHtml)
  177. });
  178. };