From eebe132aed0170accf7feb7618bc8beeceb57e5c Mon Sep 17 00:00:00 2001 From: Steve Clay Date: Sat, 30 Aug 2008 07:25:37 +0000 Subject: [PATCH] Added CSS/UriRewriter.php : untested! Minify/ImportProcessor.php units need fixing --- min/lib/Minify/CSS/UriRewriter.php | 102 ++++++++++++++++++ .../_test_files/importProcessor/1/bad.css | 1 - .../test_Minify_ImportProcessor.php | 4 +- 3 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 min/lib/Minify/CSS/UriRewriter.php delete mode 100644 min_extras/unit_tests/_test_files/importProcessor/1/bad.css diff --git a/min/lib/Minify/CSS/UriRewriter.php b/min/lib/Minify/CSS/UriRewriter.php new file mode 100644 index 0000000..4434c0d --- /dev/null +++ b/min/lib/Minify/CSS/UriRewriter.php @@ -0,0 +1,102 @@ + + */ +class Minify_CSS_UriRewriter { + + /** + * Rewrite file relative URIs as root relative in CSS files + * + * @param string $css + * + * @param string $currentDir The directory of the current CSS file. + * + * @param string $docRoot The document root of the web site in which + * the CSS file resides (default = $_SERVER['DOCUMENT_ROOT']). + * + * @return string + */ + public static function rewrite($css, $currentDir, $docRoot = null) + { + self::$_docRoot = $docRoot + ? $docRoot + : $_SERVER['DOCUMENT_ROOT']; + self::$_docRoot = realpath(self::$_docRoot); + self::$_currentDir = realpath($currentDir); + + // remove ws around urls + $css = preg_replace('/ + url\\( # url( + \\s* + ([^\\)]+?) # 1 = URI (really just a bunch of non right parenthesis) + \\s* + \\) # ) + /x', 'url($1)', $css); + + // rewrite + $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/' + ,array('Minify_CSS_UriRewriter', '_uriCB'), $css); + $css = preg_replace_callback('/url\\(\\s*([^\\)\\s]+)\\s*\\)/' + ,array('Minify_CSS_UriRewriter', '_uriCB'), $css); + + return $css; + } + + /** + * @var string directory of this stylesheet + */ + protected static $_currentDir = ''; + + /** + * @var string DOC_ROOT + */ + protected static $_docRoot = ''; + + protected static function _uriCB($m) + { + $isImport = ($m[0][0] === '@'); + if ($isImport) { + $quoteChar = $m[1]; + $uri = $m[2]; + } else { + // is url() + // $m[1] is either quoted or not + $quoteChar = ($m[1][0] === "'" || $m[1][0] === '"') + ? $m[1][0] + : ''; + $uri = ($quoteChar === '') + ? $m[1] + : substr($m[1], 1, strlen($m[1]) - 2); + } + if ('/' !== $uri[0]) { + if (strpos($uri, '//') > 0) { + // probably starts with protocol, do not alter + } else { + // it's a file relative URI! + // prepend path with current dir separator (OS-independent) + $path = strtr(self::$_currentDir, '/', DIRECTORY_SEPARATOR) + . DIRECTORY_SEPARATOR . strtr($uri, '/', DIRECTORY_SEPARATOR); + // strip doc root + $path = substr($path, strlen(self::$_docRoot)); + // fix to root-relative URI + $uri = strtr($path, DIRECTORY_SEPARATOR, '/'); + $uri = str_replace('/./', '/', $uri); + } + } + if ($isImport) { + return "@import {$quoteChar}{$uri}{$quoteChar}"; + } else { + return "url({$quoteChar}{$uri}{$quoteChar})"; + } + } +} diff --git a/min_extras/unit_tests/_test_files/importProcessor/1/bad.css b/min_extras/unit_tests/_test_files/importProcessor/1/bad.css deleted file mode 100644 index bd3704b..0000000 --- a/min_extras/unit_tests/_test_files/importProcessor/1/bad.css +++ /dev/null @@ -1 +0,0 @@ -/* I should not be imported */ \ No newline at end of file diff --git a/min_extras/unit_tests/test_Minify_ImportProcessor.php b/min_extras/unit_tests/test_Minify_ImportProcessor.php index 0823b2b..52b19ff 100644 --- a/min_extras/unit_tests/test_Minify_ImportProcessor.php +++ b/min_extras/unit_tests/test_Minify_ImportProcessor.php @@ -1,7 +1,5 @@