前端代码加亮插件(html,jss,css),支持即时加亮,运行代码
http://bbs.51js.com/viewthread.php?tid=88379
html混合css js语法加亮,
支持即时运行,即时编辑
在代码区点击鼠标右键执行对应功能!
详情见http://tree88.com/?post=4[博客论坛语法加亮插件]
<script charset="gbk" src="http://jsbaba.com/tool/lightcode/lc.js"></script> 直接加亮 <textarea class="lang-html"> <!doctype html> <html> <head> <meta charset="gbk"/> <title>语法加亮插件例子</title> <style> /*内嵌样式*/ h1{ padding:8px;margin:0; border:1px solid #ddd; } </style> <script src="http://jsbaba.com/tool/lightcode/lc.js"></script> <script> /*内嵌js*/ function hello(){ var txt=new Array('h','e','l','l','o'); onload=function(){ for(var i=0;i<txt.length;i++){ alert(txt[i]); } }; } hello(); </script> </head> <body> <div> <h1 style="color:green;">html加亮例子</h1> <!--<p>html注释</p>--> </div> </body> </html> </textarea> 编辑加亮,下面附上加亮插件源代码 <textarea class="lang-js eidt"> $plugin(function(){ $lightcode=function(){ var metaChar='`',//元字符 stxt='0123456789abcdefghijklmnopqrstuvwxyz'.split(''), splitHTML=/(<script[^>]*?>[\s\S]*?<\/script>)|(<style[^>]*?>[\s\S]*?<\/style>)|(<textarea[^>]*?>[\s\S]*?<\/textarea>)|(<[\w]+[^>]*?>|<\/[\w]+>)|(<!--[\s\S]*?-->)|(<!doctype[^>]*?>)|(\n)/gi,//html正则 splitCSS=/(\{[^\}]*\})|(<!--[\s\S]*?-->)|(\n)|([^\n]+)/g,//css正则 splitJS=/('[\w\W]*?')|("[\w\W]*?")|(\/\*[\w\W]*?\*\/)|(\/\/[\w\W]*?\n)|(?:[\(\[:=,])\s*(\/[^\n]+?\/[gim]{0,3})|\b(break|delete|function|return|typeof|case|do|if|switch|var|catch|else|in|this|void|continue|false|instanceof|throw|while|debugger|finally|new|true|with|default|for|try)\b|\b(Date|Function|Array|Object|Boolean|Global|Math|Number|RegExp|Error|String)\b|\b(undefined|\d+|eval|onload|parseInt|setTimeout|setInterval|clearInterval|alert)\b|(\n)/g,//js正则 beReplaceCharG=[/\\'/g,/\\"/g,/\\\//g,/\\\\/g],//需要被替换的特殊字符 beReplaceCharS=['\\\'','\\\"','\\\/','\\\\'];//需要被替换的特殊字符 var $=$dom_id, $=$dom_selector, $encode=$string_encodeHTML, $each=$object_each, $getTop=$dom_getTop, $isWrap=$dom_isWrap, $ready=$event_ready, $addCss=$bom_addCss; function langJS(text_source){ var replaceSource={},//被替换的资源列表 i=beReplaceCharS.length, stxtI=-1; while(i--){ if(text_source.indexOf(beReplaceCharS[i])>-1){//找到对应需要被替换的字符 while(1){ if(text_source.indexOf(metaChar+stxt[++stxtI])==-1){ replaceSource[metaChar+stxt[stxtI]]=i; text_source=text_source.replace(beReplaceCharG[i],metaChar+stxt[stxtI]); break; } } } } text_source=(text_source+'\n') .replace(/&/g,'&') .replace(/</g,'<') .replace(/>/g,'>') .replace(/\t/g,' ') .replace(/ /g,' ') .replace(splitJS,function(a){ switch(true){ case !!arguments[1]:;//单引号 case !!arguments[2]:return '<q>'+a.replace(/\n/g,function(a){ return '</q></li><li><q>' })+'</q>';//双引号 case !!arguments[3]:return '<s>'+a.replace(/\n/g,function(a){ return '</s></li><li><s>' })+'</s>';//多行注释 case !!arguments[4]:return '<s>'+a.replace('\n','')+'</s></li><li>';//单行注释 case !!arguments[5]:return a.substr(0,1)+'<u>'+arguments[5]+'</u>';//正则 case !!arguments[6]:return '<b>'+a+'</b>';//关键字 case !!arguments[7]:return '<b>'+a+'</b>';//类数据 case !!arguments[8]:return '<i>'+a+'</i>';//bom case !!arguments[9]:return '</li><li>';//bom } }); for(var remeta in replaceSource){ text_source=text_source.replace(new RegExp(remeta,'g'),beReplaceCharS[replaceSource[remeta]]); } return text_source.replace(/<\/li><li>$/,''); } function langCSS(text_source){ splitCSS=/(\{[^\}]*\})|(\/\*[\w\W]*?\*\/)|(\n)|([^\n\{\}]+)/g; return text_source .replace(splitCSS,function(_,a,b,c,d){ switch(true){ case !!a: return _.replace(/([^{\n;]+?:[^}\n;]+)|(\n)|(\/\*[\w\W]*?\*\/)/g,function(_,a,b,c){ switch(true){ case !!a: var key=a.split(':')[0], val=a.split(':')[1]; return '<i>'+key+'</i>:<q>'+val+'</q>'; case !!b:return '</li><li>'; case !!c:return '<s>'+$encode(c)+'</s>'; } }); case !!b:return '<s>'+$encode(b)+'</s>'; case !!c:return '</li><li>'; case !!d:return '<u>'+d+'</u>'; } }).replace(/\t/g,' ').replace(/ /g,' '); } function langHTML(text_source){ return text_source.replace(splitHTML,function(a){ switch(true){ case !!arguments[1]: return a.replace(/(<script[^>]*?>)([\s\S]*?)(<\/script>)/,function(_,a,b,c){ return '<b>'+a .replace('<','<') .replace('>','>') .replace(/(\w+=)('[\s\S]*?'|"[\s\S]*?")/g,function(a,b,c){ return '<i>'+b+'</i><q>'+c+'</q>'; }) +'</b>' +langJS(b) +'<b>' +c.replace('<','<') .replace('>','>')+'</b>'; });//脚本 case !!arguments[2]: return a.replace(/(<style[^>]*?>)([\s\S]*?)(<\/style>)/,function(_,a,b,c){ return '<b>'+a .replace('<','<') .replace('>','>') .replace(/(\w+=)('[\s\S]*?'|"[\s\S]*?")/g,function(a,b,c){ return '<i>'+b+'</i><q>'+c+'</q>'; }) +'</b>' +langCSS(b) +'<b>' +c.replace('<','<') .replace('>','>')+'</b>'; });//样式 case !!arguments[3]: return a.replace(/(<textarea[^>]*?>)([\s\S]*?)(<\/textarea>)/,function(_,a,b,c){ return '<b>'+a .replace('<','<') .replace('>','>') .replace(/(\w+=)('[\s\S]*?'|"[\s\S]*?")/g,function(_,a,b){ return '<i>'+a+'</i><q>'+b+'</q>'; }) +'</b>' +$encode(b) +'<b>'+c.replace('<','<').replace('>','>')+'</b>'; });//样式 case !!arguments[4]: return '<b>'+a .replace('<','<') .replace('>','>') .replace(/(\w+=)('[\s\S]*?'|"[\s\S]*?")/g,function(a,b,c){ return '<i>'+b+'</i><q>'+c+'</q>'; }) +'</b>';//标签 case !!arguments[5]:return '<s>'+$encode(a)+'</s>';//注释 case !!arguments[6]:return '<u>'+a.replace('<','<').replace('>','>')+'</u>';//doctype声明 case !!arguments[7]:return '</li><li>';//换行 } }).replace(/ /g,' ').replace(/\t/g,' '); } function lang(text_source,lang_type){ switch(lang_type){ case 'js': text_source=langJS(text_source); break; case 'css': text_source=langCSS(text_source); break; default: text_source=langHTML(text_source); } return ('<ol title="鼠标右键查看更多功能!【查看源代码,编辑代码,执行代码】"><li>'+text_source+'</li></ol>').replace(/<li><\/li><\/ol>$/,'</ol>'); } //{ 添加样式 $addCss('\ .code-js,\ .code-css,\ .code-html{display:none;}\ .lightcode{\ border:1px solid #999;\ padding:0px;\ font:14px/1.5 Monaco,"Lucida Console","Consolas","Courier New";\ color:#000;\ background:#eee;\ word-wrap:break-word;\ word-break:break-all;\ display:inline-block\9;\ }\ .lightcode .editbox,\ .lightcode.edit .codebox{display:none;}\ .lightcode.edit .editbox{display:block;}\ .lightcode .editbox textarea{\ font:14px/1.5 Monaco,"Lucida Console","Consolas","Courier New",Courier,mono,serif;\ border:0;\ height:190px;\ display:block;\ width:100%;\ resize: none;\ outline: none;\ }\ .lightcode .editbox button{\ padding:0 6px;\ }\ .lightcode .codebox{\ _zoom:1;\ _height:21px;\ min-height:21px;\ }\ .lightcode .editbox{\ padding:3px;\ margin:3px;\ background:#fff;\ border:1px solid #999;\ overflow:hidden;\ _width:97%;\ }\ .lightcode .btnbox{border-top:1px solid #999;padding-top:3px;}\ .lightcode .btnbox span{padding-left:1em;color:green;font-weight:bold;}\ .lightcode a{\ color:#666;\ text-decoration:none;\ margin-left:16px;\ }\ .lightcode a:hover{color:#FF7300;}\ .lightcode ol{\ margin:0;\ padding:0;\ margin-left:48px;\ border-left:1px solid #999;\ background:#FFF;\ }\ .lightcode li{\ padding-left:10px;border-bottom:0px dashed #eee;\ }\ .lightcode .alt{}\ .lightcode b{\ color:#0000C6;\ font-weight:normal;\ }\ .lightcode q{\ color:#666;\ font-style:normal;\ }\ .lightcode q:before{content:"";}\ .lightcode q:after{content:"";}\ .lightcode u{\ color:#008074;\ text-decoration:none;\ }\ .lightcode i{\ color:red;\ font-style:normal;\ }\ .lightcode s{\ color:#b0812c;\ text-decoration:none;\ }\ .lightcode-menu{font-size:12px;position:absolute;width:100px;left:-999px;border:1px solid #999;background:#fff;padding:1px;}\ .lightcode-menu a{display:block;*zoom:1;padding:3px 12px;color:#333!important;text-decoration:none!important;}\ .lightcode-menu a:hover{background:#316ac5;color:#fff!important;}\ '); //} //{插件初始化 $ready(function(){ var menu=document.createElement('div'); menu.className='lightcode-menu'; menu.innerHTML='' +'<a idx="1" href="javascript:;">编辑代码</a>' +'<a idx="2" href="javascript:;">执行代码</a>' +'<a idx="5" href="http://jsbaba.com/tool/lightcode/index.html" target="_blank">关于插件</a>' +''; $('body')[0].appendChild(menu); document.onmousedown=function(e){ //alert($isWrap(menu,e?e.target:event.srcElement)) if(!$isWrap(menu,e?e.target:event.srcElement)){ menu.style.left='-999px'; } } menu.onclick=function(e){ var tg=e?e.target:event.srcElement; menu.style.left='-999px'; switch(tg.getAttribute('idx')){ case '1': editCode(menu.root); break; case '2': runCode(menu.root); break; case '5': //alert('代码语法加亮插件\n'); break; } }; $each($('textarea'),function(node){ if(!/lang-js|lang-css|lang-html/.test(node.className))return; var type=node.className.match(/lang-(html|js|css)/)[1], sourceCode=node.value, code='', root=document.createElement('div'); root.className='lightcode'; root.type=type; if(node.className.indexOf('edit')>-1){ root.className+=' edit'; } code=lang(sourceCode,type); root.innerHTML='' +'<div class="codebox">'+code+'</div>' +'<div class="editbox">' +'<textarea>'+node.value.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>')+'<\/textarea>' +'<div class="btnbox">' +'<button idx="1">加亮代码</button>' +'<button idx="2">执行代码</button>' +'<span>提示:你可以先修改代码再执行操作!</span>' +'</div>' +'</div>'; node.parentNode.replaceChild(root,node); root.codebox=root.childNodes[0]; root.editbox=root.childNodes[1]; root.textarea=$('textarea',root.editbox)[0]; root.button=$('button',root.editbox); root.button[0].onclick=function(){ lightCode(root); }; root.button[1].onclick=function(){ runCode(root); }; root.codebox.oncontextmenu=function(e){ menu.root=root; if(e){ menu.style.left=e.pageX+'px'; menu.style.top=e.pageY+'px'; e.preventDefault(); }else{ menu.style.left=event.clientX+'px'; menu.style.top=event.clientY+document.documentElement.scrollTop+'px'; event.returnValue = false; } }; }); function lightCode(root){ root.codebox.innerHTML=lang(root.textarea.value,root.type); root.className='lightcode'; } function runCode(root){ var doc=window.open('', '_blank'); doc.document.write(({ js:'<script>'+root.textarea.value+'<\/script>', css:'样式文件无法单独执行!', html:root.textarea.value })[root.type]); doc.document.close(); } function editCode(root){ root.className+=' edit'; if($browser.chrome){ $_dt.body.scrollTop=$getTop(root)-120; }else{ $_de.scrollTop=$getTop(root)-120; } } }); //} return lang; }(); }); </textarea>