[SPIP] ~version 3.0.7-->3.0.10
[ptitvelo/web/www.git] / www / plugins-dist / compresseur / lib / minify_html / class.minify_html.php
index 4cb01aa..e088887 100644 (file)
@@ -67,14 +67,18 @@ class Minify_HTML_SPIP extends Minify_HTML {
  * This is a heavy regex-based removal of whitespace, unnecessary comments and
  * tokens. IE conditional comments are preserved. There are also options to have
  * STYLE and SCRIPT blocks compressed by callback functions.
+ * https://github.com/mrclay/minify/blob/master/min/lib/Minify/HTML.php
  *
  * A test suite is available.
- * http://code.google.com/p/minify/source/browse/trunk/min/lib/Minify/HTML.php
- * 
+ *
  * @package Minify
  * @author Stephen Clay <steve@mrclay.org>
  */
 class Minify_HTML {
+    /**
+     * @var boolean
+     */
+    protected $_jsCleanComments = true;
 
     /**
      * "Minify" an HTML page
@@ -95,7 +99,7 @@ class Minify_HTML {
      * @return string
      */
     public static function minify($html, $options = array()) {
-        $min = new Minify_HTML($html, $options);
+        $min = new self($html, $options);
         return $min->process();
     }
 
@@ -113,6 +117,8 @@ class Minify_HTML {
      * 'jsMinifier' : (optional) callback function to process content of SCRIPT
      * elements. Note: the type attribute is ignored.
      *
+     * 'jsCleanComments' : (optional) whether to remove HTML comments beginning and end of script block
+     *
      * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If
      * unset, minify will sniff for an XHTML doctype.
      *
@@ -130,6 +136,9 @@ class Minify_HTML {
         if (isset($options['jsMinifier'])) {
             $this->_jsMinifier = $options['jsMinifier'];
         }
+        if (isset($options['jsCleanComments'])) {
+            $this->_jsCleanComments = (bool)$options['jsCleanComments'];
+        }
     }
 
 
@@ -149,13 +158,13 @@ class Minify_HTML {
 
         // replace SCRIPTs (and minify) with placeholders
         $this->_html = preg_replace_callback(
-            '/(\\s*)(<script\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i'
+            '/(\\s*)<script(\\b[^>]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i'
             ,array($this, '_removeScriptCB')
             ,$this->_html);
 
         // replace STYLEs (and minify) with placeholders
         $this->_html = preg_replace_callback(
-            '/\\s*(<style\\b[^>]*?>)([\\s\\S]*?)<\\/style>\\s*/i'
+            '/\\s*<style(\\b[^>]*>)([\\s\\S]*?)<\\/style>\\s*/i'
             ,array($this, '_removeStyleCB')
             ,$this->_html);
 
@@ -166,16 +175,22 @@ class Minify_HTML {
             ,$this->_html);
 
         // replace PREs with placeholders
-        $this->_html = preg_replace_callback('/\\s*(<pre\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/i'
+        $this->_html = preg_replace_callback('/\\s*<pre(\\b[^>]*?>[\\s\\S]*?<\\/pre>)\\s*/i'
             ,array($this, '_removePreCB')
             ,$this->_html);
 
         // replace TEXTAREAs with placeholders
         $this->_html = preg_replace_callback(
-            '/\\s*(<textarea\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/i'
+            '/\\s*<textarea(\\b[^>]*?>[\\s\\S]*?<\\/textarea>)\\s*/i'
             ,array($this, '_removeTextareaCB')
             ,$this->_html);
 
+        // replace INPUTs with placeholders
+        $this->_html = preg_replace_callback(
+            '/\\s*<input(\\b[^>]*?>)\\s*/i'
+            ,array($this, '_removeInputCB')
+            ,$this->_html);
+
         // trim each line.
         // @todo take into account attribute values that span multiple lines.
              // 2 regexp because merging un /^\\s+|\\s+$/m also del a lot of newline chars ???
@@ -190,9 +205,9 @@ class Minify_HTML {
             .'|ul)\\b[^>]*>)/i', '$1', $this->_html);
 
         // remove ws outside of all elements
-        $this->_html = preg_replace_callback(
-            '/>([^<]+)</'
-            ,array($this, '_outsideTagCB')
+        $this->_html = preg_replace(
+            '/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?</'
+            ,'>$1$2$3<'
             ,$this->_html);
 
         // use newlines before 1st attribute in open tags (to limit line lengths)
@@ -204,6 +219,12 @@ class Minify_HTML {
             ,array_values($this->_placeholders)
             ,$this->_html
         );
+        // issue 229: multi-pass to catch scripts that didn't get replaced in textareas
+        $this->_html = str_replace(
+            array_keys($this->_placeholders)
+            ,array_values($this->_placeholders)
+            ,$this->_html
+        );
         return $this->_html;
     }
 
@@ -227,24 +248,24 @@ class Minify_HTML {
     protected $_cssMinifier = null;
     protected $_jsMinifier = null;
 
-    protected function _outsideTagCB($m)
-    {
-        return '>' . preg_replace('/^\\s+|\\s+$/', ' ', $m[1]) . '<';
-    }
-
     protected function _removePreCB($m)
     {
-        return $this->_reservePlace($m[1]);
+        return $this->_reservePlace("<pre{$m[1]}");
     }
 
+               protected function _removeInputCB($m)
+               {
+            return $this->_reservePlace("<input{$m[1]}");
+               }
+
     protected function _removeTextareaCB($m)
     {
-        return $this->_reservePlace($m[1]);
+        return $this->_reservePlace("<textarea{$m[1]}");
     }
 
     protected function _removeStyleCB($m)
     {
-        $openStyle = $m[1];
+        $openStyle = "<style{$m[1]}";
         $css = $m[2];
         // remove HTML comments
         $css = preg_replace('/(?:^\\s*<!--|-->\\s*$)/', '', $css);
@@ -266,7 +287,7 @@ class Minify_HTML {
 
     protected function _removeScriptCB($m)
     {
-        $openScript = $m[2];
+        $openScript = "<script{$m[2]}";
         $js = $m[3];
 
         // whitespace surrounding? preserve at least one space
@@ -274,7 +295,9 @@ class Minify_HTML {
         $ws2 = ($m[4] === '') ? '' : ' ';
 
         // remove HTML comments (and ending "//" if present)
-        $js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
+        if ($this->_jsCleanComments) {
+            $js = preg_replace('/(?:^\\s*<!--\\s*|\\s*(?:\\/\\/)?\\s*-->\\s*$)/', '', $js);
+        }
 
         // remove CDATA section markers
         $js = $this->_removeCdata($js);
@@ -302,4 +325,4 @@ class Minify_HTML {
     {
         return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str));
     }
-}
+}
\ No newline at end of file