garbagetown

個人の日記です

レンダリング結果の取得

ちょっとした理由 から、play1 でテンプレートをレンダリングした結果として生成される HTML をプログラムから取得する方法について調べてみました。

手順は下記の通りで、とても簡単です。

  1. play.templates.TemplateLoader#load(String) に views から見たテンプレートファイルまでの相対パスを渡して play.templates.Template インスタンスを取得する
  2. テンプレートで使う引数を Map にまとめて play.templates.Template.render(Map<String, Object>) に渡す

TemplateLoader#load(String) に渡すテンプレートファイルのパスには規約で定められた app/views/ ディレクトリからの相対パスで指定する必要があるらしく、少しハマりました。

Template.render(Map<String, Object>) に渡す Map は自分でちまちま作ります。

以下、今回対応したソースコードの抜粋です。

private static String getHtml(String version, String id) {
    String html = null;
    if (Play.mode == Play.Mode.PROD && !isTextile(version)) {
      (snip)
    } else {
      (snip)
        Template template = TemplateLoader.load("Documentation/page.html");
        Map<String, Object> args = new HashMap<String, Object>();
        args.put("request", request);
        args.put("versions", versions);
        args.put("version", version);
        args.put("id", id);
        args.put("article", article);
        args.put("navigation", navigation);
        html = template.render(args);
    }
    return html;
}

簡単ですね。