mercurial/templatefilters.py
changeset 28212 d4419c01532b
parent 28209 8ddf893560fa
child 28213 93b5c540db69
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)