C++模板引擎Ctemplate的介绍

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

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

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

<!--ctexample.tpl-->
< html >
< head >
   < title > {{NAME}} </ title >
</ head >
{{!This is a example of template.}}
< body >
Hello {{NAME}},
You have just won ${{VALUE}}!
< table >
{{#IN_TABLE}}
< tr >
     < td > {{ITEM}} </ td >
     < td > {{TAXED_VALUE}} </ td >
</ tr >
{{/IN_TABLE}}
</ table >
{{ > INCLUDED_TEMPLATE}}
</ body >
</ html >
<!--ctinclude.tpl-->
  < div >
{{INCLUDE_VAR}}
</ div >

c++代码如下

#include <stdlib.h>
#include <string>
#include <iostream>
#include <google/template.h>
int  main( int  argc,  char ** argv) {
    TemplateDictionary dict( "example" );
    dict.SetValue( "NAME" ,  "John Smith" );
     int  winnings = random() % 100000;
    dict.SetIntValue( "VALUE" , winnings);
    TemplateDictionary *dict1 = dict.AddSectionDictionary( "IN_TABLE" );
    TemplateDictionary *dict2 = dict.AddSectionDictionary( "IN_TABLE" );
    dict1->SetValue( "ITEM" ,  "Lihaibo" );
    dict1->SetFormattedValue( "TAXED_VALUE" ,  "%.2f" , winnings * 0.83);
    dict2->SetValue( "ITEM" ,  "Qiyuehua" );
    dict2->SetFormattedValue( "TAXED_VALUE" ,  "%.2f" , winnings * 0.73);
     if  (1)
    {
        dict.ShowSection( "IN_TABLE" );
    }

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

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

注意:

  • 模板字典类似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会加锁,导致性能下降。
ctemplateGoogle开发的一个开源模板系统,它允许开发者使用特定的模板语法在文本中嵌入变量或循环结构。在ctemplate模板中,`{{#COLUMNS}}` 和 `{{/COLUMNS}}` 标签定义了一个循环结构,用于迭代处理一系列的字段。当你使用`{{_field}}`来输出每个字段时,默认情况下,每个字段输出后会有一个分隔符(在这个例子中是逗号),但在最后一个循环中你可能不希望有逗号。 为了在最后一个字段后不显示逗号,你需要在模板中添加逻辑判断。ctemplate本身不提供直接在循环中控制输出的语法,但你可以通过添加一个条件变量来控制逗号的输出。具体方法是定义一个辅助变量(例如`last`),在每次循环迭代中更新这个变量的值,并在输出字段时使用这个变量来决定是否输出逗号。 下面是一个简单的例子: ``` {{#COLUMNS}} {{=_field}} {{^last}},{{/last}} {{/COLUMNS}} {{^COLUMNS}}默认输出,没有数据{{/COLUMNS}} ``` 在上面的例子中,`{{last}}`是一个在每次迭代时更新的变量,用于表示当前是否是最后一个字段。在循环的开始,`last`被初始化为真(或等效的表示为真,比如非零值)。每次循环结束时,`last`被设置为假(或等效的表示为假,比如零值)。`{{^last}},{{/last}}`部分会在`last`为假时输出逗号。循环结束后,如果`COLUMNS`标签内没有输出任何数据,则会输出“默认输出,没有数据”。 请注意,这个方法需要你在服务器端代码中进行相应的逻辑处理,以正确地设置`last`变量的值。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值