templatefilters: use \uxxxx style escape for JSON string stable
authorYuya Nishihara <yuya@tcha.org>
Wed, 11 Aug 2010 01:06:21 +0900
branchstable
changeset 11890 9dac951d0185
parent 11889 3b65c3c3cc8d
child 11891 0bedf3a2062a
templatefilters: use \uxxxx style escape for JSON string It's embeddable in plain javascript, and also conforms to JSON standard.
mercurial/templatefilters.py
tests/test-hgweb-commands.out
--- a/mercurial/templatefilters.py	Fri Aug 13 17:21:06 2010 +0200
+++ b/mercurial/templatefilters.py	Wed Aug 11 01:06:21 2010 +0900
@@ -148,7 +148,13 @@
 def jsonescape(s):
     for k, v in _escapes:
         s = s.replace(k, v)
-    return s
+
+    def uescape(c):
+        if ord(c) < 0x80:
+            return c
+        else:
+            return '\\u%04x' % ord(c)
+    return ''.join(uescape(c) for c in s)
 
 def json(obj):
     if obj is None or obj is False or obj is True:
@@ -157,9 +163,9 @@
         return str(obj)
     elif isinstance(obj, str):
         u = unicode(obj, encoding.encoding, 'replace')
-        return '"%s"' % jsonescape(u).encode('utf-8')
+        return '"%s"' % jsonescape(u)
     elif isinstance(obj, unicode):
-        return '"%s"' % jsonescape(obj).encode('utf-8')
+        return '"%s"' % jsonescape(obj)
     elif hasattr(obj, 'keys'):
         out = []
         for k, v in obj.iteritems():
--- a/tests/test-hgweb-commands.out	Fri Aug 13 17:21:06 2010 +0200
+++ b/tests/test-hgweb-commands.out	Wed Aug 11 01:06:21 2010 +0900
@@ -984,5 +984,5 @@
 }
 % Stop and restart with HGENCODING=cp932
 % Graph json escape of multibyte character
-var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "能", "test", "1970-01-01", ["stable", true], ["tip"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], []], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]];
+var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "\u80fd", "test", "1970-01-01", ["stable", true], ["tip"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], []], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"]]];
 % ERRORS ENCOUNTERED