added a do tag (closes #446)
authorFabien Potencier <fabien.potencier@gmail.com>
Thu, 22 Dec 2011 21:32:27 +0000 (22:32 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Thu, 22 Dec 2011 21:36:35 +0000 (22:36 +0100)
CHANGELOG
doc/tags/flush.rst
doc/tags/index.rst
lib/Twig/Extension/Core.php
lib/Twig/Node/Do.php [new file with mode: 0644]
lib/Twig/TokenParser/Do.php [new file with mode: 0644]
test/Twig/Tests/Node/DoTest.php [new file with mode: 0644]

index e5dfc1c..bfbab34 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
 * 1.5.0
 
+ * added a do tag
  * added a flush tag
  * added support for dynamically named filters and functions
  * added a dump function to help debugging templates
index c44d990..55ef593 100644 (file)
@@ -2,7 +2,7 @@
 =========
 
 .. versionadded:: 1.5
-    The use tag was added in Twig 1.5.
+    The flush tag was added in Twig 1.5.
 
 The ``flush`` tag tells Twig to flush the output buffer:
 
index 23ab6fe..e44e93d 100644 (file)
@@ -19,3 +19,4 @@ Tags
     autoescape
     raw
     flush
+    do
index f60d705..4c326f5 100644 (file)
@@ -57,6 +57,7 @@ class Twig_Extension_Core extends Twig_Extension
             new Twig_TokenParser_Set(),
             new Twig_TokenParser_Spaceless(),
             new Twig_TokenParser_Flush(),
+            new Twig_TokenParser_Do(),
         );
     }
 
diff --git a/lib/Twig/Node/Do.php b/lib/Twig/Node/Do.php
new file mode 100644 (file)
index 0000000..aa419d9
--- /dev/null
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) 2011 Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Represents a do node.
+ *
+ * @package    twig
+ * @author     Fabien Potencier <fabien@symfony.com>
+ */
+class Twig_Node_Do extends Twig_Node
+{
+    public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
+    {
+        parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
+    }
+
+    /**
+     * Compiles the node to PHP.
+     *
+     * @param Twig_Compiler A Twig_Compiler instance
+     */
+    public function compile(Twig_Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write('')
+            ->subcompile($this->getNode('expr'))
+            ->raw(";\n")
+        ;
+    }
+}
diff --git a/lib/Twig/TokenParser/Do.php b/lib/Twig/TokenParser/Do.php
new file mode 100644 (file)
index 0000000..17211fb
--- /dev/null
@@ -0,0 +1,42 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) 2011 Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Evaluates an expression, disgarding the returned value.
+ */
+class Twig_TokenParser_Do extends Twig_TokenParser
+{
+    /**
+     * Parses a token and returns a node.
+     *
+     * @param Twig_Token $token A Twig_Token instance
+     *
+     * @return Twig_NodeInterface A Twig_NodeInterface instance
+     */
+    public function parse(Twig_Token $token)
+    {
+        $expr = $this->parser->getExpressionParser()->parseExpression();
+
+        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+
+        return new Twig_Node_Do($expr, $token->getLine(), $this->getTag());
+    }
+
+    /**
+     * Gets the tag name associated with this token parser.
+     *
+     * @param string The tag name
+     */
+    public function getTag()
+    {
+        return 'do';
+    }
+}
diff --git a/test/Twig/Tests/Node/DoTest.php b/test/Twig/Tests/Node/DoTest.php
new file mode 100644 (file)
index 0000000..49c2a59
--- /dev/null
@@ -0,0 +1,46 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+require_once dirname(__FILE__).'/TestCase.php';
+
+class Twig_Tests_Node_DoTest extends Twig_Tests_Node_TestCase
+{
+    /**
+     * @covers Twig_Node_Do::__construct
+     */
+    public function testConstructor()
+    {
+        $expr = new Twig_Node_Expression_Constant('foo', 0);
+        $node = new Twig_Node_Do($expr, 0);
+
+        $this->assertEquals($expr, $node->getNode('expr'));
+    }
+
+    /**
+     * @covers Twig_Node_Do::compile
+     * @dataProvider getTests
+     */
+    public function testCompile($node, $source, $environment = null)
+    {
+        parent::testCompile($node, $source, $environment);
+    }
+
+    public function getTests()
+    {
+        $tests = array();
+
+        $expr = new Twig_Node_Expression_Constant('foo', 0);
+        $node = new Twig_Node_Do($expr, 0);
+        $tests[] = array($node, '"foo";');
+
+        return $tests;
+    }
+}