]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Add raw expressions to templates with {% raw [expr] %}
authorBen Darnell <ben@bendarnell.com>
Tue, 31 May 2011 01:51:31 +0000 (18:51 -0700)
committerBen Darnell <ben@bendarnell.com>
Tue, 31 May 2011 01:51:31 +0000 (18:51 -0700)
tornado/template.py
tornado/test/template_test.py

index ee4cc9a621e2326d0c9f63f52e4c7affe81c0277..d83ffa3f14570b4ca15da5d55e33a9324d40fb79 100644 (file)
@@ -372,15 +372,16 @@ class _Statement(_Node):
 
 
 class _Expression(_Node):
-    def __init__(self, expression):
+    def __init__(self, expression, raw=False):
         self.expression = expression
+        self.raw = raw
 
     def generate(self, writer):
         writer.write_line("_tmp = %s" % self.expression)
         writer.write_line("if isinstance(_tmp, _string_types):"
                           " _tmp = _utf8(_tmp)")
         writer.write_line("else: _tmp = _utf8(str(_tmp))")
-        if writer.current_template.autoescape is not None:
+        if not self.raw and writer.current_template.autoescape is not None:
             # In python3 functions like xhtml_escape return unicode,
             # so we have to convert to utf8 again.
             writer.write_line("_tmp = _utf8(%s(_tmp))" %
@@ -587,7 +588,7 @@ def _parse(reader, template, in_block=None):
             return body
 
         elif operator in ("extends", "include", "set", "import", "from",
-                          "comment", "autoescape"):
+                          "comment", "autoescape", "raw"):
             if operator == "comment":
                 continue
             if operator == "extends":
@@ -613,6 +614,8 @@ def _parse(reader, template, in_block=None):
                 if fn == "None": fn = None
                 template.autoescape = fn
                 continue
+            elif operator == "raw":
+                block = _Expression(suffix, raw=True)
             body.chunks.append(block)
             continue
 
index a7cef48e954c934b5bd62bf0247af214297a3d52..ea6b5c34fcbcca68c742b9b0eaaedcb046bcbe57 100644 (file)
@@ -86,6 +86,11 @@ default: {% include 'default.html' %}
 {% autoescape None %}\
 {% extends "escaped_block.html" %}\
 {% block name %}extended: {{ name }}{% end %}""",
+
+            "raw_expression.html": """\
+{% autoescape xhtml_escape %}\
+expr: {{ name }}
+raw: {% raw name %}""",
             }
     
     def test_default_off(self):
@@ -138,3 +143,10 @@ default: {% include 'default.html' %}
                          b("base: &lt;script&gt;"))
         self.assertEqual(render("unescaped_overrides_escaped.html"),
                          b("extended: <script>"))
+
+    def test_raw_expression(self):
+        loader = DictLoader(self.templates)
+        def render(name): return loader.load(name).generate(name='<>&"')
+        self.assertEqual(render("raw_expression.html"),
+                         b("expr: &lt;&gt;&amp;&quot;\n"
+                           "raw: <>&\""))