コード例 #1
0
    def parse(self, parser):
        # Jump over first token ("l10n"), grab line number.
        lineno = parser.stream.next().lineno

        # Block name is mandatory.
        name = parser.stream.expect('name').value
        locales = []

        parser.stream.skip_if('comma')

        # Grab the locales if provided
        if parser.stream.current.type == 'name':
            parser.stream.skip()  # locales
            parser.stream.skip()  # assign (=)
            prev_sub = False
            while parser.stream.current.type not in ['integer', 'block_end']:
                parser.stream.skip_if('comma')
                parser.stream.skip_if('assign')
                token = parser.stream.current
                if token.type in ['integer', 'block_end']:
                    break
                if token.type == 'name':
                    if prev_sub:
                        locales[-1] += token.value
                        prev_sub = False
                    else:
                        locales.append(token.value)
                if token.type == 'sub':
                    locales[-1] += '-'
                    prev_sub = True
                parser.stream.next()

        # Add version if provided.
        if parser.stream.current.type == 'integer':
            version = int(parser.parse_expression().value)
        else:
            version = 0  # Default version for unversioned block.

        # Parse content.
        body = parser.parse_statements(['name:was', 'name:endl10n'],
                                       drop_needle=False)

        # Translation fallback: If this is followed by an "was" tag, render
        # that block instead.
        end_tag = parser.stream.expect('name')  # Either was or endl10n.
        if end_tag.value == 'was':
            body = parser.parse_statements(['name:endl10n'], drop_needle=True)

        # Build regular block node with special node name and remember version.
        node = nodes.Block()
        node.set_lineno(lineno)
        node.name = '__l10n__{0}'.format(name)
        node.version = version  # For debugging only, for now.
        node.locales = locales
        node.body = body
        # I *think*, `true` would mean that variable assignments inside this
        # block do not persist beyond this block (like a `with` block).
        node.scoped = False

        return node
コード例 #2
0
    def parse(self, parser):
        # Skip over the block name
        name = parser.stream.next()
        lineno = name.lineno

        # Grab all the args
        args = [parser.stream.expect('string').value]
        while parser.stream.current.type == 'string':
            args.append(parser.stream.current.value)
            parser.stream.next()

        # Make a node that calls the lang_files helper
        content_nodes = [
            nodes.Call(nodes.Name('lang_files', 'load'),
                       [nodes.Const(x) for x in args], [], None, None)
        ]

        if name == 'add_lang_files':
            # If we are adding files, we need to keep the parent
            # template's list of lang files as well
            content_nodes.insert(
                0,
                [nodes.Call(nodes.Name('super', 'load'), [], [], None, None)])

        # Since we are a block, we must emit a block too, so make a
        # random one that contains a call to the load function
        node = nodes.Block().set_lineno(lineno)
        node.name = '__langfiles__'
        node.scoped = False
        node.body = [nodes.Output(content_nodes)]
        node.set_lineno(lineno)
        return node
コード例 #3
0
    def parse(self, parser):
        # Jump over first token ("l10n"), grab line number.
        lineno = parser.stream.next().lineno

        # Block name is mandatory.
        name = parser.stream.expect('name').value

        # Comma optional.
        parser.stream.skip_if('comma')

        # Add version if provided.
        if parser.stream.current.type == 'integer':
            version = int(parser.parse_expression().value)
        else:
            version = 0  # Default version for unversioned block.

        # Parse content.
        body = parser.parse_statements(['name:else', 'name:endl10n'],
                                       drop_needle=False)

        # Translation fallback: If this is followed by an "else" tag, render
        # that block instead.
        end_tag = parser.stream.expect('name')  # Either else or endl10n.
        if end_tag.value == 'else':
            body = parser.parse_statements(['name:endl10n'], drop_needle=True)

        # Build regular block node with special node name and remember version.
        node = nodes.Block()
        node.set_lineno(lineno)
        node.name = '__l10n__{0}'.format(name)
        node.version = version  # For debugging only, for now.
        node.body = body
        # I *think*, `true` would mean that variable assignments inside this
        # block do not persist beyond this block (like a `with` block).
        node.scoped = False

        return node