2009年2月

Javascript格式化工具,压缩工具

[code lang="html"]
<SCRIPT language=JavaScript>

function CLASS_FORMAT(code){

function Hashtable(){
this._hash = new Object();
this.add = function(key,value){
if(typeof(key)!="undefined"){
if(this.contains(key)==false){
this._hash[key]=typeof(value)=="undefined"?null:value;
return true;
} else {
return false;
}
} else {
return false;
}
}
this.remove = function(key){delete this._hash[key];}
this.count = function(){var i=0;for(var k in this._hash){i++;} return i;}
this.items = function(key){return this._hash[key];}
this.contains = function(key){return typeof(this._hash[key])!="undefined";}
this.clear = function(){for(var k in this._hash){delete this._hash[k];}}

}

this._caseSensitive = true;

this.str2hashtable = function(key,cs){

var _key = key.split(/,/g);
var _hash = new Hashtable();
var _cs = true;

if(typeof(cs)=="undefined"||cs==null){
_cs = this._caseSensitive;
} else {
_cs = cs;
}

for(var i in _key){
if(_cs){
_hash.add(_key[i]);
} else {
_hash.add((_key[i]+"").toLowerCase());
}

}
return _hash;
}

this._codetxt = code;

if(typeof(syntax)=="undefined"){
syntax = "";
}

this._deleteComment = false;

this._caseSensitive = true;

this._blockElement = this.str2hashtable("switch,if,do,while,try,finally");

this._function = this.str2hashtable("function");

this._isFor = "for";

this._choiceElement = this.str2hashtable("else,catch,while");

this._beginBlock = "{";
this._endBlock = "}";

this._singleEyeElement = this.str2hashtable("var,new,return,else,delete,in,case,typeof");

this._wordDelimiters= "  ,.?!;:\\/<>(){}[]\"'\r\n\t=+-|*%@#$^&";

this._quotation = this.str2hashtable("\",'");

this._lineComment = "//";

this._escape = "\\";

this._commentOn = "/*";

this._commentOff = "*/";

this._rowEnd = ";";
this._in = "in";

this.isCompress = false;
this.style = 0;
this._tabNum = 0;

this.format = function() {
var codeArr = new Array();
var word_index = 0;
var htmlTxt = new Array();

if(this.isCompress){
this._deleteComment = true;
}

for (var i = 0; i < this._codetxt.length; i++) {
if (this._wordDelimiters.indexOf(this._codetxt.charAt(i)) == -1) {
if (codeArr[word_index] == null || typeof(codeArr[word_index]) == 'undefined') {
codeArr[word_index] = "";
}
codeArr[word_index] += this._codetxt.charAt(i);
} else {
if (typeof(codeArr[word_index]) != 'undefined' && codeArr[word_index].length > 0)
word_index++;
codeArr[word_index++] = this._codetxt.charAt(i);
}
}

var quote_opened = false;
var slash_star_comment_opened = false;
var slash_slash_comment_opened = false;
var line_num = 1;
var quote_char = "";

var function_opened = false;

var bracket_open = false;
var for_open = false;

for (var i=0; i <=word_index; i++){
if(typeof(codeArr[i])=="undefined"||codeArr[i].length==0){
continue;
} else if(codeArr[i]==" "||codeArr[i]=="\t"){
if(slash_slash_comment_opened||slash_star_comment_opened){
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
if(quote_opened){
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else if(codeArr[i]=="\n"){
} else if (codeArr[i] == "\r"){
slash_slash_comment_opened = false;
quote_opened = false;
line_num++;
if(!this.isCompress){
htmlTxt[htmlTxt.length] = "\r\n"+ this.getIdent();
}
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&this.isFunction(codeArr[i])){
htmlTxt[htmlTxt.length] = codeArr[i] + " ";
function_opened = true;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._isFor){
htmlTxt[htmlTxt.length] = codeArr[i];
for_open = true;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){
bracket_open = true;
htmlTxt[htmlTxt.length] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==")"){
bracket_open = false;
htmlTxt[htmlTxt.length] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._rowEnd){
if(!this.isCompress){
if(!for_open){
if(i<word_index&&(codeArr[i+1]!="\r"&&codeArr[i+1]!="\n")){
htmlTxt[htmlTxt.length] = codeArr[i] + "\n" + this.getIdent();
}else{
htmlTxt[htmlTxt.length] = codeArr[i] + this.getIdent();
}
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._beginBlock){
for_open = false;
if(!this.isCompress){
switch(this.style){
case 0:
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "\n" + this.getIdent();
break;
case 1:
htmlTxt[htmlTxt.length] = "\n" + this.getIdent();
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "\n"+ this.getIdent();
break;
default:
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i];
break;

}
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}

} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._endBlock){
if(!this.isCompress){
this._tabNum--;
htmlTxt[htmlTxt.length] = "\n" + this.getIdent() + codeArr[i];
}else{
if(i<word_index&&this.isNextChar(i,codeArr)==false){
htmlTxt[htmlTxt.length] = codeArr[i] + this._rowEnd;
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isBlockElement(codeArr[i])){
htmlTxt[htmlTxt.length] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isSingleEyeElement(codeArr[i])){
if(codeArr[i]==this._in){
htmlTxt[htmlTxt.length] = " ";
}
htmlTxt[htmlTxt.length] = codeArr[i] + " ";
} else if (!slash_star_comment_opened&&!slash_slash_comment_opened&&this._quotation.contains(codeArr[i])){
if (quote_opened){
if(quote_char==codeArr[i]){
htmlTxt[htmlTxt.length] = codeArr[i];
quote_opened = false;
quote_char = "";
} else {
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else {
htmlTxt[htmlTxt.length] = codeArr[i];
quote_opened = true;
quote_char = codeArr[i];
}
} else if(!slash_star_comment_opened&&!slash_slash_comment_opened &&codeArr[i] == this._escape){
htmlTxt[htmlTxt.length] = codeArr[i];
if(i<word_index-1){
if(codeArr[i+1].charCodeAt(0)>=32&&codeArr[i+1].charCodeAt(0)<=127){
htmlTxt[htmlTxt.length] = codeArr[i+1].substr(0,1);
htmlTxt[htmlTxt.length] = codeArr[i+1].substr(1);
i=i+1;
}
}
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._commentOn,codeArr,i)){
slash_star_comment_opened = true;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOn;
}
i = i + this.getSkipLength(this._commentOn);
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._lineComment,codeArr,i)){
slash_slash_comment_opened = true;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._lineComment;
}
i = i + this.getSkipLength(this._lineComment);
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._ignore,codeArr,i)){
slash_slash_comment_opened = true;
htmlTxt[htmlTxt.length] = this._ignore;
i = i + this.getSkipLength(this._ignore);
} else if (!quote_opened&&!slash_slash_comment_opened&&this.isStartWith(this._commentOff,codeArr,i)){
if (slash_star_comment_opened) {
slash_star_comment_opened = false;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOff;
}
i = i + this.getSkipLength(this._commentOff);
}
} else {
if(!quote_opened){
if(!slash_slash_comment_opened && !slash_star_comment_opened){
htmlTxt[htmlTxt.length] = codeArr[i];
}else{
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}

}

return htmlTxt.join("");
}

this.isStartWith = function(str,code,index){

if(typeof(str)!="undefined"&&str.length>0){
var cc = new Array();
for(var i=index;i<index+str.length;i++){
cc[cc.length] = code[i];
}
var c = cc.join("");
if(this._caseSensitive){
if(str.length>=code[index].length&&c.indexOf(str)==0){
return true;
}
}else{
if(str.length>=code[index].length&&c.toLowerCase().indexOf(str.toLowerCase())==0){
return true;
}
}
return false;

} else {
return false;
}
}

this.isFunction = function(val){
return this._function.contains(this._caseSensitive?val:val.toLowerCase());
}

this.isBlockElement = function(val) {
return this._blockElement.contains(this._caseSensitive?val:val.toLowerCase());
}

this.isChoiceElement = function(val) {
return this._choiceElement.contains(this._caseSensitive?val:val.toLowerCase());
}

this.isSingleEyeElement = function(val) {
return this._singleEyeElement.contains(this._caseSensitive?val:val.toLowerCase());
}

this.isNextElement = function(from,word){
for(var i=from+1;i<word.length;i++){
if(word[i]!=" "&&word[i]!="\t"&&word[i]!="\r"&&word[i]!="\n"){
return this.isChoiceElement(word[i]);
}
}
return false;
}

this.isNextChar = function(from,word){
for(var i=from+1;i<word.length;i++){
if(word[i]!=" "&&word[i]!="\t"&&word[i]!="\r"&&word[i]!="\n"){
return ";,)]}".indexOf(word[i])>=0||this.isChoiceElement(word[i]);
}
}
return false;
}

this.getSkipLength = function(val){
var count = 0;
for(var i=0;i<val.length;i++){
if(this._wordDelimiters.indexOf(val.charAt(i))>=0){
count++;
}
}
if(count>0){
count=count-1;
}
return count;
}

this.getIdent=function(){
var n = [];
for(var i=0;i<this._tabNum;i++){
n[n.length] = "\t";
}
return n.join("");
}
}

function doformat(o){
var htmltxt = "";

if (o == null){
alert("domNode is null!");
return;
}

var _codetxt = "";

if(typeof(o)=="object"){
switch(o.tagName){
case "TEXTAREA":
case "INPUT":
_codetxt = o.value;
break;
case "DIV":
case "SPAN":
_codetxt = o.innerText;
break;
default:
_codetxt = o.innerHTML;
break;
}
}else{
_codetxt = o;
}

var _syn = new CLASS_FORMAT(_codetxt);
htmltxt = _syn.format();
return htmltxt;
}

function go()
{
var code = document.getElementById("code").value;
var xx = new CLASS_FORMAT(code);
var a = new Date();

if(document.getElementById('cboOperate').selectedIndex==1){
xx.isCompress=true;
}else{
xx.style = parseInt(document.getElementById('cboStyle').value);
}
document.getElementById("display").value = xx.format();
alert("共花:" + (new Date().getTime()-a.getTime()) + "ms");
}

</SCRIPT>
<TEXTAREA id=code rows=12 cols=100>
/*
这个是一个类
*/

function xx (num,str){//说明
var a = num;this.aa = a;
this.bb = function(){alert(str);}
this.cc = function(){for(var i=0;i<10;i++){document.title=i;}}//str=str.replace(/(\\)/gi,'\\\\');
};

var o = {a:function(){},b:345}

xx.prototype.dd= function(){alert("d d kd");}

var a = new xx(100,"hello"),b=new xx(0,"ttyp");
if(1>2) { alert();
}
else {
alert(" hell ");
}

a.bb();
b.dd();
alert(a.aa);

</TEXTAREA> <BR>
<select id="cboOperate" onchange="if(this.selectedIndex==1)document.getElementById('cboStyle').disabled=true;else document.getElementById('cboStyle').disabled=false;">
<option value="0">格式化</option>
<option value="1">压缩</option>
</select>
<select id="cboStyle">
<option value="0">经典</option>
<option value="1">微软</option>
</select>
<INPUT onclick=go() type=button value=go><br>
<textarea id=display rows=12 cols=100>
</textarea>
[/code]

CSS代码格式化和css在线压缩工具

[code lang="html"]
<script language="JavaScript">
function $()
{
var elements=new Array();
for(var i=0;i<arguments.length;i++)
{
var element=arguments[i];
if(typeof element=='string')element=document.getElementById(element);
if(arguments.length==1)return element;
elements.push(element);
}
return elements;
}

function CSSencode(code)
{
code=code.replace(/\n/ig,'');
code=code.replace(/(\s){2,}/ig,'$1');
code=code.replace(/\t/ig,'');
code=code.replace(/\n\}/ig,'\}');
code=code.replace(/\n\{\s/ig,'\{');
code=code.replace(/(\S)\s*\}/ig,'$1\}');
code=code.replace(/(\S)\s*\{/ig,'$1\{');
code=code.replace(/\{\s*(\S)/ig,'\{$1');
return code;
}

function CSSdecode(code)
{
code=code.replace(/(\s){2,}/ig,'$1');
code=code.replace(/(\S)\s*\{/ig,'$1 {');
code=code.replace(/\*\/(.[^\}\{]*)}/ig,'\*\/\n$1}');
code=code.replace(/\/\*/ig,'\n\/\*');
code=code.replace(/;\s*(\S)/ig,';\n\t$1');
code=code.replace(/\}\s*(\S)/ig,'\}\n$1');
code=code.replace(/\n\s*\}/ig,'\n\}');
code=code.replace(/\{\s*(\S)/ig,'\{\n\t$1');
code=code.replace(/(\S)\s*\*\//ig,'$1\*\/');
code=code.replace(/\*\/\s*([^\}\{]\S)/ig,'\*\/\n\t$1');
code=code.replace(/(\S)\}/ig,'$1\n\}');
code=code.replace(/(\n){2,}/ig,'\n');
code=code.replace(/:/ig,': ');
code=code.replace(/ /ig,' ');
return code;
}
</script>
CSS代码格式化和css在线压缩/*请将CSS代码复制到下面*/<br/><br/>
<textarea id="code" style="width: 100%; height: 300px">
.rss_a:link{color:#99ccff;}
.rss_a:visited{color:#99ccff;}
.rss_a:hover{
background-color:#e8f3fd;
text-decoration:none;
color:#008ed2;
border:1pxsolid#99ccff;
}
</textarea>
<br />
<input type="button" onClick="$('code').value = CSSdecode($('code').value);" value="格式化" /> |
<input type="button" onClick="$('code').value = CSSencode($('code').value);" value="压缩化" /> |
<input type="button" onClick="window.clipboardData.setData('Text',$('code').value);" value="复制" /> |
<input type="button" onClick="$('code').value = window.clipboardData.getData('Text');" value="粘贴" /> |
<input type="button" onClick="$('code').value = ''" value="清空" />
[/code]