Mercurial > hg > isophonics-drupal-site
diff core/lib/Drupal/Core/Template/TwigTransTokenParser.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/lib/Drupal/Core/Template/TwigTransTokenParser.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,103 @@ +<?php + +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 + * @see http://twig.sensiolabs.org/doc/extensions/i18n.html + * @see https://github.com/fabpot/Twig-extensions + */ +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([$this, 'decideForFork']); + if ('plural' === $stream->next()->getValue()) { + $count = $this->parser->getExpressionParser()->parseExpression(); + $stream->expect(\Twig_Token::BLOCK_END_TYPE); + $plural = $this->parser->subparse([$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(['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); + } + } + +}