2011-09-09 9 views
0

私はFreemarker(FMPP)を使ってテキストファイルをカスタマイズしています。Freemarker変数定義が別の変数を参照しています

VAR1=some-value 
VAR2=${VAR1} 

これは非常に私の実際のファイルから簡略化されているが、私のユースケースの本質を保持し、次のように私は、補間データを定義するプロパティファイルを持っていると思います。テンプレートには${VAR2}という形式の参照が含まれていますが、これはsome-valueが補間されることを期待しています。代わりに、補間された値はリテラル${VAR1}です。

これは変数の名前(間接参照)として変数の値を使用することを意味するCan a freemarker interpolation contain an interpolation?とは異なります。また、can freemarker do second replacementへの解決には、テンプレートの変更が含まれます。私はテンプレートが処理される前に概念的に '代入'が起こるようにしたいので、テンプレートは${VAR2}のみを参照することができ、二重補間を意識する必要はありません。

FreeMarkerでこれを実現する方法はありますか?

もしそうでなければ、Velocityがこれを簡単に行うことができるかどうか誰にでも教えてください。

答えて

2

.propertiesファイルで参照する変数は、常に同じ.propertiesファイルから来ていますか?その場合は、ファイルがロードされたときに必要なすべての置換を行うカスタムFMPP DataLoaderを書き込むことができます。 (または、tddデータローダはまたget(varname)と、おそらくいくつかのeval(...) -sを使用して似たような達成することができますが、それはおそらく、この目的のためにあまりにも冗長です。)テンプレート言語レベルでこれを解決するよう

を、それが必要になります${...}の出力がテンプレートフラグメントとして再解析され、テンプレート言語構造のように出力に何も表示されなくなるまで、私はそれを推測します。私はこれを行うテンプレート言語について知らない。しかし、FreeMarkerで必要とされる文字列が、文字列の値を読み取るたびにこの繰り返し評価を行うカスタムのTemplateScalarModel実装でラップされている場合は解決できます。 (FMPPでこのようなカスタムTemplateModelを使用するには、FMPPに戻す前にこの特別な方法で文字列をラップするカスタムFMPPデータローダーも必要です)。

+0

これは私が思ったものです。同じ結論。私は2段階のソリューションを開発しました。まず、テンプレートとしてプロパティ変数を処理し(外部パラメータを置換するため)、次に '実際の'テンプレートの2番目の変換への入力として処理します。 –

関連する問題