comparison mercurial/encoding.py @ 28069:b2d24c2898f9

encoding: backport paranoid escaping from templatefilters.jsonescape() This was introduced by 55c763926a28. It is required to embed JSON data in HTML page. Convince yourself here: http://escape.alf.nu/1
author Yuya Nishihara <yuya@tcha.org>
date Sun, 27 Dec 2015 19:58:11 +0900
parents 9ece901f7a19
children 9bcbd9412225
comparison
equal deleted inserted replaced
28068:9ece901f7a19 28069:b2d24c2898f9
389 _jsonmap[0x5c] = '\\\\' 389 _jsonmap[0x5c] = '\\\\'
390 _jsonmap[0x08] = '\\b' 390 _jsonmap[0x08] = '\\b'
391 _jsonmap[0x0c] = '\\f' 391 _jsonmap[0x0c] = '\\f'
392 _jsonmap[0x0d] = '\\r' 392 _jsonmap[0x0d] = '\\r'
393 _paranoidjsonmap = _jsonmap[:] 393 _paranoidjsonmap = _jsonmap[:]
394 _paranoidjsonmap[0x3c] = '\\u003c' # '<' (e.g. escape "</script>")
395 _paranoidjsonmap[0x3e] = '\\u003e' # '>'
394 _jsonmap.extend(chr(x) for x in xrange(128, 256)) 396 _jsonmap.extend(chr(x) for x in xrange(128, 256))
395 397
396 def jsonescape(s, paranoid=False): 398 def jsonescape(s, paranoid=False):
397 '''returns a string suitable for JSON 399 '''returns a string suitable for JSON
398 400
417 >>> jsonescape('utf-8: caf\\xc3\\xa9') 419 >>> jsonescape('utf-8: caf\\xc3\\xa9')
418 'utf-8: caf\\xc3\\xa9' 420 'utf-8: caf\\xc3\\xa9'
419 >>> jsonescape('') 421 >>> jsonescape('')
420 '' 422 ''
421 423
422 If paranoid, non-ascii characters are also escaped. This is suitable for 424 If paranoid, non-ascii and common troublesome characters are also escaped.
423 web output. 425 This is suitable for web output.
424 426
425 >>> jsonescape('escape boundary: \\x7e \\x7f \\xc2\\x80', paranoid=True) 427 >>> jsonescape('escape boundary: \\x7e \\x7f \\xc2\\x80', paranoid=True)
426 'escape boundary: ~ \\\\u007f \\\\u0080' 428 'escape boundary: ~ \\\\u007f \\\\u0080'
427 >>> jsonescape('a weird byte: \\xdd', paranoid=True) 429 >>> jsonescape('a weird byte: \\xdd', paranoid=True)
428 'a weird byte: \\\\udcdd' 430 'a weird byte: \\\\udcdd'
429 >>> jsonescape('utf-8: caf\\xc3\\xa9', paranoid=True) 431 >>> jsonescape('utf-8: caf\\xc3\\xa9', paranoid=True)
430 'utf-8: caf\\\\u00e9' 432 'utf-8: caf\\\\u00e9'
431 >>> jsonescape('non-BMP: \\xf0\\x9d\\x84\\x9e', paranoid=True) 433 >>> jsonescape('non-BMP: \\xf0\\x9d\\x84\\x9e', paranoid=True)
432 'non-BMP: \\\\ud834\\\\udd1e' 434 'non-BMP: \\\\ud834\\\\udd1e'
435 >>> jsonescape('<foo@example.org>', paranoid=True)
436 '\\\\u003cfoo@example.org\\\\u003e'
433 ''' 437 '''
434 438
435 if paranoid: 439 if paranoid:
436 jm = _paranoidjsonmap 440 jm = _paranoidjsonmap
437 else: 441 else: