Use unicode.translate to speed up js escaping.

This commit is contained in:
Dave Hall 2012-09-18 11:28:49 +01:00 committed by Florian Apolloner
parent 40e62a5ccd
commit 44767f2caf
1 changed files with 15 additions and 18 deletions

View File

@ -42,29 +42,26 @@ def escape(text):
return mark_safe(force_text(text).replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;').replace("'", '&#39;')) return mark_safe(force_text(text).replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;').replace("'", '&#39;'))
escape = allow_lazy(escape, six.text_type) escape = allow_lazy(escape, six.text_type)
_base_js_escapes = ( _js_escapes = {
('\\', '\\u005C'), ord('\\'): '\\u005C',
('\'', '\\u0027'), ord('\''): '\\u0027',
('"', '\\u0022'), ord('"'): '\\u0022',
('>', '\\u003E'), ord('>'): '\\u003E',
('<', '\\u003C'), ord('<'): '\\u003C',
('&', '\\u0026'), ord('&'): '\\u0026',
('=', '\\u003D'), ord('='): '\\u003D',
('-', '\\u002D'), ord('-'): '\\u002D',
(';', '\\u003B'), ord(';'): '\\u003B',
('\u2028', '\\u2028'), ord('\u2028'): '\\u2028',
('\u2029', '\\u2029') ord('\u2029'): '\\u2029'
) }
# Escape every ASCII character with a value less than 32. # Escape every ASCII character with a value less than 32.
_js_escapes = (_base_js_escapes + _js_escapes.update((ord('%c' % z), '\\u%04X' % z) for z in range(32))
tuple([('%c' % z, '\\u%04X' % z) for z in range(32)]))
def escapejs(value): def escapejs(value):
"""Hex encodes characters for use in JavaScript strings.""" """Hex encodes characters for use in JavaScript strings."""
for bad, good in _js_escapes: return mark_safe(force_text(value).translate(_js_escapes))
value = mark_safe(force_text(value).replace(bad, good))
return value
escapejs = allow_lazy(escapejs, six.text_type) escapejs = allow_lazy(escapejs, six.text_type)
def conditional_escape(text): def conditional_escape(text):