คุณเคยปวดหัวกับการดูโค้ดที่ยุ่งเหยิงของคนอื่นบ้างไหม คุณเคยประสบปัญหากับการดูโค้ด BWindow หรือไม่ วิธีที่ดีที่สุดคือทำ มีโค้ด ในที่สุดโปรแกรมสำหรับการจัดรูปแบบและการบีบอัดโค้ดก็มีให้ใช้แล้ววันนี้ มันเขียนด้วย JS ล้วนๆ และแน่นอนว่าเป็นโอเพ่นซอร์ส ขอผมทำโฆษณาก่อนนะครับ :) นานมากแล้ว และในที่สุดฉันก็ได้ใช้มันในวันนี้ ฉันเขียนมันเสร็จในช่วงสุดสัปดาห์ เนื่องจากความเร่งรีบในการเขียน จึงยังคงมีข้อบกพร่องเล็กๆ น้อยๆ อยู่บ้าง โปรดใส่ใจกับการอัปเดตบ่อยๆ
<HTML><HEAD><TITLE>รูปแบบ</TITLE>
<เนื้อหา META = "MSHTML 6.00.2800.1528" ชื่อ =เครื่องกำเนิดไฟฟ้า>
<เนื้อหาเมตา = "" ชื่อ = ผู้เขียน>
<เนื้อหาเมตา = "" ชื่อ =คำหลัก>
<เนื้อหา META="" name=คำอธิบาย></HEAD>
<ร่างกาย>
<ภาษาสคริปต์=จาวาสคริปต์>
-
-
** ================================================ ==================================================
** ชื่อคลาส: CLASS_FORMATER
** ฟังก์ชั่น: การจัดรูปแบบ JS
** ตัวอย่าง:
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
var xx = ใหม่ CLASS_FORMATER(รหัส);
document.getElementById("display").innerHTML = xx.format();
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------------------------------
**ผู้เขียน: typ
** อีเมล์: [email protected]
** วันที่: 21-5-2549
** เวอร์ชั่น: 0.1.1
** ================================================ ==================================================
**/
ฟังก์ชั่น CLASS_FORMAT(รหัส){
//คลาสตารางแฮช
ฟังก์ชั่น Hashtable(){
this._hash = วัตถุใหม่ ();
this.add = ฟังก์ชั่น (คีย์, ค่า) {
ถ้า (typeof (คีย์)! = "ไม่ได้กำหนด") {
ถ้า (this.contains (คีย์) == false) {
this._hash[คีย์]=typeof(value)=="ไม่ได้กำหนด"?null:value;
กลับเป็นจริง;
} อื่น {
กลับเท็จ;
-
} อื่น {
กลับเท็จ;
-
-
this.remove = ฟังก์ชั่น (คีย์) {ลบ this._hash [คีย์];}
this.count = function(){var i=0;for(var k in this._hash){i++;} กลับ i;}
this.items = function (คีย์) {ส่งคืน this._hash [คีย์];}
this.contains = function (คีย์) {return typeof (this._hash [คีย์])! = "ไม่ได้กำหนด";}
this.clear = function(){for(var k in this._hash){delete this._hash[k];}}
}
this._caseSensitive = true;
// แปลงสตริงเป็นตารางแฮช
this.str2hashtable = ฟังก์ชั่น (คีย์ cs) {
var _key = key.split(/,/g);
var _hash = ใหม่ Hashtable();
var _cs = จริง;
ถ้า(typeof(cs)=="ไม่ได้กำหนด"||cs==null){
_cs = this._caseSensitive;
} อื่น {
_cs = ซีเอส;
}
สำหรับ (var i ใน _key){
ถ้า(_cs){
_hash.add(_key[i]);
} อื่น {
_hash.add((_key[i]+"").toLowerCase());
}
}
กลับ _แฮช;
}
//รับโค้ดที่ต้องแปลง
this._codetxt = รหัส;
ถ้า (typeof (ไวยากรณ์) = = "ไม่ได้กำหนด") {
ไวยากรณ์ = "";
}
this._deleteComment = เท็จ;
//ไม่ว่าจะเป็นตัวพิมพ์เล็กหรือใหญ่ก็ตาม
นี้._caseSensitive = จริง;
//คำสำคัญที่สามารถเพิ่มหลังคำสั่ง block
this._blockElement = this.str2hashtable("สวิตช์,ถ้า,ขณะ,ลอง,ในที่สุด");
//เป็นการประกาศฟังก์ชัน
this._function = this.str2hashtable("ฟังก์ชั่น");
//เครื่องหมายอัฒภาคในวงเล็บของบรรทัดนี้ไม่ทำให้เกิดการขึ้นบรรทัดใหม่
this._isFor = "for";
this._choiceElement = this.str2hashtable("else,catch");
this._beginBlock = "{";
นี้._endBlock = "}";
this._singleEyeElement = this.str2hashtable("var,new,return,else,delete,in,case");
//รับอักขระแยก
this._wordDelimiters= " ,.?!;:\/<>(){}[]"'rnt=+-|*%@#$^&";
//อักขระอ้างอิง
this._quotation = this.str2hashtable("",'");
//อักขระแสดงความคิดเห็นบรรทัด
this._lineComment = "//";
//อักขระหลีก
this._escape = "\";
//จุดเริ่มต้นของการอ้างอิงหลายบรรทัด
this._commentOn = "/*";
//จบคำพูดหลายบรรทัด
this._commentOff = "*/";
//ตัวยุติบรรทัด
this._rowEnd = ";";
this._in = "ใน";
this.isCompress = เท็จ;
this.style = 0;
this._tabNum = 0;
นี้.รูปแบบ = ฟังก์ชั่น() {
var codeArr = อาร์เรย์ใหม่ ();
var word_index = 0;
var htmlTxt = อาร์เรย์ใหม่ ();
if (this.isCompress) {
this._deleteComment = จริง;
-
// รับอาร์เรย์อักขระแยก (การแบ่งส่วนคำ)
สำหรับ (var i = 0; i < this._codetxt.length; i++) {
ถ้า (this._wordDelimiters.indexOf (this._codetxt.charAt (i)) == -1) { // ไม่พบคำหลัก
ถ้า (codeArr [word_index] == null || typeof (codeArr [word_index]) == 'ไม่ได้กำหนด') {
codeArr[word_index] = "";
-
codeArr[word_index] += this._codetxt.charAt(i);
} อื่น {
ถ้า (typeof(codeArr[word_index]) != 'ไม่ได้กำหนด' && codeArr[word_index].length > 0)
word_ดัชนี++;
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;
//ตามคำที่แบ่งให้แสดงเป็นบล็อก
สำหรับ (var i=0; i <=word_index; i++){
//จัดการบรรทัดว่าง (เนื่องจากการหลบหนี)
if(typeof(codeArr[i])=="ไม่ได้กำหนด"||codeArr[i].length==0){
ดำเนินการต่อ;
} อื่น ๆ if(codeArr[i]==" "||codeArr[i]=="t"){
ถ้า(slash_slash_comment_opened||slash_star_comment_opened){
ถ้า(!this._deleteComment){
htmlTxt[htmlTxt.length] = codeArr[i];
-
-
ถ้า(quote_opened){
htmlTxt[htmlTxt.length] = codeArr[i];
-
} อื่น if(codeArr[i]=="n"){
//จัดการขึ้นบรรทัดใหม่
} อื่น ๆ ถ้า (codeArr[i] == "r"){
slash_slash_comment_opened = เท็จ;
quote_opened = เท็จ;
line_num++;
ถ้า(!this.isCompress){
htmlTxt[htmlTxt.length] = "rn"+ this.getIdent();
-
//ประมวลผลเครื่องหมายพารามิเตอร์ในฟังก์ชัน
} อื่น ๆ ถ้า (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&this.isFunction(codeArr[i])){
htmlTxt[htmlTxt.length] = codeArr[i] + " ";
function_opened = จริง;
} อื่น ๆ ถ้า (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._isFor){
htmlTxt[htmlTxt.length] = codeArr[i];
for_open = จริง;
} อื่น ๆ ถ้า (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){
bracket_open = จริง;
htmlTxt[htmlTxt.length] = codeArr[i];
} อื่น ๆ ถ้า (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==")"){
bracket_open = เท็จ;
htmlTxt[htmlTxt.length] = codeArr[i];
} อื่น ๆ ถ้า (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._rowEnd){
ถ้า(!this.isCompress){
ถ้า(!for_open){
if(i<word_index&&(codeArr[i+1]!="r"&&codeArr[i+1]!="n")){
htmlTxt[htmlTxt.length] = codeArr[i] + "n" + this.getIdent();
}อื่น{
htmlTxt[htmlTxt.length] = codeArr[i] + this.getIdent();
-
}อื่น{
htmlTxt[htmlTxt.length] = codeArr[i];
-
}อื่น{
htmlTxt[htmlTxt.length] = codeArr[i];
-
} อื่น ๆ if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._beginBlock){
for_open = เท็จ;
ถ้า(!this.isCompress){
สวิตช์ (this.style) {
กรณีที่ 0:
นี้._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "n" + this.getIdent();
หยุดพัก;
กรณีที่ 1:
htmlTxt[htmlTxt.length] = "n" + this.getIdent();
นี้._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "n"+ this.getIdent();
หยุดพัก;
ค่าเริ่มต้น:
นี้._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i];
หยุดพัก;
-
}อื่น{
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._endBlock){
ถ้า(!this.isCompress){
this._tabNum--;
if(i<word_index&&codeArr[i+1]!=this._rowEnd){
htmlTxt[htmlTxt.length] = "n" + this.getIdent() + codeArr[i];
}อื่น{
htmlTxt[htmlTxt.length] = "n" + this.getIdent() + codeArr[i];
-
}อื่น{
if(i<word_index&&codeArr[i+1]!=this._rowEnd){
htmlTxt[htmlTxt.length] = codeArr[i] + this._rowEnd;
}อื่น{
htmlTxt[htmlTxt.length] = codeArr[i];
-
-
//ประมวลผลคำสำคัญ
} อื่น ๆ ถ้า (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isBlockElement(codeArr[i])){
htmlTxt[htmlTxt.length] = codeArr[i];
//ประมวลผลออบเจ็กต์บิวท์อิน (เพิ่มช่องว่างหลัง)
} อื่น ๆ ถ้า (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isSingleEyeElement(codeArr[i])){
ถ้า(codeArr[i]==this._in){
htmlTxt[htmlTxt.length] = " ";
-
htmlTxt[htmlTxt.length] = codeArr[i] + " ";
//ประมวลผลเครื่องหมายคำพูดคู่ (ไม่มีอักขระหลีกก่อนเครื่องหมายคำพูด)
} อื่น ๆ ถ้า (!slash_star_comment_opened&&!slash_slash_comment_opened&&this._quotation.contains(codeArr[i])){
ถ้า (quote_opened){
// คือเครื่องหมายคำพูดที่สอดคล้องกัน
ถ้า(quote_char==codeArr[i]){
htmlTxt[htmlTxt.length] = codeArr[i];
quote_opened = เท็จ;
quote_char = "";
} อื่น {
htmlTxt[htmlTxt.length] = codeArr[i];
-
} อื่น {
htmlTxt[htmlTxt.length] = codeArr[i];
quote_opened = จริง;
quote_char = codeArr[i];
-
//จัดการอักขระหลีก
} อื่นถ้า (codeArr[i] == this._escape){
htmlTxt[htmlTxt.length] = codeArr[i];
ถ้า(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);
ฉัน=ฉัน+1;
-
-
//จัดการจุดเริ่มต้นของความคิดเห็นหลายบรรทัด
} อื่น ๆ ถ้า (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._commentOn,codeArr,i)){
slash_star_comment_opened = จริง;
ถ้า(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOn;
-
i = i + this.getSkipLength(this._commentOn);
//ประมวลผลความคิดเห็นบรรทัดเดียว
} อื่น ๆ ถ้า (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._lineComment,codeArr,i)){
slash_slash_comment_opened = จริง;
ถ้า(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._lineComment;
-
i = i + this.getSkipLength(this._lineComment);
//จัดการกับคำที่ถูกละเลย
} อื่น ๆ ถ้า (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._ignore,codeArr,i)){
slash_slash_comment_opened = จริง;
htmlTxt[htmlTxt.length] = this._ignore;
i = i + this.getSkipLength(this._ignore);
//สิ้นสุดการประมวลผลความคิดเห็นหลายบรรทัด
} อื่น ๆ ถ้า (!quote_opened&&!slash_slash_comment_opened&&this.isStartWith(this._commentOff,codeArr,i)){
ถ้า (slash_star_comment_opened) {
slash_star_comment_opened = เท็จ;
ถ้า(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOff;
-
i = i + this.getSkipLength(this._commentOff);
-
} อื่น {
//ไม่อยู่ในสตริง
ถ้า(!quote_opened){
//หากไม่มีอยู่ในคอมเม้นท์
ถ้า(!slash_slash_comment_opened && !slash_star_comment_opened){
htmlTxt[htmlTxt.length] = codeArr[i];
//แสดงความคิดเห็น.
}อื่น{
ถ้า(!this._deleteComment){
htmlTxt[htmlTxt.length] = codeArr[i];
-
-
}อื่น{
htmlTxt[htmlTxt.length] = codeArr[i];
-
-
}
ส่งคืน htmlTxt.join("");
}
this.isStartWith = function(str,code,index){
if(typeof(str)!="unknown"&&str.length>0){
var cc = อาร์เรย์ใหม่ ();
สำหรับ(var i=index;i<index+str.length;i++){
ซีซี[ซีซี.ความยาว] = รหัส[i];
-
var c = cc.join("");
ถ้า(this._caseSensitive){
ถ้า(str.length>=รหัส[ดัชนี].ความยาว&&c.indexOf(str)==0){
กลับเป็นจริง;
-
}อื่น{
if(str.length>=code[index].length&&c.toLowerCase().indexOf(str.toLowerCase())==0){
กลับเป็นจริง;
-
-
กลับเท็จ;
} อื่น ๆ {
กลับเท็จ;
-
}
this.isFunction = ฟังก์ชั่น (วาล) {
ส่งคืน this._function.contains(this._caseSensitive?val:val.toLowerCase());
-
this.isBlockElement = ฟังก์ชั่น (วาล) {
ส่งคืน this._blockElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isChoiceElement = ฟังก์ชั่น (วาล) {
ส่งคืน this._choiceElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isSingleEyeElement = ฟังก์ชั่น (วาล) {
ส่งคืน this._singleEyeElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isNextElement = ฟังก์ชั่น (จากคำ) {
สำหรับ(var i=from;i<word.length;i++){
if(word[i]!=" "&&word[i]!="t"&&word[i]!="r"&&word[i]!="n"){
กลับ this.isChoiceElement(คำ[i]);
-
-
กลับเท็จ;
}
this.getSkipLength = ฟังก์ชั่น(วาล){
จำนวนนับ = 0;
สำหรับ(var i=0;i<val.length;i++){
ถ้า(this._wordDelimiters.indexOf(val.charAt(i))>=0){
นับ++;
-
-
ถ้า(นับ>0){
นับ=นับ-1;
-
การนับผลตอบแทน;
}
this.getIdent=function(){
วาร์ n = [];
สำหรับ(var i=0;i<this._tabNum;i++){
n[n.length] = "t";
-
กลับ n.join("");
-
}
ฟังก์ชัน doformat(o){
var htmltxt = "";
ถ้า (o == null){
alert("domNode เป็นโมฆะ!");
กลับ;
}
var _codetxt = "";
ถ้า(typeof(o)=="วัตถุ"){
สวิตช์ (o.tagName) {
กรณี "TEXTAREA":
กรณี "อินพุต":
_codetxt = o.value;
หยุดพัก;
กรณี "DIV":
กรณี "SPAN":
_codetxt = o.ข้อความภายใน;
หยุดพัก;
ค่าเริ่มต้น:
_codetxt = o.innerHTML;
หยุดพัก;
-
}อื่น{
_codetxt = o;
}
var _syn = ใหม่ CLASS_FORMAT(_codetxt);
htmltxt = _syn.format();
กลับ htmltxt;
-
ฟังก์ชั่นไป()
-
รหัส var = document.getElementById("code").value;
var xx = CLASS_FORMAT ใหม่ (รหัส);
var a = วันที่ใหม่ ();
if(document.getElementById('cboOperate').selectedIndex==1){
xx.isCompress=จริง;
}อื่น{
xx.style = parseInt(document.getElementById('cboStyle').value);
-
document.getElementById("display").value = xx.format();
alert("ดอกไม้ทั้งหมด:" + (วันที่ใหม่().getTime()-a.getTime()) + "ms");
-
-
</สคริปต์>
<TEXTAREA id=โค้ดแถว=12 cols=100>
-
นี่คือชั้นเรียน
-
ฟังก์ชัน xx (num,str){//คำอธิบาย
var a = num;this.aa = a;
this.bb = function(){การแจ้งเตือน(str);}
this.cc = function(){for(var i=0;i<10;i++){document.title=i;}}};
xx.prototype.dd= function(){alert("d d kd"); }
var a = ใหม่ xx(100,"สวัสดี"),b=ใหม่ xx(0,"ttyp");
ถ้า (1>2) { การแจ้งเตือน ();
-
อื่น {
การแจ้งเตือน("นรก");
}
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 id="cboStyle">
<option value="0">คลาสสิก</option>
<option value="1">ไมโครซอฟต์</option>
</เลือก>
<INPUT onclick=go() type=button value=go><br>
<textarea id=แสดงแถว=12 คอลัม=100>
</ข้อความ>
</BODY></HTML>