Browse Source

Capture to variable template tag

Rafał Pitoń 11 years ago
parent
commit
cdaf11c9ae
2 changed files with 87 additions and 17 deletions
  1. 51 0
      misago/core/templatetags/misago_capture.py
  2. 36 17
      misago/core/tests/test_templatetags.py

+ 51 - 0
misago/core/templatetags/misago_capture.py

@@ -0,0 +1,51 @@
+"""
+Capture tag: renders its contents as template, and stores them in value
+
+Syntax:
+{% capture trimmed as loremipsum %}
+<a href="{% url 'misago:terms_of_service' %}">{% trans "guidelines" %}</a>
+{% endcapture %} # renders block contents to context variable loremipsum
+"""
+
+from django import template
+from django.template import Context
+
+
+register = template.Library()
+SYNTAX_ERROR = 'capture tag syntax is "capture [trimmed] as [value]"'
+
+
+@register.tag()
+def capture(parser, token):
+    split_contents = token.split_contents()
+
+    if len(split_contents) == 4:
+        if split_contents[1] != 'trimmed' or split_contents[2].lower() != 'as':
+            raise template.TemplateSyntaxError(SYNTAX_ERROR)
+        is_trimmed = True
+        variable = split_contents[3]
+    elif len(split_contents) == 3:
+        if split_contents[1].lower() != 'as':
+            raise template.TemplateSyntaxError(SYNTAX_ERROR)
+        is_trimmed = False
+        variable = split_contents[2]
+    else:
+        raise template.TemplateSyntaxError(SYNTAX_ERROR)
+
+    nodelist = parser.parse(('endcapture',))
+    parser.delete_first_token()
+    return CaptureNode(variable, nodelist, trim=is_trimmed)
+
+
+class CaptureNode(template.Node):
+    def __init__(self, variable, nodelist, trim=False):
+        self.variable = variable
+        self.nodelist = nodelist
+        self.is_trimmed = trim
+
+    def render(self, context):
+        captured_output = self.nodelist.render(context)
+        if self.is_trimmed:
+            captured_output = captured_output.strip()
+        context[self.variable] = captured_output
+        return ''

+ 36 - 17
misago/core/tests/test_templatetags.py

@@ -3,6 +3,42 @@ from django.test import TestCase
 from misago.core import forms
 from misago.core import forms
 
 
 
 
+class CaptureTests(TestCase):
+    def setUp(self):
+        self.context = Context({'unsafe_name': 'The<hr>Html'})
+
+    def test_capture(self):
+        """capture content to variable"""
+        tpl_content = """
+{% load misago_capture %}
+
+{% capture as the_var %}
+{{ unsafe_name }}
+{% endcapture %}
+Hello, <b>{{ the_var|safe }}</b>
+"""
+
+        tpl = Template(tpl_content)
+        render = tpl.render(self.context).strip()
+        self.assertIn('The&lt;hr&gt;Html', render)
+        self.assertNotIn('<b>The&lt;hr&gt;Html</b>', render)
+
+    def test_capture_trimmed(self):
+        """capture trimmed content to variable"""
+        tpl_content = """
+{% load misago_capture %}
+
+{% capture trimmed as the_var %}
+{{ unsafe_name }}
+{% endcapture %}
+Hello, <b>{{ the_var|safe }}</b>
+"""
+
+        tpl = Template(tpl_content)
+        render = tpl.render(self.context).strip()
+        self.assertIn('<b>The&lt;hr&gt;Html</b>', render)
+
+
 class TestForm(forms.Form):
 class TestForm(forms.Form):
     somefield = forms.CharField(label="Hello!", max_length=255)
     somefield = forms.CharField(label="Hello!", max_length=255)
 
 
@@ -89,20 +125,3 @@ class FormRowTests(TestCase):
         with self.assertRaises(TemplateSyntaxError):
         with self.assertRaises(TemplateSyntaxError):
             tpl = Template(tpl_content)
             tpl = Template(tpl_content)
             render = tpl.render(self.context).strip()
             render = tpl.render(self.context).strip()
-
-
-class FormInputTests(TestCase):
-    def setUp(self):
-        self.context = Context({'form': TestForm()})
-
-    def test_form_input(self):
-        """form_imput renders form field"""
-        tpl_content = """
-{% load misago_forms %}
-
-{% form_input form.somefield %}
-"""
-
-        tpl = Template(tpl_content)
-        render = tpl.render(self.context).strip()
-        self.assertIn('id_somefield', render)