我想做这样的事情
{% mytag country "italy" year "2014" %}
workday
{% holyday %}
not workday
{% endmytag %}
但是,瞻礼标签是可选的。 这也必须有效:
{% 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
我需要第一个和第二个分支,因为我选择了哪一个分支。
答案 0 :(得分:1)
...
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
中,您将收到第三个参数(列表),并选择是否返回此列表的第一个或第二个元素。