vendor/twig-extensions/lib/Twig/Extensions/Grammar/Optional.php
changeset 0 7f95f8617b0b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vendor/twig-extensions/lib/Twig/Extensions/Grammar/Optional.php	Sat Sep 24 15:40:41 2011 +0200
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) 2010 Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+class Twig_Extensions_Grammar_Optional extends Twig_Extensions_Grammar
+{
+    protected $grammar;
+
+    public function __construct()
+    {
+        $this->grammar = array();
+        foreach (func_get_args() as $grammar) {
+            $this->addGrammar($grammar);
+        }
+    }
+
+    public function __toString()
+    {
+        $repr = array();
+        foreach ($this->grammar as $grammar) {
+            $repr[] = (string) $grammar;
+        }
+
+        return sprintf('[%s]', implode(' ', $repr));
+    }
+
+    public function addGrammar(Twig_Extensions_GrammarInterface $grammar)
+    {
+        $this->grammar[] = $grammar;
+    }
+
+    public function parse(Twig_Token $token)
+    {
+        // test if we have the optional element before consuming it
+        if ($this->grammar[0] instanceof Twig_Extensions_Grammar_Constant) {
+            if (!$this->parser->getStream()->test($this->grammar[0]->getType(), $this->grammar[0]->getName())) {
+                return array();
+            }
+        } elseif ($this->grammar[0] instanceof Twig_Extensions_Grammar_Name) {
+            if (!$this->parser->getStream()->test(Twig_Token::NAME_TYPE)) {
+                return array();
+            }
+        } elseif ($this->parser->getStream()->test(Twig_Token::BLOCK_END_TYPE)) {
+            // if this is not a Constant or a Name, it must be the last element of the tag
+
+            return array();
+        }
+
+        $elements = array();
+        foreach ($this->grammar as $grammar) {
+            $grammar->setParser($this->parser);
+
+            $element = $grammar->parse($token);
+            if (is_array($element)) {
+                $elements = array_merge($elements, $element);
+            } else {
+                $elements[$grammar->getName()] = $element;
+            }
+        }
+
+        return $elements;
+    }
+}