You are here

protected function TwigNodeVisitor::doLeaveNode in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 core/lib/Drupal/Core/Template/TwigNodeVisitor.php \Drupal\Core\Template\TwigNodeVisitor::doLeaveNode()

File

core/lib/Drupal/Core/Template/TwigNodeVisitor.php, line 31
Contains \Drupal\Core\Template\TwigNodeVisitor.

Class

TwigNodeVisitor
Provides a Twig_NodeVisitor to change the generated parse-tree.

Namespace

Drupal\Core\Template

Code

protected function doLeaveNode(\Twig_Node $node, \Twig_Environment $env) {

  // We use this to inject a call to render_var -> TwigExtension->renderVar()
  // before anything is printed.
  if ($node instanceof \Twig_Node_Print) {
    if (!empty($this->skipRenderVarFunction)) {

      // No need to add the callback, we have escape active already.
      unset($this->skipRenderVarFunction);
      return $node;
    }
    $class = get_class($node);
    $line = $node
      ->getLine();
    return new $class(new \Twig_Node_Expression_Function('render_var', new \Twig_Node(array(
      $node
        ->getNode('expr'),
    )), $line), $line);
  }
  else {
    if ($node instanceof \Twig_Node_Expression_Filter) {
      $name = $node
        ->getNode('filter')
        ->getAttribute('value');
      if ('escape' == $name || 'e' == $name) {

        // Use our own escape filter that is SafeMarkup aware.
        $node
          ->getNode('filter')
          ->setAttribute('value', 'drupal_escape');

        // Store that we have a filter active already that knows how to deal with render arrays.
        $this->skipRenderVarFunction = TRUE;
      }
    }
  }
  return $node;
}