/** * Minify a CSS string * * @param string $css * * @param array $options To enable URL rewriting, set the value * for key 'prependRelativePath'. * * @return string */ protected static function _minify($css, $options) { // preserve empty comment after '>' // http://www.webdevout.net/css-hacks#in_css-selectors $css = preg_replace('/>\\/\\*\\s*\\*\\//', '>/*keep*/', $css); // preserve empty comment between property and value // http://css-discuss.incutio.com/?page=BoxModelHack $css = preg_replace('/\\/\\*\\s*\\*\\/\\s*:/', '/*keep*/:', $css); $css = preg_replace('/:\\s*\\/\\*\\s*\\*\\//', ':/*keep*/', $css); // apply callback to all valid comments (and strip out surrounding ws self::$_inHack = false; $css = preg_replace_callback('/\\s*\\/\\*([\\s\\S]*?)\\*\\/\\s*/', array('Minify_CSS', '_commentCB'), $css); // compress whitespace. $css = preg_replace('/\\s+/', ' ', $css); // leave needed comments $css = str_replace('/*keep*/', '/**/', $css); // remove ws around { } $css = preg_replace('/\\s*{\\s*/', '{', $css); $css = preg_replace('/;?\\s*}\\s*/', '}', $css); // remove ws between rules $css = preg_replace('/\\s*;\\s*/', ';', $css); // remove ws around urls $css = preg_replace('/url\\([\\s]*([^\\)]+?)[\\s]*\\)/', 'url($1)', $css); // remove ws between rules and colons $css = preg_replace('/\\s*([{;])\\s*([\\w\\-]+)\\s*:\\s*\\b/', '$1$2:', $css); // remove ws in selectors $css = preg_replace_callback('/(?:\\s*[^~>+,\\s]+\\s*[,>+~])+\\s*[^~>+,\\s]+{/', array('Minify_CSS', '_selectorsCB'), $css); // minimize hex colors $css = preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i', '$1#$2$3$4$5', $css); $rewrite = false; if (isset($options['prependRelativePath'])) { self::$_tempPrepend = $options['prependRelativePath']; $rewrite = true; } elseif (isset($options['currentPath'])) { self::$_tempCurrentPath = $options['currentPath']; $rewrite = true; } if ($rewrite) { $css = preg_replace_callback('/@import ([\'"])(.*?)[\'"]\\s*;/', array('Minify_CSS', '_urlCB'), $css); $css = preg_replace_callback('/url\\(([^\\)]+)\\)/', array('Minify_CSS', '_urlCB'), $css); } self::$_tempPrepend = self::$_tempCurrentPath = ''; return trim($css); }