add `semicolons` option in the code generator (default: `true`)
authorMihai Bazon <mihai@bazon.net>
Wed, 17 Oct 2012 11:51:27 +0000 (14:51 +0300)
committerMihai Bazon <mihai@bazon.net>
Wed, 17 Oct 2012 11:52:08 +0000 (14:52 +0300)
pass `false` to separate statements with newlines instead of semicolons

README.md
lib/output.js

index 0fe6ed3..793306d 100644 (file)
--- a/README.md
+++ b/README.md
@@ -241,6 +241,10 @@ can pass additional arguments that control the code output:
 - `bracketize` (default `false`) -- always insert brackets in `if`, `for`,
   `do`, `while` or `with` statements, even if their body is a single
   statement.
+- `semicolons` (default `true`) -- separate statements with semicolons.  If
+  you pass `false` then whenever possible we will use a newline instead of a
+  semicolon, leading to more readable output of uglified code (size before
+  gzip could be smaller; size after gzip insignificantly larger).
 
 ### Keeping copyright notices or other comments
 
index dd40972..8d2c4d3 100644 (file)
@@ -58,6 +58,7 @@ function OutputStream(options) {
         beautify      : false,
         source_map    : null,
         bracketize    : false,
+        semicolons    : true,
         comments      : false
     }, true);
 
@@ -130,14 +131,23 @@ function OutputStream(options) {
             print("\n");
     };
 
+    var requireSemicolonChars = makePredicate("( [ + * / - , .");
+
     function print(str) {
         str = String(str);
         var ch = str.charAt(0);
         if (might_need_semicolon) {
             if (";}".indexOf(ch) < 0 && !/[;]$/.test(last)) {
-                OUTPUT += ";";
-                current_col++;
-                current_pos++;
+                if (options.semicolons || requireSemicolonChars(ch)) {
+                    OUTPUT += ";";
+                    current_col++;
+                    current_pos++;
+                } else {
+                    OUTPUT += "\n";
+                    current_pos++;
+                    current_line++;
+                    current_col = 0;
+                }
                 if (!options.beautify)
                     might_need_space = false;
             }