mirror of
https://github.com/mrclay/minify.git
synced 2025-02-25 17:32:34 +01:00
CSS/UriRewriter.php : unit tests Minify/ImportProcessor.php : unit tests (need JS tests) Minify/CSS.php : refactoring using CommentPreserver.php Minify/Javascript.php : refactoring using CommentPreserver.php Minify/Lines.php : simplification
108 lines
3.3 KiB
PHP
108 lines
3.3 KiB
PHP
<?php
|
|
/**
|
|
* Class Minify_CSS_UriRewriter
|
|
* @package Minify
|
|
*/
|
|
|
|
/**
|
|
* Rewrite file-relative URIs as root-relative in CSS files
|
|
*
|
|
* @todo: prepend() method
|
|
*
|
|
* @package Minify
|
|
* @author Stephen Clay <steve@mrclay.org>
|
|
*/
|
|
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
|
|
*/
|
|
private static $_currentDir = '';
|
|
|
|
/**
|
|
* @var string DOC_ROOT
|
|
*/
|
|
private static $_docRoot = '';
|
|
|
|
private 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, '/');
|
|
// eat .
|
|
$uri = str_replace('/./', '/', $uri);
|
|
// eat ..
|
|
while (preg_match('@/[^/\\.]+/\\.\\./@', $uri, $m)) {
|
|
$uri = str_replace($m[0], '/', $uri);
|
|
}
|
|
}
|
|
}
|
|
if ($isImport) {
|
|
return "@import {$quoteChar}{$uri}{$quoteChar}";
|
|
} else {
|
|
return "url({$quoteChar}{$uri}{$quoteChar})";
|
|
}
|
|
}
|
|
}
|