]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Add the ability to escape template commands with {{! and {%!
authorBen Darnell <ben@bendarnell.com>
Wed, 8 Jun 2011 06:27:05 +0000 (23:27 -0700)
committerBen Darnell <ben@bendarnell.com>
Wed, 8 Jun 2011 06:27:05 +0000 (23:27 -0700)
tornado/template.py
tornado/test/template_test.py

index dded819a0272e3b7e8b1a4fca8d482c7b410b6fa..648621ed05c965ce9f07591a96075f7367034768 100644 (file)
@@ -543,6 +543,15 @@ def _parse(reader, template, in_block=None):
         start_brace = reader.consume(2)
         line = reader.line
 
+        # Template directives may be escaped as "{{!" or "{%!".
+        # In this case output the braces and consume the "!".
+        # This is especially useful in conjunction with jquery templates,
+        # which also use double braces.
+        if reader.remaining() and reader[0] == "!":
+            reader.consume(1)
+            body.chunks.append(_Text(start_brace))
+            continue
+
         # Expression
         if start_brace == "{{":
             end = reader.find("}}")
index cff4de36050982edaed3b03f077a035e5054ed12..037e3625c6dedd69a3a30ec817732ffc438dfddf 100644 (file)
@@ -1,5 +1,5 @@
 from tornado.escape import utf8, native_str
-from tornado.template import Template, DictLoader
+from tornado.template import Template, DictLoader, ParseError
 from tornado.testing import LogTrapTestCase
 from tornado.util import b, bytes_type
 
@@ -50,6 +50,15 @@ class TemplateTest(LogTrapTestCase):
         self.assertEqual(loader.load("a/1.html").generate(),
                          b("ok"))
 
+    def test_escaping(self):
+        self.assertRaises(ParseError, lambda: Template("{{"))
+        self.assertRaises(ParseError, lambda: Template("{%"))
+        self.assertEqual(Template("{{!").generate(), b("{{"))
+        self.assertEqual(Template("{%!").generate(), b("{%"))
+        self.assertEqual(Template("{{ 'expr' }} {{!jquery expr}}").generate(),
+                         b("expr {{jquery expr}}"))
+        
+
 class AutoEscapeTest(LogTrapTestCase):
     def setUp(self):
         self.templates = {