/*\r
- Packer version 3.0 (beta 5) - copyright 2004-2007, Dean Edwards\r
+ Packer version 3.0 (beta 8) - copyright 2004-2007, Dean Edwards\r
http://www.opensource.org/licenses/mit-license\r
*/\r
\r
var Packer = Base.extend({\r
minify: function(script) {\r
script = script.replace(Packer.CONTINUE, "");\r
- script = Packer.clean.exec(script);\r
+ script = Packer.data.exec(script);\r
script = Packer.whitespace.exec(script);\r
- script = Packer.clean.exec(script); // seem to grab a few more bytes on the second pass\r
+ script = Packer.clean.exec(script);\r
return script;\r
},\r
\r
pack: function(script, base62, shrink) {\r
- script = this.minify(script);\r
+ script = this.minify(script + "\n");\r
if (shrink) script = this._shrinkVariables(script);\r
if (base62) script = this._base62Encode(script); \r
return script;\r
};\r
\r
var data = []; // encoded strings and regular expressions\r
+ var REGEXP = /^[^'"]\//;\r
var store = function(string) {\r
var replacement = "#" + data.length;\r
+ if (REGEXP.test(string)) {\r
+ replacement = string.charAt(0) + replacement;\r
+ string = string.slice(1);\r
+ }\r
data.push(string);\r
return replacement;\r
};\r
// identify blocks, particularly identify function blocks (which define scope)\r
var BLOCK = /(function\s*[\w$]*\s*\(\s*([^\)]*)\s*\)\s*)?(\{([^{}]*)\})/;\r
var VAR_ = /var\s+/g;\r
- var VAR_NAME = /var\s+[\w$]{2,}/g; // > 1 char\r
+ var VAR_NAME = /var\s+[\w$]+/g;\r
var COMMA = /\s*,\s*/;\r
var blocks = []; // store program blocks (anything between braces {})\r
// encoder for program blocks\r
// process each identifier\r
var count = 0, shortId;\r
forEach (ids, function(id) {\r
- id = rescape(trim(id));\r
- if (id) {\r
+ id = trim(id);\r
+ if (id && id.length > 1) { // > 1 char\r
+ id = rescape(id);\r
// find the next free short name (check everything in the current scope)\r
do shortId = encode52(count++);\r
while (new RegExp("[^\\w$.]" + shortId + "[^\\w$:]").test(block));\r
}\r
});\r
}\r
- var replacement = "~" + blocks.length;\r
+ var replacement = "~" + blocks.length + "~";\r
blocks.push(block);\r
return replacement;\r
};\r
\r
// decoder for program blocks\r
- var ENCODED = /~(\d+)/;\r
+ var ENCODED = /~(\d+)~/;\r
var decode = function(script) {\r
while (ENCODED.test(script)) {\r
script = script.replace(global(ENCODED), function(match, index) {\r
"replace(new RegExp('\\\\b'+e(c)+'\\\\b','g'),k[c]);return p}('%1',%2,%3,'%4'.split('|'),0,{}))",\r
\r
init: function() {\r
- this.data = reduce(this.data, new RegGrp, function(data, replacement, expression) {\r
+ this.data = reduce(this.data, function(data, replacement, expression) {\r
data.store(this.javascript.exec(expression), replacement);\r
return data;\r
- }, this);\r
+ }, new RegGrp, this);\r
this.clean = this.data.union(this.clean);\r
this.whitespace = this.data.union(this.whitespace);\r
},\r
\r
clean: {\r
- ";;;[^\\n]*": REMOVE, // triple semi-colons treated like line comments\r
"\\(\\s*;\\s*;\\s*\\)": "(;;)", // for (;;) loops\r
"throw[^};]+[};]": IGNORE, // a safari 1.3 bug\r
";+\\s*([};])": "$1"\r
"STRING1": IGNORE,\r
'STRING2': IGNORE,\r
"CONDITIONAL": IGNORE, // conditional comments\r
- "(COMMENT1)\\n\\s*(REGEXP)?": "\n$2",\r
+ "(COMMENT1)\\n\\s*(REGEXP)?": "\n$3",\r
"(COMMENT2)\\s*(REGEXP)?": " $3",\r
- "COMMENT1$": REMOVE,\r
"([\\[(\\^=,{}:;&|!*?])\\s*(REGEXP)": "$1$2"\r
},\r
\r
javascript: new RegGrp({\r
- COMMENT1: /\/\/[^\n]*/.source,\r
+ COMMENT1: /(\/\/|;;;)[^\n]*/.source,\r
COMMENT2: /\/\*[^*]*\*+([^\/][^*]*\*+)*\//.source,\r
CONDITIONAL: /\/\*@|@\*\/|\/\/@[^\n]*\n/.source,\r
- REGEXP: /\/(\\\/|[^*\/])(\\.|[^\/\n\\])*\//.source,\r
+ REGEXP: /\/(\\[\/\\]|[^*\/])(\\.|[^\/\n\\])*\/[gim]*/.source,\r
STRING1: /'(\\.|[^'\\])*'/.source,\r
STRING2: /"(\\.|[^"\\])*"/.source\r
}),\r