From 5ec19550b24c2626971337dcdbd5ac33a5de07ad Mon Sep 17 00:00:00 2001 From: Arnaud Le Blanc Date: Sun, 5 Jun 2011 19:38:12 +0200 Subject: [PATCH] added {% line \d+ %} directive --- lib/Twig/Lexer.php | 5 +++++ test/Twig/Tests/LexerTest.php | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 0 deletions(-) diff --git a/lib/Twig/Lexer.php b/lib/Twig/Lexer.php index 26aea29..485de15 100644 --- a/lib/Twig/Lexer.php +++ b/lib/Twig/Lexer.php @@ -162,6 +162,11 @@ class Twig_Lexer implements Twig_LexerInterface $this->moveCursor($match[0]); $this->lexRawData(); $this->state = self::STATE_DATA; + // {% line \d+ %} + } else if (preg_match('/\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '/').'/As', $this->code, $match, null, $this->cursor)) { + $this->moveCursor($match[0]); + $this->lineno = (int) $match[1]; + $this->state = self::STATE_DATA; } else { $this->pushToken(Twig_Token::BLOCK_START_TYPE); $this->state = self::STATE_BLOCK; diff --git a/test/Twig/Tests/LexerTest.php b/test/Twig/Tests/LexerTest.php index f589712..ac6472a 100644 --- a/test/Twig/Tests/LexerTest.php +++ b/test/Twig/Tests/LexerTest.php @@ -36,4 +36,44 @@ class Twig_Tests_LexerTest extends PHPUnit_Framework_TestCase return $count; } + + public function testLineDirective() + { + $template = "foo\n" + . "bar\n" + . "{% line 10 %}\n" + . "{{\n" + . "baz\n" + . "}}\n"; + + $lexer = new Twig_Lexer(new Twig_Environment()); + $stream = $lexer->tokenize($template); + + // foo\nbar\n + $this->assertSame(1, $stream->expect(Twig_Token::TEXT_TYPE)->getLine()); + // \n (after {% line %}) + $this->assertSame(10, $stream->expect(Twig_Token::TEXT_TYPE)->getLine()); + // {{ + $this->assertSame(11, $stream->expect(Twig_Token::VAR_START_TYPE)->getLine()); + // baz + $this->assertSame(12, $stream->expect(Twig_Token::NAME_TYPE)->getLine()); + } + + public function testLineDirectiveInline() + { + $template = "foo\n" + . "bar{% line 10 %}{{\n" + . "baz\n" + . "}}\n"; + + $lexer = new Twig_Lexer(new Twig_Environment()); + $stream = $lexer->tokenize($template); + + // foo\nbar + $this->assertSame(1, $stream->expect(Twig_Token::TEXT_TYPE)->getLine()); + // {{ + $this->assertSame(10, $stream->expect(Twig_Token::VAR_START_TYPE)->getLine()); + // baz + $this->assertSame(11, $stream->expect(Twig_Token::NAME_TYPE)->getLine()); + } } -- 1.7.2.5