@@ -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-
224154class 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