You are here

class Twig_NodeTraverser in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/twig/twig/lib/Twig/NodeTraverser.php \Twig_NodeTraverser

Twig_NodeTraverser is a node traverser.

It visits all nodes and their children and calls the given visitor for each.

@author Fabien Potencier <fabien@symfony.com>

Hierarchy

Expanded class hierarchy of Twig_NodeTraverser

File

vendor/twig/twig/lib/Twig/NodeTraverser.php, line 19

View source
class Twig_NodeTraverser {
  protected $env;
  protected $visitors = array();

  /**
   * Constructor.
   *
   * @param Twig_Environment            $env      A Twig_Environment instance
   * @param Twig_NodeVisitorInterface[] $visitors An array of Twig_NodeVisitorInterface instances
   */
  public function __construct(Twig_Environment $env, array $visitors = array()) {
    $this->env = $env;
    foreach ($visitors as $visitor) {
      $this
        ->addVisitor($visitor);
    }
  }

  /**
   * Adds a visitor.
   *
   * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance
   */
  public function addVisitor(Twig_NodeVisitorInterface $visitor) {
    if (!isset($this->visitors[$visitor
      ->getPriority()])) {
      $this->visitors[$visitor
        ->getPriority()] = array();
    }
    $this->visitors[$visitor
      ->getPriority()][] = $visitor;
  }

  /**
   * Traverses a node and calls the registered visitors.
   *
   * @param Twig_NodeInterface $node A Twig_NodeInterface instance
   *
   * @return Twig_NodeInterface
   */
  public function traverse(Twig_NodeInterface $node) {
    ksort($this->visitors);
    foreach ($this->visitors as $visitors) {
      foreach ($visitors as $visitor) {
        $node = $this
          ->traverseForVisitor($visitor, $node);
      }
    }
    return $node;
  }
  protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null) {
    if (null === $node) {
      return;
    }
    $node = $visitor
      ->enterNode($node, $this->env);
    foreach ($node as $k => $n) {
      if (false !== ($n = $this
        ->traverseForVisitor($visitor, $n))) {
        $node
          ->setNode($k, $n);
      }
      else {
        $node
          ->removeNode($k);
      }
    }
    return $visitor
      ->leaveNode($node, $this->env);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
Twig_NodeTraverser::$env protected property
Twig_NodeTraverser::$visitors protected property
Twig_NodeTraverser::addVisitor public function Adds a visitor.
Twig_NodeTraverser::traverse public function Traverses a node and calls the registered visitors.
Twig_NodeTraverser::traverseForVisitor protected function
Twig_NodeTraverser::__construct public function Constructor.