summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2021-04-05 10:40:02 -0700
committerGitHub <noreply@github.com>2021-04-05 10:40:02 -0700
commitfd001b216a80a40cdc5c9afc6c863ed763095470 (patch)
treea387deadf03ef2ebd43bb22e3ad16de776294ca5
parent1eb871fdc32cb90db54700281dd6f4b7aa9a4cad (diff)
parent2e0a3da2bc8b764dc8cb5aec390cc7ac7dacd8ae (diff)
downloadjinja2-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.rst2
-rw-r--r--src/jinja2/lexer.py19
-rw-r--r--tests/test_lexnparse.py7
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):