comparison mercurial/templatefilters.py @ 8014:6a77ba181bc6

templatefilters: split out jsonescape() function
author Dirkjan Ochtman <dirkjan@ochtman.nl>
date Mon, 06 Apr 2009 10:51:45 +0200
parents de377b1a9a84
children 1bef3656d9fe
comparison
equal deleted inserted replaced
8013:9ec25db32b4e 8014:6a77ba181bc6
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 }