added {% line \d+ %} directive
authorArnaud Le Blanc <arnaud.lb@gmail.com>
Sun, 5 Jun 2011 17:38:12 +0000 (19:38 +0200)
committerArnaud Le Blanc <arnaud.lb@gmail.com>
Sun, 5 Jun 2011 17:38:12 +0000 (19:38 +0200)
lib/Twig/Lexer.php
test/Twig/Tests/LexerTest.php

index 26aea29..485de15 100644 (file)
@@ -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;
index f589712..ac6472a 100644 (file)
@@ -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());
+    }
 }