added support for {{ some_string[:2] }} (closes #952)
authorFabien Potencier <fabien.potencier@gmail.com>
Tue, 8 Jan 2013 14:19:16 +0000 (15:19 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Tue, 8 Jan 2013 14:19:19 +0000 (15:19 +0100)
CHANGELOG
doc/filters/slice.rst
lib/Twig/ExpressionParser.php
test/Twig/Tests/Fixtures/filters/slice.test

index cc1a820..3cf9005 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,6 @@
 * 1.12.1 (2012-XX-XX)
 
- * n/a
+ * added support for {{ some_string[:2] }}
 
 * 1.12.0 (2012-01-08)
 
index 0205771..7a9ada0 100644 (file)
@@ -34,6 +34,12 @@ As syntactic sugar, you can also use the ``[]`` notation:
 
     {{ '1234'[1:2] }}
 
+    {# you can omit the first argument -- which is the same as 0 #}
+    {{ '1234'[:2] }} {# will display "12" #}
+
+    {# you can omit the last argument -- which will select everything till the end #}
+    {{ '1234'[2:] }} {# will display "34 #}
+
 The ``slice`` filter works as the `array_slice`_ PHP function for arrays and
 `substr`_ for strings.
 
index a330246..7b9114a 100644 (file)
@@ -379,12 +379,21 @@ class Twig_ExpressionParser
         } else {
             $type = Twig_TemplateInterface::ARRAY_CALL;
 
-            $arg = $this->parseExpression();
-
             // slice?
+            $slice = false;
+            if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
+                $slice = true;
+                $arg = new Twig_Node_Expression_Constant(0, $token->getLine());
+            } else {
+                $arg = $this->parseExpression();
+            }
+
             if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
+                $slice = true;
                 $stream->next();
+            }
 
+            if ($slice) {
                 if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
                     $length = new Twig_Node_Expression_Constant(null, $token->getLine());
                 } else {
index bb32dfb..b37ad65 100644 (file)
@@ -18,6 +18,7 @@
 {{ [1, 2, 3, 4][1:]|join('') }}
 {{ '1234'|slice(1) }}
 {{ '1234'[1:] }}
+{{ '1234'[:1] }}
 --DATA--
 return array('start' => 1, 'length' => 2, 'arr' => new ArrayObject(array(1, 2, 3, 4)))
 --EXPECT--
@@ -38,3 +39,4 @@ bc
 234
 234
 234
+1