787629ce3449cc25d54ceaa33557ea56d12a8b0c
[yaffs-website] / vendor / twig / twig / lib / Twig / NodeTraverser.php
1 <?php
2
3 /*
4  * This file is part of Twig.
5  *
6  * (c) Fabien Potencier
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 /**
13  * Twig_NodeTraverser is a node traverser.
14  *
15  * It visits all nodes and their children and calls the given visitor for each.
16  *
17  * @final
18  *
19  * @author Fabien Potencier <fabien@symfony.com>
20  */
21 class Twig_NodeTraverser
22 {
23     protected $env;
24     protected $visitors = array();
25
26     /**
27      * @param Twig_Environment            $env
28      * @param Twig_NodeVisitorInterface[] $visitors
29      */
30     public function __construct(Twig_Environment $env, array $visitors = array())
31     {
32         $this->env = $env;
33         foreach ($visitors as $visitor) {
34             $this->addVisitor($visitor);
35         }
36     }
37
38     public function addVisitor(Twig_NodeVisitorInterface $visitor)
39     {
40         if (!isset($this->visitors[$visitor->getPriority()])) {
41             $this->visitors[$visitor->getPriority()] = array();
42         }
43
44         $this->visitors[$visitor->getPriority()][] = $visitor;
45     }
46
47     /**
48      * Traverses a node and calls the registered visitors.
49      *
50      * @return Twig_NodeInterface
51      */
52     public function traverse(Twig_NodeInterface $node)
53     {
54         ksort($this->visitors);
55         foreach ($this->visitors as $visitors) {
56             foreach ($visitors as $visitor) {
57                 $node = $this->traverseForVisitor($visitor, $node);
58             }
59         }
60
61         return $node;
62     }
63
64     protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null)
65     {
66         if (null === $node) {
67             return;
68         }
69
70         $node = $visitor->enterNode($node, $this->env);
71
72         foreach ($node as $k => $n) {
73             if (false !== $n = $this->traverseForVisitor($visitor, $n)) {
74                 $node->setNode($k, $n);
75             } else {
76                 $node->removeNode($k);
77             }
78         }
79
80         return $visitor->leaveNode($node, $this->env);
81     }
82 }
83
84 class_alias('Twig_NodeTraverser', 'Twig\NodeTraverser', false);