Mercurial > hg
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) |