public function LessFilter::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/LessFilter.php, line 47

Class

LessFilter
Loads LESS files.

Namespace

Assetic\Filter

Code

public function filterLoad(AssetInterface $asset) {
  static $format = <<<'EOF'
var less = require('less');
var sys  = require(process.binding('natives').util ? 'util' : 'sys');

new(less.Parser)(%s).parse(%s, function(e, tree) {
    if (e) {
        less.writeError(e);
        process.exit(2);
    }

    try {
        sys.print(tree.toCSS(%s));
    } catch (e) {
        less.writeError(e);
        process.exit(3);
    }
});

EOF;
  $root = $asset
    ->getSourceRoot();
  $path = $asset
    ->getSourcePath();

  // parser options
  $parserOptions = array();
  if ($root && $path) {
    $parserOptions['paths'] = array(
      dirname($root . '/' . $path),
    );
    $parserOptions['filename'] = basename($path);
  }

  // tree options
  $treeOptions = array();
  if (null !== $this->compress) {
    $treeOptions['compress'] = $this->compress;
  }
  $pb = new ProcessBuilder();
  $pb
    ->inheritEnvironmentVariables();

  // node.js configuration
  if (0 < count($this->nodePaths)) {
    $pb
      ->setEnv('NODE_PATH', implode(':', $this->nodePaths));
  }
  $pb
    ->add($this->nodeBin)
    ->add($input = tempnam(sys_get_temp_dir(), 'assetic_less'));
  file_put_contents($input, sprintf($format, json_encode($parserOptions), json_encode($asset
    ->getContent()), json_encode($treeOptions)));
  $proc = $pb
    ->getProcess();
  $code = $proc
    ->run();
  unlink($input);
  if (0 < $code) {
    throw FilterException::fromProcess($proc)
      ->setInput($asset
      ->getContent());
  }
  $asset
    ->setContent($proc
    ->getOutput());
}