C ++ HTML模板框架,模板化库,HTML生成器库

时间:2008-12-10 10:41:54

标签: c++ template-engine

我正在寻找与C ++类似的C ++模板/生成器库。 Ruby的Erb,Haml,PHP的Smarty等等。

如果我会使用循环,if / else,int转换为字符串等基本功能,那将会很棒。

如果我可以在哈希映射中传递所有这些参数而不是为每个参数调用某个函数,那么传递给模板渲染引擎的参数也很重要。

你有什么建议吗?

我也可以看到嵌入像Lua这样的语言的可能性,但是我还没有找到一个模板库。

13 个答案:

答案 0 :(得分:50)

快速回顾上述项目。

http://rgrz.tumblr.com/post/13808947359/review-of-html-template-engines-in-c-language

ClearSilver

Templatizer

  • 网站:http://www.lazarusid.com/libtemplate.shtml
  • 项目:仅下载
  • 组:无
  • 许可证:免费使用
  • 语言:C(低级)/ C ++(接口)混合
  • 最后更新:未知
  • 最新发布:未知
  • 文件:无
  • 社区:无

HTML模板C ++

CTPP

  • 网站:http://ctpp.havoc.ru/en/
  • 项目:仅下载
  • 组:无
  • 许可证:BSD许可证
  • 语言:C ++ with C API
  • 最后更新:2011年10月5日
  • 最新发布:2011年10月5日版本2.7.2
  • 文件:Rich
  • 社区:无

WT​​

Flate

  • 网站:http://flate.dead-inside.org/
  • 项目:无
  • 组:无
  • 许可证:LGPL v2.1
  • 语言:C
  • 最后更新:2010年9月4日
  • 最新发布:2010年9月4日的2.0
  • 文件:差劲
  • 社区:无

答案 1 :(得分:7)

Grantlee是一个基于Django模板系统的字符串模板引擎。它被移植到C ++ / Qt。

答案 2 :(得分:6)

NLTemplate是一个小型C ++模板库,其语法类似于Django。

  • 可变替换
  • 可重复或可选块
  • 文件包含
  • 麻省理工学院获得许可
  • 没有外部依赖
  • 单个源文件,易于添加到任何项目

免责声明:我是作者。

答案 3 :(得分:3)

Wt(发音为'witty')是一个用于开发和部署Web应用程序的C ++库和应用程序服务器。它不是一个“框架”,它强制执行一种编程方式,而是一个库。

答案 4 :(得分:3)

CTPP是用C ++编写的非常快速和强大的库。它具有Perl,PHP和Python的绑定。

答案 5 :(得分:2)

ClearSilver可用于c。 Here是使用clearsilver的现有网站列表。但我自己不用它。

答案 6 :(得分:2)

facebook的format

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"

答案 7 :(得分:1)

我尝试过使用ffead-cpp框架提供的模板引擎和动态C ++页面,wiki

上显示了一个示例实现

答案 8 :(得分:1)

答案 9 :(得分:1)

我最初在搜索时错过了NLTemplate,编写了自己的C ++模板引擎,显然与NLTemplate类似: - )

https://github.com/hughperkins/Jinja2CppLight

  • 类似Jinja2的语法
  • 轻量级,不依赖于boost,qt等......
  • 变量替换
  • for循环
    • 包括嵌套for循环: - )

答案 10 :(得分:0)

我开发了here之后为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 }}$ >
    & }
>
  • 可变替换
  • 用户定义的代码块
  • 收获c ++的全部功能(循环,变量声明,你可以命名)
  • 超级易于集成到源代码构建中
  • 在编译时可能完成的所有事情
  • 没有中间格式(直接c ++)
  • 易于调试(因为c ++输出)
  • 没有外部依赖
  • 超过600行的c ++
  • GPL许可

答案 11 :(得分:0)

Templtext是一个小型C ++文本模板处理库。它支持类似bash的变量(%VAR或%{VAR})。但主要功能是支持用户定义的功能。图书馆是我创建的。

  • 模板解析
  • 可变替换
  • 模板中的用户定义函数
  • C ++ 11
  • GPL许可

需要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.

答案 12 :(得分:0)

Jinja2C ++

说明:

  • C ++ 14/17库
  • 支持主流编译器(Visual C ++,gcc,clang)
  • 易于使用的界面。
  • 符合Jinja2规范http://jinja.pocoo.org/docs/2.10/
  • 部分支持模板和-参数的窄字符和宽字符字符串。
  • 针对C ++类型的内置反射。
  • 用户定义的可调用项。
  • 强大的全功能Jinja2表达式,具有过滤(通过“ |”运算符)和“ if”表达式。
  • Jinja2标签的大集合包括宏和模板扩展名。
  • 丰富的错误报告。