2011-12-03 9 views
4

は、我々は簡単なFreemarkerのマクロがあるとします。Freemarkerマクロ内のパラメータを評価する方法は?

<#macro myMacro expr> 

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

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

</macro> 

< @myMacro "A" は/>得られます。


を私は <ようなものが必要@myMacro "A $ {x}" />は次のように入力します:

A1 A2

マクロに渡す前に$ {x}が補間されているので機能しません。 生の文字列「A $ {x}」をパラメータとして使用しても、これは機能しません。

私はevalの?と遊ぶことを試みたが、何の結果は(((

は、私はあなたがここに表現、またはテンプレートスニペットを評価しますか?

答えて

3

が必要なものを行うことが可能ですまだありません?表現は1 + 2または"A${x}"のようになります(引用符は文字列リテラルです)。これを渡すと<@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標準が遅い、つまり。

+1

ありがとうございました!あなたの方法は "解釈する"と私には受け入れられます! 私のfreemarkerの使い方はかなり具体的ですが、私はソースコードの生成にそれを使用しているので、 "?interpret"のパフォーマンスはあまり重要ではありません。 – wilddev

関連する問題