Mercurial > hg
comparison mercurial/templatefilters.py @ 28212:d4419c01532b
templatefilters: make json filter be byte-transparent (BC) (issue4926)
This is necessary to preserve filename encoding over JSON. Instead, this
patch inserts "|utf8" where non-ascii local-encoding texts can be passed
to "|json".
See also the commit that introduced "utf8" filter.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 27 Dec 2015 17:59:57 +0900 |
parents | 8ddf893560fa |
children | 93b5c540db69 |
comparison
equal
deleted
inserted
replaced
28211:446465888119 | 28212:d4419c01532b |
---|---|
195 def json(obj): | 195 def json(obj): |
196 if obj is None or obj is False or obj is True: | 196 if obj is None or obj is False or obj is True: |
197 return {None: 'null', False: 'false', True: 'true'}[obj] | 197 return {None: 'null', False: 'false', True: 'true'}[obj] |
198 elif isinstance(obj, int) or isinstance(obj, float): | 198 elif isinstance(obj, int) or isinstance(obj, float): |
199 return str(obj) | 199 return str(obj) |
200 elif isinstance(obj, encoding.localstr): | |
201 u = encoding.fromlocal(obj).decode('utf-8') # can round-trip | |
202 return '"%s"' % jsonescape(u) | |
203 elif isinstance(obj, str): | 200 elif isinstance(obj, str): |
204 # no encoding.fromlocal() because it may abort if obj can't be decoded | 201 return '"%s"' % encoding.jsonescape(obj, paranoid=True) |
205 u = unicode(obj, encoding.encoding, 'replace') | |
206 return '"%s"' % jsonescape(u) | |
207 elif isinstance(obj, unicode): | |
208 return '"%s"' % jsonescape(obj) | |
209 elif util.safehasattr(obj, 'keys'): | 202 elif util.safehasattr(obj, 'keys'): |
210 out = [] | 203 out = [] |
211 for k, v in sorted(obj.iteritems()): | 204 for k, v in sorted(obj.iteritems()): |
212 s = '%s: %s' % (json(k), json(v)) | 205 s = '%s: %s' % (json(k), json(v)) |
213 out.append(s) | 206 out.append(s) |