]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
parse hex, octal, and binary integer literals 1171/head
authorAlex Mykyta <amykyta3@users.noreply.github.com>
Wed, 11 Mar 2020 03:57:28 +0000 (20:57 -0700)
committerDavid Lord <davidism@gmail.com>
Mon, 5 Apr 2021 17:35:57 +0000 (10:35 -0700)
CHANGES.rst
src/jinja2/lexer.py
tests/test_lexnparse.py

index 1e0ec0ee9c020232bb22ba5c15c6f0f1bfc99901..f45d523cfb00d94e21d5a73c3096d0c97aa26838 100644 (file)
@@ -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
index 082a051de8bdb39140f1774c9bed4548bd657aa0..d992f0d166782002bbe9c4b442bafb2fbbeb0563 100644 (file)
@@ -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("_", ""))
index f4857668341aaf574a3c7c6b393d10bbc368a678..c02adad5a9ecd95262ff555505aa3156bb3060a9 100644 (file)
@@ -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):