Example #1
0
    def parseTag(self, match_ob, command=None, sargs=''):
        """Parse a tag using an already matched re

        Return: tag, args, command, coname

        where: tag is the tag,
               args is the tag\'s argument string,
               command is a corresponding command info structure if the
                  tag is a start tag, or None otherwise, and
               coname is the name of a continue tag (e.g. else)
                 or None otherwise
        """
        tag, end, name, args = match_ob.group(0, 'end', 'name', 'args')
        args = args.strip()
        if end:
            if not command or name != command.name:
                raise ParseError('unexpected end tag', tag)
            return tag, args, None, None

        if command and name in command.blockContinuations:

            if name == 'else' and args:
                # Waaaaaah! Have to special case else because of
                # old else start tag usage. Waaaaaaah!
                l_ = len(args)
                if not (args == sargs
                        or args == sargs[:l_] and sargs[l_:l_ + 1] in ' \t\n'):
                    return tag, args, self.commands[name], None

            return tag, args, None, name

        try:
            return tag, args, self.commands[name], None
        except KeyError:
            raise ParseError('Unexpected tag', tag)
Example #2
0
    def __init__(self, blocks, encoding=None):
        self.encoding = encoding
        tname, args, section = blocks[0]
        args = parse_params(
            args,
            name=None,
            expr=None,
            nowrap=1,
            expand=None,
            leaves=None,
            header=None,
            footer=None,
            branches=None,
            branches_expr=None,
            sort=None,
            reverse=1,
            skip_unauthorized=1,
            id=None,
            single=1,
            url=None,
            # opened_decoration=None,
            # closed_decoration=None,
            # childless_decoration=None,
            assume_children=1,
            urlparam=None,
            prefix=None)
        if '' in args or 'name' in args or 'expr' in args:
            name, expr = name_param(args, 'tree', 1)

            if expr is not None:
                args['expr'] = expr
            elif '' in args:
                args['name'] = name
        else:
            name = 'a tree tag'

        if 'branches_expr' in args:
            if 'branches' in args:
                raise ParseError('branches and  and branches_expr given',
                                 'tree')
            args['branches_expr'] = Eval(args['branches_expr']).eval
        elif 'branches' not in args:
            args['branches'] = 'tpValues'

        if 'id' not in args:
            args['id'] = 'tpId'
        if 'url' not in args:
            args['url'] = 'tpURL'
        if 'childless_decoration' not in args:
            args['childless_decoration'] = ''

        prefix = args.get('prefix')
        if prefix and not simple_name(prefix):
            raise ParseError('prefix is not a simple name', 'tree')

        self.__name__ = name
        self.section = section.blocks
        self.args = args
Example #3
0
    def __init__(self, args):
        args = parse_params(args, name='', expr='', type=None, optional=1)

        name, expr = name_param(args, 'sqlvar', 1)
        if expr is None: expr = name
        else: expr = expr.eval
        self.__name__, self.expr = name, expr

        self.args = args
        if not args.has_key('type'):
            raise ParseError('the type attribute is required', 'dtvar')
        t = args['type']
        if not valid_type(t):
            raise ParseError('invalid type, %s' % t, 'dtvar')
Example #4
0
def parse_let_params(
        text,
        result=None,
        tag='let',
        parmre=re.compile('([\000- ]*([^\000- ="]+)=([^\000- ="]+))'),
        qparmre=re.compile('([\000- ]*([^\000- ="]+)="([^"]*)")'),
        **parms):

    result = result or []

    mo = parmre.match(text)
    mo1 = qparmre.match(text)

    if mo is not None:
        name = mo.group(2)
        value = mo.group(3)
        l_ = len(mo.group(1))
    elif mo1 is not None:
        name = mo1.group(2)
        value = '"%s"' % mo1.group(3)
        l_ = len(mo1.group(1))
    else:
        if not text or not text.strip():
            return result
        raise ParseError('invalid parameter: "%s"' % text, tag)

    result.append((name, value))

    text = text[l_:].strip()
    if text:
        return parse_let_params(text, result, tag, **parms)
    else:
        return result
Example #5
0
    def __init__(self, args, encoding=None):
        self.encoding = encoding
        args = parse_params(args, name='', expr='', type=None, optional=1)

        name, expr = name_param(args, 'sqlvar', 1)
        if expr is None:
            expr = name
        else:
            expr = expr.eval
        self.__name__, self.expr = name, expr

        self.args = args
        if 'type' not in args:
            raise ParseError('the type attribute is required', 'dtvar')
        t = args['type']
        if t not in valid_types:
            raise ParseError('invalid type, %s' % t, 'dtvar')
Example #6
0
    def __init__(self, blocks, encoding=None):
        tname, args, section = blocks[0]

        self.args = parse_params(args)
        self.section = section.blocks
        self.encoding = encoding

        # Find out if this is a try..finally type
        if len(blocks) == 2 and blocks[1][0] == 'finally':
            self.finallyBlock = blocks[1][2].blocks

        # This is a try [except]* [else] block.
        else:
            # store handlers as tuples (name,block)
            self.handlers = []
            defaultHandlerFound = 0

            for tname, nargs, nsection in blocks[1:]:
                if tname == 'else':
                    if self.elseBlock is not None:
                        raise ParseError(
                            'No more than one else block is allowed',
                            self.name)
                    self.elseBlock = nsection.blocks

                elif tname == 'finally':
                    raise ParseError(
                        'A try..finally combination cannot contain '
                        'any other else, except or finally blocks', self.name)

                else:
                    if self.elseBlock is not None:
                        raise ParseError(
                            'The else block should be the last block '
                            'in a try tag', self.name)

                    for errname in nargs.split():
                        self.handlers.append((errname, nsection.blocks))
                    if nargs.strip() == '':
                        if defaultHandlerFound:
                            raise ParseError(
                                'Only one default exception handler '
                                'is allowed', self.name)
                        else:
                            defaultHandlerFound = 1
                            self.handlers.append(('', nsection.blocks))
Example #7
0
    def __init__(self, args, encoding=None):
        self.encoding = encoding
        args = parse_params(args,
                            name='',
                            expr='',
                            type=None,
                            column=None,
                            multiple=1,
                            optional=1,
                            op=None)
        name, expr = name_param(args, 'sqlvar', 1)

        if expr is None:
            expr = name
        else:
            expr = expr.eval
        self.__name__, self.expr = name, expr

        self.args = args
        if 'type' not in args:
            raise ParseError('the type attribute is required', 'sqltest')

        self.type = t = args['type']
        if t not in valid_types:
            raise ParseError('invalid type, %s' % t, 'sqltest')

        if 'optional' in args:
            self.optional = args['optional']
        if 'multiple' in args:
            self.multiple = args['multiple']
        if 'column' in args:
            self.column = args['column']
        elif self.__name__ is None:
            err = ' the column attribute is required if an expression is used'
            raise ParseError(err, 'sqltest')
        else:
            self.column = self.__name__

        # Deal with optional operator specification
        op = '='  # Default
        if 'op' in args:
            op = args['op']
            # Try to get it from the chart, otherwise use the one provided
            op = comparison_operators.get(op, op)
        self.op = op
Example #8
0
    def __init__(self, blocks, encoding=None):

        tname, args, section = blocks[0]
        args = parse_params(args, name='', expr='')
        name, expr = name_param(args, 'if', 1)
        self.__name__ = name
        self.encoding = encoding
        if expr is None:
            cond = name
        else:
            cond = expr.eval
        sections = [cond, section.blocks]

        if blocks[-1][0] == 'else':
            tname, args, section = blocks[-1]
            del blocks[-1]
            args = parse_params(args, name='')
            if args:
                ename, expr = name_param(args, 'else', 1)
                if ename != name:
                    raise ParseError('name in else does not match if', 'in')
            elses = section.blocks
        else:
            elses = None

        for tname, args, section in blocks[1:]:
            if tname == 'else':
                raise ParseError('more than one else tag for a single if tag',
                                 'in')
            args = parse_params(args, name='', expr='')
            name, expr = name_param(args, 'elif', 1)
            if expr is None:
                cond = name
            else:
                cond = expr.eval
            sections.append(cond)
            sections.append(section.blocks)

        if elses is not None:
            sections.append(elses)

        self.simple_form = ('i', ) + tuple(sections)
Example #9
0
def name_or_expr(mapping, name_attr, expr_attr, default):
    name = mapping.get(name_attr, None)
    expr = mapping.get(expr_attr, None)

    if name is None:
        if expr is None:
            return default
        return Eval(expr)
    if expr is None:
        return name
    raise ParseError('%s and %s given' % (name_attr, expr_attr), 'calendar')
Example #10
0
    def __init__(self, blocks):
        tname, args, section = blocks[0]
        self.__name__ = args
        self.section = section.blocks
        self.args = args = parse_let_params(args)

        for i in range(len(args)):
            name, expr = args[i]
            if expr[:1] == '"' and expr[-1:] == '"' and len(expr) > 1:
                # expr shorthand
                expr = expr[1:-1]
                try:
                    args[i] = name, Eval(expr).eval
                except SyntaxError as v:
                    m, (huh, l, c, src) = v
                    raise ParseError(
                        '<strong>Expression (Python) Syntax error</strong>:'
                        '\n<pre>\n%s\n</pre>\n' % v[0], 'let')
Example #11
0
    def __init__(self, blocks):
        tname, args, section = blocks[0]
        args = parse_params(args,
                            name='',
                            start='1',
                            end='-1',
                            size='10',
                            orphan='0',
                            overlap='1',
                            mapping=1,
                            no_push_item=1,
                            skip_unauthorized=1,
                            previous=1,
                            next=1,
                            expr='',
                            sort='',
                            reverse=1,
                            sort_expr='',
                            reverse_expr='',
                            prefix='')
        self.args = args

        if 'sort' in args:
            self.sort = sort = args['sort']
            if sort == 'sequence-item':
                self.sort = ''

        if 'sort_expr' in args:
            self.sort_expr = Eval(args['sort_expr'])

        if 'reverse_expr' in args:
            self.reverse_expr = Eval(args['reverse_expr'])

        if 'reverse' in args:
            self.reverse = args['reverse']

        if 'no_push_item' in args:
            self.no_push_item = args['no_push_item']

        if 'mapping' in args:
            self.mapping = args['mapping']
        for n in 'start', 'size', 'end':
            if n in args:
                self.batch = 1

        prefix = args.get('prefix')
        if prefix and not simple_name(prefix):
            raise ParseError('prefix is not a simple name', 'in')

        for n in ('orphan', 'overlap', 'previous', 'next'):
            if n in args and not self.batch:
                raise ParseError(
                    """
                    The %s attribute was used but neither of the
                    <code>start</code>, <code>end</code>, or <code>size</code>
                    attributes were used.
                    """ % n, 'in')

        if 'start' in args:
            v = args['start']
            if isinstance(v, str):
                try:
                    int(v)
                except Exception:
                    self.start_name_re = re.compile(
                        '&+' + ''.join(["[%s]" % c for c in v]) + '=[0-9]+&+')

        name, expr = name_param(args, 'in', 1)
        if expr is not None:
            expr = expr.eval
        self.__name__, self.expr = name, expr
        self.section = section.blocks
        if len(blocks) > 1:
            if len(blocks) != 2:
                raise ParseError('too many else blocks', 'in')
            tname, args, section = blocks[1]
            args = parse_params(args, name='')
            if args:
                ename = name_param(args)
                if ename != name:
                    raise ParseError('name in else does not match in', 'in')
            self.elses = section.blocks
Example #12
0
 def parse_error(self, mess, tag, text, start):
     raise ParseError(
         "%s, for tag %s, on line %s of %s" %
         (mess, self.errQuote(tag), len(
             text[:start].split('\n')), self.errQuote(self.__name__)))
Example #13
0
    def __init__(self, blocks, encoding=None):
        self.encoding = encoding
        self.sections = []
        self.multipart = 'mixed'

        for tname, args, section in blocks:
            if tname == 'mime':
                args = parse_params(args,
                                    type=None,
                                    type_expr=None,
                                    disposition=None,
                                    disposition_expr=None,
                                    encode=None,
                                    encode_expr=None,
                                    name=None,
                                    name_expr=None,
                                    filename=None,
                                    filename_expr=None,
                                    cid=None,
                                    cid_expr=None,
                                    charset=None,
                                    charset_expr=None,
                                    skip_expr=None,
                                    multipart=None)
                self.multipart = args.get('multipart', 'mixed')
            else:
                args = parse_params(args,
                                    type=None,
                                    type_expr=None,
                                    disposition=None,
                                    disposition_expr=None,
                                    encode=None,
                                    encode_expr=None,
                                    name=None,
                                    name_expr=None,
                                    filename=None,
                                    filename_expr=None,
                                    cid=None,
                                    cid_expr=None,
                                    charset=None,
                                    charset_expr=None,
                                    skip_expr=None)

            if 'type_expr' in args:
                if 'type' in args:
                    raise ParseError('dtml-mime: type and type_expr given')
                args['type_expr'] = Eval(args['type_expr'])
            elif 'type' not in args:
                args['type'] = 'application/octet-stream'

            if 'disposition_expr' in args:
                if 'disposition' in args:
                    raise ParseError(
                        'dtml-mime: disposition and disposition_expr given')
                args['disposition_expr'] = Eval(args['disposition_expr'])
            elif 'disposition' not in args:
                args['disposition'] = ''

            if 'encode_expr' in args:
                if 'encode' in args:
                    raise ParseError('dtml-mime: encode and encode_expr given')
                args['encode_expr'] = Eval(args['encode_expr'])
            elif 'encode' not in args:
                args['encode'] = 'base64'

            if 'name_expr' in args:
                if 'name' in args:
                    raise ParseError('dtml-mime: name and name_expr given')
                args['name_expr'] = Eval(args['name_expr'])
            elif 'name' not in args:
                args['name'] = ''

            if 'filename_expr' in args:
                if 'filename' in args:
                    raise ParseError(
                        'dtml-mime: filename and filename_expr given')
                args['filename_expr'] = Eval(args['filename_expr'])
            elif 'filename' not in args:
                args['filename'] = ''

            if 'cid_expr' in args:
                if 'cid' in args:
                    raise ParseError('dtml-mime: cid and cid_expr given')
                args['cid_expr'] = Eval(args['cid_expr'])
            elif 'cid' not in args:
                args['cid'] = ''

            if 'charset_expr' in args:
                if 'charset' in args:
                    raise ParseError(
                        'dtml-mime: charset and charset_expr given')
                args['charset_expr'] = Eval(args['charset_expr'])
            elif 'charset' not in args:
                args['charset'] = 'us-ascii'  # Default for text parts

            if 'skip_expr' in args:
                args['skip_expr'] = Eval(args['skip_expr'])

            if args['encode'] not in ENCODINGS:
                raise MIMEError('An unsupported encoding was specified in tag')

            self.sections.append((args, section.blocks))