12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- <?php
-
- /*
- * This file is part of the Assetic package, an OpenSky project.
- *
- * (c) 2010-2011 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'),
- ),
- );
- } 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;
- }
- }
|