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))" %
return body
elif operator in ("extends", "include", "set", "import", "from",
- "comment", "autoescape"):
+ "comment", "autoescape", "raw"):
if operator == "comment":
continue
if operator == "extends":
if fn == "None": fn = None
template.autoescape = fn
continue
+ elif operator == "raw":
+ block = _Expression(suffix, raw=True)
body.chunks.append(block)
continue
{% 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):
b("base: <script>"))
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: <>&"\n"
+ "raw: <>&\""))