public function CssRewriteFilter::filterDump

Filters an asset just before it's dumped.

Parameters

AssetInterface $asset An asset:

Overrides FilterInterface::filterDump

File

drupal/core/vendor/kriswallsmith/assetic/src/Assetic/Filter/CssRewriteFilter.php, line 27

Class

CssRewriteFilter
Fixes relative CSS urls.

Namespace

Assetic\Filter

Code

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);
    }
    $parts = array();
    foreach (explode('/', $host . $path . $url) as $part) {
      if ('..' === $part && count($parts) && '..' !== end($parts)) {
        array_pop($parts);
      }
      else {
        $parts[] = $part;
      }
    }
    return str_replace($matches['url'], implode('/', $parts), $matches[0]);
  });
  $asset
    ->setContent($content);
}