From b39e53129120145421b8527347a63fe2515d0ba6 Mon Sep 17 00:00:00 2001 From: Anton Degtyarev Date: Thu, 10 Apr 2014 16:32:01 +0400 Subject: [PATCH] updated Minify_HTML to the latest version https://code.google.com/p/minify/source/browse/min/lib/Minify/HTML.php --- EScriptBoost.php | 8 +- assets/html/{HTMLMin.php => Minify_HTML.php} | 93 ++++++++++++-------- 2 files changed, 58 insertions(+), 43 deletions(-) rename assets/html/{HTMLMin.php => Minify_HTML.php} (80%) diff --git a/EScriptBoost.php b/EScriptBoost.php index c62d21b..b6fcff7 100644 --- a/EScriptBoost.php +++ b/EScriptBoost.php @@ -33,7 +33,7 @@ Yii::import('scriptboostjs.*'); Yii::import('scriptboostcss.*'); -Yii::import('scriptboosthtml.HTMLMin'); +Yii::import('scriptboosthtml.*'); class EScriptBoost extends CComponent { @@ -124,12 +124,12 @@ public static function minifyJs($content, $adapter = self::JS_MIN, $options = ar * * @param string $content the content to parse * @param array $options - * @see HTMLMin class to check the options + * @see Minify_HTML class to check the options * @return minified content */ public static function minifyHTML($content, $options = array()) { - return HTMLMin::minify($content, $options); + return Minify_HTML::minify($content, $options); } /** @@ -169,4 +169,4 @@ public static function registerScript($id, $script, $cacheDuration=0, $position= } Yii::app()->clientScript->registerScript($id, $js, $position); } -} \ No newline at end of file +} diff --git a/assets/html/HTMLMin.php b/assets/html/Minify_HTML.php similarity index 80% rename from assets/html/HTMLMin.php rename to assets/html/Minify_HTML.php index 268e81c..6767e81 100644 --- a/assets/html/HTMLMin.php +++ b/assets/html/Minify_HTML.php @@ -1,17 +1,26 @@ */ -class HTMLMin { +class Minify_HTML { + /** + * @var boolean + */ + protected $_jsCleanComments = true; /** * "Minify" an HTML page @@ -22,21 +31,21 @@ class HTMLMin { * * 'cssMinifier' : (optional) callback function to process content of STYLE * elements. - * + * * 'jsMinifier' : (optional) callback function to process content of SCRIPT * elements. Note: the type attribute is ignored. - * + * * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If * unset, minify will sniff for an XHTML doctype. - * + * * @return string */ public static function minify($html, $options = array()) { - $min = new HTMLMin($html, $options); + $min = new self($html, $options); return $min->process(); } - - + + /** * Create a minifier object * @@ -46,14 +55,14 @@ public static function minify($html, $options = array()) { * * 'cssMinifier' : (optional) callback function to process content of STYLE * elements. - * + * * '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. - * - * @return null */ public function __construct($html, $options = array()) { @@ -67,9 +76,12 @@ public function __construct($html, $options = array()) if (isset($options['jsMinifier'])) { $this->_jsMinifier = $options['jsMinifier']; } + if (isset($options['jsCleanComments'])) { + $this->_jsCleanComments = (bool)$options['jsCleanComments']; + } } - - + + /** * Minify the markeup given in the constructor * @@ -86,13 +98,13 @@ public function process() // replace SCRIPTs (and minify) with placeholders $this->_html = preg_replace_callback( - '/(\\s*)(]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i' + '/(\\s*)]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i' ,array($this, '_removeScriptCB') ,$this->_html); // replace STYLEs (and minify) with placeholders $this->_html = preg_replace_callback( - '/\\s*(]*?>)([\\s\\S]*?)<\\/style>\\s*/i' + '/\\s*]*>)([\\s\\S]*?)<\\/style>\\s*/i' ,array($this, '_removeStyleCB') ,$this->_html); @@ -103,13 +115,13 @@ public function process() ,$this->_html); // replace PREs with placeholders - $this->_html = preg_replace_callback('/\\s*(]*?>[\\s\\S]*?<\\/pre>)\\s*/i' + $this->_html = preg_replace_callback('/\\s*]*?>[\\s\\S]*?<\\/pre>)\\s*/i' ,array($this, '_removePreCB') ,$this->_html); // replace TEXTAREAs with placeholders $this->_html = preg_replace_callback( - '/\\s*(]*?>[\\s\\S]*?<\\/textarea>)\\s*/i' + '/\\s*]*?>[\\s\\S]*?<\\/textarea>)\\s*/i' ,array($this, '_removeTextareaCB') ,$this->_html); @@ -119,15 +131,15 @@ public function process() // remove ws around block/undisplayed elements $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body' - .'|caption|center|cite|col(?:group)?|dd|dir|div|dl|dt|fieldset|form' + .'|caption|center|col(?:group)?|dd|dir|div|dl|dt|fieldset|form' .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta' .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)' .'|ul)\\b[^>]*>)/i', '$1', $this->_html); // remove ws outside of all elements - $this->_html = preg_replace_callback( - '/>([^<]+)_html = preg_replace( + '/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?$1$2$3<' ,$this->_html); // use newlines before 1st attribute in open tags (to limit line lengths) @@ -139,6 +151,12 @@ public function process() ,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; } @@ -162,24 +180,19 @@ protected function _reservePlace($content) 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("_reservePlace($m[1]); + return $this->_reservePlace("\\s*$)/', '', $css); @@ -201,23 +214,25 @@ protected function _removeStyleCB($m) protected function _removeScriptCB($m) { - $openScript = $m[2]; + $openScript = "\\s*$)/', '', $js); - + if ($this->_jsCleanComments) { + $js = preg_replace('/(?:^\\s*\\s*$)/', '', $js); + } + // remove CDATA section markers $js = $this->_removeCdata($js); // minify $minifier = $this->_jsMinifier ? $this->_jsMinifier - : 'trim'; + : 'trim'; $js = call_user_func($minifier, $js); return $this->_reservePlace($this->_needsCdata($js) @@ -237,4 +252,4 @@ protected function _needsCdata($str) { return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str)); } -} \ No newline at end of file +}