mirror of
https://github.com/twigphp/Twig.git
synced 2026-09-15 11:56:50 +00:00
bug #1535 fixed negative number lexing (fabpot)
This PR was merged into the 1.16-dev branch.
Discussion
----------
fixed negative number lexing
Fixes #1368 and #1322.
I don't see it breaking BC as relying on the current way seems weird to me.
Commits
-------
bf541bf fixed negative number lexing
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
* 1.16.2 (2014-XX-XX)
|
||||
|
||||
* fixed lexing of negative numbers
|
||||
* fixed 2-words test names when a custom node class is not used
|
||||
* fixed macros when using an argument named like a PHP super global (like GET or POST)
|
||||
* fixed date_modify when working with DateTimeImmutable
|
||||
|
||||
+11
-11
@@ -40,7 +40,7 @@ class Twig_Lexer implements Twig_LexerInterface
|
||||
const STATE_INTERPOLATION = 4;
|
||||
|
||||
const REGEX_NAME = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A';
|
||||
const REGEX_NUMBER = '/[0-9]+(?:\.[0-9]+)?/A';
|
||||
const REGEX_NUMBER = '/\-?[0-9]+(?:\.[0-9]+)?/A';
|
||||
const REGEX_STRING = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
|
||||
const REGEX_DQ_STRING_DELIM = '/"/A';
|
||||
const REGEX_DQ_STRING_PART = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As';
|
||||
@@ -228,8 +228,17 @@ class Twig_Lexer implements Twig_LexerInterface
|
||||
}
|
||||
}
|
||||
|
||||
// numbers
|
||||
if (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) {
|
||||
$number = (float) $match[0]; // floats
|
||||
if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
|
||||
$number = (int) $match[0]; // integers lower than the maximum
|
||||
}
|
||||
$this->pushToken(Twig_Token::NUMBER_TYPE, $number);
|
||||
$this->moveCursor($match[0]);
|
||||
}
|
||||
// operators
|
||||
if (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) {
|
||||
elseif (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) {
|
||||
$this->pushToken(Twig_Token::OPERATOR_TYPE, preg_replace('/\s+/', ' ', $match[0]));
|
||||
$this->moveCursor($match[0]);
|
||||
}
|
||||
@@ -238,15 +247,6 @@ class Twig_Lexer implements Twig_LexerInterface
|
||||
$this->pushToken(Twig_Token::NAME_TYPE, $match[0]);
|
||||
$this->moveCursor($match[0]);
|
||||
}
|
||||
// numbers
|
||||
elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) {
|
||||
$number = (float) $match[0]; // floats
|
||||
if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
|
||||
$number = (int) $match[0]; // integers lower than the maximum
|
||||
}
|
||||
$this->pushToken(Twig_Token::NUMBER_TYPE, $number);
|
||||
$this->moveCursor($match[0]);
|
||||
}
|
||||
// punctuation
|
||||
elseif (false !== strpos(self::PUNCTUATION, $this->code[$this->cursor])) {
|
||||
// opening bracket
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
--TEST--
|
||||
Twig manages negative numbers correctly
|
||||
--TEMPLATE--
|
||||
{% import _self as macros %}
|
||||
{{ macros.negative_number1() }}
|
||||
{{ macros.negative_number2() }}
|
||||
{% macro negative_number1(nb=-1) %}{{ nb }}{% endmacro %}
|
||||
{% macro negative_number2(nb = -1) %}{{ nb }}{% endmacro %}
|
||||
--DATA--
|
||||
return array()
|
||||
--EXPECT--
|
||||
-1
|
||||
-1
|
||||
@@ -260,6 +260,23 @@ class Twig_Tests_LexerTest extends PHPUnit_Framework_TestCase
|
||||
$stream->expect(Twig_Token::OPERATOR_TYPE, 'and');
|
||||
}
|
||||
|
||||
public function testNegativeNumbers()
|
||||
{
|
||||
$template = "{{ -3 }}{{ 1 - 2 }}";
|
||||
|
||||
$lexer = new Twig_Lexer(new Twig_Environment());
|
||||
$stream = $lexer->tokenize($template);
|
||||
$stream->expect(Twig_Token::VAR_START_TYPE);
|
||||
$stream->expect(Twig_Token::NUMBER_TYPE, -3);
|
||||
$stream->expect(Twig_Token::VAR_END_TYPE);
|
||||
|
||||
$stream->expect(Twig_Token::VAR_START_TYPE);
|
||||
$stream->expect(Twig_Token::NUMBER_TYPE, 1);
|
||||
$stream->expect(Twig_Token::OPERATOR_TYPE, '-');
|
||||
$stream->expect(Twig_Token::NUMBER_TYPE, 2);
|
||||
$stream->expect(Twig_Token::VAR_END_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException Twig_Error_Syntax
|
||||
* @expectedExceptionMessage Unclosed "variable" at line 3
|
||||
|
||||
Reference in New Issue
Block a user