mirror of
https://github.com/twigphp/Twig.git
synced 2026-09-10 09:26:29 +00:00
fixed regression in string parsing (closes #580)
This commit is contained in:
@@ -170,23 +170,25 @@ class Twig_ExpressionParser
|
||||
$stream = $this->parser->getStream();
|
||||
|
||||
$nodes = array();
|
||||
|
||||
// a string cannot be followed by another string in a single expression
|
||||
$nextCanBeString = true;
|
||||
while (true) {
|
||||
if ($stream->test(Twig_Token::STRING_TYPE)) {
|
||||
if ($stream->test(Twig_Token::STRING_TYPE) && $nextCanBeString) {
|
||||
$token = $stream->next();
|
||||
$nodes[] = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
|
||||
} else if ($stream->test(Twig_Token::INTERPOLATION_START_TYPE)) {
|
||||
$nextCanBeString = false;
|
||||
} elseif ($stream->test(Twig_Token::INTERPOLATION_START_TYPE)) {
|
||||
$stream->next();
|
||||
$nodes[] = $this->parseExpression();
|
||||
$stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
|
||||
$nextCanBeString = true;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$expr = array_shift($nodes);
|
||||
|
||||
foreach($nodes as $node) {
|
||||
foreach ($nodes as $node) {
|
||||
$expr = new Twig_Node_Expression_Binary_Concat($expr, $node, $node->getLine());
|
||||
}
|
||||
|
||||
|
||||
@@ -144,6 +144,18 @@ class Twig_Tests_ExpressionParserTest extends PHPUnit_Framework_TestCase
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException Twig_Error_Syntax
|
||||
*/
|
||||
public function testStringExpressionDoesNotConcatenateTwoConsecutiveStrings()
|
||||
{
|
||||
$env = new Twig_Environment(new Twig_Loader_String(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0));
|
||||
$stream = $env->tokenize('{{ "a" "b" }}', 'index');
|
||||
$parser = new Twig_Parser($env);
|
||||
|
||||
$parser->parse($stream);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider getTestsForString
|
||||
*/
|
||||
|
||||
@@ -2,7 +2,9 @@
|
||||
Twig supports string interpolation
|
||||
--TEMPLATE--
|
||||
{{ "foo #{"foo #{bar} baz"} baz" }}
|
||||
{{ "foo #{bar}#{bar} baz" }}
|
||||
--DATA--
|
||||
return array('bar' => 'BAR');
|
||||
--EXPECT--
|
||||
foo foo BAR baz baz
|
||||
foo BARBAR baz
|
||||
|
||||
Reference in New Issue
Block a user