Skip to content

Commit

Permalink
jinja: support raw
Browse files Browse the repository at this point in the history
  • Loading branch information
perrinjerome committed Jul 4, 2024
1 parent c507850 commit ba06fdb
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 3 deletions.
16 changes: 13 additions & 3 deletions server/buildoutls/jinja.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ class JinjaStatement(str, enum.Enum):
Macro = "macro"
Call = "call"
Filter = "filter"
Raw = "raw"
EndRaw = "endraw"


jinja_statements = set(JinjaStatement)
Expand Down Expand Up @@ -46,6 +48,7 @@ def __init__(self) -> None:
self.is_error = False
self._stack: List[JinjaStatement] = []
self._current_line_was_in_jinja = False
self._in_raw = False
self._in_comment = False
self._in_multiline_expression = False
self._in_multiline_statement = False
Expand All @@ -54,7 +57,7 @@ def __init__(self) -> None:
def feed(self, line: str) -> None:
"""Feeds a line and update the state."""
self._current_line_was_in_jinja = False
self.has_expression = bool(expression_re.search(line))
self.has_expression = bool(expression_re.search(line)) and not self._in_raw
expression_re_match = expression_re.search(line)
if expression_re_match:
if expression_re_match.start() == 0 and expression_re_match.end() == len(
Expand All @@ -72,16 +75,23 @@ def feed(self, line: str) -> None:

statement_match = statement_re.match(line)
if statement_match:
self._current_line_was_in_jinja = True
self._current_line_was_in_jinja = not self._in_raw
statement = statement_match.group("statement")
if statement in jinja_statements:
if statement == JinjaStatement.Raw:
self._in_raw = True
elif statement == JinjaStatement.EndRaw:
self._in_raw = False
elif statement in jinja_statements:
self._stack.append(JinjaStatement(statement))
elif statement in end_block_statement:
self.is_error = True
if self._stack:
popped = self._stack.pop()
self.is_error = end_block_statement[statement] != popped

if self._in_raw:
return

if multiline_expression_start_re.match(line) or self._in_multiline_expression:
self._current_line_was_in_jinja = True
self._in_multiline_expression = multiline_expression_end_re.search(line) is None
Expand Down
6 changes: 6 additions & 0 deletions server/buildoutls/tests/test_jinja.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,12 @@ def test_is_in_jinja() -> None:
("line ", True),
("comment #}", True),
("after multi line comment", False),
# raw
("{% raw %}", True),
("in raw", False),
("{% set jinja_ignored_in_raw = True %}", False),
("{% endraw %}", True),
("{% set jinja_detected_after_in_raw = True %}", True),
):
parser.feed(line)
assert parser.is_in_jinja == is_in_jinja
Expand Down

0 comments on commit ba06fdb

Please sign in to comment.