Pernahkah Anda pusing melihat kode berantakan yang ditulis oleh orang lain? Pernahkah Anda merasa terganggu dengan melihat kode BWindow? Pernahkah Anda ragu tentang kontradiksi antara pengurangan ukuran JS dan keterbacaan JS? punya kode Sebuah program untuk pemformatan dan kompresi kode akhirnya tersedia hari ini. Ini ditulis dalam JS murni, dan tentu saja open source. Maaf, izinkan saya membuat iklan dulu :) Saya ingin menulis kode ini untuk a lama sekali, dan akhirnya saya menggunakannya hari ini. Saya selesai menulisnya pada akhir pekan. Karena kesibukan menulis, masih ada beberapa bug kecil. Harap sering-sering memperhatikan pembaruan!
<HTML><HEAD><TITLE>Format</TITLE>
<META content="MSHTML 6.00.2800.1528" nama=GENERATOR>
<META konten="" nama=Penulis>
<META konten="" nama=Kata Kunci>
<META konten="" nama=Deskripsi></HEAD>
<TUBUH>
<Bahasa SKRIP=JavaScript>
<!--
/**//**//**//**
** ________________________________________________ ====================
** Nama kelas: CLASS_FORMATER
** Fungsi: pemformatan JS
** Contoh:
--------------------------------------------------- ---------------------------------------------------
var xx = new CLASS_FORMATER(kode);
document.getElementById("display").innerHTML = xx.format();
--------------------------------------------------- ---------------------------------------------------
**Penulis: ttyp
**Email: [email protected]
** Tanggal: 21-5-2006
** Versi: 0.1
** ________________________________________________ ====================
**/
fungsi CLASS_FORMAT(kode){
//Kelas tabel hash
fungsi Hashtable(){
this._hash = Objek baru();
ini.tambahkan = fungsi(kunci,nilai){
if(typeof(kunci)!="tidak terdefinisi"){
if(ini.berisi(kunci)==salah){
this._hash[key]=typeof(value)===”tidak terdefinisi”?null:value;
kembali benar;
} kalau tidak {
kembali salah;
}
} kalau tidak {
kembali salah;
}
}
this.remove = function(key){hapus this._hash[key];}
this.count = function(){var i=0;for(var k in this._hash){i++;} return i;}
this.items = function(key){kembalikan this._hash[key];}
this.contains = function(key){return typeof(this._hash[key])!="tidak terdefinisi";}
this.clear = function(){for(var k in this._hash){delete this._hash[k];}}
}
this._caseSensitive = true;
//Konversi string ke tabel hash
this.str2hashtable = fungsi(kunci,cs){
var _key = kunci.split(/,/g);
var _hash = Hashtable baru();
var _cs = benar;
if(typeof(cs)=="tidak terdefinisi"||cs==null){
_cs = ini._caseSensitive;
} kalau tidak {
_cs = cs;
}
untuk(var i di _key){
jika(_cs){
_hash.tambahkan(_kunci[i]);
} kalau tidak {
_hash.add((_key[i]+"").toLowerCase());
}
}
kembalikan _hash;
}
//Dapatkan kode yang perlu dikonversi
this._codetxt = kode;
if(typeof(sintaks)=="tidak terdefinisi"){
sintaksis = "";
}
this._deleteComment = salah;
//Apakah peka huruf besar-kecil
this._caseSensitive = benar;
//Kata kunci yang dapat ditambahkan setelah pernyataan blok
this._blockElement = this.str2hashtable("beralih,jika,sementara,coba,akhirnya");
//Ini adalah deklarasi fungsi
this._function = this.str2hashtable("fungsi");
//Tanda titik koma di dalam tanda kurung pada baris ini tidak menyebabkan jeda baris.
this._isFor = "untuk";
this._choiceElement = ini.str2hashtable("else,tangkap");
this._beginBlock = "{";
ini._endBlock = "}";
this._singleEyeElement = this.str2hashtable("var,baru,kembali,lainnya,hapus,dalam,kasus");
//Dapatkan karakter terpisah
this._wordDelimiters= " ,.?!;:\/<>(){}[]"'rnt=+-|*%@#$^&";
//Kutipan karakter
this._quotation = this.str2hashtable("",'");
//Karakter komentar baris
this._lineComment = "//";
//Karakter melarikan diri
this._escape = "\";
//Awal dari referensi multi-baris
this._commentOn = "/*";
//Akhir dari kutipan multi-baris
this._commentOff = "*/";
//Terminator garis
ini._rowEnd = ";";
ini._in = "dalam";
this.isCompress = salah;
ini.gaya = 0;
ini._tabNum = 0;
ini.format = fungsi() {
var codeArr = Array baru();
var indeks_kata = 0;
var htmlTxt = Array baru();
if(ini.isCompress){
this._deleteComment = benar;
}
//Dapatkan array karakter terpisah (segmentasi kata)
for (var i = 0; i < this._codetxt.length; i++) {
if (this._wordDelimiters.indexOf(this._codetxt.charAt(i)) == -1) { //Kata kunci tidak ditemukan
if (codeArr[word_index] == null || typeof(codeArr[word_index]) == 'tidak terdefinisi') {
codeArr[indeks_kata] = "";
}
codeArr[word_index] += this._codetxt.charAt(i);
} kalau tidak {
if (typeof(codeArr[word_index]) != 'tidak terdefinisi' && codeArr[word_index].length > 0)
kata_index++;
codeArr[word_index++] = this._codetxt.charAt(i);
}
}
var quote_opened = salah; //Tanda kutip
var garis miring_bintang_comment_opened = false; //Tanda komentar multi-baris
var garis miring_slash_comment_opened = false; //Tanda komentar satu baris
var nomor_baris = 1; //nomor baris
var quote_char = ""; //Jenis tanda kutip
var function_opened = false
;
var for_open = false;
//Menurut kata yang dipisahkan, ditampilkan dalam blok
untuk (var i=0; i <=word_index; i++){
//Menangani baris kosong (karena escape)
if(typeof(codeArr[i])=="tidak terdefinisi"||codeArr[i].length==0){
melanjutkan;
} else if(codeArr[i]==" "||codeArr[i]=="t"){
if(slash_slash_comment_opened||slash_star_comment_opened){
if(!this._deleteComment){
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
}
jika(kutipan_dibuka){
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
} lain jika(codeArr[i]=="n"){
//Menangani baris baru
} else if (codeArr[i] == "r"){
garis miring_slash_comment_opened = salah;
quote_opened = salah;
baris_num++;
if(!this.isCompress){
htmlTxt[htmlTxt.length] = "rn"+ this.getIdent();
}
//Proses penanda parameter dalam fungsi
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&this.isFunction(codeArr[i])){
htmlTxt[htmlTxt.panjang] = codeArr[i] + " ";
function_opened = benar;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._isFor){
htmlTxt[htmlTxt.panjang] = codeArr[i];
for_open = benar;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){
bracket_open = benar;
htmlTxt[htmlTxt.panjang] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==")"){
bracket_open = salah;
htmlTxt[htmlTxt.panjang] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._rowEnd){
if(!this.isCompress){
jika(!untuk_terbuka){
if(i<word_index&&(codeArr[i+1]!="r"&&codeArr[i+1]!="n")){
htmlTxt[htmlTxt.length] = codeArr[i] + "n" + this.getIdent();
}kalau tidak{
htmlTxt[htmlTxt.length] = codeArr[i] + this.getIdent();
}
}kalau tidak{
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
}kalau tidak{
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._beginBlock){
for_open = salah;
if(!this.isCompress){
beralih(gaya ini){
kasus 0:
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "n" + this.getIdent();
merusak;
kasus 1:
htmlTxt[htmlTxt.length] = "n" + ini.getIdent();
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "n"+ this.getIdent();
merusak;
bawaan:
this._tabNum++;
htmlTxt[htmlTxt.panjang] = codeArr[i];
merusak;
}
}kalau tidak{
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._endBlock){
if(!this.isCompress){
ini._tabNum--;
if(i<word_index&&codeArr[i+1]!=ini._rowEnd){
htmlTxt[htmlTxt.length] = "n" + this.getIdent() + codeArr[i];
}kalau tidak{
htmlTxt[htmlTxt.length] = "n" + this.getIdent() + codeArr[i];
}
}kalau tidak{
if(i<word_index&&codeArr[i+1]!=ini._rowEnd){
htmlTxt[htmlTxt.length] = codeArr[i] + this._rowEnd;
}kalau tidak{
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
}
//proses kata kunci
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isBlockElement(codeArr[i])){
htmlTxt[htmlTxt.panjang] = codeArr[i];
//Memproses objek bawaan (tambahkan spasi setelahnya)
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isSingleEyeElement(codeArr[i])){
if(codeArr[i]==ini._in){
htmlTxt[htmlTxt.panjang] = " ";
}
htmlTxt[htmlTxt.panjang] = codeArr[i] + " ";
//Memproses tanda kutip ganda (tidak ada karakter escape sebelum tanda kutip)
} else if (!slash_star_comment_opened&&!slash_slash_comment_opened&&this._quotation.contains(codeArr[i])){
jika (kutipan_dibuka){
// adalah tanda kutip yang sesuai
if(quote_char==codeArr[i]){
htmlTxt[htmlTxt.panjang] = codeArr[i];
quote_opened = salah;
kutipan_char = "";
} kalau tidak {
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
} kalau tidak {
htmlTxt[htmlTxt.panjang] = codeArr[i];
quote_opened = benar;
quote_char = kodeArr[i];
}
//Menangani karakter escape
} else if(codeArr[i] == this._escape){
htmlTxt[htmlTxt.panjang] = codeArr[i];
jika(saya<kata_index-1){
if(codeArr[i+1].charCodeAt(0)>=32&&codeArr[i+1].charCodeAt(0)<=127){
htmlTxt[htmlTxt.panjang] = codeArr[i+1].substr(0,1);
htmlTxt[htmlTxt.panjang] = codeArr[i+1].substr(1);
saya=saya+1;
}
}
//Menangani awal komentar multi-baris
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._commentOn,codeArr,i)){
garis miring_bintang_komentar_dibuka = benar;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = ini._commentOn;
}
i = i + ini.getSkipLength(ini._commentOn);
//Memproses komentar satu baris
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._lineComment,codeArr,i)){
garis miring_slash_comment_opened = benar;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._lineComment;
}
i = i + ini.getSkipLength(ini._lineComment);
//Menangani kata-kata yang diabaikan
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._ignore,codeArr,i)){
garis miring_slash_comment_opened = benar;
htmlTxt[htmlTxt.length] = ini._ignore;
i = i + ini.getSkipLength(ini._ignore);
//Akhir pemrosesan komentar multi-baris
} else if (!quote_opened&&!slash_slash_comment_opened&&this.isStartWith(this._commentOff,codeArr,i)){
jika (garis miring_bintang_komentar_dibuka) {
garis miring_bintang_komentar_dibuka = salah;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = ini._commentOff;
}
i = i + ini.getSkipLength(ini._commentOff);
}
} kalau tidak {
//tidak dalam string
jika(!quote_opened){
//Jika tidak ada di komentar
jika(!slash_slash_comment_opened && !slash_star_comment_opened){
htmlTxt[htmlTxt.panjang] = codeArr[i];
// Mengomentari
}kalau tidak{
if(!this._deleteComment){
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
}
}kalau tidak{
htmlTxt[htmlTxt.panjang] = codeArr[i];
}
}
}
kembalikan htmlTxt.join("");
}
this.isStartWith = function(str,code,index){
if(typeof(str)!="tidak terdefinisi"&&str.length>0){
var cc = Array baru();
for(var i=index;i<index+str.length;i++){
cc[cc.panjang] = kode[i];
}
var c = cc.join("");
jika(ini._caseSensitif){
if(str.length>=kode[index].length&&c.indexOf(str)==0){
kembali benar;
}
}kalau tidak{
if(str.length>=kode[index].length&&c.toLowerCase().indexOf(str.toLowerCase())==0){
kembali benar;
}
}
kembali salah;
} lain {
kembali salah;
}
}
this.isFunction = fungsi(val){
kembalikan this._function.contains(this._caseSensitive?val:val.toLowerCase());
}
ini.isBlockElement = fungsi(val) {
kembalikan this._blockElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isChoiceElement = fungsi(val) {
kembalikan this._choiceElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isSingleEyeElement = fungsi(val) {
kembalikan this._singleEyeElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isNextElement = fungsi(dari,kata){
for(var i=dari;i<kata.panjang;i++){
if(kata[i]!=" "&&kata[i]!="t"&&kata[i]!="r"&&kata[i]!="n"){
kembalikan ini.isChoiceElement(kata[i]);
}
}
kembali salah;
}
ini.getSkipLength = fungsi(val){
var hitungan = 0;
for(var i=0;i<val.panjang;i++){
if(ini._WordDelimiters.indexOf(val.charAt(i))>=0){
hitung++;
}
}
jika(hitung>0){
hitungan=hitungan-1;
}
jumlah pengembalian;
}
this.getIdent=fungsi(){
var n = [];
untuk(var i=0;i<ini._tabNum;i++){
n[n.panjang] = "t";
}
return n.join("");
}
}
fungsi format(o){
var htmltxt = "";
jika (o == nol){
alert("domNode bernilai nol!");
kembali;
}
var _codetxt = "";
if(typeof(o)=="objek"){
beralih(o.tagNama){
kasus "TEKSTAREA":
kasus "MASUKAN":
_codetxt = o.nilai;
merusak;
kasus "DIV":
kasus "SPAN":
_codetxt = o.innerText;
merusak;
bawaan:
_codetxt = o.innerHTML;
merusak;
}
}kalau tidak{
_codetxt = o;
}
var _syn = CLASS_FORMAT baru(_codetxt);
htmltxt = _syn.format();
kembalikan htmltxt;
}
fungsi pergi()
{
kode var = document.getElementById("kode").nilai;
var xx = CLASS_FORMAT baru(kode);
var a = Tanggal baru();
if(document.getElementById('cboOperate').selectedIndex==1){
xx.isCompress=benar;
}kalau tidak{
xx.style = parseInt(document.getElementById('cboStyle').value);
}
document.getElementById("display").value = xx.format();
alert("Jumlah bunga:" + (Tanggal baru().getTime()-a.getTime()) + "ms");
}
//-->
</SKRIP>
<TEXTAREA id=kode baris=12 kolom=100>
/*
Ini adalah kelas
*/
fungsi xx (angka,str){//Deskripsi
var a = angka;ini.aa = a;
this.bb = fungsi(){alert(str);}
this.cc = function(){for(var i=0;i<10;i++){document.title=i;}}};
xx.prototype.dd= function(){alert("d d kd"); }
var a = new xx(100,"halo"),b=new xx(0,"ttyp");
jika(1>2) { peringatan();
}
kalau tidak {
peringatan("neraka");
}
a.bb();
b.dd();
peringatan(a.aa);
</TEXTAREA> <BR>
<pilih id="cboOperate" onchange="if(this.selectedIndex==1)document.getElementById('cboStyle').disabled=true;else document.getElementById('cboStyle').disabled=false;">
<option value="0">Format</option>
<option value="1">Kompresi</option>
</pilih>
<pilih id="cboStyle">
<option value="0">Klasik</option>
<option value="1">Microsoft</option>
</pilih>
<INPUT onclick=go() type=nilai tombol=go><br>
<textarea id=tampilan baris=12 kolom=100>
</area teks>
</BODI></HTML>