import re
from tornado import escape
+from tornado.util import bytes_type
class Template(object):
"""A compiled template.
"squeeze": escape.squeeze,
"linkify": escape.linkify,
"datetime": datetime,
+ "_utf8": escape.utf8, # for internal use
+ "_string_types": (unicode, bytes_type),
}
namespace.update(kwargs)
exec self.compiled in namespace
with writer.indent():
writer.write_line("_buffer = []")
self.body.generate(writer)
- writer.write_line("return ''.join(_buffer)")
+ writer.write_line("return _utf8('').join(_buffer)")
def each_child(self):
return (self.body,)
with writer.indent():
writer.write_line("_buffer = []")
self.body.generate(writer)
- writer.write_line("return ''.join(_buffer)")
+ writer.write_line("return _utf8('').join(_buffer)")
writer.write_line("_buffer.append(%s(%s()))" % (
self.method, method_name))
def generate(self, writer):
writer.write_line("_tmp = %s" % self.expression)
- writer.write_line("if isinstance(_tmp, str): _buffer.append(_tmp)")
- writer.write_line("elif isinstance(_tmp, unicode): "
- "_buffer.append(_tmp.encode('utf-8'))")
- writer.write_line("else: _buffer.append(str(_tmp))")
+ writer.write_line("if isinstance(_tmp, _string_types):"
+ " _buffer.append(_utf8(_tmp))")
+ writer.write_line("else: _buffer.append(_utf8(str(_tmp)))")
class _Text(_Node):
value = re.sub(r"(\s*\n\s*)", "\n", value)
if value:
- writer.write_line('_buffer.append(%r)' % value)
+ writer.write_line('_buffer.append(%r)' % escape.utf8(value))
class ParseError(Exception):
+from tornado.escape import utf8
from tornado.template import Template, DictLoader
from tornado.testing import LogTrapTestCase
+from tornado.util import b
class TemplateTest(LogTrapTestCase):
def test_simple(self):
template = Template("Hello {{ name }}!")
self.assertEqual(template.generate(name="Ben"),
- "Hello Ben!")
+ b("Hello Ben!"))
+
+ def test_bytes(self):
+ template = Template("Hello {{ name }}!")
+ self.assertEqual(template.generate(name=utf8("Ben")),
+ b("Hello Ben!"))
+
+ def test_expressions(self):
+ template = Template("2 + 2 = {{ 2 + 2 }}")
+ self.assertEqual(template.generate(), b("2 + 2 = 4"))
def test_include(self):
loader = DictLoader({
"header.html": "header text",
})
self.assertEqual(loader.load("index.html").generate(),
- "header text\nbody text")
+ b("header text\nbody text"))
def test_extends(self):
loader = DictLoader({
""",
})
self.assertEqual(loader.load("page.html").generate(),
- "<title>page title</title>\n<body>page body</body>\n")
+ b("<title>page title</title>\n<body>page body</body>\n"))