다른 사람이 작성한 지저분한 코드를 보면서 머리가 아팠던 적이 있습니까? 형식화 및 코드 압축을 위한 프로그램이 드디어 출시되었습니다. 이는 순수 JS로 작성되었으며 물론 오픈 소스입니다. 죄송합니다. 먼저 이 코드를 작성해 보겠습니다. 오랜 시간이 걸려서 드디어 오늘 사용하게 되었습니다.. 글이 너무 바빠서 아직 자잘한 버그가 있으니 자주 확인해주세요!
<HTML><HEAD><TITLE>형식</TITLE>
<META content="MSHTML 6.00.2800.1528" name=GENERATOR>
<META content="" name=저자>
<META content="" name=키워드>
<META content="" name=설명></HEAD>
<본문>
<SCRIPT 언어=자바스크립트>
<!--
/**//**//**//**
** =============================================== =================================================
** 클래스 이름: CLASS_FORMATER
** 기능: JS 형식화
** 예:
------------------------------------- -------------------------------------
var xx = new CLASS_FORMATER(code);
document.getElementById("display").innerHTML = xx.format();
------------------------------------- -------------------------------------
** 작성자: typ
** 이메일: [email protected]
** 날짜: 2006-5-21
** 버전: 0.1
** =============================================== =================================================
**/
함수 CLASS_FORMAT(코드){
//해시 테이블 클래스
함수 해시테이블(){
this._hash = 새로운 객체();
this.add = 함수(키,값){
if(typeof(key)!="정의되지 않음"){
if(this.contains(key)==false){
this._hash[key]=typeof(value)=="정의되지 않음"?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])!="정의되지 않음";}
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 = 사실;
if(typeof(cs)=="정의되지 않음"||cs==null){
_cs = this._caseSensitive;
} 또 다른 {
_cs = cs;
}
for(var i in _key){
if(_cs){
_hash.add(_key[i]);
} 또 다른 {
_hash.add((_key[i]+"").toLowerCase());
}
}
_hash를 반환합니다.
}
//변환이 필요한 코드를 가져옵니다.
this._codetxt = 코드;
if(typeof(syntax)=="정의되지 않음"){
구문 = "";
}
this._deleteComment = false;
//대소문자 구분 여부
this._caseSensitive = true;
//블록문 뒤에 추가할 수 있는 키워드
this._blockElement = this.str2hashtable("switch,if,while,try,finally");
//함수 선언입니다
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 = "//";
//이스케이프 문자
this._escape = "\";
//여러 줄 참조 시작
this._commentOn = "/*";
//여러줄 인용 끝
this._commentOff = "*/";
//줄 종결자
this._rowEnd = ";";
this._in = "in";
this.isCompress = 거짓;
this.style = 0;
this._tabNum = 0;
this.format = 함수() {
var codeArr = 새로운 배열();
var 단어_색인 = 0;
var htmlTxt = new Array()
if(this.isCompress){
this._deleteComment = true;
}
//분할 문자 배열 가져오기(단어 분할)
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)
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; //한 줄 주석 표시
var line_num = 1; //라인 번호
var quote_char = ""; //따옴표 유형
var function_opened = false
;
var for_open = false;
//분할된 단어에 따라 블록으로 표시합니다.
for (var i=0; i <=word_index; i++){
//빈 줄 처리(이스케이프 처리로 인해)
if(typeof(codeArr[i])=="정의되지 않음"||codeArr[i].length==0){
계속하다;
} 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];
}
} else if(codeArr[i]=="n"){
//개행 처리
} else if (codeArr[i] == "r"){
slash_slash_comment_opened = 거짓;
quote_opened = 거짓;
line_num++;
if(!this.is압축){
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 = 사실;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){
브래킷_오픈 = true;
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){
if(!this.is압축){
if(!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 = 거짓;
if(!this.is압축){
스위치(this.style){
사례 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){
if(!this.is압축){
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])){
if(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])){
if (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 = true;
quote_char = codeArr[i];
}
//이스케이프 문자 처리
} else if(codeArr[i] == this._escape){
htmlTxt[htmlTxt.length] = codeArr[i];
if(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;
if(!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;
if(!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)){
if (slash_star_comment_opened) {
slash_star_comment_opened = 거짓;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOff;
}
i = i + this.getSkipLength(this._commentOff);
}
} 또 다른 {
//문자열에 없음
if(!quote_opened){
//댓글에 없으면
if(!slash_slash_comment_opened && !slash_star_comment_opened){
htmlTxt[htmlTxt.length] = codeArr[i];
//댓글 달기
}또 다른{
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
}또 다른{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
}
return htmlTxt.join("");
}
this.isStartWith = function(str,code,index){
if(typeof(str)!="정의되지 않음"&&str.length>0){
var cc = 새로운 배열();
for(var i=index;i<index+str.length;i++){
cc[cc.length] = 코드[i];
}
var c = cc.join("");
if(this._caseSensitive){
if(str.length>=code[index].length&&c.indexOf(str)==0){
사실을 반환;
}
}또 다른{
if(str.length>=code[index].length&&c.toLowerCase().indexOf(str.toLowerCase())==0){
사실을 반환;
}
}
거짓을 반환
} else {
거짓을 반환;
}
}
this.isFunction = 함수(발){
return this._function.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isBlockElement = 함수(발) {
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 = 함수(from,word){
for(var i=from;i<word.length;i++){
if(word[i]!=" "&&word[i]!="t"&&word[i]!="r"&&word[i]!="n"){
return this.isChoiceElement(word[i]);
}
}
거짓을 반환;
}
this.getSkipLength = 함수(발){
변수 개수 = 0;
for(var i=0;i<val.length;i++){
if(this._wordDelimiters.indexOf(val.charAt(i))>=0){
카운트++;
}
}
if(개수>0){
카운트=카운트-1;
}
반환 횟수;
}
this.getIdent=function(){
var n = [];
for(var i=0;i<this._tabNum;i++){
n[n.length] = "t";
}
return n.join("");
}
}
함수 doformat(o){
var htmltxt = "";
if (o == null){
Alert("domNode가 null입니다!");
반품;
}
var _codetxt = "";
if(typeof(o)=="객체"){
스위치(o.태그이름){
사례 "TEXTAREA":
"입력":
_codetxt = o.값;
부서지다;
케이스 "DIV":
케이스 "SPAN":
_codetxt = o.innerText;
부서지다;
기본:
_codetxt = o.innerHTML;
부서지다;
}
}또 다른{
_codetxt = o;
}
var _syn = 새로운 CLASS_FORMAT(_codetxt);
htmltxt = _syn.format();
htmltxt를 반환합니다.
}
함수 이동()
{
var code = document.getElementById("code").value;
var xx = 새로운 CLASS_FORMAT(코드);
var a = new Date();
if(document.getElementById('cboOperate').selectedIndex==1){
xx.is압축=true;
}또 다른{
xx.style = parsInt(document.getElementById('cboStyle').value);
}
document.getElementById("display").value = xx.format();
Alert("총 꽃 수:" + (new Date().getTime()-a.getTime()) + "ms");
}
//-->
</SCRIPT>
<TEXTAREA ID=코드 행=12열=100>
/*
이것은 수업이다
*/
함수 xx(num,str){//설명
var a = num;this.aa = a;
this.bb = 함수(){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");
if(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>
</select>
<select id="cboStyle">
<option value="0">클래식</option>
<option value="1">마이크로소프트</option>
</select>
<INPUT onclick=go() 유형=버튼 값=go><br>
<텍스트 영역 id=표시 행=12열=100>
</textarea>
</BODY></HTML>