Вы когда-нибудь испытывали головную боль, глядя на беспорядочный код, написанный другими? Вы когда-нибудь сомневались в противоречии между уменьшением размера JS и читабельностью JS? есть код. Сегодня наконец-то доступна программа для форматирования и сжатия кода. Она написана на чистом JS и, конечно, с открытым исходным кодом. Извините, сначала позвольте мне сделать рекламу :) Я хотел написать этот код для a. долгое время, и сегодня я наконец-то использовал его. Я закончил писать его на выходных. Из-за спешки с написанием все еще есть небольшие ошибки. Пожалуйста, следите за обновлениями.
<HTML><HEAD><TITLE>Формат</TITLE>
<META content="MSHTML 6.00.2800.1528" name=GENERATOR>
<META content="" name=Автор>
<META content="" name=Ключевые слова>
<META content="" name=Description></HEAD>
<ТЕЛО>
<Язык СКРИПТА=JavaScript>
<!--
/**//**//**//**
** ============================================= ===============================================
** Имя класса: CLASS_FORMATER.
** Функция: форматирование JS.
** Пример:
-------------------------------------------------- --------------------------------------------------
вар xx = новый CLASS_FORMATER(код);
document.getElementById("display").innerHTML = xx.format();
-------------------------------------------------- --------------------------------------------------
** Автор: ttyp
** Электронная почта: [email protected]
** Дата: 21 мая 2006 г.
** Версия: 0.1
** ============================================= ===============================================
**/
функция CLASS_FORMAT(код){
//Класс хеш-таблицы
функция Хэштаблица(){
this._hash = новый объект();
this.add = функция (ключ, значение) {
если(typeof(key)!="не определено"){
if(this.contains(key)==false){
this._hash[key]=typeof(value)=="undefined"?null:value;
вернуть истину;
} еще {
вернуть ложь;
}
} еще {
вернуть ложь;
}
}
this.remove = функция(ключ){удалить this._hash[ключ];}
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 = функция(ключ){тип возврата(this._hash[ключ])!="не определено";}
this.clear = function(){for(var k in this._hash){delete this._hash[k];}}
}
this._caseSensitive = true;
//Преобразуем строку в хеш-таблицу;
this.str2hashtable = функция (ключ, cs) {
вар _key = key.split(/,/g);
вар _hash = новая Hashtable();
вар _cs = правда;
if(typeof(cs)=="не определено"||cs==null){
_cs = this._caseSensitive;
} еще {
_кс = КС;
}
for(var i в _key){
если(_cs){
_hash.add(_key[i]);
} еще {
_hash.add((_key[i]+"").toLowerCase());
}
}
вернуть _хэш;
}
//Получаем код, который нужно преобразовать
this._codetxt = код;
if(typeof(syntax)=="не определено"){
синтаксис = "";
}
this._deleteComment = ложь;
//чувствительно ли это к регистру
this._caseSensitive = правда;
//Ключевые слова, которые можно добавить после оператора блока
this._blockElement = this.str2hashtable("переключитесь,если,пока,попробуйте,наконец");
//Это объявление функции
this._function = this.str2hashtable("функция");
//Точка с запятой в скобках этой строки не приводит к разрыву строки.
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 = "//";
//Escape-символ
this._escape = "\";
//Начало многострочных ссылок
this._commentOn = "/*";
//Конец многострочной цитаты
this._commentOff = "*/";
//Терминатор строки
this._rowEnd = ";";
this._in = "в";
this.isCompress = ложь;
this.style = 0;
this._tabNum = 0;
this.format = функция() {
вар codeArr = новый массив ();
вар word_index = 0;
вар htmlTxt = новый массив ()
если (this.isCompress) {
this._deleteComment = правда;
}
//Получаем разделенный массив символов (сегментация слов)
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]) == 'не определено') {
codeArr[word_index] = "";
}
codeArr[word_index] += this._codetxt.charAt(i);
} еще {
if (typeof(codeArr[word_index]) != 'неопределено' && codeArr[word_index].length > 0)
слово_индекс++;
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 скобка_open = false;
var for_open = false;
//В соответствии с разделенным словом отображать блоками
for (var i=0; я <=word_index; я++){
//Обработка пустых строк (из-за экранирования)
if(typeof(codeArr[i])=="не определено"||codeArr[i].length==0){
продолжать;
} else if(codeArr[i]==" "||codeArr[i]=="t"){
if(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"){
//Обработка новой строки
} else if (codeArr[i] == "r"){
slash_slash_comment_opened = ложь;
quote_opened = ложь;
строка_номер++;
если(!this.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 = правда;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._isFor){
htmlTxt[htmlTxt.length] = codeArr[i];
for_open = правда;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){
скобка_открыть = правда;
htmlTxt[htmlTxt.length] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==")"){
скобка_открыть = ложь;
htmlTxt[htmlTxt.length] = codeArr[i];
} else if (!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];
}
} else 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];
}
}
//обработка ключевых слов
} 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] + " ";
//Обработка двойных кавычек (без escape-символов перед кавычками)
} else if (!slash_star_comment_opened&&!slash_slash_comment_opened&&this._quotation.contains(codeArr[i])){
если (quote_opened){
// — соответствующая кавычка
if(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];
}
//Обработка escape-символов
} Еще если (codeArr[i] == this._escape){
htmlTxt[htmlTxt.length] = codeArr[i];
если (я <индекс_слова-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 = правда;
если(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOn;
}
я = я + 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 = правда;
если(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._lineComment;
}
я = я + 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 = правда;
htmlTxt[htmlTxt.length] = this._ignore;
я = я + 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 = ложь;
если(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOff;
}
я = я + this.getSkipLength(this._commentOff);
}
} еще {
//нет в строке
если(!quote_opened){
//Если этого нет в комментарии
if(!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)!="undefined"&&str.length>0){
вар cc = новый массив ();
for(var i=index;i<index+str.length;i++){
cc[cc.length] = код[i];
}
вар c = 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 = функция (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 = функция (от, слово) {
for(var i=from;i<word.length;i++){
if(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++){
if(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("");
}
}
функция doformat(o){
вар htmltxt = "";
если (о == ноль) {
alert("domNode имеет значение null!");
возвращаться;
}
вар _codetxt = "";
если(typeof(o)=="объект"){
переключатель (o.tagName) {
случай "ТЕКСТАРЕА":
корпус «ВХОД»:
_codetxt = o.value;
перерыв;
случай "ДЕЛ":
корпус «СПАН»:
_codetxt = о.innerText;
перерыв;
по умолчанию:
_codetxt = о.innerHTML;
перерыв;
}
}еще{
_codetxt = о;
}
Вар _syn = новый CLASS_FORMAT (_codetxt);
htmltxt = _syn.format();
вернуть htmltxt;
}
функция идти()
{
код var = document.getElementById("код").value;
вар хх = новый CLASS_FORMAT (код);
var a = новая дата();
if(document.getElementById('cboOperate').selectedIndex==1){
хх.isCompress=истина;
}еще{
xx.style = parseInt(document.getElementById('cboStyle').value);
}
document.getElementById("display").value = xx.format();
alert("Всего цветов:" + (new Date().getTime()-a.getTime()) + "ms");
}
//-->
</СКРИПТ>
<TEXTAREA id=строки кода=12 столбцов=100>
/*
Это класс
*/
функция xx (num,str){//Описание
вар а = число;this.aa = а;
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,"привет"),b=new xx(0,"ttyp");
если (1>2) { оповещение ();
}
еще {
Предупреждение("ад");
}
а.bb();
б.дд();
предупреждение(а.аа);
</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">Microsoft</option>
</выбрать>
<INPUT onclick=go() type=button value=go><br>
<textarea id=display rows=12 cols=100>
</textarea>
</BODY></HTML>