前回はプログラムにHTMLを直接埋め込んでいましたが、
記述量が増えるとあっさり破綻するので、ファイルを読み込んで出力する形にします。
単純にstd.file.read等で読み出せばとりあえず事足りるのですが、
HTMLテンプレートエンジンを作ってありますので、こちらを使います。
後々テンプレートとして使用しますし。
今回のソース
初期化処理
jp.ku6.bbs.action.ThreadListActionのコンストラクタに、ファイルパスを指定でファイルを読み込む処理を追加します。
1 | // HTMLファイルからテンプレートオブジェクトを作成 |
---|---|
2 | auto tpl = FileAutoReloadableSweetsTemplate.instance(TEMPLATE_DIRECTORY ~ "/ThreadList.html"); |
今回はテンプレートとして使わないのであまり関係ありませんが、
内部的にはファイルを読み込み、テンプレートとして解析し、
処理用のデータ構造を構築しています。
TEMPLATE_DIRECTORYはconstants.dで定義しています。
テンプレートファイル置き場のディレクトリです。
取得したテンプレートデータはただのデータの塊なので、
それを操作するオブジェクトに渡してあげます。
1 | // テンプレートオブジェクトをテンプレート処理オブジェクトに渡す |
---|---|
2 | sweets_ = new AutoUpdatableSweets(tpl); |
このオブジェクトを通してテンプレートに対する処理を設定します。
レスポンス処理
レスポンスを返す処理は、前回HTMLを出力していた処理を、読み込んだファイルを出力するよう変更するだけです。
1 | // テンプレートをそのまま出力 |
---|---|
2 | sweets_.print(&response.append); |
若干書き方が見慣れないと思いますので補足します。
Sweets.printの定義は次のようになっています。
1 | alias void delegate(const(char)[]) SweetsPrinter; |
---|---|
2 | void print(SweetsPrinter printer); |
const(char)[]を受け取るdelegateを渡し、
そのdelegateに対して出力を行うようになっています。
Sweets.printがstringを返さないのは、
確保済みのメモリ領域に対して出力出来るようにしたかった為です。
実行
テンプレートファイルを読み込みますので、まずはこれを配置します。TEMPLATE_DIRECTORYで定義されているように、
/usr/local/bbs/templatesの下に、ThreadList.htmlを配置します。
実行ファイルは前回同様dmdでビルドし、配置中のものを上書きします。
ブラウザでアクセスすると、ThreadList.htmlの内容が表示されます。
次回へ続く