diff --git a/babel/messages/jslexer.py b/babel/messages/jslexer.py index c1c25575c..1264b2dbc 100644 --- a/babel/messages/jslexer.py +++ b/babel/messages/jslexer.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- """ babel.messages.jslexer ~~~~~~~~~~~~~~~~~~~~~~ @@ -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') @@ -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) diff --git a/tests/messages/test_jslexer.py b/tests/messages/test_jslexer.py index 35204eee0..bd6322e9e 100644 --- a/tests/messages/test_jslexer.py +++ b/tests/messages/test_jslexer.py @@ -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():