/** * Minify a CSS string * * @param string $css * * @param array $options available options: * * 'preserveComments': (default true) multi-line comments that begin * with "/*!" will be preserved with newlines before and after to * enhance readability. * * 'prependRelativePath': (default null) if given, this string will be * prepended to all relative URIs in import/url declarations * * 'currentDir': (default null) if given, this is assumed to be the * directory of the current CSS file. Using this, minify will rewrite * all relative URIs in import/url declarations to correctly point to * the desired files. For this to work, the files *must* exist and be * visible by the PHP process. * * 'symlinks': (default = array()) If the CSS file is stored in * a symlink-ed directory, provide an array of link paths to * target paths, where the link paths are within the document root. Because * paths need to be normalized for this to work, use "//" to substitute * the doc root in the link paths (the array keys). E.g.: * <code> * array('//symlink' => '/real/target/path') // unix * array('//static' => 'D:\\staticStorage') // Windows * </code> * * @return string */ public static function minify($css, $options = array()) { if (isset($options['preserveComments']) && !$options['preserveComments']) { $css = Paiva_Minify_CSS_Compressor::process($css, $options); } else { $css = Paiva_Minify_CSS_Comment::process($css, array('Paiva_Minify_CSS_Compressor', 'process'), array($options)); } if (!isset($options['currentDir']) && !isset($options['prependRelativePath'])) { return $css; } if (isset($options['currentDir'])) { return Paiva_Minify_CSS_UriRewriter::rewrite($css, $options['currentDir'], isset($options['docRoot']) ? $options['docRoot'] : $_SERVER['DOCUMENT_ROOT'], isset($options['symlinks']) ? $options['symlinks'] : array()); } else { return Paiva_Minify_CSS_UriRewriter::prepend($css, $options['prependRelativePath']); } }
/** * In CSS content, prepend a path to relative URIs * * @param string $css * * @param string $path The path to prepend. * * @return string */ public static function prepend($css, $path) { self::$_prependPath = $path; $css = self::_trimUrls($css); // append $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/', array(self::$className, '_processUriCB'), $css); $css = preg_replace_callback('/url\\(\\s*([^\\)\\s]+)\\s*\\)/', array(self::$className, '_processUriCB'), $css); self::$_prependPath = null; return $css; }
/** * Compile full list of files in $this->_cache array * * @return string */ protected function _getCompiledItem() { $fileProcessor = $this->getProcessor(); $path = $fileProcessor->getServerPath($this->getOption('dir') . $fileProcessor->fullFilename(md5(serialize($fileProcessor->getCache())))); if (!file_exists($path)) { // @todo: verificar a solução implementada no pacote minify $dir = dirname($path); if (!is_dir($dir) && !@mkdir($dir, 0777, true)) { throw new Exception('Impossible to create destination directory ' . $dir); } $cssContent = ''; foreach ($fileProcessor->getCache() as $css) { $content = file_get_contents($css['filepath']); $cssContent .= $this->getOption('compress', true) ? Paiva_Minify_CSS::minify($content, array('prependRelativePath' => dirname($path), 'currentDir' => dirname($css['filepath']), 'symlinks' => $this->getOption('symlinks'))) : Paiva_Minify_CSS_UriRewriter::rewrite($content, dirname($css['filepath']), $this->_getCompiledItem(''), $this->getOption('symlinks')); $cssContent .= "\n\n"; } file_put_contents($path, $cssContent); $fileProcessor->gzip($path, $cssContent); } return $this->createDataStylesheet(array('href' => $this->getProcessor()->getWebPath($path))); }