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)