html模板渲染库(c++实现,语法与django模版语法一致)

cJinja是一个轻量级的C++编写的HTML模板解析库,其语法与Django的Jinja模板相似。它使用ejson库处理数据替换,并提供了变量、索引、列表迭代、字典迭代、表达式计算、if-else语句、for循环和模板包含等功能。该库源码简洁,适用于学习和小型项目。通过cmake编译,支持Windows和Linux。讨论部分涉及如何实现表达式计算器和优化异常处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

cJinja 是一个使用cpp编写的轻量html模版解析库,依赖 ejson (https://github.com/HuangHongkai/ejson) 来实现模版的数据替换(在jinja中称为context,上下文)。模版的语法基本与django jinja一致,功能还算丰富。源码仅有700行,适合学习,觉得不错的点个star吧。

(该程序为 https://github.com/HuangHongkai/tinyserver 中的一个模块)

编译

使用cmake来编译,windows和linux下均可编译。推荐使用clion作为IDE。
在这里插入图片描述
编译成功后在build目录下会有libcjinja.a和cjinja_test.exe这2个文件。libcjinja.a是静态库,cjinja_test.exe是一个简单的测试程序。

运行测试程序后会出现output.html(该文件是tmp.html解析后的结果。)

已经完成的功能

  • 变量,例如 { { var }}
  • 变量索引访问,例如 { { var.var2 }} { { var[2] }} { { var[2].key.value[2] }},其中**[]** 表示对数组(类似python的list)进行索引, . 表示对object进行索引(类似与python的dict)
  • 表达式计算(包括字符串拼接) ,例如{ { 1*1+2-3*var }} { { 1+1*2-3/4 }} { { “asdfsf”+var }}
  • for-endfor对列表进行迭代, 例如 {% for var in list %} {% endfor %}
  • for-endfor对对象进行迭代,例如 {% for key,value in object %} {% endfor %} 或者 {% for key in object %}{% endfor %} 或者 {% for ,value in object %} {% endfor %}
  • if-else-endif 语句, 其中if的条件支持四则运算,简单的比较(!= == )等,例如 {% if 1+1==2 %}aaa{% else %}bbb{%endif %}
  • 模版包含,嵌套其他的模版文件{% include ‘other.html’ %}
  • 模版语法错误提示

需要注意,表达式之间不能含有空格,例如{ { 1 + 1 }}是非法的,而{ { 1+1 }}是合法的。

使用方法

1. 变量和变量索引

简单的例子如下,

HtmlTemplate html("username:{
   
   { username }}\n"
                  "parm.list[1][2]: {
   
   {parm.list[1][2] }} \n"
                  "parm.key: {
   
   { parm.key }}",
                 1); // 参数1表示传入的是模版字符串,0表示传入的是文件名,默认为0
JSONObject obj = {
   
   
    {
   
   "username", 1234},
    {
   
   "parm", {
   
   
        {
   
   "key", "cde"},
        {
   
   "list", {
   
   1, {
   
   1,2.3, "abcd"}, "hahaha"}},
    }}
};
html.setValue(obj);
cout << html.render() << endl << endl;
/* 运行后打印如下
username:1234
parm.list[1]: abcd 
parm.key: cde
*/

HtmlTemplate是一个库的主要类,构造函数为

explicit HtmlTemplate(const string& str, int flag = 0); // flag=0是str表示文件路径,不为0是表示传入的模版字符串

其中str参数为字符串,可以表示html模板原始串,也可也表示为文件的路径,flag默认为0。

setValue 方法表示传入数据给模版对象。

render() 方法表示将模版解析成字符串。

JSONObject来源于 ejson 库,用来模拟python的dict,构造函数也比较容易看懂。

2. 列表迭代
HtmlTemplate html("{% for x in list %}{
   
   { x }}\n{%endfor%}"
                  "此时x已经是临时变量了,不可以在打印了 {
   
   {x}}\n"
                  , 1);

JSONObject obj = OBJECT(
    KEYVALUE("list", LIST(1,2,3,4,5))
);
cout << html.setValue(obj).render() << endl << endl;
/*运行后输出如下
1
2
3
4
5
此时x已经是临时变量了,不可以在打印了 
*/

注意到在迭代过程中x是作为临时变量,在外部的话是无法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值