From 22a572315912267772fb18620e50b961adc2f765 Mon Sep 17 00:00:00 2001 From: fabien Date: Sun, 18 Oct 2009 22:52:37 +0000 Subject: [PATCH] changed the filter tag to allow chained filters git-svn-id: http://svn.twig-project.org/trunk@75 93ef8e89-cb99-4229-a87c-7fa0fa45744b --- lib/Twig/ExpressionParser.php | 20 +++++++++++++++++--- lib/Twig/Node/Expression/Filter.php | 5 +++++ lib/Twig/Node/Filter.php | 12 ++++++------ lib/Twig/NodeTransformer/Filter.php | 12 ++++++------ lib/Twig/TokenParser/Filter.php | 4 ++-- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/lib/Twig/ExpressionParser.php b/lib/Twig/ExpressionParser.php index fbcd1c3..5ccf16d 100644 --- a/lib/Twig/ExpressionParser.php +++ b/lib/Twig/ExpressionParser.php @@ -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() diff --git a/lib/Twig/Node/Expression/Filter.php b/lib/Twig/Node/Expression/Filter.php index 7109d80..a89cca0 100644 --- a/lib/Twig/Node/Expression/Filter.php +++ b/lib/Twig/Node/Expression/Filter.php @@ -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) diff --git a/lib/Twig/Node/Filter.php b/lib/Twig/Node/Filter.php index bbc161c..5f2686d 100644 --- a/lib/Twig/Node/Filter.php +++ b/lib/Twig/Node/Filter.php @@ -18,19 +18,19 @@ */ 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; } } diff --git a/lib/Twig/NodeTransformer/Filter.php b/lib/Twig/NodeTransformer/Filter.php index 6a5dd8f..105456d 100644 --- a/lib/Twig/NodeTransformer/Filter.php +++ b/lib/Twig/NodeTransformer/Filter.php @@ -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; } diff --git a/lib/Twig/TokenParser/Filter.php b/lib/Twig/TokenParser/Filter.php index ddd7c63..536311e 100644 --- a/lib/Twig/TokenParser/Filter.php +++ b/lib/Twig/TokenParser/Filter.php @@ -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) -- 1.7.2.5