介绍
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是作为临时变量,在外部的话是无法