另一个标签中的Jinja2扩展标签

2024-04-16 20:18:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着做这样的事

{% mytag country "italy" year "2014" %}
    workday
{% holyday %}
    not workday
{% endmytag %}

但是holyday标签是可选的。 这也必须起作用:

{% mytag country "italy" year "2014" %}
    workday
{% endmytag %}

代码是我写的

class MytagExtension(Extension):
    tags = set(['mytag'])

    def __init__(self, environment):
        super(TranslateExtension, self).__init__(environment)

    def parse(self, parser):
        lineno = parser.stream.next().lineno

        if parser.stream.skip_if('name:country'):
            country= parser.parse_primary()
        else:
            country= nodes.Const(None)
        if parser.stream.skip_if('name:year'):
            year = parser.parse_primary()
        else:
            year = nodes.Const(None)

        args = [country, year]

        # body1 = parser.parse_statements(['name:holyday']) # not working :)

        body = parser.parse_statements(['name:endmytag'], drop_needle=True)
        return nodes.CallBlock(self.call_method('_helper', args),
                           [], [], body).set_lineno(lineno)

    def _helper(self, country, year, caller):
        etc ....

类似于if else endif,但我没有找到if标记的源代码(如果它作为扩展名存在)

我该怎么做? 显然,在我的_helper中,我需要第一个和第二个分支,因为在那里我可以选择显示哪一个。你知道吗


Tags: nameselfparserstreamifparsedefyear
1条回答
网友
1楼 · 发布于 2024-04-16 20:18:38

好吧,这是一个答案,它不是完美的,可能不是最好的,但它是一些东西。你知道吗

    ...
    body = parser.parse_statements(
               ['name:endmytag', 'name:holyday'], 
               drop_needle=True
           )
    if not parser.stream.current.test('block_end'):
        body.extend ( parser.parse_statements(['name:endmytag'], drop_needle=True) )

    args = [
         country, 
         year, 
         nodes.Const([y.data for x in body for y in x.nodes]), #I don't like this line a lot :)
           ]
    return nodes.CallBlock(self.call_method('_helper', args),
                           [], [], body).set_lineno(lineno)
    ...

这样,在_helper中,您将收到第三个参数(一个列表),并选择是否返回该列表的第一个或第二个元素。你知道吗

相关问题 更多 >