Skip to content

Commit

Permalink
Merge pull request #87 from jnns/86-slippers
Browse files Browse the repository at this point in the history
Add support for Slippers component syntax
  • Loading branch information
JaapJoris committed Mar 4, 2023
2 parents 97067bd + 87eed98 commit ca02cd8
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 4 deletions.
8 changes: 4 additions & 4 deletions djhtml/modes.py
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ class DjTXT(BaseMode):
"video": (" as ", None),
"placeholder": (" or ", None),
}
OPENING_TAG = r"{%[-+]? *(\w+).*?[-+]?%}"
OPENING_TAG = r"{%[-+]? *[#/]?(\w+).*?[-+]?%}"

def create_token(self, raw_token, src, line):
mode = self
Expand All @@ -219,12 +219,12 @@ def create_token(self, raw_token, src, line):
token, mode = Token.Open(raw_token, mode=DjTXT, ignore=True), Comment(
"{% *end" + name + " *%}", mode=DjTXT, return_mode=self
)
elif name.startswith("end") or re.match(r"{% */\w+", raw_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:
token = Token.CloseAndOpen(raw_token, mode=DjTXT, **self.offsets)
elif name.startswith("end"):
token = Token.Close(raw_token, mode=DjTXT, **self.offsets)
else:
token = Token.Text(raw_token, mode=DjTXT, **self.offsets)
elif raw_token == "{#":
Expand All @@ -240,7 +240,7 @@ def create_token(self, raw_token, src, line):
return token, mode

def _has_closing_token(self, name, raw_token, src):
if not re.search(f"{{%[-+]? *end{name}(?: .*?|)%}}", src):
if not re.search(f"{{%[-+]? *(end|/){name}(?: .*?|)%}}", src):
return False
if regex := self.AMBIGUOUS_BLOCK_TAGS.get(name):
if regex[0]:
Expand Down
21 changes: 21 additions & 0 deletions tests/suite/django.html
Original file line number Diff line number Diff line change
Expand Up @@ -163,3 +163,24 @@ <h1>Welcome, {{ request.user }}</h1>
</div>
</section>
{% endblock %}


<!-- Slippers components (https://github.com/rtts/djhtml/issues/86) -->
{% #quote %}
{% quote_photo src="/project-hail-mary.jpg" %}

{% #quote_text %}
“I penetrated the outer cell membrane with a nanosyringe."
"You poked it with a stick?"
"No!" I said. "Well. Yes. But it was a scientific poke
with a very scientific stick.”
{% /quote_text %}

{% #quote_attribution %}
Andy Weir, Project Hail Mary
{% /quote_attribution %}

{% #quote_text %}
This component is intentionally repeated.
{% /quote_text %}
{% /quote %}
21 changes: 21 additions & 0 deletions tests/suite/django.tokens
Original file line number Diff line number Diff line change
Expand Up @@ -163,4 +163,25 @@ Line([Text(' ', mode=DjHTML), Text('{% placeholder "placeholder4" %}'
Line([Text(' ', mode=DjHTML), Close('</div>', mode=DjHTML)], level=2)
Line([Text(' ', mode=DjHTML), Close('</section>', mode=DjHTML)], level=1)
Line([Close('{% endblock %}', mode=DjTXT)])
Line([])
Line([])
Line([Open('<!--', mode=DjHTML, ignore=True), Text(' Slippers components (https://github.com/rtts/djhtml/issues/86) ', mode=Comment, ignore=True), Close('-->', mode=DjHTML, ignore=True)], ignore=True)
Line([Open('{% #quote %}', mode=DjTXT)])
Line([Text(' ', mode=DjHTML), Text('{% quote_photo src="/project-hail-mary.jpg" %}', mode=DjTXT)], level=1)
Line([])
Line([Text(' ', mode=DjHTML), Open('{% #quote_text %}', mode=DjTXT, level=1)], level=1)
Line([Text(' “I penetrated the outer cell membrane with a nanosyringe."', mode=DjHTML)], level=2)
Line([Text(' "You poked it with a stick?"', mode=DjHTML)], level=2)
Line([Text(' "No!" I said. "Well. Yes. But it was a scientific poke', mode=DjHTML)], level=2)
Line([Text(' with a very scientific stick.”', mode=DjHTML)], level=2)
Line([Text(' ', mode=DjHTML), Close('{% /quote_text %}', mode=DjTXT)], level=1)
Line([])
Line([Text(' ', mode=DjHTML), Open('{% #quote_attribution %}', mode=DjTXT, level=1)], level=1)
Line([Text(' Andy Weir, Project Hail Mary', mode=DjHTML)], level=2)
Line([Text(' ', mode=DjHTML), Close('{% /quote_attribution %}', mode=DjTXT)], level=1)
Line([])
Line([Text(' ', mode=DjHTML), Open('{% #quote_text %}', mode=DjTXT, level=1)], level=1)
Line([Text(' This component is intentionally repeated.', mode=DjHTML)], level=2)
Line([Text(' ', mode=DjHTML), Close('{% /quote_text %}', mode=DjTXT)], level=1)
Line([Close('{% /quote %}', mode=DjTXT)])
Line([])

0 comments on commit ca02cd8

Please sign in to comment.