diff options
author | David Lord <davidism@gmail.com> | 2021-04-05 10:40:02 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-05 10:40:02 -0700 |
commit | fd001b216a80a40cdc5c9afc6c863ed763095470 (patch) | |
tree | a387deadf03ef2ebd43bb22e3ad16de776294ca5 | |
parent | 1eb871fdc32cb90db54700281dd6f4b7aa9a4cad (diff) | |
parent | 2e0a3da2bc8b764dc8cb5aec390cc7ac7dacd8ae (diff) | |
download | jinja2-fd001b216a80a40cdc5c9afc6c863ed763095470.tar.gz |
Merge pull request #1171 from amykyta3/feature/base-integer-literals
Add support for hex, octal, and binary integer literals
-rw-r--r-- | CHANGES.rst | 2 | ||||
-rw-r--r-- | src/jinja2/lexer.py | 19 | ||||
-rw-r--r-- | tests/test_lexnparse.py | 7 |
3 files changed, 26 insertions, 2 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index 1e0ec0e..f45d523 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -50,6 +50,8 @@ Unreleased extension. :issue:`441` - The ``|indent`` filter's ``width`` argument can be a string to indent by. :pr:`1167` +- The parser understands hex, octal, and binary integer literals. + :issue:`1170` Version 2.11.3 diff --git a/src/jinja2/lexer.py b/src/jinja2/lexer.py index 082a051..d992f0d 100644 --- a/src/jinja2/lexer.py +++ b/src/jinja2/lexer.py @@ -23,7 +23,22 @@ newline_re = re.compile(r"(\r\n|\r|\n)") string_re = re.compile( r"('([^'\\]*(?:\\.[^'\\]*)*)'" r'|"([^"\\]*(?:\\.[^"\\]*)*)")', re.S ) -integer_re = re.compile(r"(\d+_)*\d+") +integer_re = re.compile( + r""" + ( + 0b(_?[0-1])+ # binary + | + 0o(_?[0-7])+ # octal + | + 0x(_?[\da-f])+ # hex + | + [1-9](_?\d)* # decimal + | + 0(_?0)* # decimal zero + ) + """, + re.IGNORECASE | re.VERBOSE, +) float_re = re.compile( r""" (?<!\.) # doesn't start with a . @@ -613,7 +628,7 @@ class Lexer: msg = str(e).split(":")[-1].strip() raise TemplateSyntaxError(msg, lineno, name, filename) elif token == TOKEN_INTEGER: - value = int(value.replace("_", "")) + value = int(value.replace("_", ""), 0) elif token == TOKEN_FLOAT: # remove all "_" first to support more Python versions value = literal_eval(value.replace("_", "")) diff --git a/tests/test_lexnparse.py b/tests/test_lexnparse.py index f485766..c02adad 100644 --- a/tests/test_lexnparse.py +++ b/tests/test_lexnparse.py @@ -412,6 +412,13 @@ class TestSyntax: ("2.5e+100", "2.5e+100"), ("25.6e-10", "2.56e-09"), ("1_2.3_4e5_6", "1.234e+57"), + ("0", "0"), + ("0_00", "0"), + ("0b1001_1111", "159"), + ("0o123", "83"), + ("0o1_23", "83"), + ("0x123abc", "1194684"), + ("0x12_3abc", "1194684"), ), ) def test_numeric_literal(self, env, value, expect): |