Skip to content

Commit

Permalink
Support for hex escapes in JavaScript string literals
Browse files Browse the repository at this point in the history
  • Loading branch information
codepainters authored and akx committed Oct 31, 2022
1 parent 8f5757c commit c7d04e8
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
13 changes: 13 additions & 0 deletions babel/messages/jslexer.py
@@ -1,3 +1,4 @@
# -*- coding: utf-8 -*-
"""
babel.messages.jslexer
~~~~~~~~~~~~~~~~~~~~~~
Expand Down Expand Up @@ -27,6 +28,7 @@
line_re = re.compile(r'(\r\n|\n|\r)')
line_join_re = re.compile(r'\\' + line_re.pattern)
uni_escape_re = re.compile(r'[a-fA-F0-9]{1,4}')
hex_escape_re = re.compile(r'[a-fA-F0-9]{1,2}')

Token = namedtuple('Token', 'type value lineno')

Expand Down Expand Up @@ -127,6 +129,17 @@ def unquote_string(string):
else:
add(next_char)

# hex escapes. conversion from 2-digits hex to char is infallible
elif next_char in 'xX':
escaped = hex_escape_re.match(string, escape_pos + 2)
if escaped is not None:
escaped_value = escaped.group()
add(chr(int(escaped_value, 16)))
pos = escape_pos + 2 + len(escaped_value)
continue
else:
add(next_char)

# bogus escape. Just remove the backslash.
else:
add(next_char)
Expand Down
2 changes: 2 additions & 0 deletions tests/messages/test_jslexer.py
Expand Up @@ -4,6 +4,8 @@
def test_unquote():
assert jslexer.unquote_string('""') == ''
assert jslexer.unquote_string(r'"h\u00ebllo"') == u"hëllo"
assert jslexer.unquote_string(r'"h\xebllo"') == u"hëllo"
assert jslexer.unquote_string(r'"\xebb"') == u"ëb"


def test_dollar_in_identifier():
Expand Down

0 comments on commit c7d04e8

Please sign in to comment.