4 * This file is part of Twig.
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 calls the given visitor for each.
19 * @author Fabien Potencier <fabien@symfony.com>
21 class Twig_NodeTraverser
24 protected $visitors = array();
27 * @param Twig_Environment $env
28 * @param Twig_NodeVisitorInterface[] $visitors
30 public function __construct(Twig_Environment $env, array $visitors = array())
33 foreach ($visitors as $visitor) {
34 $this->addVisitor($visitor);
38 public function addVisitor(Twig_NodeVisitorInterface $visitor)
40 if (!isset($this->visitors[$visitor->getPriority()])) {
41 $this->visitors[$visitor->getPriority()] = array();
44 $this->visitors[$visitor->getPriority()][] = $visitor;
48 * Traverses a node and calls the registered visitors.
50 * @return Twig_NodeInterface
52 public function traverse(Twig_NodeInterface $node)
54 ksort($this->visitors);
55 foreach ($this->visitors as $visitors) {
56 foreach ($visitors as $visitor) {
57 $node = $this->traverseForVisitor($visitor, $node);
64 protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null)
70 $node = $visitor->enterNode($node, $this->env);
72 foreach ($node as $k => $n) {
73 if (false !== $n = $this->traverseForVisitor($visitor, $n)) {
74 $node->setNode($k, $n);
76 $node->removeNode($k);
80 return $visitor->leaveNode($node, $this->env);