Você já teve dor de cabeça ao olhar para o código confuso escrito por outras pessoas? Você já se sentiu incomodado ao olhar para o código do BWindow? Você já hesitou sobre a contradição entre reduzir o tamanho do JS e a legibilidade do JS? tenho um código Um programa para formatação e compactação de código está finalmente disponível hoje. Ele é escrito em JS puro e, claro, é de código aberto. Desculpe, deixe-me fazer um anúncio primeiro :). muito tempo, e finalmente usei hoje. Terminei de escrevê-lo no fim de semana. Devido à correria da escrita, ainda existem alguns pequenos bugs.
<HTML><HEAD><TITLE>Formato</TITLE>
<META content="MSHTML 6.00.2800.1528" nome=GERADOR>
<META content="" nome=Autor>
<META content="" nome=Palavras-chave>
<META content="" name=Descrição></HEAD>
<CORPO>
<linguagem SCRIPT=JavaScript>
<!--
/**//**//**//**
** ============================================== =================================================
** Nome da classe: CLASS_FORMATER
** Função: formatação JS
** Exemplo:
-------------------------------------------------- --------------------------------------------------
var xx = new CLASS_FORMATER(código);
document.getElementById("display").innerHTML = xx.format();
-------------------------------------------------- --------------------------------------------------
** Autor: ttyp
** E-mail: [email protected]
** Data: 21/05/2006
** Versão: 0.1
** ============================================== =================================================
**/
função CLASS_FORMAT(código){
//Classe da tabela hash
função Hashtable(){
this._hash = new Object();
this.add = function(chave,valor){
if(typeof(chave)!="indefinido"){
if(this.contains(chave)==falso){
this._hash[key]=typeof(value)=="indefinido"?null:value;
retornar verdadeiro;
} outro {
retornar falso;
}
} outro {
retornar falso;
}
}
this.remove = function(key){excluir 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])!="indefinido";}
this.clear = function(){for(var k in this._hash){delete this._hash[k];}}
}
this._caseSensitive = true
//Converter string em tabela hash
;
this.str2hashtable=função(chave,cs){
var _key = key.split(/,/g);
var _hash = new Hashtable();
var _cs = verdadeiro;
if(typeof(cs)=="indefinido"||cs==null){
_cs = this._caseSensitive;
} outro {
_cs = cs;
}
for(var i in _key){
se(_cs){
_hash.add(_chave[i]);
} outro {
_hash.add((_key[i]+"").toLowerCase());
}
}
retornar _hash;
}
//Obtém o código que precisa ser convertido
this._codetxt = código;
if(typeof(sintaxe)=="indefinido"){
sintaxe = "";
}
this._deleteComment = false;
//Se faz distinção entre maiúsculas e minúsculas
this._caseSensitive = verdadeiro;
//Palavras-chave que podem ser adicionadas após a instrução do bloco
this._blockElement = this.str2hashtable("switch,se,enquanto,tentar,finalmente");
//É uma declaração de função
this._function = this.str2hashtable("função");
//O ponto e vírgula entre parênteses desta linha não causa quebras de linha.
this._isFor = "para";
this._choiceElement = this.str2hashtable("else,catch");
this._beginBlock = "{";
this._endBlock = "}";
this._singleEyeElement = this.str2hashtable("var,novo,return,else,delete,in,case");
//Obtém o caractere de divisão
this._wordDelimiters= " ,.?!;:\/<>(){}[]"'rnt=+-|*%@#$^&";
//Cita caracteres
this._quotation = this.str2hashtable("",'");
//Caracteres de comentário de linha
this._lineComment = "//";
//Caracter de escape
this._escape = "\";
//Início das referências multilinhas
this._commentOn = "/*";
//Fim da cotação multilinha
this._commentOff = "*/";
//Terminador de linha
this._rowEnd = ";";
this._in = "em";
this.isCompress = falso;
este.estilo = 0;
este._tabNum = 0;
este.formato = função() {
var codeArr = new Array();
var índice_palavra = 0;
htmlTxt
= new Array();
this._deleteComment = true;
}
//Obtém o array de caracteres divididos (segmentação de palavras)
for (var i = 0; i < this._codetxt.length; i++) {
if (this._wordDelimiters.indexOf(this._codetxt.charAt(i)) == -1) { //Palavra-chave não encontrada
if (codeArr[word_index] == null || typeof(codeArr[word_index]) == 'indefinido') {
codeArr[palavra_index] = "";
}
codeArr[word_index] += this._codetxt.charAt(i);
} outro {
if (typeof(codeArr[word_index]) != 'indefinido' && codeArr[word_index].length > 0)
palavra_índice++;
codeArr[word_index++] = this._codetxt.charAt(i);
}
}
var quote_opened = false; //Aspas
var slash_star_comment_opened = false; //Marca de comentário multilinha
var slash_slash_comment_opened = false; //Marca de comentário de linha única
var núm_linha = 1; //número da linha
var quote_char = ""; //Tipo de aspas
var function_opened = false;
var bracket_open = false;
var for_open = false;
//De acordo com a palavra dividida, exibir em blocos
for (var i=0; i <=índice_palavra; i++){
//Trata linhas vazias (devido ao escape)
if(typeof(codeArr[i])=="indefinido"||codeArr[i].length==0){
continuar;
} 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];
}
} senão if(codeArr[i]=="n"){
//Lida com nova linha
} else if (codeArr[i] == "r"){
slash_slash_comment_opened = falso;
quote_opened = falso;
núm_linha++;
if(!this.isCompress){
htmlTxt[htmlTxt.length] = "rn"+ this.getIdent();
}
//Processa marcadores de parâmetros na função
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&this.isFunction(codeArr[i])){
htmlTxt[htmlTxt.length] = codeArr[i] + " ";
função_aberta = verdadeiro;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._isFor){
htmlTxt[htmlTxt.length] = codeArr[i];
for_open = verdadeiro;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){
colchete_open = verdadeiro;
htmlTxt[htmlTxt.length] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==")"){
colchetes_open = falso;
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();
}outro{
htmlTxt[htmlTxt.length] = codeArr[i] + this.getIdent();
}
}outro{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}outro{
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._beginBlock){
for_open = falso;
if(!this.isCompress){
mudar(este.estilo){
caso 0:
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "n" + this.getIdent();
quebrar;
caso 1:
htmlTxt[htmlTxt.length] = "n" + this.getIdent();
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "n"+ this.getIdent();
quebrar;
padrão:
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i];
quebrar;
}
}outro{
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--;
if(i<word_index&&codeArr[i+1]!=this._rowEnd){
htmlTxt[htmlTxt.length] = "n" + this.getIdent() + codeArr[i];
}outro{
htmlTxt[htmlTxt.length] = "n" + this.getIdent() + codeArr[i];
}
}outro{
if(i<word_index&&codeArr[i+1]!=this._rowEnd){
htmlTxt[htmlTxt.length] = codeArr[i] + this._rowEnd;
}outro{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
//processa palavras-chave
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isBlockElement(codeArr[i])){
htmlTxt[htmlTxt.length] = codeArr[i];
//Processa objetos integrados (adicione um espaço depois)
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isSingleEyeElement(codeArr[i])){
if(códigoArr[i]==this._in){
htmlTxt[htmlTxt.length] = " ";
}
htmlTxt[htmlTxt.length] = codeArr[i] + " ";
//Processa aspas duplas (sem caracteres de escape antes das aspas)
} else if (!slash_star_comment_opened&&!slash_slash_comment_opened&&this._quotation.contains(codeArr[i])){
if (quote_opened){
// é a aspa correspondente
if(quote_char==codeArr[i]){
htmlTxt[htmlTxt.length] = codeArr[i];
quote_opened = falso;
citação_char = "";
} outro {
htmlTxt[htmlTxt.length] = codeArr[i];
}
} outro {
htmlTxt[htmlTxt.length] = codeArr[i];
quote_opened = verdadeiro;
quote_char = codeArr[i];
}
//Trata caracteres de escape
} else if(codeArr[i] == this._escape){
htmlTxt[htmlTxt.length] = codeArr[i];
if(i<palavra_índice-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);
eu=eu+1;
}
}
//Trata o início dos comentários multilinhas
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._commentOn,codeArr,i)){
slash_star_comment_opened = verdadeiro;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOn;
}
i = i + this.getSkipLength(this._commentOn);
//Processa comentários de linha única
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._lineComment,codeArr,i)){
slash_slash_comment_opened = verdadeiro;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._lineComment;
}
i = i + this.getSkipLength(this._lineComment);
//Trata palavras ignoradas
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._ignore,codeArr,i)){
slash_slash_comment_opened = verdadeiro;
htmlTxt[htmlTxt.length] = this._ignore;
i = i + this.getSkipLength(this._ignore);
//Fim do processamento de comentários multilinhas
} else if (!quote_opened&&!slash_slash_comment_opened&&this.isStartWith(this._commentOff,codeArr,i)){
if (slash_star_comment_opened) {
slash_star_comment_opened = falso;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOff;
}
i = i + this.getSkipLength(this._commentOff);
}
} outro {
//não está na string
if(!quote_opened){
//Se não estiver no comentário
if(!slash_slash_comment_opened && !slash_star_comment_opened){
htmlTxt[htmlTxt.length] = codeArr[i];
//Comentando
}outro{
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
}outro{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
}
return htmlTxt.join("");
}
this.isStartWith = function(str,code,index){
if(typeof(str)!="indefinido"&&str.length>0){
var cc = new Array();
for(var i=index;i<index+str.length;i++){
cc[cc.comprimento] = código[i];
}
var c = cc.join("");
if(this._caseSensitive){
if(str.length>=código[index].length&&c.indexOf(str)==0){
retornar verdadeiro;
}
}outro{
if(str.length>=código[index].length&&c.toLowerCase().indexOf(str.toLowerCase())==0){
retornar verdadeiro;
}
}
retornar falso
} senão {
retornar falso;
}
}
this.isFunction = function(val){
retornar this._function.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isBlockElement = função (val) {
retornar this._blockElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isChoiceElement = function(val) {
retornar this._choiceElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isSingleEyeElement = função (val) {
retornar this._singleEyeElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isNextElement = função(de,palavra){
for(var i=de;i<palavra.comprimento;i++){
if(palavra[i]!=" "&&palavra[i]!="t"&&palavra[i]!="r"&&palavra[i]!="n"){
retornar this.isChoiceElement(palavra[i]);
}
}
retornar falso;
}
this.getSkipLength = function(val){
var contagem = 0;
for(var i=0;i<val.comprimento;i++){
if(this._wordDelimiters.indexOf(val.charAt(i))>=0){
contar++;
}
}
if(contagem>0){
contagem = contagem-1;
}
contagem de retorno;
}
this.getIdent=função(){
var n = [];
for(var i=0;i<this._tabNum;i++){
n[n.comprimento] = "t";
}
retornar n.join("");
}
}
função doformato(o){
var htmltxt = "";
if (o == nulo){
alert("domNode é nulo!");
retornar;
}
var _codetxt = "";
if(typeof(o)=="objeto"){
switch(o.tagNome){
caso "TEXTAREA":
caso "ENTRADA":
_codetxt = o.valor;
quebrar;
caso "DIV":
caso "SPAN":
_codetxt = o.innerText;
quebrar;
padrão:
_codetxt = o.innerHTML;
quebrar;
}
}outro{
_codetxt=o;
}
var _syn = new CLASS_FORMAT(_codetxt);
htmltxt = _syn.format();
retornar htmltxt;
}
função ir()
{
var código = document.getElementById("código").valor;
var xx = novo CLASS_FORMAT(código);
var a = new Date();
if(document.getElementById('cboOperate').selectedIndex==1){
xx.isCompress=true;
}outro{
xx.style = parseInt(document.getElementById('cboStyle').value);
}
document.getElementById("display").value = xx.format();
alert("Total de flores:" + (new Date().getTime()-a.getTime()) + "ms");
}
//-->
</SCRIPT>
<TEXTAREA id=código linhas=12 cols=100>
/*
Esta é uma aula
*/
função xx (num,str){//Descrição
var a = num;this.aa = a;
this.bb = function(){alert(str);}
)
{document.title=i;}}};
}
var a = new xx(100,"olá"),b=new xx(0,"ttyp");
if(1>2) { alerta();
}
outro {
alerta("inferno");
}
a.bb();
b.dd();
alerta(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">Formato</option>
<option value="1">Compressão</option>
</selecionar>
<selecione id="cboStyle">
<option value="0">Clássico</option>
<option value="1">Microsoft</option>
</selecionar>
<INPUT onclick=go() tipo=botão valor=go><br>
<textarea id=exibir linhas=12 colunas=100>
</textarea>
</BODY></HTML>