【问题标题】:C++ HTML template framework, templatizing library, HTML generator library [closed]C ++ HTML模板框架,模板化库,HTML生成器库[关闭]
【发布时间】:2008-12-10 10:41:54
【问题描述】:

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

如果我能提供一些基本功能,例如循环、if/else、int 转换为字符串等,那就太好了。

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

你有什么建议吗?

我也看到了嵌入 Lua 等语言的可能性,但是我也没有找到一个模板库。

【问题讨论】:

  • 太多已过时、未更新或死链接。
  • 第一个答案是社区wiki,你可以更新它。

标签: c++ template-engine


【解决方案1】:

对上述项目的快速回顾。

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

清银

模板化

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

HTML 模板 C++

ctpp

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

重量

平板

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

Jinja2C++

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @gbjbaanb:我已将 url 更新到新位置。
    【解决方案3】:

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

    • 变量替换
    • 可重复或可选块
    • 文件包括
    • MIT 许可
    • 没有外部依赖
    • 单一源文件,轻松添加到任何项目中

    免责声明:我是作者。

    【讨论】:

    • 对我来说效果很好。感谢分享!
    • 喜欢它是单文件。不过有点过时了,最后一次提交是 2 年前。
    • NLTemplate 很不错,感谢 CatNapGames!有几件事我不喜欢它(抛出字符串而不是异常,缺少 nil 类型的块引用),所以我写了类似的东西。 github.com/michaelainsworth/StringTemplate
    • 上面的链接好像失效了。
    【解决方案4】:

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

    【讨论】:

    • 值得记住,但是我正在研究如何将 HTML 模板化功能嵌入到 C++ 桌面程序中。
    • 我绝对称它为框架。它甚至可以生成 JavaScript 代码。见webtoolkit.eu/wt/src/hello
    【解决方案5】:

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

    【讨论】:

    • 文档已过时,开发似乎停滞了
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      脸书的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"
      

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          模板

          https://code.google.com/p/ctemplate/?redir=1

          新的 BSD 许可证

          【讨论】:

            【解决方案10】:

            我最初搜索时不知何故错过了 NLTemplate,并编写了自己的 C++ 模板引擎,显然与 NLTemplate 有类似的用例:-)

            https://github.com/hughperkins/Jinja2CppLight

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

            【讨论】:

            • 顺便说一句,我还制作了一个不同的模板,基于嵌入式 lua 引擎。我认为 lua 版本非常酷,因为 lua 又小又快,然后我们可以在 github.com/hughperkins/luacpptemplater 模板中使用 lua 的全部功能
            • 它根本不起作用。甚至是 README 中的示例。
            【解决方案11】:

            我为 c++ 开发了一些 here 仿照 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 许可

            【讨论】:

              【解决方案12】:

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

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

              需要BOOST regex库,但下个版本会替换为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.
              

              【讨论】:

                【解决方案13】:

                Jinja2C++

                说明:

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

                【讨论】:

                  猜你喜欢
                  • 2011-04-04
                  • 1970-01-01
                  • 2012-11-01
                  • 1970-01-01
                  • 2010-09-06
                  • 1970-01-01
                  • 2010-10-01
                  • 1970-01-01
                  • 2015-12-01
                  相关资源
                  最近更新 更多