fixed json_encode filter (thanks to Koc for the fix)
authorFabien Potencier <fabien.potencier@gmail.com>
Fri, 24 Jun 2011 09:26:17 +0000 (11:26 +0200)
committerFabien Potencier <fabien.potencier@gmail.com>
Fri, 24 Jun 2011 09:26:28 +0000 (11:26 +0200)
lib/Twig/Extension/Core.php
test/Twig/Tests/Fixtures/filters/json_encode.test [new file with mode: 0644]

index b65f732..a1cdf42 100644 (file)
@@ -48,7 +48,7 @@ class Twig_Extension_Core extends Twig_Extension
 
             // encoding
             'url_encode'  => new Twig_Filter_Function('twig_urlencode_filter'),
-            'json_encode' => new Twig_Filter_Function('json_encode'),
+            'json_encode' => new Twig_Filter_Function('twig_jsonencode_filter'),
 
             // string filters
             'title'      => new Twig_Filter_Function('twig_title_string_filter', array('needs_environment' => true)),
@@ -232,6 +232,24 @@ function twig_urlencode_filter($url, $raw = false)
     return urlencode($url);
 }
 
+function twig_jsonencode_filter($value, $options = 0)
+{
+    if ($value instanceof Twig_Markup) {
+        $value = (string) $value;
+    } elseif (is_array($value)) {
+        array_walk_recursive($value, '_twig_markup2string');
+    }
+
+    return json_encode($value, $options);
+}
+
+function _twig_markup2string(&$value)
+{
+    if ($value instanceof Twig_Markup) {
+        $value = (string) $value;
+    }
+}
+
 function twig_array_merge($arr1, $arr2)
 {
     if (!is_array($arr1) || !is_array($arr2)) {
diff --git a/test/Twig/Tests/Fixtures/filters/json_encode.test b/test/Twig/Tests/Fixtures/filters/json_encode.test
new file mode 100644 (file)
index 0000000..776a631
--- /dev/null
@@ -0,0 +1,12 @@
+--TEST--
+"json_encode" filter
+--TEMPLATE--
+{{ "foo"|json_encode|raw }}
+{{ foo|json_encode|raw }}
+{{ [foo, "foo"]|json_encode|raw }}
+--DATA--
+return array('foo' => new Twig_Markup('foo'))
+--EXPECT--
+"foo"
+"foo"
+["foo","foo"]