4 * This file is part of Twig.
6 * (c) 2009 Fabien Potencier
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
13 * Twig_NodeTraverser is a node traverser.
15 * It visits all nodes and their children and call the given visitor for each.
17 * @author Fabien Potencier <fabien@symfony.com>
19 class Twig_NodeTraverser
27 * @param Twig_Environment $env A Twig_Environment instance
28 * @param array $visitors An array of Twig_NodeVisitorInterface instances
30 public function __construct(Twig_Environment
$env, array $visitors = array())
33 $this->visitors
= array();
34 foreach ($visitors as $visitor) {
35 $this->addVisitor($visitor);
42 * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance
44 public function addVisitor(Twig_NodeVisitorInterface
$visitor)
46 if (!isset($this->visitors
[$visitor->getPriority()])) {
47 $this->visitors
[$visitor->getPriority()] = array();
50 $this->visitors
[$visitor->getPriority()][] = $visitor;
54 * Traverses a node and calls the registered visitors.
56 * @param Twig_NodeInterface $node A Twig_NodeInterface instance
58 public function traverse(Twig_NodeInterface
$node)
60 ksort($this->visitors
);
61 foreach ($this->visitors
as $visitors) {
62 foreach ($visitors as $visitor) {
63 $node = $this->traverseForVisitor($visitor, $node);
70 protected function traverseForVisitor(Twig_NodeVisitorInterface
$visitor, Twig_NodeInterface
$node = null)
76 $node = $visitor->enterNode($node, $this->env
);
78 foreach ($node as $k => $n) {
79 if (false !== $n = $this->traverseForVisitor($visitor, $n)) {
80 $node->setNode($k, $n);
82 $node->removeNode($k);
86 return $visitor->leaveNode($node, $this->env
);