Mercurial > public > mercurial-scm > hg
comparison mercurial/templatefilters.py @ 11765:aff419e260f9 stable
templatefilters: make json filter handle multibyte characters correctly
It aims to fix javascript error of hgweb's graph view in Japanese 'cp932'
encoding.
'cp932' contains multibyte characters ending with '\x5c' (backslash),
e.g. '\x94\x5c' for Japanese Kanji 'Noh'.
Due to json filter escapes '\' to '\\', multibyte string ending with
'\x5c' is translated to "xxx\", resulting javascript parse error on
a web browser.
This patch changes json() to pass unicode to jsonescape().
Unicode decoding error handler changed to 'replace' by Patrick M?zard.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 07 Aug 2010 16:27:16 +0900 |
parents | d320e70442a5 |
children | 9dac951d0185 |
comparison
equal
deleted
inserted
replaced
11758:a79214972da2 | 11765:aff419e260f9 |
---|---|
154 if obj is None or obj is False or obj is True: | 154 if obj is None or obj is False or obj is True: |
155 return {None: 'null', False: 'false', True: 'true'}[obj] | 155 return {None: 'null', False: 'false', True: 'true'}[obj] |
156 elif isinstance(obj, int) or isinstance(obj, float): | 156 elif isinstance(obj, int) or isinstance(obj, float): |
157 return str(obj) | 157 return str(obj) |
158 elif isinstance(obj, str): | 158 elif isinstance(obj, str): |
159 return '"%s"' % jsonescape(obj) | 159 u = unicode(obj, encoding.encoding, 'replace') |
160 return '"%s"' % jsonescape(u).encode('utf-8') | |
160 elif isinstance(obj, unicode): | 161 elif isinstance(obj, unicode): |
161 return json(obj.encode('utf-8')) | 162 return '"%s"' % jsonescape(obj).encode('utf-8') |
162 elif hasattr(obj, 'keys'): | 163 elif hasattr(obj, 'keys'): |
163 out = [] | 164 out = [] |
164 for k, v in obj.iteritems(): | 165 for k, v in obj.iteritems(): |
165 s = '%s: %s' % (json(k), json(v)) | 166 s = '%s: %s' % (json(k), json(v)) |
166 out.append(s) | 167 out.append(s) |