replaced {% parent %} with {{ parent() }}
authorFabien Potencier <fabien.potencier@gmail.com>
Wed, 29 Dec 2010 10:15:04 +0000 (11:15 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Thu, 30 Dec 2010 10:20:20 +0000 (11:20 +0100)
13 files changed:
doc/api.rst
doc/templates.rst
lib/Twig/ExpressionParser.php
lib/Twig/Extension/Core.php
lib/Twig/Node/Expression/Parent.php [moved from lib/Twig/Node/Parent.php with 81% similarity]
lib/Twig/Template.php
lib/Twig/TokenParser/Parent.php [deleted file]
test/Twig/Tests/Fixtures/tags/inheritance/conditional.test
test/Twig/Tests/Fixtures/tags/inheritance/multiple.test
test/Twig/Tests/Fixtures/tags/inheritance/parent.test
test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test
test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test
test/Twig/Tests/Node/Expression/ParentTest.php [moved from test/Twig/Tests/Node/ParentTest.php with 69% similarity]

index fe69117..43e5bc6 100644 (file)
@@ -270,8 +270,6 @@ The ``core`` extension defines all the core features of Twig:
   * ``extends``
   * ``include``
   * ``block``
-  * ``parent``
-  * ``display``
   * ``filter``
   * ``macro``
   * ``import``
@@ -306,6 +304,7 @@ The ``core`` extension defines all the core features of Twig:
   * ``range``
   * ``constant``
   * ``cycle``
+  * ``parent``
 
 * Tests:
 
index fc88b27..9f91e8b 100644 (file)
@@ -241,7 +241,7 @@ A child template might look like this:
 
     {% block title %}Index{% endblock %}
     {% block head %}
-      {% parent %}
+      {{ parent() }}
       <style type="text/css">
         .important { color: #336699; }
       </style>
@@ -293,14 +293,14 @@ Parent Blocks
 ~~~~~~~~~~~~~
 
 It's possible to render the contents of the parent block by using the ``parent``
-tag. This gives back the results of the parent block:
+function. This gives back the results of the parent block:
 
 .. code-block:: jinja
 
     {% block sidebar %}
       <h3>Table Of Contents</h3>
       ...
-      {% parent %}
+      {{ parent() }}
     {% endblock %}
 
 Named Block End-Tags
index c988722..39c5a12 100644 (file)
@@ -213,11 +213,7 @@ class Twig_ExpressionParser
                 } elseif ('|' == $token->getValue()) {
                     $node = $this->parseFilterExpression($node);
                 } elseif ($firstPass && $node instanceof Twig_Node_Expression_Name && '(' == $token->getValue()) {
-                    if (null !== $alias = $this->parser->getImportedFunction($node->getAttribute('name'))) {
-                        $node = new Twig_Node_Expression_GetAttr($alias['node'], new Twig_Node_Expression_Constant($alias['name'], $node->getLine()), $this->parseArguments(), $node->getLine(), Twig_Node_Expression_GetAttr::TYPE_METHOD);
-                    } else {
-                        $node = new Twig_Node_Expression_Function($node, $this->parseArguments(), $node->getLine());
-                    }
+                    $node = $this->getFunctionNode($node);
                 } else {
                     break;
                 }
@@ -231,6 +227,29 @@ class Twig_ExpressionParser
         return $node;
     }
 
+    public function getFunctionNode($node)
+    {
+        $args = $this->parseArguments();
+
+        if ('parent' === $node->getAttribute('name')) {
+            if (!count($this->parser->getBlockStack())) {
+                throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden', $token->getLine());
+            }
+
+            if (!$this->parser->getParent()) {
+                throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend another one is forbidden', $token->getLine());
+            }
+
+            return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $node->getLine());
+        }
+
+        if (null !== $alias = $this->parser->getImportedFunction($node->getAttribute('name'))) {
+            return new Twig_Node_Expression_GetAttr($alias['node'], new Twig_Node_Expression_Constant($alias['name'], $node->getLine()), $args, $node->getLine(), Twig_Node_Expression_GetAttr::TYPE_METHOD);
+        }
+
+        return new Twig_Node_Expression_Function($node, $args, $node->getLine());
+    }
+
     public function parseSubscriptExpression($node)
     {
         $token = $this->parser->getStream()->next();
index b933344..26ae86e 100644 (file)
@@ -23,7 +23,6 @@ class Twig_Extension_Core extends Twig_Extension
             new Twig_TokenParser_Extends(),
             new Twig_TokenParser_Include(),
             new Twig_TokenParser_Block(),
-            new Twig_TokenParser_Parent(),
             new Twig_TokenParser_Display(),
             new Twig_TokenParser_Filter(),
             new Twig_TokenParser_Macro(),
similarity index 81%
rename from lib/Twig/Node/Parent.php
rename to lib/Twig/Node/Expression/Parent.php
index b2498fa..be07cdb 100644 (file)
@@ -16,7 +16,7 @@
  * @package    twig
  * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
  */
-class Twig_Node_Parent extends Twig_Node
+class Twig_Node_Expression_Parent extends Twig_Node_Expression
 {
     public function __construct($name, $lineno, $tag = null)
     {
@@ -31,10 +31,9 @@ class Twig_Node_Parent extends Twig_Node
     public function compile($compiler)
     {
         $compiler
-            ->addDebugInfo($this)
-            ->write("\$this->displayParentBlock(")
+            ->raw("\$this->renderParentBlock(")
             ->string($this->getAttribute('name'))
-            ->raw(", \$context, \$blocks);\n")
+            ->raw(", \$context, \$blocks)")
         ;
     }
 }
index 46aec99..bf0378e 100644 (file)
@@ -59,6 +59,22 @@ abstract class Twig_Template implements Twig_TemplateInterface
         }
     }
 
+    public function renderParentBlock($name, array $context, array $blocks = array())
+    {
+        ob_start();
+        $this->displayParentBlock($name, $context, $blocks);
+
+        return new Twig_Markup(ob_get_clean());
+    }
+
+    public function renderBlock($name, array $context, array $blocks = array())
+    {
+        ob_start();
+        $this->displayBlock($name, $context, $blocks);
+
+        return new Twig_Markup(ob_get_clean());
+    }
+
     public function hasBlock($name)
     {
         return isset($this->blocks[$name]);
diff --git a/lib/Twig/TokenParser/Parent.php b/lib/Twig/TokenParser/Parent.php
deleted file mode 100644 (file)
index afde369..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) 2009 Fabien Potencier
- * (c) 2009 Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_TokenParser_Parent 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)
-    {
-        if (!count($this->parser->getBlockStack())) {
-            throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden', $token->getLine());
-        }
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        if (!$this->parser->getParent()) {
-            throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend another one is forbidden', $token->getLine());
-        }
-
-        return new Twig_Node_Parent($this->parser->peekBlockStack(), $token->getLine(), $this->getTag());
-    }
-
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @param string The tag name
-     */
-    public function getTag()
-    {
-        return 'parent';
-    }
-}
index 3be8c47..8576e77 100644 (file)
@@ -3,7 +3,7 @@
 --TEMPLATE--
 {% extends standalone ? foo : 'bar.twig' %}
 
-{% block content %}{% parent %}FOO{% endblock %}
+{% block content %}{{ parent() }}FOO{% endblock %}
 --TEMPLATE(foo.twig)--
 {% block content %}FOO{% endblock %}
 --TEMPLATE(bar.twig)--
index 4aba998..dfc2b6c 100644 (file)
@@ -1,9 +1,9 @@
 --TEST--
 "extends" tag
 --TEMPLATE--
-{% extends "layout.twig" %}{% block content %}{% parent %}index {% endblock %}
+{% extends "layout.twig" %}{% block content %}{{ parent() }}index {% endblock %}
 --TEMPLATE(layout.twig)--
-{% extends "base.twig" %}{% block content %}{% parent %}layout {% endblock %}
+{% extends "base.twig" %}{% block content %}{{ parent() }}layout {% endblock %}
 --TEMPLATE(base.twig)--
 {% block content %}base {% endblock %}
 --DATA--
index b4a1daf..4f975db 100644 (file)
@@ -3,7 +3,7 @@
 --TEMPLATE--
 {% extends "foo.twig" %}
 
-{% block content %}{% parent %}FOO{% parent %}{% endblock %}
+{% block content %}{{ parent() }}FOO{{ parent() }}{% endblock %}
 --TEMPLATE(foo.twig)--
 {% block content %}BAR{% endblock %}
 --DATA--
index 1a5cf44..71e7c20 100644 (file)
@@ -9,7 +9,7 @@
   {% endblock %}
 
   BEFORE
-  {% parent %}
+  {{ parent() }}
   AFTER
 {% endblock %}
 --TEMPLATE(foo.twig)--
@@ -24,4 +24,5 @@ INSIDE OVERRIDDEN
   
   BEFORE
     BAR
+
   AFTER
index b2c48d9..d1876a5 100644 (file)
@@ -4,7 +4,7 @@
 {% extends foo %}
 
 {% block content %}
-{% parent %}FOO
+{{ parent() }}FOO
 {% endblock %}
 --TEMPLATE(foo.twig)--
 {% block content %}BAR{% endblock %}
similarity index 69%
rename from test/Twig/Tests/Node/ParentTest.php
rename to test/Twig/Tests/Node/Expression/ParentTest.php
index 607b4f1..ef18925 100644 (file)
@@ -9,16 +9,16 @@
  * file that was distributed with this source code.
  */
 
-require_once dirname(__FILE__).'/TestCase.php';
+require_once dirname(__FILE__).'/../TestCase.php';
 
-class Twig_Tests_Node_ParentTest extends Twig_Tests_Node_TestCase
+class Twig_Tests_Node_Expression_ParentTest extends Twig_Tests_Node_TestCase
 {
     /**
      * @covers Twig_Node_Parent::__construct
      */
     public function testConstructor()
     {
-        $node = new Twig_Node_Parent('foo', 0);
+        $node = new Twig_Node_Expression_Parent('foo', 0);
 
         $this->assertEquals('foo', $node->getAttribute('name'));
     }
@@ -35,7 +35,7 @@ class Twig_Tests_Node_ParentTest extends Twig_Tests_Node_TestCase
     public function getTests()
     {
         $tests = array();
-        $tests[] = array(new Twig_Node_Parent('foo', 0), '$this->displayParentBlock("foo", $context, $blocks);');
+        $tests[] = array(new Twig_Node_Expression_Parent('foo', 0), '$this->renderParentBlock("foo", $context, $blocks)');
 
         return $tests;
     }