diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-01-24 00:30:46 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-01-24 00:30:46 +0000 |
commit | ad3ddbb71c826844e4efef6f1181bee43422cab2 (patch) | |
tree | 2a2bf739aa1bef264601f8e7643b416e2df94729 /lib/mako/codegen.py | |
parent | 64c7ba7bad1c49ab2985760357144f2ef4d5d378 (diff) | |
download | external_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.py | 39 |
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 ) |