Add raw expressions to templates with {% raw [expr] %}

This commit is contained in:
Ben Darnell 2011-05-30 18:51:31 -07:00
parent 708cd9e34a
commit ebe191e1bf
2 changed files with 18 additions and 3 deletions

View 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

View 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: <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: &lt;&gt;&amp;&quot;\n"
"raw: <>&\""))