public function CompassFilter::filterLoad

Filters an asset after it has been loaded.

Parameters

AssetInterface $asset An asset:

Overrides FilterInterface::filterLoad

File

drupal/core/vendor/kriswallsmith/assetic/src/Assetic/Filter/CompassFilter.php, line 174

Class

CompassFilter
Loads Compass files.

Namespace

Assetic\Filter

Code

public function filterLoad(AssetInterface $asset) {
  $root = $asset
    ->getSourceRoot();
  $path = $asset
    ->getSourcePath();
  $loadPaths = $this->loadPaths;
  if ($root && $path) {
    $loadPaths[] = dirname($root . '/' . $path);
  }

  // compass does not seems to handle symlink, so we use realpath()
  $tempDir = realpath(sys_get_temp_dir());
  $compassProcessArgs = array(
    $this->compassPath,
    'compile',
    $tempDir,
  );
  if (null !== $this->rubyPath) {
    $compassProcessArgs = array_merge(explode(' ', $this->rubyPath), $compassProcessArgs);
  }
  $pb = new ProcessBuilder($compassProcessArgs);
  $pb
    ->inheritEnvironmentVariables();
  if ($this->force) {
    $pb
      ->add('--force');
  }
  if ($this->style) {
    $pb
      ->add('--output-style')
      ->add($this->style);
  }
  if ($this->quiet) {
    $pb
      ->add('--quiet');
  }
  if ($this->boring) {
    $pb
      ->add('--boring');
  }
  if ($this->noLineComments) {
    $pb
      ->add('--no-line-comments');
  }

  // these two options are not passed into the config file
  // because like this, compass adapts this to be xxx_dir or xxx_path
  // whether it's an absolute path or not
  if ($this->imagesDir) {
    $pb
      ->add('--images-dir')
      ->add($this->imagesDir);
  }
  if ($this->javascriptsDir) {
    $pb
      ->add('--javascripts-dir')
      ->add($this->javascriptsDir);
  }

  // options in config file
  $optionsConfig = array();
  if (!empty($loadPaths)) {
    $optionsConfig['additional_import_paths'] = $loadPaths;
  }
  if ($this->unixNewlines) {
    $optionsConfig['sass_options']['unix_newlines'] = true;
  }
  if ($this->debugInfo) {
    $optionsConfig['sass_options']['debug_info'] = true;
  }
  if ($this->cacheLocation) {
    $optionsConfig['sass_options']['cache_location'] = $this->cacheLocation;
  }
  if ($this->noCache) {
    $optionsConfig['sass_options']['no_cache'] = true;
  }
  if ($this->httpPath) {
    $optionsConfig['http_path'] = $this->httpPath;
  }
  if ($this->httpImagesPath) {
    $optionsConfig['http_images_path'] = $this->httpImagesPath;
  }
  if ($this->generatedImagesPath) {
    $optionsConfig['generated_images_path'] = $this->generatedImagesPath;
  }
  if ($this->httpJavascriptsPath) {
    $optionsConfig['http_javascripts_path'] = $this->httpJavascriptsPath;
  }

  // options in configuration file
  if (count($optionsConfig)) {
    $config = array();
    foreach ($this->plugins as $plugin) {
      $config[] = sprintf("require '%s'", addcslashes($plugin, '\\'));
    }
    foreach ($optionsConfig as $name => $value) {
      if (!is_array($value)) {
        $config[] = sprintf('%s = "%s"', $name, addcslashes($value, '\\'));
      }
      elseif (!empty($value)) {
        $config[] = sprintf('%s = %s', $name, $this
          ->formatArrayToRuby($value));
      }
    }
    $configFile = tempnam($tempDir, 'assetic_compass');
    file_put_contents($configFile, implode("\n", $config) . "\n");
    $pb
      ->add('--config')
      ->add($configFile);
  }
  $pb
    ->add('--sass-dir')
    ->add('')
    ->add('--css-dir')
    ->add('');

  // compass choose the type (sass or scss from the filename)
  if (null !== $this->scss) {
    $type = $this->scss ? 'scss' : 'sass';
  }
  elseif ($path) {

    // FIXME: what if the extension is something else?
    $type = pathinfo($path, PATHINFO_EXTENSION);
  }
  else {
    $type = 'scss';
  }
  $tempName = tempnam($tempDir, 'assetic_compass');
  unlink($tempName);

  // FIXME: don't use tempnam() here
  // input
  $input = $tempName . '.' . $type;

  // work-around for https://github.com/chriseppstein/compass/issues/748
  if (defined('PHP_WINDOWS_VERSION_MAJOR')) {
    $input = str_replace('\\', '/', $input);
  }
  $pb
    ->add($input);
  file_put_contents($input, $asset
    ->getContent());

  // output
  $output = $tempName . '.css';
  if ($this->homeEnv) {

    // it's not really usefull but... https://github.com/chriseppstein/compass/issues/376
    $pb
      ->setEnv('HOME', sys_get_temp_dir());
  }
  $proc = $pb
    ->getProcess();
  $code = $proc
    ->run();
  if (0 < $code) {
    unlink($input);
    if (isset($configFile)) {
      unlink($configFile);
    }
    throw FilterException::fromProcess($proc)
      ->setInput($asset
      ->getContent());
  }
  $asset
    ->setContent(file_get_contents($output));
  unlink($input);
  unlink($output);
  if (isset($configFile)) {
    unlink($configFile);
  }
}