comparison mercurial/templatefilters.py @ 11890:9dac951d0185 stable

templatefilters: use \uxxxx style escape for JSON string It's embeddable in plain javascript, and also conforms to JSON standard.
author Yuya Nishihara <yuya@tcha.org>
date Wed, 11 Aug 2010 01:06:21 +0900
parents aff419e260f9
children 0bedf3a2062a
comparison
equal deleted inserted replaced
11889:3b65c3c3cc8d 11890:9dac951d0185
146 ] 146 ]
147 147
148 def jsonescape(s): 148 def jsonescape(s):
149 for k, v in _escapes: 149 for k, v in _escapes:
150 s = s.replace(k, v) 150 s = s.replace(k, v)
151 return s 151
152 def uescape(c):
153 if ord(c) < 0x80:
154 return c
155 else:
156 return '\\u%04x' % ord(c)
157 return ''.join(uescape(c) for c in s)
152 158
153 def json(obj): 159 def json(obj):
154 if obj is None or obj is False or obj is True: 160 if obj is None or obj is False or obj is True:
155 return {None: 'null', False: 'false', True: 'true'}[obj] 161 return {None: 'null', False: 'false', True: 'true'}[obj]
156 elif isinstance(obj, int) or isinstance(obj, float): 162 elif isinstance(obj, int) or isinstance(obj, float):
157 return str(obj) 163 return str(obj)
158 elif isinstance(obj, str): 164 elif isinstance(obj, str):
159 u = unicode(obj, encoding.encoding, 'replace') 165 u = unicode(obj, encoding.encoding, 'replace')
160 return '"%s"' % jsonescape(u).encode('utf-8') 166 return '"%s"' % jsonescape(u)
161 elif isinstance(obj, unicode): 167 elif isinstance(obj, unicode):
162 return '"%s"' % jsonescape(obj).encode('utf-8') 168 return '"%s"' % jsonescape(obj)
163 elif hasattr(obj, 'keys'): 169 elif hasattr(obj, 'keys'):
164 out = [] 170 out = []
165 for k, v in obj.iteritems(): 171 for k, v in obj.iteritems():
166 s = '%s: %s' % (json(k), json(v)) 172 s = '%s: %s' % (json(k), json(v))
167 out.append(s) 173 out.append(s)