PageRenderTime 261ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/dTweets/Content/JavaScript/JsDecoder.js

http://dtweet.codeplex.com
JavaScript | 1 lines | 1 code | 0 blank | 0 comment | 0 complexity | e7035dba9e0682895e9ffc4daf348ee0 MD5 | raw file
  1. function JsDecoder(){this.s="",this.len=0,this.i=0,this.lvl=0,this.code=[""],this.row=0,this.switches=[],this.lastWord="",this.nextChar="",this.prevChar="",this.isAssign=!1,this.decode=function(){this.s=this.s.replace(/[\r\n\f]+/g,"\n"),this.len=this.s.length;while(this.i<this.len){var n=this.s.charAt(this.i);this.charInit(),this.switch_c(n),this.i++}return this.code.join("\n")},this.switch_c=function(n){switch(n){case"\n":this.linefeed();break;case" ":case"\t":this.space();break;case"{":this.blockBracketOn();break;case"}":this.blockBracketOff();break;case":":this.colon();break;case";":this.semicolon();break;case"(":this.bracketOn();break;case")":this.bracketOff();break;case"[":this.squareBracketOn();break;case"]":this.squareBracketOff();break;case'"':case"'":this.quotation(n);break;case"/":"/"==this.nextChar?this.lineComment():"*"==this.nextChar?this.comment():this.slash();break;case",":this.comma();break;case".":this.dot();break;case"~":case"^":this.symbol1(n);break;case"-":case"+":case"*":case"%":case"<":case"=":case">":case"?":case":":case"&":case"|":case"/":this.symbol2(n);break;case"!":"="==this.nextChar?this.symbol2(n):this.symbol1(n);break;default:/\w/.test(n)?this.alphanumeric(n):this.unknown(n)}n=this.s.charAt(this.i),/\w/.test(n)||(this.lastWord="")},this.blockBracketOn=function(){var t,r,i;this.isAssign=!1,t=this.nextNonWhite(this.i);if("}"==t){r=this.prevChar==")"?" ":"",this.write(r+"{"),this.lvl++;return}/^\s*switch\s/.test(this.getCurrentLine())&&this.switches.push(this.lvl);var u=this.getCurrentLine(),f=this.row,n=/(,)\s*(\w+\s*:\s*function\s*\([^\)]*\)\s*)$/;n.test(u)&&(this.replaceLine(this.code[f].replace(n,"$1")),this.writeLine(),i=n.exec(u),this.write(i[2]));if(/^\s*return\s*/.test(this.code[this.row])){/^\s*return\s+\w+/.test(this.code[this.row])?this.writeLine():this.prevChar!=" "&&this.write(" "),this.write("{"),this.writeLine(),this.lvl++;return}/function\s*/.test(this.code[this.row])||this.isBlockBig()?this.writeLine():this.prevChar!=" "&&this.prevChar!="\n"&&this.prevChar!="("&&this.write(" "),this.write("{"),this.lvl++,"{"!=t&&this.writeLine()},this.isBlockBig=function(){var t=this.i+1,i=0,r=0,u=0,n;while(t<this.len-1){t++,n=this.s.charAt(t);if(/\s/.test(n))continue;if("}"==n&&r==u)break;"{"==n&&r++,"}"==n&&u++,i++;if(i>80)return!0}return i>80},this.blockBracketOff=function(){var n=this.nextNonWhite(this.i),r=this.prevNonWhite(this.i),i=this.getCurrentLine(),f;r!="{"&&(i.length&&n!=";"&&n!="}"&&n!=")"&&n!=","?this.writeLine():i.length&&r!=";"&&n=="}"&&this.isAssign?this.semicolon():i.length&&this.isAssign&&r!=";"?this.semicolon():i.length&&r!=";"&&(/^\s*(else)?\s*return[\s(]+/i.test(i)?this.semicolon():this.writeLine())),this.write("}"),","==n&&(this.write(","),this.goNextNonWhite()),f=this.nextManyNW(3),f=="(),"?(this.write("(),"),this.goNextManyNW("(),"),this.writeLine()):f=="();"?(this.write("();"),this.goNextManyNW("();"),this.writeLine()):f=="():"?(this.write("()"),this.goNextManyNW("()"),this.write(" : "),this.goNextNonWhite()):"{"==r?","==n&&this.getCurrentLine().length<80?this.write(" "):(this.nextWord()||"}"==n)&&this.writeLine():")"!=n&&"]"!=n&&(","==n&&/^[\s\w,]+\)/.test(this.s.substr(this.i,20))?this.write(" "):this.writeLine()),this.lvl--;if(this.switches.length&&this.switches[this.switches.length-1]==this.lvl){var t=this.row-1,h=str_repeat(" ",this.lvl*4),s=str_repeat(" ",(this.lvl+1)*4),c=new RegExp("^"+h+"(switch\\s|{)"),l=new RegExp("^"+s+"(case|default)[\\s:]"),a=new RegExp("^"+s+"[^\\s]");while(t>0){t--;if(c.test(this.code[t]))break;if(l.test(this.code[t]))continue;this.replaceLine(" "+this.code[t],t)}this.switches.pop()}if(this.sub)return;var o=/^(\s*else\s*if)\s*\(/,e=/^(\s*else)\s+[^{]+/,u=this.s.substr(this.i+1,100);o.test(u)?(this.i+=o.exec(u)[1].length,this.write("else if"),this.lastWord="if",this.fixSub("else if")):e.test(u)&&(this.i+=e.exec(u)[1].length,this.write("else"),this.lastWord="else",this.fixSub("else"))},this.bracketOn=function(){this.isKeyword()&&this.prevChar!=" "&&this.prevChar!="\n"?this.write(" ("):this.write("(")},this.bracketOff=function(){var r,n,i,t;this.write(")");if(this.sub)return;r=new RegExp("^\\s*(if|for|while|do)\\s*\\([^{}]+\\)$","i"),n=this.getCurrentLine();if(r.test(n)){i=this.nextNonWhite(this.i);if("{"!=i&&";"!=i&&")"!=i){var e=0,u=0,o=!1,s=!1,f=!1;for(t=0;t<n.length;t++){n.charAt(t)=="("&&(o=!0,e++);if(n.charAt(t)==")"){u++;if(o&&e==u)if(t==n.length-1)f=!0;else break}}f&&this.fixSub(r.exec(n)[1])}}},this.sub=!1,this.orig_i=null,this.orig_lvl=null,this.orig_code=null,this.orig_row=null,this.orig_switches=null,this.restoreOrig=function(n){this.sub=!1,n||(this.i=this.orig_i),this.lvl=this.orig_lvl,this.code=this.orig_code,this.row=this.orig_row,this.switches=this.orig_switches,this.prevCharInit(),this.lastWord="",this.charInit(),this.isAssign=!1},this.combineSub=function(){for(i=0;i<this.code.length;i++){var n=this.orig_code[this.orig_row];0==i&&n.length?(n.substr(n.length-1,1)!=" "&&(this.orig_code[this.orig_row]+=" "),this.orig_code[this.orig_row]+=this.code[i].trim()):this.orig_code[this.orig_row+i]=this.code[i]}},this.fixSub=function(n){var i,h,e,s;if(this.sub)return;if("{"==this.nextNonWhite(this.i))return;i=this.nextWord(),this.orig_i=this.i,this.orig_lvl=this.lvl,this.orig_code=this.code,this.orig_row=this.row,this.orig_switches=this.switches,this.sub=!0,this.code=[""],this.prevChar="",this.row=0,this.switches=[],this.isAssign=!1,this.i++;var u=0,r=0,f=0;"else if"==n&&(h=!1);var t=!1,o=!1,c=!1;while(!t&&this.i<this.len){e=this.s.charAt(this.i),this.charInit();switch(e){case"{":u++;break;case"}":u--;if(0==u&&0==r&&0==f&&this.lvl-1==this.orig_lvl){s=this.nextWord();if("switch"==i){t=!0;break}if("try"==i&&"catch"==o){t=!0;break}if("while"==i&&"do"==o){t=!0;break}"if"==i;if("if"==n&&"else"==s&&"if"!=i){t=!0;break}o=s}break;case"(":r++;break;case")":r--;if("else if"==n&&0==r&&!h){if(this.nextNonWhite(this.i)=="{"){this.write(e),this.combineSub(),this.restoreOrig(!0);return}this.write(e),this.combineSub(),this.restoreOrig(!0),this.fixSub("if");return}break;case"[":f++;break;case"]":f--;break;case";":0==u&&0==r&&0==f&&this.lvl==this.orig_lvl&&"if"!=i&&(t=!0)}if(-1==u&&r==0&&f==0&&this.prevNonWhite(this.i)!="}")this.write(";"),this.i--,t=!0;else if(u<0||r<0||f<0){t=!1;break}else this.switch_c(e);this.i++}this.i--,t&&(this.s=this.s.substr(0,this.orig_i+1)+"{"+this.code.join("\n")+"}"+this.s.substr(this.i+1),this.len=this.s.length),this.restoreOrig(!1)},this.squareBracketOn=function(){this.checkKeyword(),this.write("[")},this.squareBracketOff=function(){this.write("]")},this.isKeyword=function(){return this.lastWord.length&&this.keywords.indexOf(this.lastWord)!=-1},this.linefeed=function(){},this.space=function(){if(!this.prevChar.length)return;if(" "==this.prevChar||"\n"==this.prevChar)return;"}"==this.prevChar&&"]"==this.nextChar,this.write(" ");return},this.checkKeyword=function(){this.isKeyword()&&this.prevChar!=" "&&this.prevChar!="\n"&&this.write(" ")},this.nextWord=function(){var i=this.i,t="",n;while(i<this.len-1){i++,n=this.s.charAt(i);if(t.length)if(/\s/.test(n))break;else if(/\w/.test(n))t+=n;else break;else if(/\s/.test(n))continue;else if(/\w/.test(n))t+=n;else break}return t.length?t:!1},this.nextManyNW=function(n){var r="",i=this.i,t;while(i<this.len-1){i++,t=this.s.charAt(i);if(!/^\s+$/.test(t)){r+=t;if(r.length==n)return r}}return!1},this.goNextManyNW=function(n){var r="",t=this.i,i;while(t<this.len-1){t++,i=this.s.charAt(t);if(!/^\s+$/.test(i)){r+=i;if(r==n)return this.i=t,this.charInit(),!0;if(r.length>=n.length)return!1}}return!1},this.nextNonWhite=function(n){while(n<this.len-1){n++;var t=this.s.charAt(n);if(!/^\s+$/.test(t))return t}return!1},this.prevNonWhite=function(n){while(n>0){n--;var t=this.s.charAt(n);if(!/^\s+$/.test(t))return t}return!1},this.goNextNonWhite=function(){var n=this.i,t;while(n<this.len-1){n++,t=this.s.charAt(n);if(!/^\s+$/.test(t))return this.i=n,this.charInit(),!0}return!1},this.colon=function(){var n=this.getCurrentLine();/^\s*case\s/.test(n)||/^\s*default$/.test(n)?(this.write(":"),this.writeLine()):this.symbol2(":")},this.isStart=function(){return this.getCurrentLine().length===0},this.backLine=function(){if(!this.isStart)throw"backLine() may be called only at the start of the line";this.code.length=this.code.length-1,this.row--},this.semicolon=function(){this.isAssign=!1,this.isStart()&&this.backLine(),this.write(";"),/^\s*for\s/.test(this.getCurrentLine())?this.write(" "):this.writeLine()},this.quotation=function(n){var i,t;this.checkKeyword(),i=!1,this.write(n);while(this.i<this.len-1){this.i++,t=this.s.charAt(this.i),"\\"==t&&(i=i?!1:!0),this.write(t);if(t==n)if(!i)break;"\\"!=t&&(i=!1)}},this.lineComment=function(){this.write("//"),this.i++;while(this.i<this.len-1){this.i++;var n=this.s.charAt(this.i);if("\n"==n){this.writeLine();break}this.write(n)}},this.comment=function(){this.write("/*"),this.i++;var n="",t="";while(this.i<this.len-1){this.i++,t=n,n=this.s.charAt(this.i)," "==n||"\t"==n||"\n"==n?" "==n?this.getCurrentLine().length>100?this.writeLine():this.write(" ",!0):"\t"==n?this.write(" ",!0):"\n"==n&&this.writeLine():this.write(n,!0);if("/"==n&&"*"==t)break}this.writeLine()},this.slash=function(){for(var n=this.i-1,u=this.s.charAt(n),e,o,f,s,i,r,t,n=this.i-1;n>=0;n--){e=this.s.charAt(n);if(" "==e||"\t"==e)continue;u=this.s.charAt(n);break}o=/^\w+$/.test(u)||"]"==u||")"==u,f="*"==this.prevChar;if(o||f)o?"="==this.nextChar?(s=this.prevChar==" "?"":" ",this.write(s+"/")):this.write(" / "):f&&this.write("/ ");else if(")"==this.prevChar)this.write(" / ");else{i="",i+="="==this.prevChar||":"==this.prevChar?" /":"/",r=!1;while(this.i<this.len-1){this.i++,t=this.s.charAt(this.i),"\\"==t&&(r=r?!1:!0),i+=t;if("/"==t)if(!r)break;"\\"!=t&&(r=!1)}this.write(i)}},this.comma=function(){this.write(", ");var n=this.getCurrentLine();n.replace(" ","").length>100&&this.writeLine()},this.dot=function(){this.write(".")},this.symbol1=function(n){"="==this.prevChar&&"!"==n?this.write(" "+n):this.write(n)},this.symbol2=function(n){if("+"==n||"-"==n)if(n==this.nextChar||n==this.prevChar){this.write(n);return}var i=this.prevChar==" "?"":" ",t=" ";"("==this.prevChar&&(i="",t="");if("-"==n&&(">"==this.prevChar||">"==this.prevChar)){this.write(" "+n);return}this.symbols2.indexOf(this.prevChar)!=-1?this.symbols2.indexOf(this.nextChar)!=-1?this.write(n+(this.nextChar=="!"?" ":"")):this.write(n+t):this.symbols2.indexOf(this.nextChar)!=-1?this.write(i+n):this.write(i+n+t),"="==n&&/^[\w\]]$/.test(this.prevNonWhite(this.i))&&/^[\w\'\"\[]$/.test(this.nextNonWhite(this.i))&&(this.isAssign=!0)},this.alphanumeric=function(n){this.lastWord?this.lastWord+=n:this.lastWord=n,")"==this.prevChar&&(n=" "+n),this.write(n)},this.unknown=function(n){this.write(n)},this.charInit=function(){this.nextChar=this.len-1===this.i?"":this.s.charAt(this.i+1)},this.write=function(n,t){var r,i;if(t)/\s/.test(n)||this.code[this.row].length<this.lvl*4&&(this.code[this.row]+=str_repeat(" ",this.lvl*4-this.code[this.row].length)),this.code[this.row]+=n;else if(0===this.code[this.row].length){for(r="}"==n?this.lvl-1:this.lvl,i=0;i<r;i++)this.code[this.row]+=" ";this.code[this.row]+=n}else this.code[this.row]+=n;this.prevCharInit()},this.writeLine=function(){this.code.push(""),this.row++,this.prevChar="\n"},this.replaceLine=function(n,t){"undefined"==typeof t&&(t=!1);if(t!==!1)if(!/^\d+$/.test(t)||t<0||t>this.row)throw"replaceLine() failed: invalid row="+t;t!==!1?this.code[t]=n:this.code[this.row]=n,(t===!1||t==this.row)&&this.prevCharInit()},this.prevCharInit=function(){this.prevChar=this.code[this.row].charAt(this.code[this.row].length-1)},this.writeTab=function(){this.write(" "),this.prevChar=" "},this.getCurrentLine=function(){return this.code[this.row]},this.symbols1="~!^",this.symbols2="-+*%<=>?:&|/!",this.keywords=["abstract","boolean","break","byte","case","catch","char","class","const","continue","default","delete","do","double","else","extends","false","final","finally","float","for","function","goto","if","implements","import","in","instanceof","int","interface","long","native","new","null","package","private","protected","public","return","short","static","super","switch","synchronized","this","throw","throws","transient","true","try","typeof","var","void","while","with"]}function str_repeat(n,t){ret="";for(var i=0;i<t;i++)ret+=n;return ret}function debug(n,t){var i,r;if(!debug_w){var f=600,e=600,o=screen.width/2-f/2,u=screen.height/2-e/2;debug_w=window.open("","","scrollbars=yes,resizable=yes,width="+f+",height="+e+",screenX="+o+",screenY="+u+",left="+o+",top="+u),debug_w.document.open(),debug_w.document.write("<html><head><style>body{margin: 1em;padding: 0;font-family: courier new; font-size: 12px;}h1,h2{margin: 0.2em 0;}</style></head><body><h1>Debug</h1></body></html>"),debug_w.document.close()}i="","undefined"!=typeof t&&t.length&&(i="<h2>"+t+"</h2>\n");if("object"==typeof n)for(r=0;r<n.length;r++)i+="["+r+"] => "+n[r]+"\n";else if("string"==typeof n)i+=n;else{try{i+=n.toString()}catch(s){}i+=" ("+typeof n+")"}debug_w.document.body.innerHTML+="<pre>"+i+"</pre>"}typeof Array.prototype.indexOf=="undefined"&&(Array.prototype.indexOf=function(n){for(var t=0;t<this.length;t++)if(typeof this[t]==typeof n&&this[t]==n)return t;return-1}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s*|\s*$/g,"")});var debug_w