127 _escapes = [ |
127 _escapes = [ |
128 ('\\', '\\\\'), ('"', '\\"'), ('\t', '\\t'), ('\n', '\\n'), |
128 ('\\', '\\\\'), ('"', '\\"'), ('\t', '\\t'), ('\n', '\\n'), |
129 ('\r', '\\r'), ('\f', '\\f'), ('\b', '\\b'), |
129 ('\r', '\\r'), ('\f', '\\f'), ('\b', '\\b'), |
130 ] |
130 ] |
131 |
131 |
|
132 def jsonescape(s): |
|
133 for k, v in _escapes: |
|
134 s = s.replace(k, v) |
|
135 return s |
|
136 |
132 def json(obj): |
137 def json(obj): |
133 if obj is None or obj is False or obj is True: |
138 if obj is None or obj is False or obj is True: |
134 return {None: 'null', False: 'false', True: 'true'}[obj] |
139 return {None: 'null', False: 'false', True: 'true'}[obj] |
135 elif isinstance(obj, int) or isinstance(obj, float): |
140 elif isinstance(obj, int) or isinstance(obj, float): |
136 return str(obj) |
141 return str(obj) |
137 elif isinstance(obj, str): |
142 elif isinstance(obj, str): |
138 for k, v in _escapes: |
143 return '"%s"' % jsonescape(obj) |
139 obj = obj.replace(k, v) |
|
140 return '"%s"' % obj |
|
141 elif isinstance(obj, unicode): |
144 elif isinstance(obj, unicode): |
142 return json(obj.encode('utf-8')) |
145 return json(obj.encode('utf-8')) |
143 elif hasattr(obj, 'keys'): |
146 elif hasattr(obj, 'keys'): |
144 out = [] |
147 out = [] |
145 for k, v in obj.iteritems(): |
148 for k, v in obj.iteritems(): |
167 "firstline": firstline, |
170 "firstline": firstline, |
168 "tabindent": lambda x: indent(x, '\t'), |
171 "tabindent": lambda x: indent(x, '\t'), |
169 "hgdate": lambda x: "%d %d" % x, |
172 "hgdate": lambda x: "%d %d" % x, |
170 "isodate": lambda x: util.datestr(x, '%Y-%m-%d %H:%M %1%2'), |
173 "isodate": lambda x: util.datestr(x, '%Y-%m-%d %H:%M %1%2'), |
171 "isodatesec": lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2'), |
174 "isodatesec": lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2'), |
|
175 "json": json, |
|
176 "jsonescape": jsonescape, |
172 "obfuscate": obfuscate, |
177 "obfuscate": obfuscate, |
173 "permissions": permissions, |
178 "permissions": permissions, |
174 "person": person, |
179 "person": person, |
175 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2"), |
180 "rfc822date": lambda x: util.datestr(x, "%a, %d %b %Y %H:%M:%S %1%2"), |
176 "rfc3339date": lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S%1:%2"), |
181 "rfc3339date": lambda x: util.datestr(x, "%Y-%m-%dT%H:%M:%S%1:%2"), |
180 "strip": lambda x: x.strip(), |
185 "strip": lambda x: x.strip(), |
181 "urlescape": lambda x: urllib.quote(x), |
186 "urlescape": lambda x: urllib.quote(x), |
182 "user": lambda x: util.shortuser(x), |
187 "user": lambda x: util.shortuser(x), |
183 "stringescape": lambda x: x.encode('string_escape'), |
188 "stringescape": lambda x: x.encode('string_escape'), |
184 "xmlescape": xmlescape, |
189 "xmlescape": xmlescape, |
185 "json": json, |
|
186 } |
190 } |