📄 js压缩.htm
字号:
return this.length
};
// 如果没有pop方法,那么他就给他写一个
if(![].pop) Array.prototype.pop = function()
{
var i=this[this.length-1];
this.length--;
return i
}
};
//
function pack(_7, _0, _2, _8)
{
var I = "$1";
_7 += "\n";
// 如果_0比95大就用95了, 95 = '_'
_0 = Math.min(parseInt(_0),95);
// 将_6里的所有函数都处理一遍s并返回
function _15(s)
{
var i, p;
// 如果数组_6[i]为真,看来还是一个函数对象
for(i = 0; (p =_6[i]); i++){s = p(s)}
return s
};
// 将String p用e函数返回的单词,替换为k[c]
// c 是数字,执行过程是 c ~ 0
var _25 = function(p, a, c, k, e, d)
{
while(c--) if(k[c]) p = p.replace(new RegExp('\\b' + e(c) + '\\b','g'), k[c]);
return p
};
var _26 = function()
{
// 如果string 没有replace
if(!''.replace(/^/,String))
{
while(c--) d[e(c)] = k[c] || e(c);
// k 是一个放函数指针的数组
k = [function(e){return d[e]}];
// e 成为返回一个正则表达式匹配单词的串的函数
e = function(){return'\\w+'};
c = 1
}
};
var _6 = [];
// 等于_6.push(p)
function _4(p)
{
_6[_6.length]=p
};
//
function _18(s)
{
var p = new ParseMaster;
p.escapeChar = "\\";
// 单行内,单引号内[包含]的串
p.add(/'[^'\n\r]*'/, I);
// 单行内,双引号内[包含]的串
p.add(/"[^"\n\r]*"/, I);
// 单行内,两个“//”注释符号开头的东西替换为" "
p.add(/\/\/[^\n\r]*[\n\r]/," ");
// 找/*开头[^内的*不需要加\就能表示其本意], + 多个*加/的串替换为" "
p.add(/\/\*[^*]*\*+([^\/][^*]*\*+)*\//," ");
// 1个以上非可见字符 + (/ + (一个非/回车换行和*的符号) + (n个非/回车换行的符号) + / + 零到1个g + 零到1个i
// 看来这里是在匹配单行中的正则表达式
p.add(/\s+(\/[^\/\n\r\*][^\/\n\r]*\/g?i?)/,"$2");
// 0x24 = $ = \x24, 一个非(单词、$、/、‘、"、*、)、?、:)的字符 + / + 一个非(/,回车换行,*)的字符 + n个非(/,回车换行)的字符
// + / + 零到1个g + 零到1个i
// 这里也是在匹配一个正则表达式的串
p.add(/[^\w\x24\/'"*)\?:]\/[^\/\n\r\*][^\/\n\r]*\/g?i?/,I);
// 3个; + 1个以上的非(回车换行符号) + 回车或换行符号
if(_8)p.add(/;;;[^\n\r]+[\n\r]/);
// ( + 2个 + )
p.add(/\(;;\)/,I);
// 1个以上; + n个不可见字符 + }或者;, 这里是优化;}前的多余的空格或回车换行符号和分号
p.add(/;+\s*([};])/,"$2");
s = p.exec(s);
// 单词边界或$ + 1个以上非可见字符 + 单词边界或$, 这里是优化去掉多余的空白
p.add(/(\b|\x24)\s+(\b|\x24)/,"$2 $3");
// 修正++,--中间的空白
p.add(/([+\-])\s+([+\-])/,"$2 $3");
// 去除1个以上的不可见字符
p.add(/\s+/,"");
return p.exec(s)
};
//
function _17(s)
{
var p = new ParseMaster;
// 一个以上$ + 一个a-z或A-Z的字符 + 0 ~ n个数字
p.add(/((\x24+)([a-zA-Z_]+))(\d*)/, function(m,o)
{
var l = m[o + 2].length;
var s = l - Math.max(l - m[o + 3].length, 0);
return m[o + 1].substr(s, l) + m[o + 4]
});
// 单词边界 + _ + [A-Z或a-z或一个数字] + n个单词
var r = /\b_[A-Za-z\d]\w*/;
var k = _13(s, _9(r), _21);
var e = k.e;
p.add(r, function(m,o){return e[m[o]]});
return p.exec(s)
};
//
function _16(s)
{
if(_0 > 62)s = _20(s);
var p = new ParseMaster;
var e = _12(_0);
// /\w\w+/ = /\w{2,}/
var r = (_0 > 62) ? /\w\w+/ :/\w+/;
k = _13(s, _9(r), e);
var e = k.e;
p.add(r, function(m, o){return e[m[o]]});
return s && _27(p.exec(s), k)
};
//
function _13(s,r,e)
{
var a = s.match(r);
var so = [];
var en = {};
var pr = {};
if(a)
{
// 注意,这里的不写成p = v = c = {}是因为这样的话,他们就等于共同操作一个{}了
var u = [];
var p = {};
var v = {};
var c = {};
var i = a.length, j = 0, w;
do
{
w = "$" + a[--i];
if(!c[w])
{
c[w] = 0;
u[j] = w;
p["$" + (v[j] = e(j))] = j++
}
c[w]++
}
while(i);
i = u.length;
do
{
w=u[--i];
if(p[w]!=null)
{
so[p[w]] = w.slice(1);
pr[p[w]] = true;
c[w] = 0
}
}
while(i);
u.sort(function(m1,m2){return c[m2]-c[m1]});
j=0;
do{
if(so[i]==null) so[i]=u[j++].slice(1);
en[so[i]]=v[i]
}
while(++i<u.length)
}
return{s:so,e:en,p:pr}
};
function _27(p,k){
var E=_10("e\\(c\\)","g");
p="'"+_5(p)+"'";
var a=Math.min(k.s.length,_0)||1;
var c=k.s.length;
for(var i in k.p) k.s[i]="";
k="'"+k.s.join("|")+"'.split('|')";
var e=_0>62?_11:_12(a);
e=String(e).replace(/_0/g,"a").replace(/arguments\.callee/g,"e");
var i="c"+(a>10?".toString(a)":"");
if(_2){
var d=_19(_26);
if(_0>62)d=d.replace(/\\\\w/g,"[\\xa1-\\xff]");
else if(a<36)d=d.replace(E,i);
if(!c)d=d.replace(_10("(c)\\s*=\\s*1"),"$1=0")
}
var u=String(_25);
if(_2){ u=u.replace(/\{/,"{"+d+";") }
u=u.replace(/"/g,"'");
if(_0>62){ u=u.replace(/'\\\\b'\s*\+|\+\s*'\\\\b'/g,"") }
if(a>36||_0>62||_2){ u=u.replace(/\{/,"{e="+e+";") }else{ u=u.replace(E,i) }
u=pack(u,0,false,true);
var p=[p,a,c,k];
if(_2){ p=p.concat(0,"{}") }
return"eval("+u+"("+p+"))\n"
};
function _12(a){return a>10?a>36?a>62?_11:_22:_23:_24};
var _24=function(c){ return c };
var _23=function(c){ return c.toString(36) };
var _22=function(c){ return(c<_0?'':arguments.callee(parseInt(c/_0)))+((c=c%_0)>35?String.fromCharCode(c+29):c.toString(36)) };
var _11=function(c){ return(c<_0?'':arguments.callee(c/_0))+String.fromCharCode(c%_0+161) };
var _21=function(c){ return"_"+c };
function _5(s){ return s.replace(/([\\'])/g,"\\$1") };
function _20(s){ return s.replace(/[\xa1-\xff]/g,function(m){ return"\\x"+m.charCodeAt(0).toString(16) }) };
function _10(s,f){ return new RegExp(s.replace(/\$/g,"\\$"),f) };
function _19(f){ with(String(f))return slice(indexOf("{")+1,lastIndexOf("}")) };
function _9(r){ return new RegExp(String(r).slice(1,-1),"g") };
_4(_18);
if(_8)_4(_17);
if(_0)_4(_16);
return _15(_7)
};
var input,output;
onload=function(){
if(!document.getElementById||''.replace(/^/,String))return;
input=document.getElementById("input");//内容 文本区域
var message=document.getElementById("message");//消息
var encoding=document.getElementById("ascii-encoding");//编码方式 选择列表 值有0、10、62、95
var fastDecode=document.getElementById("fast-decode");//快速解码 选择框
var specialChars=document.getElementById("special-chars");//特殊字符 选择框
function packScript()
{//执行压缩
try
{
if(input.value)
{
//调用编码函数 输入代码, 编码方式, 是否快速解码, 是否特殊字符
input.value=pack(input.value,encoding.value,fastDecode.checked,specialChars.checked);
}
}catch(e){
reportError("error packing script",e.message)
}
};
function decodeScript(){//执行解码
try{
if(input.value.substring(0,27)=="eval(function(p,a,c,k,e,d){"){
eval("input.value=String"+input.value.slice(4));
}
else reportError("代码解码取消","您的代码没有用此方法压缩!");
}catch(e){
reportError("代码解码错误",e.message)
}
};
function enableFastDecode()
{
fastDecode.disabled = Boolean(encoding.value == 0);
fastDecode.parentNode.className = (encoding.value == 0) ? "disabled" : ""
};
function reportError(m,e)
{
message.innerHTML = m + (e ? ": " + e : "");
message.className = "error"
};
encoding.onclick = enableFastDecode;
var buttons = document.getElementsByTagName("button");
var button, i;
for(i = 0;(button = buttons[i]); i++)
{
var handler = eval(button.id || button.uniqueID);// var handler = eval(button.id);// 这样来获得对象也太懒了点
button.onclick = handler;// 这样如果处理不善要内存泄露的
handler.button = button
}
};
</script>
</head>
<body >
<form id="packer" action="" method="post">
<label for="input">Paste your code:</label>
<br />
<textarea id="input" name="input" rows="10" cols="79"></textarea>
<div class="r ar">
<p id="controls">
<label for="ascii-encoding">Encoding:</label>
<select id="ascii-encoding" name="ascii_encoding">
<option value="0">None</option>
<option value="10">Numeric</option>
<option value="62" selected="selected">Normal</option>
<option value="95">High ASCII</option>
</select><br />
<label for="fast-decode">Fast Decode:
<input type="checkbox" id="fast-decode" name="fast_decode" value="1" checked="checked"/></label><br />
<label for="special-chars">Special Characters:
<input type="checkbox" id="special-chars" name="special_chars" value="1"/></label>
</p>
</div>
<button type="button" id="packScript">Compress</button>
<button type="button" id="decodeScript" >Decode</button>
<p id="message"></p>
</form>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -