Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
CRAP | |
93.75% |
15 / 16 |
TwigNodeVisitor | |
0.00% |
0 / 1 |
|
66.67% |
2 / 3 |
8.02 | |
93.75% |
15 / 16 |
doEnterNode | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
doLeaveNode | |
0.00% |
0 / 1 |
6.01 | |
92.86% |
13 / 14 |
|||
getPriority | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Template\TwigNodeVisitor. | |
*/ | |
namespace Drupal\Core\Template; | |
/** | |
* Provides a Twig_NodeVisitor to change the generated parse-tree. | |
* | |
* This is used to ensure that everything printed is wrapped via the | |
* TwigExtension->renderVar() function in order to just write {{ content }} | |
* in templates instead of having to write {{ render_var(content) }}. | |
* | |
* @see twig_render | |
*/ | |
class TwigNodeVisitor extends \Twig_BaseNodeVisitor { | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function doEnterNode(\Twig_Node $node, \Twig_Environment $env) { | |
return $node; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
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 | |
); | |
} | |
// Change the 'escape' filter to our own 'drupal_escape' filter. | |
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 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; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getPriority() { | |
// Just above the Optimizer, which is the normal last one. | |
return 256; | |
} | |
} |