今回は\(^o^)/とテンションを上げるほどでもないのですが、まあ、シリーズなのでw
GaedsのGiter8テンプレートを作ろうと思って、そのためのサンプルアプリを作ったのですが、 そこで使ったテンプレートエンジンのTwirlが結構いいと思ったので紹介したいと思います。 Giter8テンプレートについては次回に詳しく説明するので、今回はサンプルアプリのほうに注目します。
ScalaのテンプレートエンジンというとScalateが有名なんですが、 Google App Engineにローカルファイルを作成できない制限なんかがあって、 Scalateをそのまま使うのは難しいんですね。 なので、今回はTwirlという別のテンプレートエンジンを使うことにしました。
TwirlはPlay2.0のテンプレートエンジンを単独で使えるようにしたものです。 依存関係も完全に切り離されているので、他のPlay2.0の知識が必要ということもないです。
基本的にPlay2.0のドキュメントが参考になります。 Play2.0のドキュメントは日本語に翻訳してくださってる人たちがいるので、 そちら読むとわかりやすいです。
テンプレートエンジン · playframework-ja/Play20 Wiki
Twirl(というかPlay2.0のテンプレートエンジン)の特徴は、テンプレートがScalaの関数に変換されるということですね。 これにより、テンプレートを呼び出すのも簡単だし、テンプレート同士を組み合わせるのも簡単だし、 タイプセーフでもあるというScalaらしいライブラリだと思います。
作ったのは簡単な一行掲示板です。
Twitter Bootstrapを使って体裁は整えていますが、コードにすると40行程度の単純なコードです。 いかにもなサンプルアプリですね。
コードはこちらになります。
gaeds-sample
├── build.sbt
├── project
│ └── plugins.sbt
└── src
└── main
├── scala
│ └── board.scala
├── twirl
│ ├── board.scala.html
│ ├── form.scala.html
│ ├── index.scala.html
│ └── main.scala.html
└── webapp
├── WEB-INF
│ ├── appengine-web.xml
│ └── web.xml
├── css
│ ├── bootstrap-responsive.min.css
│ └── bootstrap.min.css
├── img
│ ├── glyphicons-halflings-white.png
│ └── glyphicons-halflings.png
└── js
└── bootstrap.min.js
テンプレートはsrc/main/twirlの下に置きます。
css、img、jsに入ってるのはTwitter Bootstrapのファイルです。
あとは、前に説明したApp Engineの構成と同じですね。
ほとんどいつもと同じコードなので、ポイントだけ。
case class Twirl(html: twirl.api.Html) extends ComposeResponse(HtmlContent ~> ResponseString(html.body))
UnfilteredでTwirlを使う場合はこのケースクラスを定義して使うようにすると便利です。 HTMLのレスポンスヘッダを付けて、HTMLを返すという処理です。
def view = Ok ~> Twirl(html.index())
ここで使っているhtml.indexという関数ですが、Twirlがテンプレートから生成します。
src/main/twirl/index.scala.htmlというファイルがhtml.indexという関数になります。
この関数はコードやテンプレート中のどこからでも制限なく使えます。
それではテンプレートのほうを見てみましょう。
form.scala.htmlboard.scala.htmlmain.scala.htmlindex.scala.html単純なアプリなので四つに分ける必要なんて全然ないんですけど、分けやすいのでこうしたくなるんですよね。
テンプレート内の詳しい文法は前述の日本語ドキュメントを参照してください。
テンプレートエンジン · playframework-ja/Play20 Wiki
シンプルなのですぐに覚えることができると思います。
form.scala.htmlこれは純粋なformのHTMLの部品ですね。他のテンプレートから使います。
board.scala.htmlこれは掲示板の表示部分です。上と同じく他のテンプレートから使います。 見たとおりテンプレート中のScalaのコードも自然に書けます。
一つ注意としては @for( の部分はスペースを開けずに書くということですね。
テンプレート内のScalaのコードとHTMLの区別はTwirlが自動的におこなってくれるのですが、
スペースを開けるとうまくいかないみたいです。
main.scala.htmlこれはガワの部分ですね。引数を取るテンプレートになってます。
index.scala.htmlタイトルと部品を組み合わせて完全なページを作っています。 これがコード中で呼び出している関数に変換されるわけです。
TwirlがPlay2.0のテンプレートエンジンということで、 だったらUnfilteredじゃなくてPlay2.0を使ったほうがいいんじゃね?と思われるかもしれませんが、 現時点のPlay framework 2.0.1ではwarパッケージを作ることができないので、 Google App Engineには使えないみたいです。
一応warを作ることができるプラグインもあるみたいなのですが、 まだ実用は難しいようです。
Twitter / takezoen: play2-war-pluginを試してみた。
Play2.1でwarパッケージに対応予定ということなので、そうなったら試してみたいと思います。
今回はテンプレートエンジンのTwirlについて解説しました。 僕の感想としてはTwirlはシンプルでタイプセーフというScalaらしいライブラリだなと思いました。 まあ、Play2.0自体がそうできているんだと思いますが。 Google App Engineで使うならこれがいいんじゃないですかね。
いつの間にかGiter8テンプレートの一覧ができてた。n8han氏セレクトなのかな?
完成させてくれー
nomorescriptとは ScalaのコードをJavaScriptに変換するscalaのコンパイラープラグインです。