aboutsummaryrefslogtreecommitdiffstats
path: root/lib/mako/codegen.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-01-24 00:30:46 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-01-24 00:30:46 +0000
commitad3ddbb71c826844e4efef6f1181bee43422cab2 (patch)
tree2a2bf739aa1bef264601f8e7643b416e2df94729 /lib/mako/codegen.py
parent64c7ba7bad1c49ab2985760357144f2ef4d5d378 (diff)
downloadexternal_python_mako-ad3ddbb71c826844e4efef6f1181bee43422cab2.tar.gz
external_python_mako-ad3ddbb71c826844e4efef6f1181bee43422cab2.tar.bz2
external_python_mako-ad3ddbb71c826844e4efef6f1181bee43422cab2.zip
- "expression_filter" argument in <%page> applies only to expressions
- added "default_filters" argument to Template, TemplateLookup. applies only to expressions, gets prepended to "expression_filter" arg from <%page>. defaults to ["unicode"], so that all expressions get stringified into u'' by default (this is what Mako already does). By setting to [], expressions are passed through raw. - added "imports" argument to Template, TemplateLookup. so you can predefine a list of import statements at the top of the template. can be used in conjunction with default_filters.
Diffstat (limited to 'lib/mako/codegen.py')
-rw-r--r--lib/mako/codegen.py39
1 files changed, 27 insertions, 12 deletions
diff --git a/lib/mako/codegen.py b/lib/mako/codegen.py
index 95e1ba2..ba83f1b 100644
--- a/lib/mako/codegen.py
+++ b/lib/mako/codegen.py
@@ -14,17 +14,19 @@ from mako import util, ast, parsetree, filters
MAGIC_NUMBER = 1
-def compile(node, uri, filename=None):
+def compile(node, uri, filename=None, default_filters=None, imports=None):
"""generate module source code given a parsetree node, uri, and optional source filename"""
buf = util.FastEncodingBuffer()
printer = PythonPrinter(buf)
- _GenerateRenderMethod(printer, _CompileContext(uri, filename), node)
+ _GenerateRenderMethod(printer, _CompileContext(uri, filename, default_filters, imports), node)
return buf.getvalue()
class _CompileContext(object):
- def __init__(self, uri, filename):
+ def __init__(self, uri, filename, default_filters, imports):
self.uri = uri
self.filename = filename
+ self.default_filters = default_filters
+ self.imports = imports
class _GenerateRenderMethod(object):
"""a template visitor object which generates the full module source for a template."""
@@ -113,10 +115,21 @@ class _GenerateRenderMethod(object):
self.printer.writeline("_template_filename=%s" % repr(self.compiler.filename))
self.printer.writeline("_template_uri=%s" % repr(self.compiler.uri))
self.printer.writeline("_template_cache=cache.Cache(__name__, _modified_time)")
+ if self.compiler.imports:
+ buf = ''
+ for imp in self.compiler.imports:
+ buf += imp + "\n"
+ self.printer.writeline(imp)
+ impcode = ast.PythonCode(buf, 0, 0, 'template defined imports')
+ else:
+ impcode = None
main_identifiers = module_identifiers.branch(self.node)
module_identifiers.topleveldefs = module_identifiers.topleveldefs.union(main_identifiers.topleveldefs)
[module_identifiers.declared.add(x) for x in ["UNDEFINED"]]
+ if impcode:
+ [module_identifiers.declared.add(x) for x in impcode.declared_identifiers]
+
self.compiler.identifiers = module_identifiers
self.printer.writeline("_exports = %s" % repr([n.name for n in main_identifiers.topleveldefs.values()]))
self.printer.write("\n\n")
@@ -331,7 +344,7 @@ class _GenerateRenderMethod(object):
self.printer.writeline("_buf = context.pop_buffer()")
s = "_buf.getvalue()"
if filtered:
- s = self.create_filter_callable(node.filter_args.args, s)
+ s = self.create_filter_callable(node.filter_args.args, s, False)
self.printer.writeline(None)
if buffered or cached:
self.printer.writeline("return %s" % s)
@@ -376,13 +389,15 @@ class _GenerateRenderMethod(object):
None
)
- def create_filter_callable(self, args, target):
+ def create_filter_callable(self, args, target, is_expression):
"""write a filter-applying expression based on the filters present in the given
filter names, adjusting for the global 'default' filter aliases as needed."""
- d = dict([(k, "filters." + v.func_name) for k, v in filters.DEFAULT_ESCAPES.iteritems()])
+ d = dict([(k, (v is unicode and 'unicode' or "filters." + v.func_name)) for k, v in filters.DEFAULT_ESCAPES.iteritems()])
- if self.compiler.pagetag:
- args += self.compiler.pagetag.filter_args.args
+ if is_expression and self.compiler.pagetag:
+ args = self.compiler.pagetag.filter_args.args + args
+ if is_expression and self.compiler.default_filters:
+ args = self.compiler.default_filters + args
for e in args:
# if filter given as a function, get just the identifier portion
m = re.match(r'(.+?)(\(.*\))', e)
@@ -397,11 +412,11 @@ class _GenerateRenderMethod(object):
def visitExpression(self, node):
self.write_source_comment(node)
- if len(node.escapes) or (self.compiler.pagetag is not None and len(self.compiler.pagetag.filter_args.args)):
- s = self.create_filter_callable(node.escapes_code.args, "unicode(%s)" % node.text)
+ if len(node.escapes) or (self.compiler.pagetag is not None and len(self.compiler.pagetag.filter_args.args)) or len(self.compiler.default_filters):
+ s = self.create_filter_callable(node.escapes_code.args, "%s" % node.text, True)
self.printer.writeline("context.write(%s)" % s)
else:
- self.printer.writeline("context.write(unicode(%s))" % node.text)
+ self.printer.writeline("context.write(%s)" % node.text)
def visitControlLine(self, node):
if node.isend:
@@ -425,7 +440,7 @@ class _GenerateRenderMethod(object):
self.printer.writelines(
"finally:",
"_buf = context.pop_buffer()",
- "context.write(%s)" % self.create_filter_callable(node.filter_args.args, "_buf.getvalue()"),
+ "context.write(%s)" % self.create_filter_callable(node.filter_args.args, "_buf.getvalue()", False),
None
)