1 | import re, time
|
---|
2 |
|
---|
3 | ###################old implementation##################
|
---|
4 | _base_js_escapes = (
|
---|
5 | ('\\', r'\x5C'),
|
---|
6 | ('\'', r'\x27'),
|
---|
7 | ('"', r'\x22'),
|
---|
8 | ('>', r'\x3E'),
|
---|
9 | ('<', r'\x3C'),
|
---|
10 | ('&', r'\x26'),
|
---|
11 | ('=', r'\x3D'),
|
---|
12 | ('-', r'\x2D'),
|
---|
13 | (';', r'\x3B')
|
---|
14 | )
|
---|
15 |
|
---|
16 | # Escape every ASCII character with a value less than 32.
|
---|
17 | _js_escapes = (_base_js_escapes +
|
---|
18 | tuple([('%c' % z, '\\x%02X' % z) for z in range(32)]))
|
---|
19 |
|
---|
20 | def escapejs(value):
|
---|
21 | for bad, good in _js_escapes:
|
---|
22 | value = value.replace(bad, good)
|
---|
23 | return value
|
---|
24 | #######################################################
|
---|
25 |
|
---|
26 | #####################new implementation################
|
---|
27 | _js_escapes_dict = {
|
---|
28 | '\\': r'\x5C',
|
---|
29 | '\'': r'\x27',
|
---|
30 | '"': r'\x22',
|
---|
31 | '>': r'\x3E',
|
---|
32 | '<': r'\x3C',
|
---|
33 | '&': r'\x26',
|
---|
34 | '=': r'\x3D',
|
---|
35 | '-': r'\x2D',
|
---|
36 | ';': r'\x3B',
|
---|
37 | u'\u2028': r'\u2028',
|
---|
38 | u'\u2029': r'\u2029',
|
---|
39 | }
|
---|
40 |
|
---|
41 | # also escape every ASCII character with a value less than 32.
|
---|
42 | for z in range(32):
|
---|
43 | _js_escapes_dict[chr(z)] = '\\x%02X' % z
|
---|
44 |
|
---|
45 | # construct a Regex object matching the keys in _js_escapes_dict
|
---|
46 | _js_escapes_re = u''.join(sorted(_js_escapes_dict.keys()))
|
---|
47 | _js_escapes_re = re.sub(r'[\\\\\-\]]', r'\\\g<0>', _js_escapes_re) # escape \-]
|
---|
48 | _js_escapes_re = '[' + _js_escapes_re + ']'
|
---|
49 | _js_escapes_re = re.compile(_js_escapes_re)
|
---|
50 |
|
---|
51 | def escapejs_new(value):
|
---|
52 | """Hex encodes characters for use in JavaScript strings."""
|
---|
53 | return _js_escapes_re.sub(lambda m: _js_escapes_dict[m.group(0)], value)
|
---|
54 | #######################################################
|
---|
55 |
|
---|
56 | # time the functions
|
---|
57 | n = 100000
|
---|
58 | for test_string in (
|
---|
59 | "x" * 5, "x" * 512, "'" * 5, "'" * 512,
|
---|
60 | "Hello, I'm a simple string we're going to use. \\ - ; &",
|
---|
61 | ):
|
---|
62 |
|
---|
63 | t_old = time.time()
|
---|
64 | for x in range(n):
|
---|
65 | escapejs(test_string)
|
---|
66 | t_old = time.time() - t_old
|
---|
67 |
|
---|
68 | t_new = time.time()
|
---|
69 | for x in range(n):
|
---|
70 | escapejs_new(test_string)
|
---|
71 | t_new = time.time() - t_new
|
---|
72 |
|
---|
73 | str = test_string
|
---|
74 | if len(str) > 10:
|
---|
75 | str = str[:10] + "..."
|
---|
76 | if t_new < t_old:
|
---|
77 | print "%5.1fx speedup %.1fs vs %.1fs %r" % (t_old / t_new, t_old, t_new, str)
|
---|
78 | else:
|
---|
79 | print "%5.1fx slowdown %.1fs vs %.1fs %r" % (t_new / t_old, t_old, t_new, str)
|
---|
80 |
|
---|