|
@@ -0,0 +1,86 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace Symfony\Bundle\TwigBundle\TokenParser;
|
|
|
+
|
|
|
+use Symfony\Bundle\TwigBundle\Node\TransNode;
|
|
|
+
|
|
|
+/*
|
|
|
+ * This file is part of the Symfony package.
|
|
|
+ *
|
|
|
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
+ *
|
|
|
+ * For the full copyright and license information, please view the LICENSE
|
|
|
+ * file that was distributed with this source code.
|
|
|
+ */
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
|
+ */
|
|
|
+class TransTokenParser extends \Twig_TokenParser
|
|
|
+{
|
|
|
+ /**
|
|
|
+ * Parses a token and returns a node.
|
|
|
+ *
|
|
|
+ * @param \Twig_Token $token A Twig_Token instance
|
|
|
+ *
|
|
|
+ * @return \Twig_NodeInterface A Twig_NodeInterface instance
|
|
|
+ */
|
|
|
+ public function parse(\Twig_Token $token)
|
|
|
+ {
|
|
|
+ $lineno = $token->getLine();
|
|
|
+ $stream = $this->parser->getStream();
|
|
|
+
|
|
|
+ $domain = new \Twig_Node_Expression_Constant('messages', $lineno);
|
|
|
+ if (!$stream->test(\Twig_Token::BLOCK_END_TYPE)) {
|
|
|
+ if (!$stream->test('from')) {
|
|
|
+ $body = $this->parser->getExpressionParser()->parseExpression();
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($stream->test('from')) {
|
|
|
+ $stream->next();
|
|
|
+ $domain = $this->parser->getExpressionParser()->parseExpression();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ $stream->expect(\Twig_Token::BLOCK_END_TYPE);
|
|
|
+ $body = $this->parser->subparse(array($this, 'decideTransFork'));
|
|
|
+ }
|
|
|
+
|
|
|
+ $stream->expect(\Twig_Token::BLOCK_END_TYPE);
|
|
|
+
|
|
|
+ $this->checkTransString($body, $lineno);
|
|
|
+
|
|
|
+ return new TransNode($body, $domain, null, $lineno, $this->getTag());
|
|
|
+ }
|
|
|
+
|
|
|
+ public function decideTransFork($token)
|
|
|
+ {
|
|
|
+ return $token->test(array('endtrans'));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Gets the tag name associated with this token parser.
|
|
|
+ *
|
|
|
+ * @param string The tag name
|
|
|
+ */
|
|
|
+ public function getTag()
|
|
|
+ {
|
|
|
+ return 'trans';
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function checkTransString(\Twig_NodeInterface $body, $lineno)
|
|
|
+ {
|
|
|
+ foreach ($body as $i => $node) {
|
|
|
+ if (
|
|
|
+ $node instanceof \Twig_Node_Text
|
|
|
+ ||
|
|
|
+ ($node instanceof \Twig_Node_Print && $node->expr instanceof \Twig_Node_Expression_Name)
|
|
|
+ ) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw new \Twig_SyntaxError(sprintf('The text to be translated with "trans" can only contain references to simple variables'), $lineno);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|