function TwigNodeVisitor::doLeaveNode

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

File

core/lib/Drupal/Core/Template/TwigNodeVisitor.php, line 26

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->getTemplateLine();
        return new $class(new \Twig_Node_Expression_Function('render_var', new \Twig_Node([
            $node->getNode('expr'),
        ]), $line), $line);
    }
    elseif ($node instanceof \Twig_Node_Expression_Filter) {
        $name = $node->getNode('filter')
            ->getAttribute('value');
        if ('escape' == $name || 'e' == $name) {
            // Use our own escape filter that is MarkupInterface 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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.