たとえば、C++用のテンプレート/ジェネレーターライブラリを探しています。 RubyのErb、Haml、PHPのSmartyなど.
ループ、if/else、文字列へのint変換などのいくつかの基本的な機能があれば素晴らしいでしょう。
テンプレートレンダリングエンジンへのパラメーターの受け渡しは、各パラメーターに対して何らかの関数を呼び出す代わりに、すべてをハッシュマップで渡すことができる場合にも重要です。
何かお勧めはありますか?
Luaのような言語を埋め込む可能性もありますが、そのためのテンプレートライブラリも見つかりませんでした。
言及されたプロジェクトの簡単なレビュー。
http://rgrz.tumblr.com/post/13808947359/review-of-html-template-engines-in-c-language
Grantlee はDjangoテンプレートシステムに基づく文字列テンプレートエンジンです。C++/Qtに移植されています。
NLTemplate は、Djangoに似た構文を持つ小さなC++テンプレートライブラリです。
免責事項:私は著者です。
Wt (「ウィッティ」と発音)は、Webアプリケーションを開発および展開するためのC++ライブラリおよびアプリケーションサーバーです。それはプログラミングの方法を強制する「フレームワーク」ではなく、ライブラリです。
[〜#〜] ctpp [〜#〜] は、C++で記述された非常に高速で強力なライブラリです。 Perl、PHP、Python。
facebookの 形式 :
std::cout << format("The answers are {} and {}", 23, 42);
// => "The answers are 23 and 42"
std::map<std::string, std::string> m { {"what", "answer"}, {"value", "42"} };
std::cout << vformat("The only {what} is {value}", m);
// => "The only answer is 42"
ClearSilver はcで使用可能です。 ここ はclearsilverを使用する既存のWebサイトのリストです。しかし、私はそれを自分では使いません。
どういうわけか、最初に検索していたときにNLTemplateを見逃し、NLTemplateと明らかに似たユースケースで、独自のC++テンプレートエンジンを作成しました:-)
https://github.com/hughperkins/Jinja2CppLight
Ffead-cppフレームワークが提供するテンプレートエンジンとダイナミックC++ページを使用してみました。実装例は wiki
Jinja2C++
説明:
私は何かを開発しました こちら C++の jade をモデルにしています。シンプルだが強力な入力言語を受け取り、HTMLをストリームに書き込む単一のc ++テンプレート関数を作成します。
< html
< h1 The title is ${{ params["title"] }}& >
< ul >
& for(int i = 0; i < boost::get<int>(params["items"]); ++i) {
< li Item ${{ i }}$ >
& }
>
Templtext は小さなC++テキストテンプレート処理ライブラリです。 bashのような変数(%VARまたは%{VAR})をサポートします。ただし、主な機能はユーザー定義関数のサポートです。ライブラリは私によって作成されました。
bOOST正規表現ライブラリが必要ですが、次のバージョンではstd :: regexに置き換えられます
例1:
using namespace templtext;
Templ * t = new Templ( "Dear %SALUTATION %NAME. I would like to invite you for %TEXT. Sincerely yours, %MYNAME." );
std::map<std::string, std::string> tokens01 =
{
{ "SALUTATION", "Mr." },
{ "NAME", "John Doe" },
{ "TEXT", "an interview" },
{ "MYNAME", "Ty Coon" }
};
std::map<std::string, std::string> tokens02 =
{
{ "SALUTATION", "Sweetheart" },
{ "NAME", "Mary" },
{ "TEXT", "a cup of coffee" },
{ "MYNAME", "Bob" }
};
std::cout << t->format( tokens01 ) << std::endl;
std::cout << t->format( tokens02 ) << std::endl;
出力:
Dear Mr. John Doe. I would like to invite you for an interview. Sincerely yours, Ty Coon.
Dear Sweetheart Mary. I would like to invite you for a cup of coffee. Sincerely yours, Bob.
例2:
using namespace templtext;
std::unique_ptr<Templ> tf1( new Templ( "You have got an $decode( 1 )." ) );
std::unique_ptr<Templ> tf2( new Templ( "You have got an $decode( 2 )." ) );
std::unique_ptr<Templ> tf3( new Templ( "English version - $decode_loc( 1, EN )." ) );
std::unique_ptr<Templ> tf4( new Templ( "German version - $decode_loc( 1, DE )." ) );
std::unique_ptr<Templ> tf5( new Templ( "Flexible version - $decode_loc( 1, %LANG )." ) );
tf1->set_func_proc( func );
tf2->set_func_proc( func );
tf3->set_func_proc( func );
tf4->set_func_proc( func );
tf5->set_func_proc( func );
Templ::MapKeyValue map1 =
{
{ "LANG", "EN" }
};
Templ::MapKeyValue map2 =
{
{ "LANG", "DE" }
};
std::cout << tf1->format() << std::endl;
std::cout << tf2->format() << std::endl;
std::cout << tf3->format() << std::endl;
std::cout << tf4->format() << std::endl;
std::cout << tf5->format( map1 ) << std::endl;
std::cout << tf5->format( map2 ) << std::endl;
出力:
You have got an Apple.
You have got an orange.
English version - Apple.
German version - Apfel.
Flexible version - Apple.
Flexible version - Apfel.