C++模板引擎Ctemplate的介绍

转载 2012年03月27日 16:59:44

    C&C++的模板引擎相对比较少,比较有名的是ClearSilverTeng,他们功能都比较强大,我需要一个轻量级的模板引擎Ctemplate
    ctemplate的设计哲学是轻量级,快速,且逻辑和界面分离,因此和ClearSilver和Teng是有一些差异的。比如Ctemplate就没有模板函数,没有条件判断和循环语句(当然,它可以通过变通的方式来实现)。
1.Ctemplate介绍
    ctemplate大体上分为两个部分,一部分是模板,另一部分是数据字典。模板定义了界面展现的形式(V),数据字典就是填充模板的数据(M),你自己写业务逻辑去控制界面展现(C),典型的MVC模型。
    ctemplate模板中有四中标记,对应的数据字典也有不同的处理方式:

  • 变量,{{变量名}},用两个大括号包含的就是变量名,在c++代码中,可以对变量赋值,任何类型的值都可以(如字符,整数,日期等)。
  • 片断,{{#片断名}},片断在数据字典中表现为一个子字典,字典是可以分级的,根字典下面有多级子字典。片断可以处理条件判断和循环。
  • 包含,{{>模板名}}包含指的是一个模板可以包含其他模板,对应的也是一个字字典。
  • 注释,{{!注释名}},包含注释。

一份演示了完整四种标记的例子如下,

  1. <!--ctexample.tpl-->
  2. <html>
  3. <head>
  4.   <title>{{NAME}}</title>
  5. </head>
  6. {{!This is a example of template.}}
  7. <body>
  8. Hello {{NAME}},
  9. You have just won ${{VALUE}}!
  10. <table>
  11. {{#IN_TABLE}}
  12. <tr>
  13.     <td>{{ITEM}}</td>
  14.     <td>{{TAXED_VALUE}}</td>
  15. </tr>
  16. {{/IN_TABLE}}
  17. </table>
  18. {{>INCLUDED_TEMPLATE}}
  19. </body>
  20. </html>
  21. <!--ctinclude.tpl-->
  22.  <div>
  23. {{INCLUDE_VAR}}
  24. </div>

c++代码如下

  1. #include <stdlib.h>
  2. #include <string>
  3. #include <iostream>
  4. #include <google/template.h>
  5. int main(int argc, char** argv) {
  6.     TemplateDictionary dict("example");
  7.     dict.SetValue("NAME""John Smith");
  8.     int winnings = random() % 100000;
  9.     dict.SetIntValue("VALUE", winnings);
  10.     TemplateDictionary *dict1 = dict.AddSectionDictionary("IN_TABLE");
  11.     TemplateDictionary *dict2 = dict.AddSectionDictionary("IN_TABLE");
  12.     dict1->SetValue("ITEM""Lihaibo");
  13.     dict1->SetFormattedValue("TAXED_VALUE""%.2f", winnings * 0.83);
  14.     dict2->SetValue("ITEM""Qiyuehua");
  15.     dict2->SetFormattedValue("TAXED_VALUE""%.2f", winnings * 0.73);
  16.     if (1)
  17.     {
  18.         dict.ShowSection("IN_TABLE");
  19.     }

  20.     TemplateDictionary *dict3 = dict.AddIncludeDictionary("INCLUDED_TEMPLATE");
  21.     dict3->SetFilename("../tpl/ctInclude.tpl");    
  22.     dict3->SetValue("INCLUDE_VAR","This is a include template.");

  23.      Template* tpl = Template::GetTemplate("../tpl/ctexample.tpl",nwsc::DO_NOT_STRIP);
  24.     std::string output;
  25.     tpl->Expand(&output, &dict);
  26.     std::cout << output;
  27.     Template::ClearCache();
  28.     return 0;
  29. }

注意:

  • 模板字典类似Key和Value的结构,对应的是变量名和值。
  • 片断是可以有多条记录的,如果要显示列表,可以定义为片断,获取多条记录填充到字典中。
  • 片断可以显示,也可以不显示。如果片断的字典有数据,显示。如果片断的字典没有数据,默认是不显示的,可以调用ShowSection来显示。

2.ctemplate高级

  1. Modifier(修改器),意思变量的类型(html,js或者其他),会进行校验和编码处理,比如html类型会将&转换成&amp。类型有html,pre,url query,javascript,css和json。如果觉得在模板变量中定义这些麻烦,可以在加载模板是使用google::Template::GetTemplateWithAutoEscaping()方法,使用自动替换模式,指定是Html,js还是css。你可以编写你自己的modifier,来处理一些特殊的需求。
  2. Strip(清除器),模板中有一些空行和空白字符,在加载时,可以指定参数,是否需要清除。如google::STRIP_BLANK_LINESgoogle::STRIP_WHITESPACE
  3. ExpandEmitter,在ctemplate中有这个接口,这个接口是在展开模板时,输出数据用的,默认实现了std::string版本的StringEmitter,这种方式是处理完毕后,才能发送到客户端,std::string性能并不高。如果你要一个高效率的Web服务器,则可以用流式的模式。比如自己实现ExpandEmitter接口,实现数据流式发送到客户浏览器。
  4. 字典copy,如果两个字典很类似,可以copy一个字典,然后修改,调用dict->MakeCopy()。
  5. Template::ClearCache()这句,正式使用时不要加这句,因为模板只要用过一次,就会缓存起来,ClearCache会加锁,导致性能下降。


    C&C++的模板引擎相对比较少,比较有名的是ClearSilverTeng,他们功能都比较强大,我需要一个轻量级的模板引擎Ctemplate
    ctemplate的设计哲学是轻量级,快速,且逻辑和界面分离,因此和ClearSilver和Teng是有一些差异的。比如Ctemplate就没有模板函数,没有条件判断和循环语句(当然,它可以通过变通的方式来实现)。
1.Ctemplate介绍
    ctemplate大体上分为两个部分,一部分是模板,另一部分是数据字典。模板定义了界面展现的形式(V),数据字典就是填充模板的数据(M),你自己写业务逻辑去控制界面展现(C),典型的MVC模型。
    ctemplate模板中有四中标记,对应的数据字典也有不同的处理方式:

  • 变量,{{变量名}},用两个大括号包含的就是变量名,在c++代码中,可以对变量赋值,任何类型的值都可以(如字符,整数,日期等)。
  • 片断,{{#片断名}},片断在数据字典中表现为一个子字典,字典是可以分级的,根字典下面有多级子字典。片断可以处理条件判断和循环。
  • 包含,{{>模板名}}包含指的是一个模板可以包含其他模板,对应的也是一个字字典。
  • 注释,{{!注释名}},包含注释。

一份演示了完整四种标记的例子如下,

  1. <!--ctexample.tpl-->
  2. <html>
  3. <head>
  4.   <title>{{NAME}}</title>
  5. </head>
  6. {{!This is a example of template.}}
  7. <body>
  8. Hello {{NAME}},
  9. You have just won ${{VALUE}}!
  10. <table>
  11. {{#IN_TABLE}}
  12. <tr>
  13.     <td>{{ITEM}}</td>
  14.     <td>{{TAXED_VALUE}}</td>
  15. </tr>
  16. {{/IN_TABLE}}
  17. </table>
  18. {{>INCLUDED_TEMPLATE}}
  19. </body>
  20. </html>
  21. <!--ctinclude.tpl-->
  22.  <div>
  23. {{INCLUDE_VAR}}
  24. </div>

c++代码如下

  1. #include <stdlib.h>
  2. #include <string>
  3. #include <iostream>
  4. #include <google/template.h>
  5. int main(int argc, char** argv) {
  6.     TemplateDictionary dict("example");
  7.     dict.SetValue("NAME""John Smith");
  8.     int winnings = random() % 100000;
  9.     dict.SetIntValue("VALUE", winnings);
  10.     TemplateDictionary *dict1 = dict.AddSectionDictionary("IN_TABLE");
  11.     TemplateDictionary *dict2 = dict.AddSectionDictionary("IN_TABLE");
  12.     dict1->SetValue("ITEM""Lihaibo");
  13.     dict1->SetFormattedValue("TAXED_VALUE""%.2f", winnings * 0.83);
  14.     dict2->SetValue("ITEM""Qiyuehua");
  15.     dict2->SetFormattedValue("TAXED_VALUE""%.2f", winnings * 0.73);
  16.     if (1)
  17.     {
  18.         dict.ShowSection("IN_TABLE");
  19.     }

  20.     TemplateDictionary *dict3 = dict.AddIncludeDictionary("INCLUDED_TEMPLATE");
  21.     dict3->SetFilename("../tpl/ctInclude.tpl");    
  22.     dict3->SetValue("INCLUDE_VAR","This is a include template.");

  23.      Template* tpl = Template::GetTemplate("../tpl/ctexample.tpl",nwsc::DO_NOT_STRIP);
  24.     std::string output;
  25.     tpl->Expand(&output, &dict);
  26.     std::cout << output;
  27.     Template::ClearCache();
  28.     return 0;
  29. }

注意:

  • 模板字典类似Key和Value的结构,对应的是变量名和值。
  • 片断是可以有多条记录的,如果要显示列表,可以定义为片断,获取多条记录填充到字典中。
  • 片断可以显示,也可以不显示。如果片断的字典有数据,显示。如果片断的字典没有数据,默认是不显示的,可以调用ShowSection来显示。

2.ctemplate高级

  1. Modifier(修改器),意思变量的类型(html,js或者其他),会进行校验和编码处理,比如html类型会将&转换成&amp。类型有html,pre,url query,javascript,css和json。如果觉得在模板变量中定义这些麻烦,可以在加载模板是使用google::Template::GetTemplateWithAutoEscaping()方法,使用自动替换模式,指定是Html,js还是css。你可以编写你自己的modifier,来处理一些特殊的需求。
  2. Strip(清除器),模板中有一些空行和空白字符,在加载时,可以指定参数,是否需要清除。如google::STRIP_BLANK_LINESgoogle::STRIP_WHITESPACE
  3. ExpandEmitter,在ctemplate中有这个接口,这个接口是在展开模板时,输出数据用的,默认实现了std::string版本的StringEmitter,这种方式是处理完毕后,才能发送到客户端,std::string性能并不高。如果你要一个高效率的Web服务器,则可以用流式的模式。比如自己实现ExpandEmitter接口,实现数据流式发送到客户浏览器。
  4. 字典copy,如果两个字典很类似,可以copy一个字典,然后修改,调用dict->MakeCopy()。
  5. Template::ClearCache()这句,正式使用时不要加这句,因为模板只要用过一次,就会缓存起来,ClearCache会加锁,导致性能下降。
本文转自:http://blog.csdn.net/marising/article/details/3069346

ctemplate使用

 CTemplate is a simple but powerful template language for C++. It emphasizes separating logic from p...
  • benny5609
  • benny5609
  • 2008年09月18日 14:26
  • 3029

ctemplate模版引擎

  • 2014年12月14日 15:43
  • 1.06MB
  • 下载

简介:google ctemplate:简单易用的文字模板

CTemplate 是一个简单实用、功能强大的文字模板(template language),适用于使用C++语言开发的应用程序。 其解决的主要问题是将文字表达和逻辑分离开来:文字模板解决如何用合适的...
  • aladdina
  • aladdina
  • 2009年09月08日 14:25
  • 5499

1.为什么需要用到模板引擎

1.为什么需要用到模板引擎 我们在做前端开发的时候,有时候经常需要根据后端返回的json数据,然后来生成html,再显示到页面中去。 例如这样子: var data = [ {t...
  • zdy0_2004
  • zdy0_2004
  • 2015年10月29日 00:49
  • 5821

Google开源html模板库ctemplate的完整使用示例

ctemplate是Google开源的一个C++版本html模板替换库。有了它,在C++代码中操作html模板是一件非常简单和高效的事。通过本文,即可掌握对它的简单使用。 示例htm...
  • Aquester
  • Aquester
  • 2012年08月15日 21:01
  • 1334

在Intel 架构上释放程序的最佳性能

软件性能的优化作为一项费时、艰难的工作往往被视为软件开发高手的领地,令一般软件开发人员望而却步。但是,软件性能对软件产品在市场中是否具有竞争力,以至软件产品能否取得成功,都起着关键作用。所以,如何提高...
  • CSDN_document
  • CSDN_document
  • 2004年12月09日 13:06
  • 4529

C++ socket中recv和send机制

利用TCP传递信息时要注意:TCP传输是流的方式:即send 100个字节后对方如果没有及时recv取出, 这时又send 100个字节,则recv有可能接收到两次发送叠加的部分或全部数据,所有在传...
  • riyuedangkong1
  • riyuedangkong1
  • 2016年10月05日 17:24
  • 4276

C++实时处理不断被写入的文件

最近业务上需要实现一个解析远程终端输出结果的指令,通过ssh将远程服务器终端结果重定向 到本地,再解析终端输出,提取有用的信息做下一步的处理。由于终端会不停的输出,因此重定向的文件也会不断的更新。目前...
  • jxhaha
  • jxhaha
  • 2017年11月10日 14:37
  • 231

C/C++文件操作效率比较——FILE/fstream

利用GetTickTount函数进行效率测试,对比C/C++在读写文本文件和二进制文件时耗时大小,程序执行时间获取方式参见我另一篇C/C++获取程序执行时间的五种方式比较。 电脑配置如下...
  • shudaxia123
  • shudaxia123
  • 2016年01月11日 18:13
  • 2043

c++文件的读取和写入

ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间     在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们...
  • Doraemon___
  • Doraemon___
  • 2016年11月26日 11:38
  • 1041
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++模板引擎Ctemplate的介绍
举报原因:
原因补充:

(最多只允许输入30个字)