]>
Commit | Line | Data |
---|---|---|
a4565e88 NL |
1 | <?php |
2 | ||
3 | /* | |
4 | * This file is part of Twig. | |
5 | * | |
6 | * (c) 2009 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 call the given visitor for each. | |
16 | * | |
17 | * @author Fabien Potencier <fabien@symfony.com> | |
18 | */ | |
19 | class Twig_NodeTraverser | |
20 | { | |
21 | protected $env; | |
22 | protected $visitors; | |
23 | ||
24 | /** | |
25 | * Constructor. | |
26 | * | |
27 | * @param Twig_Environment $env A Twig_Environment instance | |
28 | * @param array $visitors An array of Twig_NodeVisitorInterface instances | |
29 | */ | |
30 | public function __construct(Twig_Environment $env, array $visitors = array()) | |
31 | { | |
32 | $this->env = $env; | |
33 | $this->visitors = array(); | |
34 | foreach ($visitors as $visitor) { | |
35 | $this->addVisitor($visitor); | |
36 | } | |
37 | } | |
38 | ||
39 | /** | |
40 | * Adds a visitor. | |
41 | * | |
42 | * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance | |
43 | */ | |
44 | public function addVisitor(Twig_NodeVisitorInterface $visitor) | |
45 | { | |
46 | if (!isset($this->visitors[$visitor->getPriority()])) { | |
47 | $this->visitors[$visitor->getPriority()] = array(); | |
48 | } | |
49 | ||
50 | $this->visitors[$visitor->getPriority()][] = $visitor; | |
51 | } | |
52 | ||
53 | /** | |
54 | * Traverses a node and calls the registered visitors. | |
55 | * | |
56 | * @param Twig_NodeInterface $node A Twig_NodeInterface instance | |
57 | */ | |
58 | public function traverse(Twig_NodeInterface $node) | |
59 | { | |
60 | ksort($this->visitors); | |
61 | foreach ($this->visitors as $visitors) { | |
62 | foreach ($visitors as $visitor) { | |
63 | $node = $this->traverseForVisitor($visitor, $node); | |
64 | } | |
65 | } | |
66 | ||
67 | return $node; | |
68 | } | |
69 | ||
70 | protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null) | |
71 | { | |
72 | if (null === $node) { | |
73 | return null; | |
74 | } | |
75 | ||
76 | $node = $visitor->enterNode($node, $this->env); | |
77 | ||
78 | foreach ($node as $k => $n) { | |
79 | if (false !== $n = $this->traverseForVisitor($visitor, $n)) { | |
80 | $node->setNode($k, $n); | |
81 | } else { | |
82 | $node->removeNode($k); | |
83 | } | |
84 | } | |
85 | ||
86 | return $visitor->leaveNode($node, $this->env); | |
87 | } | |
88 | } |