プログラム中に 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!