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