プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件
たとえばドキュメント生成ツールなんかを作ってると、HTML をプログラムの中で生成したい!ってことは良くあると思います。でも、そのためにいちいちテンプレートエンジンを使うのは大げさな場合も多いですよね。たとえば、ちょっとリストを出力するとき。以下のような感じのコードを書いたことがある人は多いと思います。
std::string mylistToHTML(const std::vector<std::string>& list) { std::string r("<ul class=\"mylist\">\n"); for (auto i = list.begin(); i != list.end(); ++i) { r += std::string("<li class=\"mylist-item\">") + escapeHTML(*i) + "</li>\n"; } r += "</ul>\n"; return r; }
しかし、この手のコードは、HTML の占める割合が多く、あるいは、出力するデータ構造が複雑になってくると煩雑になりすぎる気がします。
picotemplate は、こういったケースで威力を発揮するテンプレートエンジンです。picotemplate を使うと上のコードは以下のように書き換えることができます。
std::string mylistToHTML(const std::vector<std::string>& list) { std::string _; ?<ul class="mylist"> for (auto i = list.begin(); i != list.end(); ++i) { ?<li class="mylist-item"><?= escapeHTML(*i) ?></li> } ?</ul> return _; }
HTML とロジックが「?」と「<?= ?>」という記号によって分離されるため、コードが簡潔になっていることがわかります。
テンプレートとロジックを別々のファイルに書くのが適切でない場合、具体的には、
- プログラムで HTML 等のドキュメントを生成する場合
- かつ、デザインとコードの分離が不要な場合
- あるいは、複雑なデータ構造を HTML 等に変換する場合
といったケースで威力を発揮するでしょう。
picotemplate は現在、Perl, C++, JavaScript, JSX の各言語に対応しています。
コードは kazuho/picotemplate - Github にあるので、詳しくはそちらを御覧ください。
それでは have fun!