在另一个宏的字符串参数中使用Freemarker宏调用

时间:2015-08-01 16:29:32

标签: macros freemarker

我有一个宏A来格式化一些文本 <#macro A text>...${text}...</#macro> 和另一个具有接受文本的参数的宏 <#macro B x>Another ${x} text</#macro>

我想用x参数调用B作为A,s.th。格式化的文本。喜欢 <@B x="<@A text='abc'/>" />返回Another <@A text='abc'/>

这有可能吗?

我尝试?interpret作为suggested here by ddekany - <@B x="<@A text='abc'/>"?interpret />但是这失败并出现错误:

  

在这里期待字符串,日期或数字,表达式....是   而是一个freemarker.core.Interpret $ TemplateProcessorModel

似乎FreeMarker中的宏调用与其他语言中的函数调用不同。

2 个答案:

答案 0 :(得分:1)

宏调用不是表达式,因此不能在表达式内使用(如参数值)。调用宏的副作用通常是打印到输出,并且没有返回值。函数(参见<#assign someVar>...</#assign>)的返回值被调用,因此函数调用是表达式。所以也许你需要功能,而不是这种情况下的宏。

但是如果您必须在表达式(或任意模板片段)中使用宏调用的输出,则必须通过<#local someVar>...</#local>#escape捕获输出。 (请注意${...}。如果您使用#noescape重新打印捕获的输出,它将再次转义,因此您需要{{1}}。)

答案 1 :(得分:0)

我找到了使用assign的解决方法:

<#assign a><@A text="abc"/></#assign> <@B text=a/>

无论如何,知道这是否有可能会很有趣。