From 80a47290a7a01f2a320d09d387eea690ce1f62b4 Mon Sep 17 00:00:00 2001
From: Andreas Gohr <andi@splitbrain.org>
Date: Mon, 6 Aug 2012 20:34:51 +0200
Subject: [PATCH] do not recompress already minified js FS#2574

---
 _test/tests/lib/exe/js_js_compress.test.php | 26 +++++++++++++++++++++
 lib/exe/js.php                              | 17 +++++++++++++-
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/_test/tests/lib/exe/js_js_compress.test.php b/_test/tests/lib/exe/js_js_compress.test.php
index 49f93cc54..b1ae2a84f 100644
--- a/_test/tests/lib/exe/js_js_compress.test.php
+++ b/_test/tests/lib/exe/js_js_compress.test.php
@@ -118,6 +118,32 @@ class js_js_compress_test extends DokuWikiTest {
         $this->assertEquals("var foo='this is a multiline string';",js_compress($text));
     }
 
+    function test_nocompress(){
+        $text = <<<EOF
+var meh   =    'test' ;
+
+/* BEGIN NOCOMPRESS */
+
+
+var foo   =    'test' ;
+
+var bar   =    'test' ;
+
+
+/* END NOCOMPRESS */
+
+var moh   =    'test' ;
+EOF;
+        $out = <<<EOF
+var meh='test';
+var foo   =    'test' ;
+
+var bar   =    'test' ;
+var moh='test';
+EOF;
+
+        $this->assertEquals($out, js_compress($text));
+    }
 
     /**
      * Test the files provided with the original JsStrip
diff --git a/lib/exe/js.php b/lib/exe/js.php
index f84c07709..634e21207 100644
--- a/lib/exe/js.php
+++ b/lib/exe/js.php
@@ -102,8 +102,12 @@ function js_out(){
 
     // load files
     foreach($files as $file){
+        $ismin = (substr($file,-7) == '.min.js');
+
         echo "\n\n/* XXXXXXXXXX begin of ".str_replace(DOKU_INC, '', $file) ." XXXXXXXXXX */\n\n";
+        if($ismin) echo "\n/* BEGIN NOCOMPRESS */\n";
         js_load($file);
+        if($ismin) echo "\n/* END NOCOMPRESS */\n";
         echo "\n\n/* XXXXXXXXXX end of " . str_replace(DOKU_INC, '', $file) . " XXXXXXXXXX */\n\n";
     }
 
@@ -262,7 +266,18 @@ function js_compress($s){
         if($ch == '/' && $s{$i+1} == '*' && $s{$i+2} != '@'){
             $endC = strpos($s,'*/',$i+2);
             if($endC === false) trigger_error('Found invalid /*..*/ comment', E_USER_ERROR);
-            $i = $endC + 2;
+
+            // check if this is a NOCOMPRESS comment
+            if(substr($s, $i, $endC+2-$i) == '/* BEGIN NOCOMPRESS */'){
+                $endNC = strpos($s, '/* END NOCOMPRESS */', $endC+2);
+                if($endNC === false) trigger_error('Found invalid NOCOMPRESS comment', E_USER_ERROR);
+
+                // verbatim copy contents, trimming but putting it on its own line
+                $result .= "\n".trim(substr($s, $i + 22, $endNC - ($i + 22)))."\n"; // BEGIN comment = 22 chars
+                $i = $endNC + 20; // END comment = 20 chars
+            }else{
+                $i = $endC + 2;
+            }
             continue;
         }
 
-- 
GitLab