Ejemplo n.º 1
0
 def genCode(self, indent, codeout, tagreg, tag):
     DTCompilerUtil.tagDebug(indent, codeout, tag)
     pargs=args=DTUtil.tagCall(tag, ['name', 'value'])
     args=DTCompilerUtil.pyifyArgs(tag, args)
     name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                     pargs['name'])
     codeout.write(indent, '%s = (%s)' % (name, args['value']))
Ejemplo n.º 2
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        args = DTUtil.tagCall(tag, [
            'expr',
            ('fmt', 'None'),
        ])
        #expr = args['expr']
        args = DTCompilerUtil.pyifyArgs(tag, args)
        expr = args['expr']
        #if len(expr)>1 and expr[0]==expr[-1]=='`':
        #    expr=expr[1:-1]
        #elif len(expr)>1 and expr[0]==expr[-1]=='"':
        #    expr=expr[1:-1]
        #elif len(expr)>1 and expr[0]==expr[-1]=="'":
        #    expr=expr[1:-1]
        #else:
        #    pass #expr=exrepr(expr)

        codeout.write(indent, '__t.val = %s' % expr)

        codeout.write(indent, 'if __t.val is None:')
        codeout.write(indent + 4, '__t.val = ""')
        codeout.write(indent, 'else:')
        codeout.write(indent + 4, '__t.val = str(__t.val)')
        if args['fmt'] and args['fmt'][1:-1] not in \
     ('None', 'plain', 'plaintext'):
            codeout.write(
                indent, '__t.val=__h.VALFMTRGY.get(%s, lambda x: x)(__t.val)' %
                args['fmt'])
        codeout.write(indent, '__h.OUTPUT.write(__t.val)')
        codeout.write(indent, 'del __t.val')
Ejemplo n.º 3
0
 def genCode ( self, indent, codeout, tagreg, tag ):
     """
     If we got here, we're out of context
     """
     DTCompilerUtil.tagDebug ( indent, codeout, tag )
     DTExcept.raiseRuntime ( codeout, indent, 
                      '<:%s:> tag out of context' % self.tagname )
Ejemplo n.º 4
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        args=DTUtil.tagCall ( tag, ['expr',
                                  ('fmt', 'None'),
                                   ] )
        #expr = args['expr']
        args=DTCompilerUtil.pyifyArgs(tag, args)
        expr = args['expr']
        #if len(expr)>1 and expr[0]==expr[-1]=='`':
        #    expr=expr[1:-1]
        #elif len(expr)>1 and expr[0]==expr[-1]=='"':
        #    expr=expr[1:-1]
        #elif len(expr)>1 and expr[0]==expr[-1]=="'":
        #    expr=expr[1:-1]
        #else:
        #    pass #expr=exrepr(expr)
        
        codeout.write(indent, '__t.val = %s' % expr)

        codeout.write(indent, 'if __t.val is None:')
        codeout.write(indent+4, '__t.val = ""')
        codeout.write(indent, 'else:')
        codeout.write(indent+4, '__t.val = str(__t.val)')
        if args['fmt'] and args['fmt'][1:-1] not in \
	    ('None', 'plain', 'plaintext'):
            codeout.write(indent, 
                         '__t.val=__h.VALFMTRGY.get(%s, lambda x: x)(__t.val)'
                          % args['fmt'])
        codeout.write(indent, '__h.OUTPUT.write(__t.val)')
        codeout.write(indent, 'del __t.val')
Ejemplo n.º 5
0
 def genCode(self, indent, codeout, tagreg, tag):
     """
     If we got here, we're out of context
     """
     DTCompilerUtil.tagDebug(indent, codeout, tag)
     DTExcept.raiseRuntime(codeout, indent,
                           '<:%s:> tag out of context' % self.tagname)
Ejemplo n.º 6
0
 def genCode(self, indent, codeout, tagreg, tag):
     DTCompilerUtil.tagDebug(indent, codeout, tag)
     pargs = args = DTUtil.tagCall(tag, ['name', 'value'])
     args = DTCompilerUtil.pyifyArgs(tag, args)
     name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                     pargs['name'])
     codeout.write(indent, '%s = (%s)' % (name, args['value']))
Ejemplo n.º 7
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        whiletag = node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, whiletag)
        args = DTUtil.tagCall(whiletag, ['expr'])
        args = DTCompilerUtil.pyifyArgs(whiletag, args)

        codeout.write ( indent, 'while (%s):' % args['expr'])
        for i in node.children[1:-1]:
            # Just generate the code
            DTCompilerUtil.genCodeChild ( indent + 4, codeout, tagreg, i, meta)
Ejemplo n.º 8
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        whiletag = node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, whiletag)
        args = DTUtil.tagCall(whiletag, ['expr'])
        args = DTCompilerUtil.pyifyArgs(whiletag, args)

        codeout.write(indent, 'while (%s):' % args['expr'])
        for i in node.children[1:-1]:
            # Just generate the code
            DTCompilerUtil.genCodeChild(indent + 4, codeout, tagreg, i, meta)
Ejemplo n.º 9
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        tag = node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        pargs = args = DTUtil.tagCall(tag,
                                      ['expr', ('name', '"sequence_item"')])
        args = DTCompilerUtil.pyifyArgs(tag, args)

        name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                        pargs['name'])
        exprval = DTCompilerUtil.getTempName()

        codeout.write(indent, '%s = %s' % (exprval, args['expr']))
        codeout.write(indent, 'if %s:' % exprval)
        codeout.write(indent + 4, 'for %s in %s:' % (name, exprval))
        #do main loop shit
        for i in node.children[1:-1]:
            if (type(i) == InstanceType and i.__class__ == DTLexer.DTToken
                    and i.tagname == 'else'):
                break
            else:
                DTCompilerUtil.genCodeChild(indent + 8, codeout, tagreg, i,
                                            meta)
        codeout.write(indent, 'else:')
        codeout.write(indent + 4, 'pass')
        #do else clause
        on = 0
        for i in node.children[1:-1]:
            if (type(i) == InstanceType and i.__class__ == DTLexer.DTToken
                    and i.tagname == 'else'):
                on = 1
            elif on:
                DTCompilerUtil.genCodeChild(indent + 4, codeout, tagreg, i,
                                            meta)
        codeout.write(indent, 'del %s' % exprval)
Ejemplo n.º 10
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        tag=node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        pargs=args=DTUtil.tagCall(tag, ['expr', ('name','"sequence_item"')])
        args=DTCompilerUtil.pyifyArgs(tag, args)

        name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                        pargs['name'])
        exprval=DTCompilerUtil.getTempName()

        codeout.write(indent, '%s = %s' % (exprval, args['expr']))
        codeout.write(indent, 'if %s:' % exprval)
        codeout.write(indent+4, 'for %s in %s:' % (name, exprval))
        #do main loop shit
        for i in node.children[1:-1]:
            if (type(i) == InstanceType
                and i.__class__ == DTLexer.DTToken
                and i.tagname == 'else'):
                break
            else:
                DTCompilerUtil.genCodeChild(indent+8, codeout, tagreg, i, meta)
        codeout.write(indent, 'else:')
        codeout.write(indent+4, 'pass')
        #do else clause
        on=0
        for i in node.children[1:-1]:
            if (type(i) == InstanceType
                and i.__class__ == DTLexer.DTToken
                and i.tagname == 'else'):
                on=1
            elif on:
                DTCompilerUtil.genCodeChild(indent+4, codeout, tagreg, i, meta)
        codeout.write(indent, 'del %s' % exprval)
Ejemplo n.º 11
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        args = DTUtil.tagCall(tag, ['expr', ('valTrue', self._def_true), 
                                            ('valFalse', self._def_false)],)
        args = DTCompilerUtil.pyifyArgs(tag, args)

        # Ok, write out the stuff
        codeout.write ( indent, 'if %s:' % args['expr'] )
        codeout.write ( indent+4, '__h.OUTPUT.write ( %s )' % args['valTrue'] )
        codeout.write ( indent, 'else:' )
        codeout.write ( indent+4, '__h.OUTPUT.write ( %s )' % args['valFalse'] )
Ejemplo n.º 12
0
 def genCode(self, indent, codeout, tagreg, tag):
     DTCompilerUtil.tagDebug(indent, codeout, tag)
     pargs=args=DTUtil.tagCall(tag, ['name', ('value', '""')])
     args=DTCompilerUtil.pyifyArgs(tag, args)
     name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                     pargs['name'])
     codeout.write(indent, 'try:')
     codeout.write(indent+4, '%s' % name)
     codeout.write(indent, 'except (NameError, AttributeError):')
     codeout.write(indent+4, '%s = %s' % (name, args['value']))
     codeout.write(indent, 'else:')
     codeout.write(indent+4, 'if %s is None:' % name)
     codeout.write(indent+8, '%s = %s' % (name, args['value']))
Ejemplo n.º 13
0
 def genCode(self, indent, codeout, tagreg, tag):
     DTCompilerUtil.tagDebug(indent, codeout, tag)
     pargs = args = DTUtil.tagCall(tag, ['name', ('value', '""')])
     args = DTCompilerUtil.pyifyArgs(tag, args)
     name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                     pargs['name'])
     codeout.write(indent, 'try:')
     codeout.write(indent + 4, '%s' % name)
     codeout.write(indent, 'except (NameError, AttributeError):')
     codeout.write(indent + 4, '%s = %s' % (name, args['value']))
     codeout.write(indent, 'else:')
     codeout.write(indent + 4, 'if %s is None:' % name)
     codeout.write(indent + 8, '%s = %s' % (name, args['value']))
Ejemplo n.º 14
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        iftag = node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, iftag)
        args = DTUtil.tagCall(iftag, ['expr'])
        args = DTCompilerUtil.pyifyArgs(iftag, args)

        codeout.write(indent, 'if (%s):' % args['expr'])
        for i in node.children[1:-1]:
            #if not an else or elif tag and on is true, render the child
            if (type(i) != InstanceType or i.__class__ != DTLexer.DTToken
                    or i.tagname not in ('else', 'elif')):
                DTCompilerUtil.genCodeChild(indent + 4, codeout, tagreg, i,
                                            meta)
            else:
                if i.tagname == 'elif':
                    #
                    # XXX has to move to the elif tag genCode()!
                    #
                    args = DTUtil.tagCall(i, ['expr'])
                    args = DTCompilerUtil.pyifyArgs(i, args)

                    codeout.write(indent, 'elif (%s):' % (args['expr']))
                    # XXX kind of sucks to do this after the elif statement
                    DTCompilerUtil.tagDebug(indent + 4, codeout, i)
                    codeout.write(indent + 4, 'pass')
                else:  #tagname is else
                    codeout.write(indent, 'else:')
                    codeout.write(indent + 4, 'pass')
Ejemplo n.º 15
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        iftag = node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, iftag)
        args = DTUtil.tagCall(iftag, ['expr'])
        args = DTCompilerUtil.pyifyArgs(iftag, args)

        codeout.write ( indent, 'if (%s):' % args['expr'])
        for i in node.children[1:-1]:
            #if not an else or elif tag and on is true, render the child
            if (type(i) != InstanceType or i.__class__ != DTLexer.DTToken
                or i.tagname not in ('else', 'elif')):
                DTCompilerUtil.genCodeChild ( indent + 4, codeout, tagreg, i,
                                              meta )
            else:
                if i.tagname == 'elif':
                    #
                    # XXX has to move to the elif tag genCode()!
                    #
                    args=DTUtil.tagCall ( i, ['expr'] )
                    args=DTCompilerUtil.pyifyArgs(i, args)
                    
                    codeout.write(indent, 'elif (%s):' % (args['expr']))
                    # XXX kind of sucks to do this after the elif statement
                    DTCompilerUtil.tagDebug(indent + 4, codeout, i)
                    codeout.write(indent+4, 'pass' )
                else: #tagname is else
                    codeout.write(indent, 'else:')
                    codeout.write(indent+4, 'pass')
Ejemplo n.º 16
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        args = DTUtil.tagCall(
            tag,
            [
                'expr', ('valTrue', self._def_true),
                ('valFalse', self._def_false)
            ],
        )
        args = DTCompilerUtil.pyifyArgs(tag, args)

        # Ok, write out the stuff
        codeout.write(indent, 'if %s:' % args['expr'])
        codeout.write(indent + 4, '__h.OUTPUT.write ( %s )' % args['valTrue'])
        codeout.write(indent, 'else:')
        codeout.write(indent + 4, '__h.OUTPUT.write ( %s )' % args['valFalse'])
Ejemplo n.º 17
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        args = DTUtil.tagCall(tag, [('exc', None)])
        args = DTCompilerUtil.pyifyArgs(tag, args)
        tvar = DTCompilerUtil.getTempName()

        # Just do a regular python raise - you should know to raise instances
        #
        # <:raise MyExcept('hello'):> works
        # <:raise MyExcept, 'hello':> doesn't
        # <:raise 'string exception':> works
        # <:raise:> by itself now re-raises exception properly
        if args['exc'] is None:
            codeout.write(indent, 'import sys')
            codeout.write(indent, 'raise')
        else:
            codeout.write(indent, 'raise (%s)' % args['exc'])
Ejemplo n.º 18
0
    def genCode ( self, indent, codeout, tagreg, tag ):
        DTCompilerUtil.tagDebug ( indent, codeout, tag )
        args=DTUtil.tagCall ( tag, [('exc', None)] )
        args=DTCompilerUtil.pyifyArgs(tag, args)
        tvar=DTCompilerUtil.getTempName()
        
        # Just do a regular python raise - you should know to raise instances
        # 
        # <:raise MyExcept('hello'):> works
        # <:raise MyExcept, 'hello':> doesn't
        # <:raise 'string exception':> works
	# <:raise:> by itself now re-raises exception properly
	if args['exc'] is None:
            codeout.write ( indent, 'import sys' )
            codeout.write ( indent, 'raise' )
	else:
            codeout.write ( indent, 'raise (%s)' % args['exc'] )
Ejemplo n.º 19
0
    def genCode ( self, indent, codeout, tagreg, node, meta):
        tag = node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        tagargs=['name']
        if self._attend_to_comments:
            tagargs.append(('comments', None))
        pargs = args = DTUtil.tagCall(tag, tagargs)
        args = DTCompilerUtil.pyifyArgs(tag, args)
        if self._attend_to_comments and args['comments'] is not None:
            self._testCommentLevel(indent, codeout, args['comments'])
            stuff=self._pushCommentLevel(indent, codeout, args['comments'])

        name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                        pargs['name'])
        
        oldout = DTCompilerUtil.getTempName()
        codeout.write(indent, '%s = __h.OUTPUT' % oldout)
        codeout.write(indent, '__h.OUTPUT=__h.NEWOUTPUT()')
        for i in node.children[1:-1]:
            DTCompilerUtil.genCodeChild(indent, codeout, tagreg, i, meta)
        codeout.write(indent, '%s = __h.OUTPUT.getvalue()' % name)
        codeout.write(indent, '__h.OUTPUT = %s' % oldout)
        codeout.write(indent, 'del %s' % oldout)
        if self._attend_to_comments and args['comments'] is not None:
            self._popCommentLevel(indent, codeout, *stuff)
Ejemplo n.º 20
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        tag = node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        tagargs = ['name']
        if self._attend_to_comments:
            tagargs.append(('comments', None))
        pargs = args = DTUtil.tagCall(tag, tagargs)
        args = DTCompilerUtil.pyifyArgs(tag, args)
        if self._attend_to_comments and args['comments'] is not None:
            self._testCommentLevel(indent, codeout, args['comments'])
            stuff = self._pushCommentLevel(indent, codeout, args['comments'])

        name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                        pargs['name'])

        oldout = DTCompilerUtil.getTempName()
        codeout.write(indent, '%s = __h.OUTPUT' % oldout)
        codeout.write(indent, '__h.OUTPUT=__h.NEWOUTPUT()')
        for i in node.children[1:-1]:
            DTCompilerUtil.genCodeChild(indent, codeout, tagreg, i, meta)
        codeout.write(indent, '%s = __h.OUTPUT.getvalue()' % name)
        codeout.write(indent, '__h.OUTPUT = %s' % oldout)
        codeout.write(indent, 'del %s' % oldout)
        if self._attend_to_comments and args['comments'] is not None:
            self._popCommentLevel(indent, codeout, *stuff)
Ejemplo n.º 21
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        pargs = args = DTUtil.tagCall(tag, ['var'], 'plainArgs', 'kwArgs')
        kwargs = DTCompilerUtil.pyifyArgs(tag, args['kwArgs'])
        args = DTCompilerUtil.pyifyArgs(tag, args)

        varname = DTCompilerUtil.checkName(tag, 'var', args['var'],
                                           pargs['var'])
        # First, generate the plain args
        out = []
        for _j in args['plainArgs']:
            out.append('"%s": %s' % (_j, _j))

        codeout.write(indent,
                      '%s = { %s }' % (varname, string.join(out, ', ')))

        # Now, add the keyword arguments
        codeout.write(indent, '%s.update(%s)' % (varname, str(args['kwArgs'])))
Ejemplo n.º 22
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        pargs = args = DTUtil.tagCall(tag, ['var'], 'plainArgs', 'kwArgs' )
        kwargs = DTCompilerUtil.pyifyArgs(tag, args['kwArgs'])
        args = DTCompilerUtil.pyifyArgs(tag, args)

        varname = DTCompilerUtil.checkName(tag, 'var', args['var'],
                                           pargs['var'])
        # First, generate the plain args
        out = []
        for _j in args['plainArgs']:
            out.append ( '"%s": %s' % ( _j, _j ) )

        codeout.write ( indent, '%s = { %s }' % ( varname,
                                                  string.join ( out, ', ' )) )

        # Now, add the keyword arguments
        codeout.write ( indent, '%s.update(%s)' % ( varname,
                                                    str(args['kwArgs']) ))
Ejemplo n.º 23
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        pargs = args = DTUtil.tagCall(tag, [('expr', 'None')])
        args = DTCompilerUtil.pyifyArgs(tag, args)

        try:
            DTCompilerUtil.checkName(tag, 'expr', args['expr'], pargs['expr'])
        except:
            pass
        else:
            raise DTExcept.DTCompileError(tag, 'cannot call a string')

        stmt = args['expr'] + '\n'

        try:
            compile(stmt, stmt, 'exec')
        except SyntaxError:
            raise DTExcept.DTCompileError(
                tag, 'syntax error in statement "%s"' % stmt)

        codeout.writemultiline(indent, stmt)
Ejemplo n.º 24
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug ( indent, codeout, tag )
        pargs = args = DTUtil.tagCall(tag, [('expr', 'None')])
        args = DTCompilerUtil.pyifyArgs(tag, args)

        try:
            DTCompilerUtil.checkName(tag, 'expr', args['expr'], pargs['expr'])
        except:
            pass
        else:
            raise DTExcept.DTCompileError( tag, 'cannot call a string')

        stmt = args['expr'] + '\n'

        try:
            compile(stmt, stmt, 'exec')
        except SyntaxError:
            raise DTExcept.DTCompileError ( tag, 
                                  'syntax error in statement "%s"' % stmt )

        codeout.writemultiline(indent, stmt)
Ejemplo n.º 25
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        oargs = args = DTUtil.tagCall(
            tag, ['module', ('items', 'None'), ('as', 'None')])
        args = DTCompilerUtil.pyifyArgs(tag, args)
        module = DTCompilerUtil.checkName(tag, 'module', args['module'],
                                          oargs['module'])

        if oargs['as'] != None:
            asname = DTCompilerUtil.checkName(tag, 'as', args['as'],
                                              oargs['as'])
            asStr = " as %s" % asname
        else:
            asStr = ''

        if oargs['items'] != None:
            items = DTCompilerUtil.checkName('import', 'items', args['items'],
                                             oargs['items'])
            # allow items to be separated by commas or spaces
            if ',' in items:
                formattedItems = ','.join(_splitter.split(items))
            else:
                formattedItems = ','.join(items.split())
            codeout.write(
                indent,
                'from %s import %s%s' % (module, formattedItems, asStr))
        else:
            codeout.write(indent, 'import %s%s' % (module, asStr))
Ejemplo n.º 26
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        oargs = args = DTUtil.tagCall(tag, ['module', ('items', 'None'),
                                            ('as', 'None')])
        args = DTCompilerUtil.pyifyArgs(tag, args)
        module = DTCompilerUtil.checkName(tag, 'module', args['module'],
                                          oargs['module'])

        if oargs['as'] != None:
            asname = DTCompilerUtil.checkName(tag, 'as', args['as'],
                                              oargs['as'])
            asStr = " as %s" % asname
        else:
            asStr = ''
            
        if oargs['items'] != None:
            items = DTCompilerUtil.checkName('import', 'items', args['items'],
                                             oargs['items'])
            # allow items to be separated by commas or spaces
            if ',' in items:
                formattedItems=','.join(_splitter.split(items))
            else:
                formattedItems=','.join(items.split())
            codeout.write(indent,
                          'from %s import %s%s' % (module,
                                                   formattedItems,
                                                   asStr))
        else:
            codeout.write(indent, 'import %s%s' % (module, asStr))
Ejemplo n.º 27
0
    def genCode(self, indent, codeout, tagreg, node):
        tag = node.children[0]
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        pargs = args = DTUtil.tagCall(tag, ['name'])
        args = DTCompilerUtil.pyifyArgs(tag, args)
        name = DTCompilerUtil.checkName(tag, 'name', args['name'],
                                        pargs['name'])

        oldout = DTCompilerUtil.getTempName()
        codeout.write(indent, '%s = __h.OUTPUT' % oldout)
        codeout.write(indent, '__h.OUTPUT=__h.NEWOUTPUT()')
        for i in node.children[1:-1]:
            DTCompilerUtil.genCodeChild(indent, codeout, tagreg, i)
        codeout.write(indent, '%s = __h.OUTPUT.getvalue()' % name)
        codeout.write(indent, '__h.OUTPUT = %s' % oldout)
        codeout.write(indent, 'del %s' % oldout)
Ejemplo n.º 28
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        oargs = args = DTUtil.tagCall(
            tag, ['module', ('items', 'None'), ('as', 'None')])
        args = DTCompilerUtil.pyifyArgs(tag, args)
        module = DTCompilerUtil.checkName(tag, 'module', args['module'],
                                          oargs['module'])

        if oargs['as'] != None:
            asname = DTCompilerUtil.checkName(tag, 'as', args['as'],
                                              oargs['as'])
            asStr = " as %s" % asname
        else:
            asStr = ''

        if oargs['items'] != None:
            items = DTCompilerUtil.checkName('import', 'items', args['items'],
                                             oargs['items'])
            codeout.write(
                indent, 'from %s import %s%s' %
                (module, string.join(string.split(items), ','), asStr))
        else:
            codeout.write(indent, 'import %s%s' % (module, asStr))
Ejemplo n.º 29
0
    def __call__(self, local_ns, global_ns, hidden_ns, call_type=DT_REGULAR):
        """
        This function is called to actually evaluate the template
        """

        ns = local_ns
        temp_ns = {}
        if call_type == DT_INCLUDE:
            # Store somewhere parent's stuff
            # this failed when trying to do an include call
            # from a top-level python document; now be a little
            # more careful
            #__t, __h, __d = ns['__t'], ns['__h'], ns['__d']
            self.__store_ns(ns, temp_ns)

        #
        # Add our stuff to local namespace
        #
        ns['__t'] = dummy()  # temporary var space
        _h = ns['__h'] = copy.copy(hidden_ns)  # hidden ns

        #ATC
        #_d = ns['__d'] = DTCompilerUtil.get_d() # debug info ns
        #/ATC

        _d = ns['__d'] = DTCompilerUtil.dummy()

        # Add our own stuff to global_ns
        DTCompilerUtil.setup_h(_h)

        # Clear out current tag
        self._error_tag = None

        if call_type == DT_DATA:
            # We are called as data component, prepare return value
            ns['__return'] = None
            ns['__return_set'] = None

        # Does the finally: clause need to setup the current tag?
        _needs_tag = 1
        try:
            try:
                exec self._compiled in global_ns, ns
            except DTExcept.DTHaltError:
                # Set the error tag, just in case error occurs
                pass
            else:
                _needs_tag = 0
        finally:
            if _needs_tag:
                self._error_tag = _current_tag_thingy(_d.CURRENT_TAG,
                                                      _d.CURRENT_LINENO)
            # Cleanup the local namespace
            for k in ('__t', '__h', '__d'):
                del ns[k]

            if call_type == DT_INCLUDE:
                # Restore parent's stuff
                #ns['__t'], ns['__h'], ns['__d'] = __t, __h, __d
                self.__unstore_ns(ns, temp_ns)

        # Check the return value
        if call_type == DT_DATA:
            if not ns['__return_set']:
                raise SkunkStandardError, \
                      'no <:return:> tag was found in a data component'

        if call_type == DT_DATA:
            return ns['__return']
        else:
            return _h.OUTPUT.getvalue()
Ejemplo n.º 30
0
 def genCode(self, indent, codeout, tagreg, tag):
     DTCompilerUtil.tagDebug(indent, codeout, tag)
     args=DTUtil.tagCall(tag, [])
     codeout.write ( indent, 'break' )
Ejemplo n.º 31
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        tag=node.children[0]

        # Do the debug
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        DTUtil.tagCall(tag,[])
        oldout=DTCompilerUtil.getTempName()

        #
        # First, determine if this is a 'try...finally' form
        #
        for i in node.children[1:-1]:
            if ( type(i) == InstanceType
                 and i.__class__ == DTLexer.DTToken 
                 and i.tagname in ( 'finally', )):
                has_finally = 1
                break
        else:
            has_finally = 0

        if has_finally:
            # This is a try...finally block
            codeout.write ( indent, 'try:')

            for i in node.children[1:-1]:
                if ( type(i) == InstanceType
                     and i.__class__ == DTLexer.DTToken
                     and i.tagname in ( 'else', 'except', 'finally' ) ):

                    if i.tagname in ( 'else', 'except' ):
                        # This is an error
                        raise DTExcept.DTCompileError ( i, 
                          'tag %s inside of a try...finally block' % str(i) )
                    else:            # i.tagname == 'finally':
                        codeout.write ( indent, 'finally:' )
                        codeout.write ( indent+4, '__d.FTAG=__d.CURRENT_TAG')
                        codeout.write ( indent+4,
                                        '__d.FLINENO=__d.CURRENT_LINENO')
                        DTCompilerUtil.tagDebug ( indent + 4, codeout, i)
                else:
                    DTCompilerUtil.genCodeChild(indent + 4, codeout, tagreg, i,
                                                meta)
            codeout.write( indent+4, '__d.CURRENT_TAG=__d.FTAG')
            codeout.write( indent+4, '__d.CURRENT_LINENO=__d.FLINENO')
            codeout.write( indent+4, 'del __d.FTAG, __d.FLINENO')
            #
            # Ok, we're done - return
            #
            return

        #
        # Store a reference to current output object. Basically, if an exception
        # occurs we kind of rollback to the point before the 'try' block
        #
        codeout.write ( indent, '%s = __h.OUTPUT' % oldout)
        codeout.write ( indent, '__h.OUTPUT=__h.NEWOUTPUT()')
        codeout.write ( indent, 'try:')

        waselse = 0
        wasexcept = 0

        for i in node.children[1:-1]:
            if ( type(i) == InstanceType
                 and i.__class__ == DTLexer.DTToken 
                 and i.tagname in ( 'else', 'except' )):
                if i.tagname == 'except':
                    # Get the arguments for the except clause
                    args = DTUtil.tagCall ( i, [('exc', 'None')] )
                    args = DTCompilerUtil.pyifyArgs(tag, args)

                    if args['exc'] != None:
                        codeout.write ( indent, 'except %s:' % args['exc'])
                    else:
                        codeout.write ( indent, 'except:' )

                    # Do the debugging
                    DTCompilerUtil.tagDebug ( indent + 4, codeout, i)
                        
                    # Restore the original output
                    codeout.write(indent + 4, '__h.OUTPUT = %s' % oldout)
                    codeout.write(indent + 4, 'del %s' % oldout)

                    wasexcept = 1
                else:      # i.tagname == 'else':
                    codeout.write ( indent, 'else:' )

                    DTCompilerUtil.tagDebug ( indent + 4, codeout, i)

                    # Print and restore the original output
                    codeout.write(indent+4, '%s.write(__h.OUTPUT.getvalue())' %
                                            oldout )
                    codeout.write(indent + 4, '__h.OUTPUT = %s' % oldout)
                    codeout.write(indent + 4, 'del %s' % oldout)

                    waselse = 1
            else:
                DTCompilerUtil.genCodeChild(indent + 4, codeout, tagreg, i,
                                            meta)

        if not wasexcept:
            raise DTExcept.DTCompileError ( tag, '<:try:> without <:except:>' )
            
        if not waselse:
            codeout.write(indent, 'else:')
            codeout.write(indent+4, '%s.write(__h.OUTPUT.getvalue())' % oldout)
            codeout.write(indent+4, '__h.OUTPUT = %s' % oldout)
            codeout.write(indent+4, 'del %s' % oldout)
Ejemplo n.º 32
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        args = DTUtil.tagCall(tag, [])

        # Generate a halt
        DTExcept.raiseHalt(codeout, indent)
Ejemplo n.º 33
0
    def genCode(self, indent, codeout, tagreg, tag):
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        args=DTUtil.tagCall(tag, [])

        # Generate a halt
        DTExcept.raiseHalt ( codeout, indent ) 
Ejemplo n.º 34
0
    def genCode(self, indent, codeout, tagreg, node, meta):
        tag = node.children[0]

        # Do the debug
        DTCompilerUtil.tagDebug(indent, codeout, tag)
        DTUtil.tagCall(tag, [])
        oldout = DTCompilerUtil.getTempName()

        #
        # First, determine if this is a 'try...finally' form
        #
        for i in node.children[1:-1]:
            if (type(i) == InstanceType and i.__class__ == DTLexer.DTToken
                    and i.tagname in ('finally', )):
                has_finally = 1
                break
        else:
            has_finally = 0

        if has_finally:
            # This is a try...finally block
            codeout.write(indent, 'try:')

            for i in node.children[1:-1]:
                if (type(i) == InstanceType and i.__class__ == DTLexer.DTToken
                        and i.tagname in ('else', 'except', 'finally')):

                    if i.tagname in ('else', 'except'):
                        # This is an error
                        raise DTExcept.DTCompileError(
                            i,
                            'tag %s inside of a try...finally block' % str(i))
                    else:  # i.tagname == 'finally':
                        codeout.write(indent, 'finally:')
                        codeout.write(indent + 4, '__d.FTAG=__d.CURRENT_TAG')
                        codeout.write(indent + 4,
                                      '__d.FLINENO=__d.CURRENT_LINENO')
                        DTCompilerUtil.tagDebug(indent + 4, codeout, i)
                else:
                    DTCompilerUtil.genCodeChild(indent + 4, codeout, tagreg, i,
                                                meta)
            codeout.write(indent + 4, '__d.CURRENT_TAG=__d.FTAG')
            codeout.write(indent + 4, '__d.CURRENT_LINENO=__d.FLINENO')
            codeout.write(indent + 4, 'del __d.FTAG, __d.FLINENO')
            #
            # Ok, we're done - return
            #
            return

        #
        # Store a reference to current output object. Basically, if an exception
        # occurs we kind of rollback to the point before the 'try' block
        #
        codeout.write(indent, '%s = __h.OUTPUT' % oldout)
        codeout.write(indent, '__h.OUTPUT=__h.NEWOUTPUT()')
        codeout.write(indent, 'try:')

        waselse = 0
        wasexcept = 0

        for i in node.children[1:-1]:
            if (type(i) == InstanceType and i.__class__ == DTLexer.DTToken
                    and i.tagname in ('else', 'except')):
                if i.tagname == 'except':
                    # Get the arguments for the except clause
                    args = DTUtil.tagCall(i, [('exc', 'None')])
                    args = DTCompilerUtil.pyifyArgs(tag, args)

                    if args['exc'] != None:
                        codeout.write(indent, 'except %s:' % args['exc'])
                    else:
                        codeout.write(indent, 'except:')

                    # Do the debugging
                    DTCompilerUtil.tagDebug(indent + 4, codeout, i)

                    # Restore the original output
                    codeout.write(indent + 4, '__h.OUTPUT = %s' % oldout)
                    codeout.write(indent + 4, 'del %s' % oldout)

                    wasexcept = 1
                else:  # i.tagname == 'else':
                    codeout.write(indent, 'else:')

                    DTCompilerUtil.tagDebug(indent + 4, codeout, i)

                    # Print and restore the original output
                    codeout.write(indent + 4,
                                  '%s.write(__h.OUTPUT.getvalue())' % oldout)
                    codeout.write(indent + 4, '__h.OUTPUT = %s' % oldout)
                    codeout.write(indent + 4, 'del %s' % oldout)

                    waselse = 1
            else:
                DTCompilerUtil.genCodeChild(indent + 4, codeout, tagreg, i,
                                            meta)

        if not wasexcept:
            raise DTExcept.DTCompileError(tag, '<:try:> without <:except:>')

        if not waselse:
            codeout.write(indent, 'else:')
            codeout.write(indent + 4,
                          '%s.write(__h.OUTPUT.getvalue())' % oldout)
            codeout.write(indent + 4, '__h.OUTPUT = %s' % oldout)
            codeout.write(indent + 4, 'del %s' % oldout)
Ejemplo n.º 35
0
    def __call__(self, local_ns, global_ns, hidden_ns, 
                       call_type = DT_REGULAR ):
        """
        This function is called to actually evaluate the template
        """

        ns = local_ns
        temp_ns={}
        if call_type == DT_INCLUDE:
            # Store somewhere parent's stuff
            # this failed when trying to do an include call
            # from a top-level python document; now be a little
            # more careful
            #__t, __h, __d = ns['__t'], ns['__h'], ns['__d']
            self.__store_ns(ns, temp_ns)

        # 
        # Add our stuff to local namespace
        #
        ns['__t'] = dummy()                     # temporary var space
        _h = ns['__h'] = copy.copy(hidden_ns)   # hidden ns

        #ATC
        #_d = ns['__d'] = DTCompilerUtil.get_d() # debug info ns
        #/ATC
        
        _d = ns['__d'] = DTCompilerUtil.dummy()
        
        # Add our own stuff to global_ns
        DTCompilerUtil.setup_h ( _h )

        # Clear out current tag
        self._error_tag = None

        if call_type == DT_DATA:
            # We are called as data component, prepare return value
            ns['__return'] = None
            ns['__return_set'] = None

        # Does the finally: clause need to setup the current tag?
        _needs_tag = 1
        try:
            try:
                exec self._compiled in global_ns, ns
            except DTExcept.DTHaltError:
                # Set the error tag, just in case error occurs
                pass
            else:
                _needs_tag = 0
        finally:
            if _needs_tag:
                self._error_tag = _current_tag_thingy ( _d.CURRENT_TAG,
                                                        _d.CURRENT_LINENO )
            # Cleanup the local namespace
            for k in ( '__t', '__h', '__d' ):
                 del ns[k]
        
            if call_type == DT_INCLUDE:
                # Restore parent's stuff
                #ns['__t'], ns['__h'], ns['__d'] = __t, __h, __d
                self.__unstore_ns(ns, temp_ns)

        # Check the return value
        if call_type == DT_DATA:
             if not ns['__return_set']:
                 raise SkunkStandardError, \
                       'no <:return:> tag was found in a data component'

        if call_type == DT_DATA:
            return ns['__return']
        else:
            return _h.OUTPUT.getvalue()
Ejemplo n.º 36
0
import DTLexer
import DTParser
import DTExcept
import ErrorHandler
from SkunkExcept import *

def compileTemplate ( text, name = None, tagreg = None, meta = None ):
    try:
        taglist=DTLexer.doTag(text, name)
    except DTExcept.DTLexicalError, val:
        # Ok, force the name here - its a decent hack Drew
        val.name = name
        raise val

    node = DTParser.parseit(text, taglist, tagreg, name)

    indent=0
    codeout=DTCompilerUtil.Output()
    DTCompilerUtil.genCodeNode ( indent, codeout, tagreg, node.children,
                                 meta )
    return codeout.getText()
    
def compileText(text, name):
    # Only catch syntax errors in the text, all else will fall through
    try:
        cobj = compile(text, name, 'exec')
    except SyntaxError, val:
        raise SkunkSyntaxError ( name, text, val )

    return cobj
Ejemplo n.º 37
0
import DTParser
import DTExcept
import ErrorHandler
from SkunkExcept import *


def compileTemplate(text, name=None, tagreg=None, meta=None):
    try:
        taglist = DTLexer.doTag(text, name)
    except DTExcept.DTLexicalError, val:
        # Ok, force the name here - its a decent hack Drew
        val.name = name
        raise val

    node = DTParser.parseit(text, taglist, tagreg, name)

    indent = 0
    codeout = DTCompilerUtil.Output()
    DTCompilerUtil.genCodeNode(indent, codeout, tagreg, node.children, meta)
    return codeout.getText()


def compileText(text, name):
    # Only catch syntax errors in the text, all else will fall through
    try:
        cobj = compile(text, name, 'exec')
    except SyntaxError, val:
        raise SkunkSyntaxError(name, text, val)

    return cobj
Ejemplo n.º 38
0
 def genCode(self, indent, codeout, tagreg, tag):
     DTCompilerUtil.tagDebug(indent, codeout, tag)
     args = DTUtil.tagCall(tag, [])
     codeout.write(indent, 'break')