/** * Rewrite file relative URIs as root relative in CSS files * * @param string $css * * @param string $current_dir The directory of the current CSS file. * * @param string $doc_root The document root of the web site in which * the CSS file resides (default = $_SERVER['DOCUMENT_ROOT']). * * @param array $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 rewrite($css, $current_dir, $doc_root = null, $symlinks = array()) { self::$_doc_root = self::_realpath($doc_root ? $doc_root : $_SERVER['DOCUMENT_ROOT']); self::$_current_dir = self::_realpath($current_dir); self::$_symlinks = array(); // normalize symlinks foreach ($symlinks as $link => $target) { $link = $link === '//' ? self::$_doc_root : str_replace('//', self::$_doc_root . '/', $link); $link = strtr($link, '/', DIRECTORY_SEPARATOR); self::$_symlinks[$link] = self::_realpath($target); } self::$debug_text .= "doc_root : " . self::$_doc_root . "\n" . "current_dir : " . self::$_current_dir . "\n"; if (self::$_symlinks) { self::$debug_text .= "symlinks : " . var_export(self::$_symlinks, 1) . "\n"; } self::$debug_text .= "\n"; $css = self::_trim_urls($css); // rewrite $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/', array(self::$class_name, '_process_uri_cb'), $css); $css = preg_replace_callback('/url\\(\\s*([^\\)\\s]+)\\s*\\)/', array(self::$class_name, '_process_uri_cb'), $css); $css = preg_replace_callback('/src=\'\\s*([^\\)\\s]+)\\s*\'/', array(self::$class_name, '_process_src_cb'), $css); return $css; }