3

プラグイン プロジェクトがあり、Velocity テンプレートを使用しています。ユーザーは設定ページからテンプレート本体を変更できます。ユーザーが設定ページで「OK」をクリックしたときに、テンプレート本体の変数を取得したいと考えています。Velocity テンプレート本体から変数を抽出するのに助けが必要です。

4

4 に答える 4

4

Velocity は JavaCC を使用してテンプレートを解析し、AST を作成します。

テンプレートを解析するために必要なのは RuntimeInstance だけです。

RuntimeInstance ri = new RuntimeInstance();
SimpleNode node = ri.parse( reader, "templateName" );

次に、必要に応じて BaseVisitor を拡張する必要があります。BaseVisitor は、すべての訪問者の抽象クラスです。BaseVisitor にはノード タイプのメソッドが 1 つあるため、AST ノードを簡単にフィルタリングできます。

ParserVisitor visitor = new BaseVisitor() {
@Override
public Object visit(final ASTReference node, final Object data) {
    //insert here your logic ...
    System.out.println(node.getFirstToken();
    //use super.visit( node, data) if you need to traverse all node children 
    return null;
    }
};

そしてノードにアクセスします...

visitor.visit(node, null);

次のようなテンプレートがある場合:

some text $var other text

提案されたコードの印刷のみ$var

ASTReference は ANY 参照であることに注意してください。次のようなテンプレートがある場合:

some text $var other text
#set( $primate = "monkey" )

このコードは次を出力します:$var$primate.

于 2014-03-29T14:34:51.617 に答える
0

私が考えることができる唯一の方法は、速度エンジンに次のようなものを追加することです:

VelocityContext context = new VelocityContext();
context.put("parameters", new HashMap());

... テンプレート内で、ユーザーが次のようにパラメータ ハッシュマップに値を入力できるようにします。

#set ($t = $parameters.put("value", "key"))

(重要: ユーザーは $t などの一時パラメーターに値を割り当てる必要があります)

...そして、レンダリング後、値を取り出します:

HashMap map = (HashMap)context.get("parameters");
for (String key : map.keySet()) {
    // ...
}
于 2013-08-09T15:49:42.407 に答える