هل سبق لك أن شعرت بالصداع عند النظر إلى التعليمات البرمجية الفوضوية التي كتبها الآخرون؟ هل سبق لك أن شعرت بالانزعاج عند النظر إلى كود BWindow؟ هل سبق لك أن ترددت في التناقض بين تقليل حجم JS وسهولة قراءة JS؟ لديك رمز، أصبح برنامج التنسيق وضغط التعليمات البرمجية متاحًا أخيرًا اليوم، وهو مكتوب بلغة JS خالصة، وهو بالطبع مفتوح المصدر. آسف، دعني أقدم إعلانًا أولاً :) لقد استخدمته أخيرًا اليوم وانتهيت من كتابته خلال عطلة نهاية الأسبوع بسبب الاندفاع في الكتابة، لا تزال هناك بعض الأخطاء الصغيرة.
<HTML><HEAD><TITLE>التنسيق</TITLE>
<محتوى META = "MSHTML 6.00.2800.1528" الاسم = المولد>
<محتوى META = "" الاسم = المؤلف>
<محتوى META = "" الاسم = الكلمات الرئيسية>
<محتوى META = "" الاسم = الوصف ></HEAD>
<الجسم>
<لغة البرنامج النصي=جافا سكريبت>
<!--
/**//**//**//**
** ================================================================ ==================================================================================================
** اسم الفئة: CLASS_FORMATER
** الوظيفة: تنسيق JS
** مثال:
-------------------------------------------------- --------------------------------------------------
var xx = new CLASS_FORMATER(code);
document.getElementById("display").innerHTML = xx.format();
-------------------------------------------------- --------------------------------------------------
** المؤلف: ttp
** البريد الإلكتروني: [email protected]
** التاريخ: 2006-5-21
** الإصدار: 0.1
** ================================================================ ==================================================================================================
**/
الدالة CLASS_FORMAT(كود){
// فئة جدول التجزئة
وظيفة جدول التجزئة () {
this._hash = new Object();
this.add = function(key,value){
إذا(نوع(مفتاح)!=غير محدد){
إذا(this.contains(مفتاح)==خطأ){
this._hash[key]=typeof(value)=="undef"?null:value;
عودة صحيحة؛
} آخر {
عودة كاذبة.
}
} آخر {
عودة كاذبة.
}
}
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])!="undef";}
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;
إذا(typeof(cs)===غير محدد"||cs==null){
_cs = this._caseSensitive;
} آخر {
_cs = cs;
}
ل(فار أنا في _key){
إذا (_كس) {
_hash.add(_key[i]);
} آخر {
_hash.add((_key[i]+"").toLowerCase());
}
}
إرجاع _التجزئة؛
}
// احصل على الرمز الذي يجب تحويله
this._codetxt = code
;
بناء الجملة = ""؛
}
this._deleteComment = false;
// سواء كانت حساسة لحالة الأحرف
this._caseSensitive = true;
// الكلمات الرئيسية التي يمكن إضافتها بعد بيان الحظر
this._blockElement = this.str2hashtable("switch,if,while,try,finally");
// إنه إعلان دالة
this._function = this.str2hashtable("function");
// الفاصلة المنقوطة الموجودة بين قوسين هذا السطر لا تسبب فواصل الأسطر.
this._isFor = "for";
this._choiceElement = this.str2hashtable("else,catch");
this._beginBlock = "{";
this._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 = "in";
this.isCompress = false;
this.style = 0;
this._tabNum = 0;
this.format = function() {
var codeArr = new Array();
فار word_index = 0;
htmlTxt
= new Array();
this._deleteComment = true;
}
// احصل على مصفوفة الأحرف المنقسمة (تجزئة الكلمات)
لـ (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]) == 'undef') {
codeArr[word_index] = "";
}
codeArr[word_index] += this._codetxt.charAt(i);
} آخر {
إذا (typeof(codeArr[word_index]) != 'undef' && 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; // علامة تعليق من سطر واحد
فار line_num = 1; // رقم السطر
var quote_char = ""; // نوع علامة الاقتباس
var function_opened = false
;
var for_open = false;
// وفقًا للكلمة المقسمة، يتم عرضها في كتل
لـ (var i=0; i <=word_index; i++){
// التعامل مع الأسطر الفارغة (بسبب الهروب)
if(typeof(codeArr[i])====codeArr[i].length==0){
يكمل؛
} else 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];
}
} else if(codeArr[i]=="n"){
// التعامل مع السطر الجديد
} else if (codeArr[i] == "r"){
slash_slash_comment_opened = false;
quote_opened = false;
line_num++;
إذا (! هذا.isCompress) {
htmlTxt[htmlTxt.length] = "rn"+ 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;
} وإلا إذا (!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){
إذا (! هذا.isCompress) {
إذا (!for_open){
إذا(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];
}
} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._beginBlock){
for_open = false;
إذا (! هذا.isCompress) {
التبديل (هذا.النمط) {
الحالة 0:
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "n" + this.getIdent();
استراحة؛
الحالة 1:
htmlTxt[htmlTxt.length] = "n" + this.getIdent();
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "n"+ this.getIdent();
استراحة؛
تقصير:
this._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){
إذا (! هذا.isCompress) {
this._tabNum--;
إذا(i<word_index&&codeArr[i+1]!=this._rowEnd){
htmlTxt[htmlTxt.length] = "n" + this.getIdent() + codeArr[i];
}آخر{
htmlTxt[htmlTxt.length] = "n" + this.getIdent() + codeArr[i];
}
}آخر{
إذا(i<word_index&&codeArr[i+1]!=this._rowEnd){
htmlTxt[htmlTxt.length] = codeArr[i] + this._rowEnd;
}آخر{
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])){
إذا(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])){
إذا (quote_opened){
// هي علامة الاقتباس المقابلة
إذا(quote_char==codeArr[i]){
htmlTxt[htmlTxt. length] = codeArr[i];
quote_opened = false;
quote_char = "";
} آخر {
htmlTxt[htmlTxt. length] = codeArr[i];
}
} آخر {
htmlTxt[htmlTxt. length] = codeArr[i];
quote_opened = true;
quote_char = codeArr[i];
}
// التعامل مع أحرف الهروب
} else if(codeArr[i] == this._escape){
htmlTxt[htmlTxt. length] = codeArr[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;
}
}
// التعامل مع بداية التعليقات متعددة الأسطر
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._commentOn,codeArr,i)){
slash_star_comment_opened = true;
إذا(!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;
إذا(!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)){
إذا (slash_star_comment_opened) {
slash_star_comment_opened = false;
إذا(!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)!="undef"&&str.length>0){
var cc = new Array();
for(var i=index;i<index+str.length;i++){
cc[cc. length] = code[i];
}
فار ج = cc.join("");
إذا(this._caseSensitive){
if(str.length>=code[index].length&&c.indexOf(str)==0){
عودة صحيحة؛
}
}آخر{
if(str.length>=code[index].length&&c.toLowerCase().indexOf(str.toLowerCase())==0){
عودة صحيحة؛
}
}
إرجاع خطأ
} آخر {
عودة كاذبة.
}
}
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;i<word.length;i++){
إذا(word[i]!=" "&&word[i]!="t"&&word[i]!="r"&&word[i]!="n"){
إرجاع this.isChoiceElement(word[i]);
}
}
عودة كاذبة.
}
this.getSkipLength = function(val){
عدد فار = 0؛
for(var i=0;i<val.length;i++){
إذا(this._wordDelimiters.indexOf(val.charAt(i))>=0){
العد++;
}
}
إذا (العد> 0) {
العد=العد-1;
}
عدد الإرجاع؛
}
this.getIdent=function(){
فار ن = [];
for(var i=0;i<this._tabNum;i++){
n[n.length] = "t";
}
العودة n.join("");
}
}
تنسيق الدالة (س) {
فار htmltxt = "";
إذا (o == null){
تنبيه ("domNode فارغ!")؛
يعود؛
}
var _codetxt = "";
إذا (نوع (س) = = "كائن") {
التبديل (o.tagName) {
حالة "TEXTAREA":
حالة "الإدخال":
_codetxt = o.value;
استراحة؛
الحالة "DIV":
حالة "سبان":
_codetxt = o.innerText;
استراحة؛
تقصير:
_codetxt = o.innerHTML;
استراحة؛
}
}آخر{
_codetxt = o;
}
var _syn = new CLASS_FORMAT(_codetxt);
htmltxt = _syn.format();
إرجاع HTMLTXT؛
}
وظيفة الذهاب ()
{
كود فار = document.getElementById("code").value;
var xx = new CLASS_FORMAT(code);
var a = new Date();
if(document.getElementById('cboOperate').selectedIndex==1){
xx.isCompress=true;
}آخر{
xx.style = parseInt(document.getElementById('cboStyle').value);
}
document.getElementById("display").value = xx.format();
تنبيه("إجمالي الزهور:" + (new Date().getTime()-a.getTime()) + "ms");
}
//-->
</النص>
<معرف TEXTAREA=صفوف الكود=12 عمود=100>
/*
هذه فئة
*/
الوظيفة xx (num,str){//Description
var a = num;this.aa = a;
this.bb = function(){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,"hello"),b=new xx(0,"ttyp");
إذا (1>2) { تنبيه ()؛
}
آخر {
تنبيه("الجحيم");
}
a.bb();
b.dd();
تنبيه (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>
</حدد>
<حدد معرف = "cboStyle">
<option value="0">كلاسيكي</option>
<option value="1">مايكروسوفت</option>
</حدد>
<INPUT onclick=go() type=button value=go><br>
<معرف منطقة النص=عرض الصفوف=12 عمود=100>
</textarea>
</BODY></HTML>