예제 #1
0
 def __init__(self, keyword, attributes, **kwargs):
     super(CallTag, self).__init__(keyword, attributes, ('args'),
                                   ('expr', ), ('expr', ), **kwargs)
     self.expression = attributes['expr']
     self.code = ast.PythonCode(self.expression, **self.exception_kwargs)
     self.body_decl = ast.FunctionArgs(attributes.get('args', ''),
                                       **self.exception_kwargs)
예제 #2
0
 def __init__(self, keyword, attributes, **kwargs):
     super(IncludeTag,
           self).__init__(keyword, attributes, ('file', 'import', 'args'),
                          (), ('file', ), **kwargs)
     self.page_args = ast.PythonCode(
         "__DUMMY(%s)" % attributes.get('args', ''),
         **self.exception_kwargs)
예제 #3
0
 def undeclared_identifiers(self):
     res = []
     for c in self.function_decl.defaults:
         res += list(
             ast.PythonCode(c,
                            **self.exception_kwargs).undeclared_identifiers)
     return set(res).union(
         self.filter_args.undeclared_identifiers.difference(
             filters.DEFAULT_ESCAPES.keys())).union(
                 self.expression_undeclared_identifiers).difference(
                     self.function_decl.allargnames)
예제 #4
0
    def __init__(self, namespace, defname, attributes, **kwargs):
        super(CallNamespaceTag,
              self).__init__(namespace + ":" + defname, attributes,
                             tuple(attributes.keys()) + ('args', ), (), (),
                             **kwargs)

        self.expression = "%s.%s(%s)" % (namespace, defname, ",".join([
            "%s=%s" % (k, v)
            for k, v in self.parsed_attributes.items() if k != 'args'
        ]))
        self.code = ast.PythonCode(self.expression, **self.exception_kwargs)
        self.body_decl = ast.FunctionArgs(attributes.get('args', ''),
                                          **self.exception_kwargs)
예제 #5
0
 def _parse_attributes(self, expressions, nonexpressions):
     undeclared_identifiers = set()
     self.parsed_attributes = {}
     for key in self.attributes:
         if key in expressions:
             expr = []
             for x in re.compile(r'(\${.+?})',
                                 re.S).split(self.attributes[key]):
                 m = re.compile(r'^\${(.+?)}$', re.S).match(x)
                 if m:
                     code = ast.PythonCode(m.group(1).rstrip(),
                                           **self.exception_kwargs)
                     # we aren't discarding "declared_identifiers" here,
                     # which we do so that list comprehension-declared
                     # variables aren't counted.   As yet can't find a
                     # condition that requires it here.
                     undeclared_identifiers = \
                         undeclared_identifiers.union(
                             code.undeclared_identifiers)
                     expr.append('(%s)' % m.group(1))
                 else:
                     if x:
                         expr.append(repr(x))
             self.parsed_attributes[key] = " + ".join(expr) or repr('')
         elif key in nonexpressions:
             if re.search(r'\${.+?}', self.attributes[key]):
                 raise exceptions.CompileException(
                     "Attibute '%s' in tag '%s' does not allow embedded "
                     "expressions" % (key, self.keyword),
                     **self.exception_kwargs)
             self.parsed_attributes[key] = repr(self.attributes[key])
         else:
             raise exceptions.CompileException(
                 "Invalid attribute for tag '%s': '%s'" %
                 (self.keyword, key),
                 **self.exception_kwargs)
     self.expression_undeclared_identifiers = undeclared_identifiers
예제 #6
0
    def write_toplevel(self):
        """Traverse a template structure for module-level directives and
        generate the start of module-level code.

        """
        inherit = []
        namespaces = {}
        module_code = []

        self.compiler.pagetag = None

        class FindTopLevel(object):
            def visitInheritTag(s, node):
                inherit.append(node)

            def visitNamespaceTag(s, node):
                namespaces[node.name] = node

            def visitPageTag(s, node):
                self.compiler.pagetag = node

            def visitCode(s, node):
                if node.ismodule:
                    module_code.append(node)

        f = FindTopLevel()
        for n in self.node.nodes:
            n.accept_visitor(f)

        self.compiler.namespaces = namespaces

        module_ident = set()
        for n in module_code:
            module_ident = module_ident.union(n.declared_identifiers())

        module_identifiers = _Identifiers(self.compiler)
        module_identifiers.declared = module_ident

        # module-level names, python code
        if self.compiler.generate_magic_comment and \
                self.compiler.source_encoding:
            self.printer.writeline("# -*- coding:%s -*-" %
                                   self.compiler.source_encoding)

        if self.compiler.future_imports:
            self.printer.writeline("from __future__ import %s" %
                                   (", ".join(self.compiler.future_imports), ))
        self.printer.writeline(
            "from docassemble.base.mako import runtime, filters, cache")
        self.printer.writeline("UNDEFINED = runtime.UNDEFINED")
        self.printer.writeline("STOP_RENDERING = runtime.STOP_RENDERING")
        self.printer.writeline("__M_dict_builtin = dict")
        self.printer.writeline("__M_locals_builtin = locals")
        self.printer.writeline("_magic_number = %r" % MAGIC_NUMBER)
        self.printer.writeline("_modified_time = %r" % time.time())
        self.printer.writeline("_enable_loop = %r" % self.compiler.enable_loop)
        self.printer.writeline("_template_filename = %r" %
                               self.compiler.filename)
        self.printer.writeline("_template_uri = %r" % self.compiler.uri)
        self.printer.writeline("_source_encoding = %r" %
                               self.compiler.source_encoding)
        if self.compiler.imports:
            buf = ''
            for imp in self.compiler.imports:
                buf += imp + "\n"
                self.printer.writeline(imp)
            impcode = ast.PythonCode(buf,
                                     source='',
                                     lineno=0,
                                     pos=0,
                                     filename='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.update(TOPLEVEL_DECLARED)
        if impcode:
            module_identifiers.declared.update(impcode.declared_identifiers)

        self.compiler.identifiers = module_identifiers
        self.printer.writeline(
            "_exports = %r" %
            [n.name for n in main_identifiers.topleveldefs.values()])
        self.printer.write_blanks(2)

        if len(module_code):
            self.write_module_code(module_code)

        if len(inherit):
            self.write_namespaces(namespaces)
            self.write_inherit(inherit[-1])
        elif len(namespaces):
            self.write_namespaces(namespaces)

        return list(main_identifiers.topleveldefs.values())
예제 #7
0
 def __init__(self, text, escapes, **kwargs):
     super(Expression, self).__init__(**kwargs)
     self.text = text
     self.escapes = escapes
     self.escapes_code = ast.ArgumentList(escapes, **self.exception_kwargs)
     self.code = ast.PythonCode(text, **self.exception_kwargs)
예제 #8
0
 def __init__(self, text, ismodule, **kwargs):
     super(Code, self).__init__(**kwargs)
     self.text = text
     self.ismodule = ismodule
     self.code = ast.PythonCode(text, **self.exception_kwargs)