Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
CRAP | |
100.00% |
1 / 1 |
TwigTransTokenParser | |
100.00% |
1 / 1 |
|
100.00% |
5 / 5 |
19 | |
100.00% |
1 / 1 |
parse | |
100.00% |
1 / 1 |
7 | |
100.00% |
0 / 0 |
|||
decideForFork | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
decideForEnd | |
100.00% |
1 / 1 |
1 | |
100.00% |
0 / 0 |
|||
getTag | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
checkTransString | |
100.00% |
1 / 1 |
9 | |
100.00% |
0 / 0 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\Core\Template\TwigTransTokenParser. | |
* | |
* @see http://twig.sensiolabs.org/doc/extensions/i18n.html | |
* @see https://github.com/fabpot/Twig-extensions | |
*/ | |
namespace Drupal\Core\Template; | |
/** | |
* A class that defines the Twig 'trans' token parser for Drupal. | |
* | |
* The token parser converts a token stream created from template source | |
* code into an Abstract Syntax Tree (AST). The AST will later be compiled | |
* into PHP code usable for runtime execution of the template. | |
* | |
* @see \Twig_TokenParser | |
*/ | |
class TwigTransTokenParser extends \Twig_TokenParser { | |
/** | |
* {@inheritdoc} | |
*/ | |
public function parse(\Twig_Token $token) { | |
$lineno = $token->getLine(); | |
$stream = $this->parser->getStream(); | |
$body = NULL; | |
$options = NULL; | |
$count = NULL; | |
$plural = NULL; | |
if (!$stream->test(\Twig_Token::BLOCK_END_TYPE) && $stream->test(\Twig_Token::STRING_TYPE)) { | |
$body = $this->parser->getExpressionParser()->parseExpression(); | |
} | |
if (!$stream->test(\Twig_Token::BLOCK_END_TYPE) && $stream->test(\Twig_Token::NAME_TYPE, 'with')) { | |
$stream->next(); | |
$options = $this->parser->getExpressionParser()->parseExpression(); | |
} | |
if (!$body) { | |
$stream->expect(\Twig_Token::BLOCK_END_TYPE); | |
$body = $this->parser->subparse(array($this, 'decideForFork')); | |
if ('plural' === $stream->next()->getValue()) { | |
$count = $this->parser->getExpressionParser()->parseExpression(); | |
$stream->expect(\Twig_Token::BLOCK_END_TYPE); | |
$plural = $this->parser->subparse(array($this, 'decideForEnd'), TRUE); | |
} | |
} | |
$stream->expect(\Twig_Token::BLOCK_END_TYPE); | |
$this->checkTransString($body, $lineno); | |
$node = new TwigNodeTrans($body, $plural, $count, $options, $lineno, $this->getTag()); | |
return $node; | |
} | |
/** | |
* Detect a 'plural' switch or the end of a 'trans' tag. | |
*/ | |
public function decideForFork($token) { | |
return $token->test(array('plural', 'endtrans')); | |
} | |
/** | |
* Detect the end of a 'trans' tag. | |
*/ | |
public function decideForEnd($token) { | |
return $token->test('endtrans'); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getTag() { | |
return 'trans'; | |
} | |
/** | |
* Ensure that any nodes that are parsed are only of allowed types. | |
* | |
* @param \Twig_Node $body | |
* The expression to check. | |
* @param int $lineno | |
* The source line. | |
* | |
* @throws \Twig_Error_Syntax | |
*/ | |
protected function checkTransString(\Twig_Node $body, $lineno) { | |
foreach ($body as $node) { | |
if ( | |
$node instanceof \Twig_Node_Text | |
|| | |
($node instanceof \Twig_Node_Print && $node->getNode('expr') instanceof \Twig_Node_Expression_Name) | |
|| | |
($node instanceof \Twig_Node_Print && $node->getNode('expr') instanceof \Twig_Node_Expression_GetAttr) | |
|| | |
($node instanceof \Twig_Node_Print && $node->getNode('expr') instanceof \Twig_Node_Expression_Filter) | |
) { | |
continue; | |
} | |
throw new \Twig_Error_Syntax(sprintf('The text to be translated with "trans" can only contain references to simple variables'), $lineno); | |
} | |
} | |
} |