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

标签 macros freemarker

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

我想用 x 参数调用 B,使其成为由 A 格式化的一些文本。喜欢 <@B x="<@A text='abc'/>" />返回Another <@A text='abc'/>

这有可能吗?

我尝试了 ?interpretsuggested 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 中的宏调用与其他语言中的函数调用有所不同。

最佳答案

宏调用不是表达式,因此不能在表达式内部使用(如参数值)。调用宏是因为它们的副作用,通常是打印到输出,并且没有返回值。函数(参见 #function )被调用以获取其返回值,因此函数调用是表达式。因此,在这种情况下,您可能需要函数,而不是宏。

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

关于macros - 在另一个宏的字符串参数中使用 Freemarker 宏调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763754/

相关文章:

java - 为什么这个正则表达式在 FreeMarker 中失败

python - 有谁知道 FMPP 的 Python 等价物?

c++ - 在 C++ 中使用重复的宏

rust - 为什么在基于类型实现宏时需要在 <$a> 中使用尖括号?

Rust 函数名称(调用者)或宏内的任何其他上下文

angularjs - Freemarker 与 AngularJS

java - 参数可以为空的 Freemarker 函数

java - 如何在FTL(Freemarker)中创建 map 列表

c++ - 如果类型是在命名空间内创建的,我如何才能知道?

excel - 为什么我的 VBA 宏在打开和关闭数百个 CSV 文件后停止?