在另一个宏的字符串参数中使用 Freemarker 宏调用
Use Freemarker macro call within string parameter of another macro
我有一个格式化一些文本的宏 A
<#macro A text>...${text}...</#macro>
和另一个具有接受文本参数的宏
<#macro B x>Another ${x} text</#macro>
我想用 x 参数调用 B 是一些由 A 格式化的文本,s.th。像
<@B x="<@A text='abc'/>" />
returns Another <@A text='abc'/>
这有可能吗?
我试过 ?interpret
作为 suggested here by ddekany -
<@B x="<@A text='abc'/>"?interpret />
但这失败并出现错误:
Expecting a string, date or number here, Expression .... is
instead a freemarker.core.Interpret$TemplateProcessorModel
似乎 FreeMarker 中的宏调用与其他语言中的函数调用有所不同。
我找到了使用分配的解决方法:
<#assign a><@A text="abc"/></#assign>
<@B text=a/>
无论如何,如果知道这是否可行会很有趣。
宏调用不是表达式,因此不能在表达式内部使用(如参数值)。调用宏是因为它们的副作用,通常是打印到输出,并且没有 return 值。函数(请参阅 #function
)因其 return 值而被调用,因此函数调用是表达式。所以在这种情况下,也许您需要函数,而不是宏。
但是如果您绝对必须在表达式(或任何任意模板片段)中使用宏调用的输出,那么您必须通过 <#assign someVar>...</#assign>
或 <#local someVar>...</#local>
捕获输出。 (当心 #escape
。如果您使用 ${...}
重新打印捕获的输出,它将再次被转义,因此您将需要 #noescape
。)
我有一个格式化一些文本的宏 A
<#macro A text>...${text}...</#macro>
和另一个具有接受文本参数的宏
<#macro B x>Another ${x} text</#macro>
我想用 x 参数调用 B 是一些由 A 格式化的文本,s.th。像
<@B x="<@A text='abc'/>" />
returns Another <@A text='abc'/>
这有可能吗?
我试过 ?interpret
作为 suggested here by ddekany -
<@B x="<@A text='abc'/>"?interpret />
但这失败并出现错误:
Expecting a string, date or number here, Expression .... is instead a freemarker.core.Interpret$TemplateProcessorModel
似乎 FreeMarker 中的宏调用与其他语言中的函数调用有所不同。
我找到了使用分配的解决方法:
<#assign a><@A text="abc"/></#assign>
<@B text=a/>
无论如何,如果知道这是否可行会很有趣。
宏调用不是表达式,因此不能在表达式内部使用(如参数值)。调用宏是因为它们的副作用,通常是打印到输出,并且没有 return 值。函数(请参阅 #function
)因其 return 值而被调用,因此函数调用是表达式。所以在这种情况下,也许您需要函数,而不是宏。
但是如果您绝对必须在表达式(或任何任意模板片段)中使用宏调用的输出,那么您必须通过 <#assign someVar>...</#assign>
或 <#local someVar>...</#local>
捕获输出。 (当心 #escape
。如果您使用 ${...}
重新打印捕获的输出,它将再次被转义,因此您将需要 #noescape
。)