Fix MB characters handling in split
author1emming <megatron001@gmail.com>
Fri, 3 Oct 2014 09:25:38 +0000 (11:25 +0200)
committerFabien Potencier <fabien.potencier@gmail.com>
Fri, 10 Oct 2014 23:33:34 +0000 (01:33 +0200)
lib/Twig/Extension/Core.php
test/Twig/Tests/Fixtures/filters/split.test
test/Twig/Tests/Fixtures/filters/split_utf8.test [new file with mode: 0644]

index 761d737..539bb0c 100644 (file)
@@ -173,7 +173,7 @@ class Twig_Extension_Core extends Twig_Extension
 
             // array helpers
             new Twig_SimpleFilter('join', 'twig_join_filter'),
-            new Twig_SimpleFilter('split', 'twig_split_filter'),
+            new Twig_SimpleFilter('split', 'twig_split_filter', array('needs_environment' => true)),
             new Twig_SimpleFilter('sort', 'twig_sort_filter'),
             new Twig_SimpleFilter('merge', 'twig_array_merge'),
             new Twig_SimpleFilter('batch', 'twig_array_batch'),
@@ -796,9 +796,27 @@ function twig_join_filter($value, $glue = '')
  *
  * @return array The split string as an array
  */
-function twig_split_filter($value, $delimiter, $limit = null)
+function twig_split_filter(Twig_Environment $env, $value, $delimiter, $limit = null)
 {
     if (empty($delimiter)) {
+        if (function_exists('mb_get_info') && null !== $charset = $env->getCharset()) {
+            if ($limit > 1) {
+                $length = mb_strlen($value, $charset);
+                if ($length < $limit) {
+                    return array($value);
+                }
+
+                $r = array();
+                for ($i = 0; $i < $length; $i += $limit) {
+                    $r[] = mb_substr($value, $i, $limit, $charset);
+                }
+
+                return $r;
+            }
+
+            return preg_split('/(?<!^)(?!$)/u', $value);
+        }
+
         return str_split($value, null === $limit ? 1 : $limit);
     }
 
index ce8ec9c..a093ed7 100644 (file)
@@ -5,6 +5,7 @@
 {{ foo|split(',')|join('-') }}
 {{ foo|split(',', 3)|join('-') }}
 {{ baz|split('')|join('-') }}
+{{ baz|split('', 1)|join('-') }}
 {{ baz|split('', 2)|join('-') }}
 {{ foo|split(',', -2)|join('-') }}
 --DATA--
@@ -14,5 +15,6 @@ one-two-three-four-five
 one-two-three-four-five
 one-two-three,four,five
 1-2-3-4-5
+1-2-3-4-5
 12-34-5
 one-two-three
\ No newline at end of file
diff --git a/test/Twig/Tests/Fixtures/filters/split_utf8.test b/test/Twig/Tests/Fixtures/filters/split_utf8.test
new file mode 100644 (file)
index 0000000..305e162
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+"split" filter
+--CONDITION--
+function_exists('mb_get_info')
+--TEMPLATE--
+{{ "é"|split('', 10)|join('-') }}
+{{ foo|split(',')|join('-') }}
+{{ foo|split(',', 1)|join('-') }}
+{{ foo|split(',', 2)|join('-') }}
+{{ foo|split(',', 3)|join('-') }}
+{{ baz|split('')|join('-') }}
+{{ baz|split('', 1)|join('-') }}
+{{ baz|split('', 2)|join('-') }}
+--DATA--
+return array('foo' => 'Ä,é,Äほ', 'baz' => 'éÄßごa',)
+--EXPECT--
+Ä-é-Äほ
+Ä,é,Äほ
+Ä-é,Äほ
+Ä-é-Äほ
+é-Ä-ß-ご-a
+é-Ä-ß-ご-a
+éÄ-ßご-a
\ No newline at end of file