Project

General

Profile

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
}
(23-23/40)