function TwigNodeTrans::compileString
Same name in other branches
- 9 core/lib/Drupal/Core/Template/TwigNodeTrans.php \Drupal\Core\Template\TwigNodeTrans::compileString()
- 10 core/lib/Drupal/Core/Template/TwigNodeTrans.php \Drupal\Core\Template\TwigNodeTrans::compileString()
- 11.x core/lib/Drupal/Core/Template/TwigNodeTrans.php \Drupal\Core\Template\TwigNodeTrans::compileString()
Extracts the text and tokens for the "trans" tag.
Parameters
\Twig_Node $body: The node to compile.
Return value
array Returns an array containing the two following parameters:
- string $text The extracted text.
- array $tokens The extracted tokens as new \Twig_Node_Expression_Name instances.
1 call to TwigNodeTrans::compileString()
- TwigNodeTrans::compile in core/
lib/ Drupal/ Core/ Template/ TwigNodeTrans.php
File
-
core/
lib/ Drupal/ Core/ Template/ TwigNodeTrans.php, line 101
Class
- TwigNodeTrans
- A class that defines the Twig 'trans' tag for Drupal.
Namespace
Drupal\Core\TemplateCode
protected function compileString(\Twig_Node $body) {
if ($body instanceof \Twig_Node_Expression_Name || $body instanceof \Twig_Node_Expression_Constant || $body instanceof \Twig_Node_Expression_TempName) {
return [
$body,
[],
];
}
$tokens = [];
if (count($body)) {
$text = '';
foreach ($body as $node) {
if (get_class($node) === 'Twig_Node' && $node->getNode(0) instanceof \Twig_Node_SetTemp) {
$node = $node->getNode(1);
}
if ($node instanceof \Twig_Node_Print) {
$n = $node->getNode('expr');
while ($n instanceof \Twig_Node_Expression_Filter) {
$n = $n->getNode('node');
}
if ($n instanceof CheckToStringNode) {
$n = $n->getNode('expr');
}
$args = $n;
// Support TwigExtension->renderVar() function in chain.
if ($args instanceof \Twig_Node_Expression_Function) {
$args = $n->getNode('arguments')
->getNode(0);
}
// Detect if a token implements one of the filters reserved for
// modifying the prefix of a token. The default prefix used for
// translations is "@". This escapes the printed token and makes them
// safe for templates.
// @see TwigExtension::getFilters()
$argPrefix = '@';
while ($args instanceof \Twig_Node_Expression_Filter) {
switch ($args->getNode('filter')
->getAttribute('value')) {
case 'placeholder':
$argPrefix = '%';
break;
}
$args = $args->getNode('node');
}
if ($args instanceof CheckToStringNode) {
$args = $args->getNode('expr');
}
if ($args instanceof \Twig_Node_Expression_GetAttr) {
$argName = [];
// Reuse the incoming expression.
$expr = $args;
// Assemble a valid argument name by walking through the expression.
$argName[] = $args->getNode('attribute')
->getAttribute('value');
while ($args->hasNode('node')) {
$args = $args->getNode('node');
if ($args instanceof \Twig_Node_Expression_Name) {
$argName[] = $args->getAttribute('name');
}
else {
$argName[] = $args->getNode('attribute')
->getAttribute('value');
}
}
$argName = array_reverse($argName);
$argName = implode('.', $argName);
}
else {
$argName = $n->getAttribute('name');
if (!is_null($args)) {
$argName = $args->getAttribute('name');
}
$expr = new \Twig_Node_Expression_Name($argName, $n->getTemplateLine());
}
$placeholder = sprintf('%s%s', $argPrefix, $argName);
$text .= $placeholder;
$expr->setAttribute('placeholder', $placeholder);
$tokens[] = $expr;
}
else {
$text .= $node->getAttribute('data');
}
}
}
elseif (!$body->hasAttribute('data')) {
throw new \Twig_Error_Syntax('{% trans %} tag cannot be empty');
}
else {
$text = $body->getAttribute('data');
}
return [
new \Twig_Node([
new \Twig_Node_Expression_Constant(trim($text), $body->getTemplateLine()),
]),
$tokens,
];
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.