diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-03-22 00:10:54 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-03-22 00:10:54 +0000 |
commit | d5f83e6918fc188c90afdd01f4adaaa40710a954 (patch) | |
tree | 8fe97391fed35987bff1e4463e71302b265970a8 /lib/mako/codegen.py | |
parent | 1cb9f21d79ce16bb6f99ec1c2b50a144ab1bcd96 (diff) | |
download | external_python_mako-d5f83e6918fc188c90afdd01f4adaaa40710a954.tar.gz external_python_mako-d5f83e6918fc188c90afdd01f4adaaa40710a954.tar.bz2 external_python_mako-d5f83e6918fc188c90afdd01f4adaaa40710a954.zip |
- added "bytestring passthru" mode, via `disable_unicode=True`
argument passed to Template or TemplateLookup. All
unicode-awareness and filtering is turned off, and template
modules are generated with the appropriate magic encoding
comment. In this mode, template expressions can only
receive raw bytestrings or Unicode objects which represent
straight ASCII, and render_unicode() may not be used.
[ticket:77] (courtesy anonymous guest)
Diffstat (limited to 'lib/mako/codegen.py')
-rw-r--r-- | lib/mako/codegen.py | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/lib/mako/codegen.py b/lib/mako/codegen.py index 523c3b0..acf5bf1 100644 --- a/lib/mako/codegen.py +++ b/lib/mako/codegen.py @@ -14,21 +14,27 @@ from mako import util, ast, parsetree, filters MAGIC_NUMBER = 2 -def compile(node, uri, filename=None, default_filters=None, buffer_filters=None, imports=None, source_encoding=None): +def compile(node, uri, filename=None, default_filters=None, buffer_filters=None, imports=None, source_encoding=None, generate_unicode=True): """generate module source code given a parsetree node, uri, and optional source filename""" - buf = util.FastEncodingBuffer() + + if generate_unicode: + buf = util.FastEncodingBuffer() # creates Unicode + else: + buf = util.StringIO() # returns whatever was passed in + printer = PythonPrinter(buf) - _GenerateRenderMethod(printer, _CompileContext(uri, filename, default_filters, buffer_filters, imports, source_encoding), node) + _GenerateRenderMethod(printer, _CompileContext(uri, filename, default_filters, buffer_filters, imports, source_encoding, generate_unicode), node) return buf.getvalue() class _CompileContext(object): - def __init__(self, uri, filename, default_filters, buffer_filters, imports, source_encoding): + def __init__(self, uri, filename, default_filters, buffer_filters, imports, source_encoding, generate_unicode): self.uri = uri self.filename = filename self.default_filters = default_filters self.buffer_filters = buffer_filters self.imports = imports self.source_encoding = source_encoding + self.generate_unicode = generate_unicode class _GenerateRenderMethod(object): """a template visitor object which generates the full module source for a template.""" @@ -110,6 +116,9 @@ class _GenerateRenderMethod(object): module_identifiers.declared = module_ident # module-level names, python code + if not self.compiler.generate_unicode and self.compiler.source_encoding: + self.printer.writeline("# -*- encoding:%s -*-" % self.compiler.source_encoding) + self.printer.writeline("from mako import runtime, filters, cache") self.printer.writeline("UNDEFINED = runtime.UNDEFINED") self.printer.writeline("_magic_number = %s" % repr(MAGIC_NUMBER)) @@ -159,7 +168,7 @@ class _GenerateRenderMethod(object): ) if buffered or filtered or cached: self.printer.writeline("context.push_buffer()") - + self.identifier_stack.append(self.compiler.identifiers.branch(self.node)) if not self.in_def and '**pageargs' in args: self.identifier_stack[-1].argument_declared.add('pageargs') @@ -424,8 +433,6 @@ class _GenerateRenderMethod(object): def locate_encode(name): if re.match(r'decode\..+', name): return "filters." + name - elif name == 'unicode': - return 'unicode' else: return filters.DEFAULT_ESCAPES.get(name, name) @@ -544,6 +551,7 @@ class _GenerateRenderMethod(object): ) self.write_variable_declares(body_identifiers) self.identifier_stack.append(body_identifiers) + for n in node.nodes: n.accept_visitor(self) self.identifier_stack.pop() @@ -563,7 +571,7 @@ class _GenerateRenderMethod(object): "try:") self.write_source_comment(node) self.printer.writelines( - "context.write(unicode(%s))" % node.attributes['expr'], + "context.write(%s)" % self.create_filter_callable([], node.attributes['expr'], True), "finally:", "context.caller_stack.nextcaller = None", None |