diff --git a/WebLoader/Filter/CssUrlsFilter.php b/WebLoader/Filter/CssUrlsFilter.php index 3115592..1562453 100644 --- a/WebLoader/Filter/CssUrlsFilter.php +++ b/WebLoader/Filter/CssUrlsFilter.php @@ -55,7 +55,7 @@ public function setBasePath($basePath) public function absolutizeUrl($url, $quote, $cssFile) { // is already absolute - if (preg_match('/^([a-z]+:\/)?\//', $url)) { + if (preg_match('/^([a-z]+:|\/)/i', $url)) { return $url; } @@ -71,7 +71,7 @@ public function absolutizeUrl($url, $quote, $cssFile) $path = $this->cannonicalizePath($path); - return $quote === '"' ? addslashes($path) : $path; + return !$quote ? addslashes($path) : $path; } /** @@ -107,30 +107,22 @@ public function cannonicalizePath($path) */ public function __invoke($code, \WebLoader\Compiler $loader, $file = null) { - // thanks to kravco - $regexp = '~ - (?absolutizeUrl($matches[2], $matches[1], $file) . "')"; + $path = trim($matches[2]); // Remove new lines, spaces, etc + $path = trim($path, '\'"'); // Remove quotes on each end (if any) + + return "url('" . $this->absolutizeUrl($path, $matches[1], $file) . "')"; }, $code); } diff --git a/tests/Filter/CssUrlsFilterTest.php b/tests/Filter/CssUrlsFilterTest.php index a5c403c..df67e2d 100644 --- a/tests/Filter/CssUrlsFilterTest.php +++ b/tests/Filter/CssUrlsFilterTest.php @@ -2,6 +2,9 @@ namespace WebLoader\Test\Filter; +use WebLoader\Compiler; +use WebLoader\DefaultOutputNamingConvention; +use WebLoader\FileCollection; use WebLoader\Filter\CssUrlsFilter; class CssUrlsFilterTest extends \PHPUnit_Framework_TestCase @@ -12,12 +15,16 @@ class CssUrlsFilterTest extends \PHPUnit_Framework_TestCase protected function setUp() { - $this->object = new CssUrlsFilter(__DIR__ . '/..', '/'); + $this->filter = new CssUrlsFilter(__DIR__ . '/..', '/'); + + $files = new FileCollection(__DIR__ . '/../fixtures'); + @mkdir($outputDir = __DIR__ . '/../temp/'); + $this->compiler = new Compiler($files, new DefaultOutputNamingConvention(), $outputDir); } public function testCannonicalizePath() { - $path = $this->object->cannonicalizePath('/prase/./dobytek/../ale/nic.jpg'); + $path = $this->filter->cannonicalizePath('/prase/./dobytek/../ale/nic.jpg'); $this->assertEquals('/prase/ale/nic.jpg', $path); } @@ -26,10 +33,16 @@ public function testAbsolutizeAbsolutized() $cssPath = __DIR__ . '/../fixtures/style.css'; $url = 'http://image.com/image.jpg'; - $this->assertEquals($url, $this->object->absolutizeUrl($url, '\'', $cssPath)); + $this->assertEquals($url, $this->filter->absolutizeUrl($url, '\'', $cssPath)); $abs = '/images/img.png'; - $this->assertEquals($abs, $this->object->absolutizeUrl($abs, '\'', $cssPath)); + $this->assertEquals($abs, $this->filter->absolutizeUrl($abs, '\'', $cssPath)); + + $abs = 'https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic'; + $this->assertEquals($abs, $this->filter->absolutizeUrl($abs, '\'', $cssPath)); + + $abs = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='; + $this->assertEquals($abs, $this->filter->absolutizeUrl($abs, '\'', $cssPath)); } public function testAbsolutize() @@ -38,12 +51,12 @@ public function testAbsolutize() $this->assertEquals( '/images/image.png', - $this->object->absolutizeUrl('./../images/image.png', '\'', $cssPath) + $this->filter->absolutizeUrl('./../images/image.png', '\'', $cssPath) ); $this->assertEquals( '/images/path/to/image.png', - $this->object->absolutizeUrl('./../images/path/./to/image.png', '\'', $cssPath) + $this->filter->absolutizeUrl('./../images/path/./to/image.png', '\'', $cssPath) ); } @@ -51,7 +64,16 @@ public function testAbsolutizeOutsideOfDocRoot() { $path = './../images/image.png'; $existingPath = __DIR__ . '/../../Compiler.php'; - $this->assertEquals($path, $this->object->absolutizeUrl($path, '\'', $existingPath)); + $this->assertEquals($path, $this->filter->absolutizeUrl($path, '\'', $existingPath)); } + public function testInvoke() + { + $cssPath = __DIR__ . '/../fixtures/style.css'; + $code = file_get_contents($cssPath); + + $css = $this->filter->__invoke($code, $this->compiler, $cssPath); + + $this->assertSame(file_get_contents(__DIR__ . '/../fixtures/style.css.expected'), $css); + } } diff --git a/tests/fixtures/style.css b/tests/fixtures/style.css index e69de29..630e745 100644 --- a/tests/fixtures/style.css +++ b/tests/fixtures/style.css @@ -0,0 +1,23 @@ +@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic); + +body { + background: url(img/boxed-bg.jpg); +} + +.greedy-match { + background: url("img/\"layer1.jpg"), url('img\'/layer2.jpg'); +} + +.addslashes-if-unquoted { + background: url(img/'layer1.jpg); +} + +.quote-mismatch { + background: url("img/layer2.jpg'); +} + +ul { + list-style-image: url( + data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg== + ); +} diff --git a/tests/fixtures/style.css.expected b/tests/fixtures/style.css.expected new file mode 100644 index 0000000..886497b --- /dev/null +++ b/tests/fixtures/style.css.expected @@ -0,0 +1,21 @@ +@import url('https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic'); + +body { + background: url('/fixtures/img/boxed-bg.jpg'); +} + +.greedy-match { + background: url('/fixtures/img/\"layer1.jpg'), url('/fixtures/img\'/layer2.jpg'); +} + +.addslashes-if-unquoted { + background: url('/fixtures/img/\'layer1.jpg'); +} + +.quote-mismatch { + background: url('/fixtures/img/layer2.jpg'); +} + +ul { + list-style-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=='); +}