TwigFormulaLoader.php

Namespace

Assetic\Extension\Twig

File

drupal/core/vendor/kriswallsmith/assetic/src/Assetic/Extension/Twig/TwigFormulaLoader.php
View source
<?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\Extension\Twig;

use Assetic\Factory\Loader\FormulaLoaderInterface;
use Assetic\Factory\Resource\ResourceInterface;

/**
 * Loads asset formulae from Twig templates.
 *
 * @author Kris Wallsmith <kris.wallsmith@gmail.com>
 */
class TwigFormulaLoader implements FormulaLoaderInterface {
  private $twig;
  public function __construct(\Twig_Environment $twig) {
    $this->twig = $twig;
  }
  public function load(ResourceInterface $resource) {
    try {
      $tokens = $this->twig
        ->tokenize($resource
        ->getContent(), (string) $resource);
      $nodes = $this->twig
        ->parse($tokens);
    } catch (\Exception $e) {
      return array();
    }
    return $this
      ->loadNode($nodes);
  }

  /**
   * Loads assets from the supplied node.
   *
   * @return array An array of asset formulae indexed by name
   */
  private function loadNode(\Twig_Node $node) {
    $formulae = array();
    if ($node instanceof AsseticNode) {
      $formulae[$node
        ->getAttribute('name')] = array(
        $node
          ->getAttribute('inputs'),
        $node
          ->getAttribute('filters'),
        array(
          'output' => $node
            ->getAttribute('asset')
            ->getTargetPath(),
          'name' => $node
            ->getAttribute('name'),
          'debug' => $node
            ->getAttribute('debug'),
          'combine' => $node
            ->getAttribute('combine'),
          'vars' => $node
            ->getAttribute('vars'),
        ),
      );
    }
    elseif ($node instanceof \Twig_Node_Expression_Function) {
      $name = version_compare(\Twig_Environment::VERSION, '1.2.0-DEV', '<') ? $node
        ->getNode('name')
        ->getAttribute('name') : $node
        ->getAttribute('name');
      if ($this->twig
        ->getFunction($name) instanceof AsseticFilterFunction) {
        $arguments = array();
        foreach ($node
          ->getNode('arguments') as $argument) {
          $arguments[] = eval('return ' . $this->twig
            ->compile($argument) . ';');
        }
        $invoker = $this->twig
          ->getExtension('assetic')
          ->getFilterInvoker($name);
        $inputs = isset($arguments[0]) ? (array) $arguments[0] : array();
        $filters = $invoker
          ->getFilters();
        $options = array_replace($invoker
          ->getOptions(), isset($arguments[1]) ? $arguments[1] : array());
        if (!isset($options['name'])) {
          $options['name'] = $invoker
            ->getFactory()
            ->generateAssetName($inputs, $filters, $options);
        }
        $formulae[$options['name']] = array(
          $inputs,
          $filters,
          $options,
        );
      }
    }
    foreach ($node as $child) {
      if ($child instanceof \Twig_Node) {
        $formulae += $this
          ->loadNode($child);
      }
    }
    return $formulae;
  }

}

Classes

Namesort descending Description
TwigFormulaLoader Loads asset formulae from Twig templates.