From 70daee86e69783928d3da887a3a3e26b8ab74734 Mon Sep 17 00:00:00 2001
From: LarsDW223 <lars_paulsen@web.de>
Date: Tue, 14 Oct 2014 16:12:08 +0200
Subject: [PATCH] Corrected compression for ++ and -- operator. Partially fixes
 #897.

---
 _test/tests/lib/exe/js_js_compress.test.php | 60 +++++++++++++++++++++
 lib/exe/js.php                              | 34 ++++++++----
 2 files changed, 83 insertions(+), 11 deletions(-)

diff --git a/_test/tests/lib/exe/js_js_compress.test.php b/_test/tests/lib/exe/js_js_compress.test.php
index b1ae2a84f..78e089d89 100644
--- a/_test/tests/lib/exe/js_js_compress.test.php
+++ b/_test/tests/lib/exe/js_js_compress.test.php
@@ -145,6 +145,66 @@ EOF;
         $this->assertEquals($out, js_compress($text));
     }
 
+    function test_plusplus1(){
+        $text = 'a = 5 + ++b;';
+        $this->assertEquals('a=5+ ++b;',js_compress($text));
+    }
+
+    function test_plusplus2(){
+        $text = 'a = 5+ ++b;';
+        $this->assertEquals('a=5+ ++b;',js_compress($text));
+    }
+
+    function test_plusplus3(){
+        $text = 'a = 5++ + b;';
+        $this->assertEquals('a=5++ +b;',js_compress($text));
+    }
+
+    function test_plusplus4(){
+        $text = 'a = 5++ +b;';
+        $this->assertEquals('a=5++ +b;',js_compress($text));
+    }
+
+    function test_minusminus1(){
+        $text = 'a = 5 - --b;';
+        $this->assertEquals('a=5- --b;',js_compress($text));
+    }
+
+    function test_minusminus2(){
+        $text = 'a = 5- --b;';
+        $this->assertEquals('a=5- --b;',js_compress($text));
+    }
+
+    function test_minusminus3(){
+        $text = 'a = 5-- - b;';
+        $this->assertEquals('a=5-- -b;',js_compress($text));
+    }
+
+    function test_minusminus4(){
+        $text = 'a = 5-- -b;';
+        $this->assertEquals('a=5-- -b;',js_compress($text));
+    }
+
+    function test_minusplus1(){
+        $text = 'a = 5-- +b;';
+        $this->assertEquals('a=5--+b;',js_compress($text));
+    }
+
+    function test_minusplus2(){
+        $text = 'a = 5-- + b;';
+        $this->assertEquals('a=5--+b;',js_compress($text));
+    }
+
+    function test_plusminus1(){
+        $text = 'a = 5++ - b;';
+        $this->assertEquals('a=5++-b;',js_compress($text));
+    }
+
+    function test_plusminus2(){
+        $text = 'a = 5++ -b;';
+        $this->assertEquals('a=5++-b;',js_compress($text));
+    }
+
     /**
      * Test the files provided with the original JsStrip
      */
diff --git a/lib/exe/js.php b/lib/exe/js.php
index bec12ef7a..2ab78dfc3 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -289,6 +289,10 @@ function js_compress($s){
     // items that don't need spaces next to them
     $chars = "^&|!+\-*\/%=\?:;,{}()<>% \t\n\r'\"[]";
 
+    // items which need a space if the sign before and after whitespace is equal.
+    // E.g. '+ ++' may not be compressed to '+++' --> syntax error.
+    $ops = "+-";
+
     $regex_starters = array("(", "=", "[", "," , ":", "!");
 
     $whitespaces_chars = array(" ", "\t", "\n", "\r", "\0", "\x0B");
@@ -389,19 +393,27 @@ function js_compress($s){
 
         // whitespaces
         if( $ch == ' ' || $ch == "\r" || $ch == "\n" || $ch == "\t" ){
-            // leading spaces
-            if($i+1 < $slen && (strpos($chars,$s[$i+1]) !== false)){
-                $i = $i + 1;
-                continue;
-            }
-            // trailing spaces
-            //  if this ch is space AND the last char processed
-            //  is special, then skip the space
             $lch = substr($result,-1);
-            if($lch && (strpos($chars,$lch) !== false)){
-                $i = $i + 1;
-                continue;
+
+            // Only consider deleting whitespace if the signs before and after
+            // are not equal and are not an operator which may not follow itself.
+            if ((!$lch || $s[$i+1] == ' ')
+                || $lch != $s[$i+1]
+                || strpos($ops,$s[$i+1]) === false) {
+                // leading spaces
+                if($i+1 < $slen && (strpos($chars,$s[$i+1]) !== false)){
+                    $i = $i + 1;
+                    continue;
+                }
+                // trailing spaces
+                //  if this ch is space AND the last char processed
+                //  is special, then skip the space
+                if($lch && (strpos($chars,$lch) !== false)){
+                    $i = $i + 1;
+                    continue;
+                }
             }
+
             // else after all of this convert the "whitespace" to
             // a single space.  It will get appended below
             $ch = ' ';
-- 
GitLab