12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- <?php
-
- /*
- * This file is part of the Assetic package, an OpenSky project.
- *
- * (c) 2010-2012 OpenSky Project Inc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
- namespace Assetic\Filter;
-
- use Assetic\Asset\AssetInterface;
-
- /**
- * Fixes relative CSS urls.
- *
- * @author Kris Wallsmith <kris.wallsmith@gmail.com>
- */
- class CssRewriteFilter extends BaseCssFilter
- {
- public function filterLoad(AssetInterface $asset)
- {
- }
-
- public function filterDump(AssetInterface $asset)
- {
- $sourceBase = $asset->getSourceRoot();
- $sourcePath = $asset->getSourcePath();
- $targetPath = $asset->getTargetPath();
-
- if (null === $sourcePath || null === $targetPath || $sourcePath == $targetPath) {
- return;
- }
-
- // learn how to get from the target back to the source
- if (false !== strpos($sourceBase, '://')) {
- list($scheme, $url) = explode('://', $sourceBase.'/'.$sourcePath, 2);
- list($host, $path) = explode('/', $url, 2);
-
- $host = $scheme.'://'.$host.'/';
- $path = false === strpos($path, '/') ? '' : dirname($path);
- $path .= '/';
- } else {
- // assume source and target are on the same host
- $host = '';
-
- // pop entries off the target until it fits in the source
- if ('.' == dirname($sourcePath)) {
- $path = str_repeat('../', substr_count($targetPath, '/'));
- } elseif ('.' == $targetDir = dirname($targetPath)) {
- $path = dirname($sourcePath).'/';
- } else {
- $path = '';
- while (0 !== strpos($sourcePath, $targetDir)) {
- if (false !== $pos = strrpos($targetDir, '/')) {
- $targetDir = substr($targetDir, 0, $pos);
- $path .= '../';
- } else {
- $targetDir = '';
- $path .= '../';
- break;
- }
- }
- $path .= ltrim(substr(dirname($sourcePath).'/', strlen($targetDir)), '/');
- }
- }
-
- $content = $this->filterReferences($asset->getContent(), function($matches) use ($host, $path) {
- if (false !== strpos($matches['url'], '://') || 0 === strpos($matches['url'], '//') || 0 === strpos($matches['url'], 'data:')) {
- // absolute or protocol-relative or data uri
- return $matches[0];
- }
-
- if ('/' == $matches['url'][0]) {
- // root relative
- return str_replace($matches['url'], $host.$matches['url'], $matches[0]);
- }
-
- // document relative
- $url = $matches['url'];
- while (0 === strpos($url, '../') && 2 <= substr_count($path, '/')) {
- $path = substr($path, 0, strrpos(rtrim($path, '/'), '/') + 1);
- $url = substr($url, 3);
- }
-
- return str_replace($matches['url'], $host.$path.$url, $matches[0]);
- });
-
- $asset->setContent($content);
- }
- }
|