Born Too Late

Yuya's old tech blog.

Sinatra 風テンプレートを扱う InlineTemplateLoader 作った

2013-03-17 13:34:30

2 月はブログを書くことなく終わってしまいました。
3 月も半ばを過ぎようとしていますが、久々のブログ更新です。

ちょいとした Web アプリケーションを書くとき、やっぱり選んでしまうのは Sinatra。
とにかくサクっと作れるし、ファイルとかも少なくて済む。

中でもズボラ的に便利だと思うのがインラインテンプレートと呼ばれる機能です。
以下のように、プログラムの末尾にテンプレートをそのまま書けるというものです。

このインラインテンプレートがそれだけで gem 化されていれば、あらゆるフレームワークや DSL にこれを組み込めるのではないか、ということで作ってみました。

yuya-takeyama/inline_template_loader

inline_template_loader という名前で rubygems.org に登録済みですので、gem コマンドなり bundler なりでインストールできます。

使い方はこんな感じ。

InlineTemplateLoader.load でインラインテンプレートを Hash として読み込みます。

インラインテンプレートを読み込むファイルを load に引数として渡すこともできますが、省略時は caller を使ってバックトレースから呼び出し元を調べて、そのファイルから読み出すようにしています。

これを何らかのフレームワーク等に組み込む場合は、少し工夫が必要です。
普通は InlineTemplateLoader.load をラップして使うことになると思いますが、その場合は上記のように引数を省略してしまうと、ラッパーメソッドが存在するフレームワークのライブラリそれ自体からインラインテンプレートを読み込んでしまうことになります。

それだと困るので、引数に整数値を渡した場合は caller が返す配列のうち、整数値分だけ後の要素を呼び出し元とすることができます。

文だけだと訳がわからないと思うので、例を示します。

まずは DSL を用いた何らかのプログラム。
インラインテンプレートはこのファイルにあります。

次に InlineTemplateLoader をラップして何らかの処理を行う内部 DSL の処理系です。

このように load に整数値 (ここでは 4) を渡すことで、その文だけバックトレースを遡り、DslUsesInlineTemplateLoader.dsl の呼び出し元のファイルからインラインテンプレートを読むことができます。

来週あたりには、これを用いて MongoDB を操作する DSL なんかを紹介できればと思ってます。

そんじゃーね。