Updated Packer - the current version was working incorrectly.
[jquery.git] / build / js / Packer.js
index 4e907cf..88c47d0 100644 (file)
@@ -1,5 +1,5 @@
 /*\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
@@ -13,14 +13,14 @@ var WORDS = /\w+/g;
 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
@@ -59,8 +59,13 @@ var Packer = Base.extend({
                };\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
@@ -74,7 +79,7 @@ var Packer = Base.extend({
                // 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
@@ -93,8 +98,9 @@ var Packer = Base.extend({
                                // 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
@@ -106,13 +112,13 @@ var Packer = Base.extend({
                                        }\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
@@ -158,16 +164,15 @@ var Packer = Base.extend({
                        "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
@@ -178,17 +183,16 @@ var Packer = Base.extend({
                "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