changed the filter tag to allow chained filters
authorfabien <fabien@93ef8e89-cb99-4229-a87c-7fa0fa45744b>
Sun, 18 Oct 2009 22:52:37 +0000 (22:52 +0000)
committerfabien <fabien@93ef8e89-cb99-4229-a87c-7fa0fa45744b>
Sun, 18 Oct 2009 22:52:37 +0000 (22:52 +0000)
git-svn-id: http://svn.twig-project.org/trunk@75 93ef8e89-cb99-4229-a87c-7fa0fa45744b

lib/Twig/ExpressionParser.php
lib/Twig/Node/Expression/Filter.php
lib/Twig/Node/Filter.php
lib/Twig/NodeTransformer/Filter.php
lib/Twig/TokenParser/Filter.php

index fbcd1c3..5ccf16d 100644 (file)
@@ -340,16 +340,30 @@ class Twig_ExpressionParser
   public function parseFilterExpression($node)
   {
     $lineno = $this->parser->getCurrentToken()->getLine();
+
+    $this->parser->getStream()->next();
+
+    return new Twig_Node_Expression_Filter($node, $this->parseFilterExpressionRaw(), $lineno);
+  }
+
+  public function parseFilterExpressionRaw()
+  {
     $filters = array();
-    while ($this->parser->getStream()->test(Twig_Token::OPERATOR_TYPE, '|'))
+    while (true)
     {
-      $this->parser->getStream()->next();
       $token = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE);
 
       $filters[] = array($token->getValue(), $this->parseArguments());
+
+      if (!$this->parser->getStream()->test(Twig_Token::OPERATOR_TYPE, '|'))
+      {
+        break;
+      }
+
+      $this->parser->getStream()->next();
     }
 
-    return new Twig_Node_Expression_Filter($node, $filters, $lineno);
+    return $filters;
   }
 
   public function parseArguments()
index 7109d80..a89cca0 100644 (file)
@@ -99,6 +99,11 @@ class Twig_Node_Expression_Filter extends Twig_Node_Expression implements Twig_N
     $this->filters[] = $filter;
   }
 
+  public function appendFilters(array $filters)
+  {
+    $this->filters = array_merge($this->filters, $filters);
+  }
+
   public function hasFilter($name)
   {
     foreach ($this->filters as $filter)
index bbc161c..5f2686d 100644 (file)
  */
 class Twig_Node_Filter extends Twig_Node implements Twig_NodeListInterface
 {
-  protected $filter;
+  protected $filters;
   protected $body;
 
-  public function __construct($filter, Twig_NodeList $body, $lineno, $tag = null)
+  public function __construct($filters, Twig_NodeList $body, $lineno, $tag = null)
   {
     parent::__construct($lineno, $tag);
-    $this->filter = $filter;
+    $this->filters = $filters;
     $this->body  = $body;
   }
 
   public function __toString()
   {
-    return get_class($this).'('.$this->filter.')';
+    return get_class($this).'('.$this->filters.')';
   }
 
   public function getNodes()
@@ -48,8 +48,8 @@ class Twig_Node_Filter extends Twig_Node implements Twig_NodeListInterface
     $compiler->subcompile($this->body);
   }
 
-  public function getFilter()
+  public function getFilters()
   {
-    return $this->filter;
+    return $this->filters;
   }
 }
index 6a5dd8f..105456d 100644 (file)
@@ -17,7 +17,7 @@ class Twig_NodeTransformer_Filter extends Twig_NodeTransformer
     // filter?
     if ($node instanceof Twig_Node_Filter)
     {
-      $this->statusStack[] = $node->getFilter();
+      $this->statusStack[] = $node->getFilters();
 
       $node = $this->visitDeep($node);
 
@@ -31,7 +31,7 @@ class Twig_NodeTransformer_Filter extends Twig_NodeTransformer
       return $this->visitDeep($node);
     }
 
-    if (false === $filter = $this->getCurrentFilter())
+    if (false === $filters = $this->getCurrentFilters())
     {
       return $node;
     }
@@ -45,23 +45,23 @@ class Twig_NodeTransformer_Filter extends Twig_NodeTransformer
       $expression = $node->getExpression();
     }
 
-    // filter
+    // filters
     if ($expression instanceof Twig_Node_Expression_Filter)
     {
-      $expression->appendFilter(array($filter, array()));
+      $expression->appendFilters($filters);
 
       return $node;
     }
     else
     {
       return new Twig_Node_Print(
-        new Twig_Node_Expression_Filter($expression, array(array($filter, array())), $node->getLine())
+        new Twig_Node_Expression_Filter($expression, $filters, $node->getLine())
         , $node->getLine()
       );
     }
   }
 
-  protected function getCurrentFilter()
+  protected function getCurrentFilters()
   {
     return count($this->statusStack) ? $this->statusStack[count($this->statusStack) - 1] : false;
   }
index ddd7c63..536311e 100644 (file)
@@ -13,13 +13,13 @@ class Twig_TokenParser_Filter extends Twig_TokenParser
   public function parse(Twig_Token $token)
   {
     $lineno = $token->getLine();
-    $filter = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue();
+    $filters = $this->parser->getExpressionParser()->parseFilterExpressionRaw();
 
     $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
     $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
     $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
 
-    return new Twig_Node_Filter($filter, $body, $lineno, $this->getTag());
+    return new Twig_Node_Filter($filters, $body, $lineno, $this->getTag());
   }
 
   public function decideBlockEnd($token)