Output `-- >` instead of `-->` in expressions. Escape `<!--` and `-->` within string...
authorkzc <zaxxon2011@gmail.com>
Mon, 12 Oct 2015 04:20:42 +0000 (00:20 -0400)
committerMihai Bazon <mihai.bazon@gmail.com>
Mon, 12 Oct 2015 07:19:17 +0000 (10:19 +0300)
lib/output.js
test/compress/html_comments.js [new file with mode: 0644]

index c15f3b2..8ca0dc0 100644 (file)
@@ -127,6 +127,8 @@ function OutputStream(options) {
         var ret = make_string(str, quote);
         if (options.inline_script)
             ret = ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi, "<\\/script$1");
+        ret = ret.replace(/\x3c!--/g, "\\x3c!--");
+        ret = ret.replace(/--\x3e/g, "--\\x3e");
         return ret;
     };
 
@@ -1046,7 +1048,15 @@ function OutputStream(options) {
     });
     DEFPRINT(AST_Binary, function(self, output){
         self.left.print(output);
-        output.space();
+        if (self.operator == ">"
+            && self.left instanceof AST_UnaryPostfix
+            && self.left.operator == "--") {
+            // space is mandatory to avoid outputting -->
+            output.print(" ");
+        } else {
+            // the space is optional depending on "beautify"
+            output.space();
+        }
         output.print(self.operator);
         if (self.operator == "<"
             && self.right instanceof AST_UnaryPrefix
@@ -1054,7 +1064,6 @@ function OutputStream(options) {
             && self.right.expression instanceof AST_UnaryPrefix
             && self.right.expression.operator == "--") {
             // space is mandatory to avoid outputting <!--
-            // http://javascript.spec.whatwg.org/#comment-syntax
             output.print(" ");
         } else {
             // the space is optional depending on "beautify"
diff --git a/test/compress/html_comments.js b/test/compress/html_comments.js
new file mode 100644 (file)
index 0000000..6141980
--- /dev/null
@@ -0,0 +1,15 @@
+html_comment_in_expression: {
+    input: {
+        function f(a, b, x, y) { return a < !--b && x-- > y; }
+    }
+    expect_exact: "function f(a,b,x,y){return a< !--b&&x-- >y}";
+}
+
+html_comment_in_string_literal: {
+    input: {
+        function f() { return "<!--HTML-->comment in<!--string literal-->"; }
+    }
+    expect_exact: 'function f(){return"\\x3c!--HTML--\\x3ecomment in\\x3c!--string literal--\\x3e"}';
+}
+
+