如何评估Freemarker宏中的参数?

wil*_*dev 6 freemarker

假设我们有一个简单的Freemarker宏:

<#macro myMacro expr>

    <#local x=1>
      ${expr}
    </#local>

    <#local x=2>
      ${expr}
    </#local>

</macro>
Run Code Online (Sandbox Code Playgroud)

<@myMacro“ A” />给出:

A A


我需要类似<@myMacro“ A $ {x}” />之类的东西:

A1 A2

但是在传递给宏之前,无法对$ {x}进行插值。即使我使用原始字符串r“ A $ {x}”作为参数,这也不起作用。

我试图玩?eval,但还没有结果(((

有可能做我所需要的吗?

dde*_*any 5

您要在此处评估表达式还是模板片段?表达式类似于1 + 2"A${x}"(请注意引号;它是字符串文字),当您将其传递时,其外观将类似于<@myMacro "1 + 2" /><@myMacro r'"A${x}"' />;。最后一点很尴尬。模板代码段类似于<#list 1..x as i>${i}</#list>A${x}(请注意没有引号),它更强大,并且在字符串中看起来更好。根据我所看到的,您可能想要评估一个模板代码段,因此应该是:

<#macro myMacro snippet>
  <#-- Pre-parse it for speed -->
  <#local snippet = snippet?interpret>

  <#local x = 1>
  <@snippet />

  <#local x = 2>
  <@snippet />
</#macro>
Run Code Online (Sandbox Code Playgroud)

然后您可以将其用作:

<@myMacro r"A${x}" />
Run Code Online (Sandbox Code Playgroud)

甚至:

<@myMacro r"<ul><#list 1..x as i><li>${i}</li></#list><ul>" />
Run Code Online (Sandbox Code Playgroud)

无论如何,整个事情都是FreeMarker的一个奇怪用法,如果您非常依赖?interpret?eval(例如,每个HTTP请求要处理数百个),您可能会发现它很慢。也就是说,Java标准的速度慢。