<?php
/*
* This file is part of the Assetic package, an OpenSky project.
*
* (c) 2010-2013 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.
*
* @param \Twig_Node $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;
}
}
Name | Description |
---|---|
TwigFormulaLoader | Loads asset formulae from Twig templates. |