* bug fixes.
authorKonstantin G Romanov <senz@senz.su>
Sat, 18 Aug 2012 15:21:44 +0000 (19:21 +0400)
committerKonstantin G Romanov <konstantin.romanov@inn.ru>
Tue, 21 Aug 2012 11:13:47 +0000 (15:13 +0400)
* str_split on empty delimeter.
* tests and documentation updated.

doc/filters/split.rst
lib/Twig/Extension/Core.php
test/Twig/Tests/Fixtures/filters/split.test

index 287f823..14faf1f 100644 (file)
@@ -1,16 +1,37 @@
 ``split``
 ========
 
-The ``split`` filter returns a list of items from a string that's separated by the provided delimiter or glue:
+The ``split`` filter returns a list of items from a string that's separated by the provided delimiter:
 
 .. code-block:: jinja
 
     {{ "one,two,three"|split(',') }}
     {# returns [one, two, three] #}
 
-A limit parameter is available which the returned list will contain a maximum of limit elements with the last element containing the rest of string. 
+A limit parameter is available which the returned list will contain a maximum of limit elements with the last element containing the rest of string.
+If limit is set and positive, the returned array will contain a maximum of limit elements with the last element containing the rest of string.
+If the limit parameter is negative, all components except the last -limit are returned.
+If the limit parameter is zero, then this is treated as 1.
 
 .. code-block:: jinja
 
     {{ "one,two,three,four,five"|split(',', 3) }}
     {# returns [one, two, "three,four,five"] #}
+
+If delimiter is an empty string, then value will be splitted by equal chunks. Length is set by limit parameter (1 char by default).
+
+.. code-block:: jinja
+
+    {{ "123"|split('') }}
+    {# returns [1, 2, 3] #}
+
+    {{ "aabbcc"|split('', 2) }}
+    {# returns [aa, bb, cc] #}
+
+.. note::
+
+    Internally, Twig uses the PHP `explode`_ or `str_split`_ (if delimiter is empty) functions for string splitting.
+
+.. _`explode`: http://php.net/explode
+
+.. _`str_split`: http://php.net/str_split
index 87b3a63..fe4652d 100644 (file)
@@ -652,9 +652,11 @@ function twig_join_filter($value, $glue = '')
 }
 
 /**
- * Splits the values into an array.
+ * Splits the string into an array.
  *
  * The second parameter is option for the limit.
+ * If delimiter is an empty string, then string is split by equal chunks. Chunk length is 1 char by default, or set
+ * by limit
  *
  * <pre>
  *  {{ "one,two,three"|split(',') }}
@@ -662,25 +664,27 @@ function twig_join_filter($value, $glue = '')
  *
  *  {{ "one,two,three,four,five"|split(',', 3) }}
  *  {# returns [one, two, "three,four,five"] #}
+ *
+ *  {{ "123"|split('') }}
+ *  {# returns [1, 2, 3] #}
+ *
+ *  {{ "aabbcc"|split('', 2) }}
+ *  {# returns [aa, bb, cc] #}
  * </pre>
  *
- * @param string  $value A string
+ * @param string  $value     A string
  * @param string  $delimiter The separator to explode by
- * @param integer $limit  The limit
+ * @param integer $limit     The limit
  *
  * @return string The explode'ed string
  */
 function twig_split_filter($value, $delimiter, $limit = null)
 {
-    if (is_empty($delimiter)) {
-        throw new Twig_Error_Runtime('The string to split must be provided with a delimiter.');
-    }
-
-    if (!is_null($limit)) {
-        return explode($delimiter, $value, $limit);
+    if (empty($delimiter)) {
+        return str_split($value, null === $limit ? 1 : $limit);
     }
 
-    return explode($delimiter, $value);
+    return null === $limit ? explode($delimiter, $value) : explode($delimiter, $value, $limit);
 }
 
 // The '_default' filter is used internally to avoid using the ternary operator
index 2bdcdbf..ce8ec9c 100644 (file)
@@ -3,10 +3,16 @@
 --TEMPLATE--
 {{ "one,two,three,four,five"|split(',')|join('-') }}
 {{ foo|split(',')|join('-') }}
-{{ bar|split(',', 3)|join('-') }}
+{{ foo|split(',', 3)|join('-') }}
+{{ baz|split('')|join('-') }}
+{{ baz|split('', 2)|join('-') }}
+{{ foo|split(',', -2)|join('-') }}
 --DATA--
-return array('foo' => "one,two,three,four,five", 'bar' => "one,two,three,four,five")
+return array('foo' => "one,two,three,four,five", 'baz' => '12345',)
 --EXPECT--
 one-two-three-four-five
 one-two-three-four-five
 one-two-three,four,five
+1-2-3-4-5
+12-34-5
+one-two-three
\ No newline at end of file