我想以黑色显示数字序列,并以红色显示嵌套序列号。这是我的marco代码:
<#macro test datas isNested>
<#list datas as d>
<#if d?is_enumerable>
<#local isNested = true>
<#if isNested>
<#-- become red if it is nested -->
Hi, I am going to be red!
<#-- some business code -->
</#if>
<@test d isNested/>
<#else>
<#if isNested>
<span style="color:red;">${d}</span>
<#else>
${d}
</#if>
</#if>
</#list>
</#macro>
这样称呼:
<@test [1,2,3,[4,5],6,7] false/>我希望它是:
1 2 3 Hi, I am going to be red! 4 5 6 7只有4和5显示为红色 但现在我明白了:
1 2 3 Hi, I am going to be red! 4 5 6 7
所有4 5 6 7都以红色显示。
我认为这行代码<#local isNested = true>
起到了作用。我也尝试使用assign
,global
,所有1 2 3 4 5 6 7都是黑色。
那我该怎么办? Thx提前。
PS :
我不知道如何在stackoverflow中以红色显示代码,如果有人知道plz帮助我编辑我的代码。
答案 0 :(得分:1)
您的问题不是FreeMarker特有的。在递归isNested
调用之前,将true
局部变量(也包含参数值)翻转到@test
,如果返回递归宏调用,则将其保留。因此,当6
和7
的迭代到来时,isNested
已经true
。您根本不应设置isNested
,只需将true
传递给递归调用即可。这里:
<#macro test datas isNested=false>
<#list datas as d>
<#if d?is_enumerable>
Hi, I am going to be red!
<@test d true />
<#else>
<#if isNested>
<span style="color:red;">${d}</span>
<#else>
${d}
</#if>
</#if>
</#list>
</#macro>
<@test [1,2,3,[4,5],6,7] />