vendor/assetic/src/Assetic/Extension/Twig/TwigFormulaLoader.php
changeset 0 7f95f8617b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/assetic/src/Assetic/Extension/Twig/TwigFormulaLoader.php	Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,93 @@
+<?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 = $node->getNode('name')->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;
+    }
+}