diff --git a/djhtml/__main__.py b/djhtml/__main__.py index 2842ac0..51ea58d 100644 --- a/djhtml/__main__.py +++ b/djhtml/__main__.py @@ -48,6 +48,13 @@ def main() -> None: if len(options.input_filenames) > 1 and "-" in options.input_filenames: sys.exit("I’m sorry Dave, I’m afraid I can’t do that.") + extra_blocks = {} + extra_middle_tags = [] + for block_tuple in options.extra_block or (): + if len(block_tuple) >= 2: + extra_blocks[block_tuple[0]] = block_tuple[-1] + extra_middle_tags.extend(block_tuple[1:-1]) + for filename in _generate_filenames(options.input_filenames, suffixes): # Read input file try: @@ -74,11 +81,12 @@ def main() -> None: guess = probabilities.index(max(probabilities)) # Indent input file - extra_blocks = dict(options.extra_block or ()) try: - result = Mode(source, extra_blocks=extra_blocks).indent( - options.tabwidth or guess or 4 - ) + result = Mode( + source, + extra_blocks=extra_blocks, + extra_middle_tags=extra_middle_tags, + ).indent(options.tabwidth or guess or 4) except modes.MaxLineLengthExceeded: problematic_files += 1 _error(f"Maximum line length exceeded in {filename}") diff --git a/djhtml/modes.py b/djhtml/modes.py index c3ea11a..56b57e9 100644 --- a/djhtml/modes.py +++ b/djhtml/modes.py @@ -36,6 +36,7 @@ def __init__( source: str = "", return_mode: BaseMode | None = None, extra_blocks: dict[str, str] | None = None, + extra_middle_tags: list[str] | None = None, ) -> None: """ Instantiate with source text before calling indent(), or @@ -49,6 +50,7 @@ def __init__( self.return_mode = return_mode or self self.token_re = compile_re(self.RAW_TOKENS) self.extra_blocks = extra_blocks or {} + self.extra_middle_tags = extra_middle_tags or [] # To keep track of the current and previous offsets. self.offsets = OffsetDict(relative=0, absolute=0) @@ -252,7 +254,9 @@ def create_token( token = Token.Close(raw_token, mode=DjTXT, **self.offsets) elif self._has_closing_token(name, raw_token, src): token = Token.Open(raw_token, mode=DjTXT, **self.offsets) - elif name in self.CLOSING_AND_OPENING_TAGS: + elif ( + name in self.CLOSING_AND_OPENING_TAGS or name in self.extra_middle_tags + ): token = Token.CloseAndOpen(raw_token, mode=DjTXT, **self.offsets) else: token = Token.Text(raw_token, mode=DjTXT, **self.offsets) @@ -440,13 +444,15 @@ def __init__( source: str = "", return_mode: BaseMode | None = None, extra_blocks: dict[str, str] | None = None, + extra_middle_tags: list[str] | None = None, ) -> None: - super().__init__(source, return_mode, extra_blocks) + super().__init__(source, return_mode, extra_blocks, extra_middle_tags) self.haskell = False self.haskell_re = re.compile(r"^ *, ([$\w-]+ *=|[$\w-]+;?)") self.variable_re = re.compile(r"^ *([$\w-]+ *=|[$\w-]+;?)") self.previous_line_ended_with_comma = False self.extra_blocks = {} + self.extra_middle_tags = [] def create_token( self, raw_token: str, src: str, line: Line @@ -559,6 +565,7 @@ def __init__( self.return_mode = return_mode self.token_re = compile_re([r"\n", endtag]) self.extra_blocks = {} + self.extra_middle_tags = [] def create_token( self, raw_token: str, src: str, line: Line @@ -594,6 +601,7 @@ def __init__( self.inside_attr = False self.additional_offset = -len(tagname) - 1 if absolute else 0 self.extra_blocks = {} + self.extra_middle_tags = [] def create_token( self, raw_token: str, src: str, line: Line diff --git a/djhtml/options.py b/djhtml/options.py index 2223e71..f217070 100644 --- a/djhtml/options.py +++ b/djhtml/options.py @@ -62,7 +62,7 @@ "-b", "--extra-block", action="append", - help="startblock,endblock pair", + help="startblock[,middletag,...],endblock tuple", type=lambda x: tuple(x.split(",")), ) diff --git a/tests/suite/django.html b/tests/suite/django.html index 73da8db..3d4e06c 100644 --- a/tests/suite/django.html +++ b/tests/suite/django.html @@ -200,3 +200,10 @@