2

文字列テンプレートのカスタム フォーマット関数を作成する方法を知りたいです。次のコードがあるとしましょう:

render(attributes) :: <<
<html>
    $atributes: {
        <div> $customformat(atribute.name)$</div>
    }


</html>
>>

customformat(name) ::= <<
    $name; format="upper"$
>>

現在、関数 customformat の動作は次のとおりです。

入力: "hello world" -> 出力: "HELLO WORLD"

出力が次のようになるように、 customformat 関数を変更したいと思います。

入力: "hello world" -> 出力: "HELLO_WORLD"

4

2 に答える 2

4

StringTemplate はモデルとビューの厳密な分離に関するものであるため、私が知る限り、これは不可能です。

代わりに、書式設定された文字列を返すコントローラーにゲッターを用意したほうがよいと思います。

この質問は役に立つかもしれません:テンプレート内に Java コードを埋め込む


実際、フォーマットされた文字列ゲッターの必要性を回避する簡単な方法を見つけました。

必要な方法で文字列をフォーマットできる新しい StringRenderer を作成する必要があります。

public class MyStringRenderer extends StringRenderer
{
    @Override
    public String toString(Object o, String formatString, Locale locale) {
        if (!("upperAndUnder".equals(formatString)))
            return super.toString(o, formatString, locale);
       // we want upper case words with underscores instead of spaces
        return ((String) o).replaceAll(" ", "_").toUpperCase(locale);
    }
}

次に、テンプレート グループに新しいレンダラーについて知らせる必要があります。

public static void main(String[] args) {
    STGroup templates = new STGroupFile("test.stg");
    templates.registerRenderer(String.class, new MyStringRenderer());
    ST renderTemplate = templates.getInstanceOf("render");
    renderTemplate.add("attributes", new String[]{"blahh blahh I'm a string", "I'm another string"});
    System.out.println(renderTemplate.render());
}

次に、前と同じように format 関数を呼び出すことができますが、パラメーターとして「upperAndUnder」を渡します。

group test;

delimiters "$","$"

render(attributes) ::= <<
<html>
    $attributes:{ attribute | <div> $customFormat(attribute)$</div>}; separator="\n"$


</html>
>>

customFormat(name) ::= <<
    $name; format="upperAndUnder"$
>>

これは次を印刷します:

<html>
    <div> BLAHH_BLAHH_I'M_A_STRING</div>
    <div> I'M_ANOTHER_STRING</div>


</html>

ご参考までに:

これが元の StringRenderer コードです

レンダラーの詳細

于 2014-11-24T11:53:05.380 に答える