1

ST4 テンプレート内に実行可能な Java コードを埋め込むことは可能ですか? たとえば、テンプレートに文字列を渡したい場合、文字列をそのまま印刷することもあれば、大文字で印刷することもあるため、Java コードで必要な変換を行う必要があります。この機能がなければ、同じ機能を実現する方法が 3 つあります。

(1) Java で代替値を事前に計算し、それらすべてを一度にテンプレートに渡します (ただし、これにより引数が多すぎる可能性があります)。

// in the below code, if the template can compute DESCRIPTION_CAPS from DESCRIPTION, using embedded java code, that reduces one argument
test(DESCRIPTION, DESCRIPTION_CAPS) ::= <<
this is original <DESCRIPTION>
this is caps <DESCRIPTION_CAPS>
>>

(2) そのような引数が多くなりすぎた場合、もう 1 つのオプションは、templpate を小さな部分に分割することですが、コードが見苦しく、読みにくくなります。

test1(DESCRIPTION) ::= <<
this is original <DESCRIPTION>
>>

test2(DESCRIPTION_CAPS) ::= <<
this is caps <DESCRIPTION_CAPS>
>>

(3) クラス内の関連するすべての値を事前に計算し、テンプレートに getter 関数を (引数なしで) 呼び出して、クラスから関連する値を単純に取得させます。

test() ::= <<
this is original <values.description>
this is caps <values.description_caps>
>>

現時点では (埋め込み Java クラスが利用できない場合)、3 番目のオプションが最適なソリューションのようです。より良い解決策が存在するかどうかアドバイスしてください。

注: 上記の例では、CAPS を例として使用していますが、より複雑な Java 関数も必要になる可能性があります。

4

2 に答える 2

1

@Hartmut が言ったように、Java コードをテンプレート内に埋め込むことはできませんが、文字列を必要な方法でフォーマットするために使用できるカスタムStringRendererを作成できます。

次に、カスタム フォーマット文字列を次のようにレンダラーに渡すことができます。

test(description) ::= <<
    this is original <description>
    this is caps <description; format="upper">
    this is custom format <description; format="my-format-string">
>>

PS テキストの大文字と小文字を変更することにのみ関心がある場合は、独自のロールを作成する必要がない可能性があります。次を使用して、StringTemplate にバンドルされている StringRenderer への参照を追加するだけです。

templateGroup.registerRenderer(String.class, new StringRenderer());

フォーマット文字列として「upper」、「lower」、または「cap」を渡します

詳細については、こちらの回答を参照してください

于 2014-12-04T10:42:17.953 に答える