Skip to content

Commit 02ce53b

Browse files
committed
Add the ability to escape template commands with {{! and {%!
1 parent 4264418 commit 02ce53b

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

tornado/template.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,15 @@ def _parse(reader, template, in_block=None):
543543
start_brace = reader.consume(2)
544544
line = reader.line
545545

546+
# Template directives may be escaped as "{{!" or "{%!".
547+
# In this case output the braces and consume the "!".
548+
# This is especially useful in conjunction with jquery templates,
549+
# which also use double braces.
550+
if reader.remaining() and reader[0] == "!":
551+
reader.consume(1)
552+
body.chunks.append(_Text(start_brace))
553+
continue
554+
546555
# Expression
547556
if start_brace == "{{":
548557
end = reader.find("}}")

tornado/test/template_test.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from tornado.escape import utf8, native_str
2-
from tornado.template import Template, DictLoader
2+
from tornado.template import Template, DictLoader, ParseError
33
from tornado.testing import LogTrapTestCase
44
from tornado.util import b, bytes_type
55

@@ -50,6 +50,15 @@ def test_relative_load(self):
5050
self.assertEqual(loader.load("a/1.html").generate(),
5151
b("ok"))
5252

53+
def test_escaping(self):
54+
self.assertRaises(ParseError, lambda: Template("{{"))
55+
self.assertRaises(ParseError, lambda: Template("{%"))
56+
self.assertEqual(Template("{{!").generate(), b("{{"))
57+
self.assertEqual(Template("{%!").generate(), b("{%"))
58+
self.assertEqual(Template("{{ 'expr' }} {{!jquery expr}}").generate(),
59+
b("expr {{jquery expr}}"))
60+
61+
5362
class AutoEscapeTest(LogTrapTestCase):
5463
def setUp(self):
5564
self.templates = {

0 commit comments

Comments
 (0)