Skip to content

Commit 7579a4b

Browse files
authored
chore: render node tag (#1639)
1 parent 5ba68ff commit 7579a4b

File tree

1 file changed

+47
-70
lines changed

1 file changed

+47
-70
lines changed

src/unfold/templatetags/unfold.py

Lines changed: 47 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -151,76 +151,6 @@ def tabs(adminform: AdminForm) -> list[Fieldset]:
151151
return result
152152

153153

154-
class CaptureNode(Node):
155-
def __init__(self, nodelist: NodeList, varname: str, silent: bool) -> None:
156-
self.nodelist = nodelist
157-
self.varname = varname
158-
self.silent = silent
159-
160-
def render(self, context: dict[str, Any]) -> str | SafeText:
161-
output = self.nodelist.render(context)
162-
context[self.varname] = output
163-
if self.silent:
164-
return ""
165-
else:
166-
return output
167-
168-
169-
@register.tag(name="capture")
170-
def do_capture(parser: Parser, token: Token) -> CaptureNode:
171-
"""
172-
Capture the contents of a tag output.
173-
Usage:
174-
.. code-block:: html+django
175-
{% capture %}..{% endcapture %} # output in {{ capture }}
176-
{% capture silent %}..{% endcapture %} # output in {{ capture }} only
177-
{% capture as varname %}..{% endcapture %} # output in {{ varname }}
178-
{% capture as varname silent %}..{% endcapture %} # output in {{ varname }} only
179-
For example:
180-
.. code-block:: html+django
181-
{# Allow templates to override the page title/description #}
182-
<meta name="description" content="{% capture as meta_description %}
183-
{% block meta-description %}{% endblock %}{% endcapture %}" />
184-
<title>{% capture as meta_title %}{% block meta-title %}Untitled{% endblock %}{% endcapture %}</title>
185-
{# copy the values to the Social Media meta tags #}
186-
<meta property="og:description" content="{% block og-description %}{{ meta_description }}{% endblock %}" />
187-
<meta name="twitter:title" content="{% block twitter-title %}{{ meta_title }}{% endblock %}" />
188-
"""
189-
bits = token.split_contents()
190-
191-
# tokens
192-
t_as = "as"
193-
t_silent = "silent"
194-
var = "capture"
195-
silent = False
196-
197-
num_bits = len(bits)
198-
if len(bits) > 4:
199-
raise TemplateSyntaxError(
200-
"'capture' node supports '[as variable] [silent]' parameters."
201-
)
202-
elif num_bits == 4:
203-
t_name, t_as, var, t_silent = bits
204-
silent = True
205-
elif num_bits == 3:
206-
t_name, t_as, var = bits
207-
elif num_bits == 2:
208-
t_name, t_silent = bits
209-
silent = True
210-
else:
211-
var = "capture"
212-
silent = False
213-
214-
if t_silent != "silent" or t_as != "as":
215-
raise TemplateSyntaxError(
216-
"'capture' node expects 'as variable' or 'silent' syntax."
217-
)
218-
219-
nodelist = parser.parse(("endcapture",))
220-
parser.delete_first_token()
221-
return CaptureNode(nodelist, var, silent)
222-
223-
224154
class RenderComponentNode(template.Node):
225155
def __init__(
226156
self,
@@ -799,3 +729,50 @@ def has_nested_tables(table: dict) -> bool:
799729
return any(
800730
isinstance(row, dict) and "table" in row for row in table.get("rows", [])
801731
)
732+
733+
734+
class RenderCaptureNode(Node):
735+
def __init__(self, nodelist: NodeList, variable_name: str, silent: bool) -> None:
736+
self.nodelist = nodelist
737+
self.variable_name = variable_name
738+
self.silent = silent
739+
740+
def render(self, context: dict[str, Any]) -> str | SafeText:
741+
content = self.nodelist.render(context)
742+
743+
if not self.silent:
744+
return content
745+
746+
context.update(
747+
{
748+
self.variable_name: content,
749+
}
750+
)
751+
752+
return ""
753+
754+
755+
@register.tag(name="capture")
756+
def do_capture(parser: Parser, token: Token) -> RenderCaptureNode:
757+
parts = token.split_contents()
758+
variable_name = ""
759+
silent = False
760+
761+
if len(parts) > 4:
762+
raise TemplateSyntaxError("Too many arguments for 'capture' tag.")
763+
764+
if len(parts) >= 3:
765+
if parts[1] != "as":
766+
raise TemplateSyntaxError("'as' is required for 'capture' tag.")
767+
768+
variable_name = parts[2]
769+
770+
if len(parts) == 4:
771+
if parts[3] != "silent":
772+
raise TemplateSyntaxError("'silent' is required for 'capture' tag.")
773+
774+
silent = True
775+
776+
nodelist = parser.parse(("endcapture",))
777+
parser.delete_first_token()
778+
return RenderCaptureNode(nodelist, variable_name, silent)

0 commit comments

Comments
 (0)