Как оценить параметр внутри макроса Freemarker? - PullRequest
5 голосов
/ 03 декабря 2011

Предположим, у нас есть простой макрос Freemarker:

<#macro myMacro expr>

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

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

</macro>

<@ myMacro "A" /> дает:

A A


Мне нужно что-то вроде <@myMacro "A $ {x}" /> должно дать:

A1 A2

но он не работает как $ {x}, интерполированный до перехода в макрос. Это не работает, даже если я использую необработанную строку r "A $ {x}" в качестве параметра.

Я пытался играть с? Eval, но пока нет результата (((

Можно ли делать то, что мне нужно?

1 Ответ

4 голосов
/ 03 декабря 2011

Хотите оценить выражение здесь или фрагмент шаблона?Выражение имеет вид 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>

, а затем вы можете использовать его как:

<@myMacro r"A${x}" />

или даже:

<@myMacro r"<ul><#list 1..x as i><li>${i}</li></#list><ul>" />

В любом случае, все это немного странное использование FreeMarker, и если вы очень сильно полагаетесь на ?interpret или ?eval (как вы делаете сотни из них на HTTP-запрос), вы будетевозможно, найти это медленно.Медленно со стандартами Java, то есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...