c html 模板引擎,see-phit 一个使用编译时HTML解析的C++ HTML模板引擎

see-phit

See-phit is a compile time HTML templating library written in modern C++.

You write plain HTML as C++ string literals and it is parsed at compile time into a DOM like data structure.

It makes your "stringly typed" HTML text into an actual strongly typed DSL.

C++14 is required to compile - it implements a fairly complete HTML parser as constexpr functions. Before constexpr, the way to make C++ DSLs was by (ab)using operator overloading in ingenious ways, but now we can actually have a DSL as a user literal string and let the compiler compile your DSL into C++

Example:

#include

#include "seephit.h"

using namespace std;

int main()

{

constexpr auto parser =

R"*(

{{name}} is a {{profession}} in {{city}}

)*"_html;

spt::tree spt_tree(parser);

spt::template_dict dct;

dct["name"] = "Mary";

dct["profession"] = "doctor";

dct["city"] = "London";

spt_tree.root.render(cerr, dct);

cerr << endl;

dct["city"] = "New York";

dct["name"] = "John";

dct["profession"] = "janitor";

spt_tree.root.render(cerr, dct);

cerr << endl;

}

produces the following output

Mary is a doctor in London

John is a janitor in New York

The program will fail to compile if the HTML is malformed - We attempt to make the compiler generate the most sensible error message:

For example, the following fragment:

This is a bad closing tag

Generates the following compile errors in gcc:

$ g++ --std=c++14 -Wall main.cpp

In file included from seephit.h:21:0,

from main.cpp:3:

parse_error.h: In instantiation of 'constexpr spt::Error::Error() [with int ROW = 4; int COL = 3; WHAT = spt::Mismatched_Close_Tag]':

main.cpp:13:3: required from here

parse_error.h:40:15: error: incompatible types in assignment of 'const int' to 'char [0]'

SPTParser = fatal;

~~~~~~~~~~^~~~~~~

And the following in clang:

$ clang++ --std=c++14 -Wall main.cpp

In file included from main.cpp:3:

In file included from ./seephit.h:21:

./parse_error.h:40:15: error: array type 'char [0]' is not assignable

SPTParser = fatal;

~~~~~~~~~ ^

main.cpp:13:3: note: in instantiation of member function 'spt::Error<4, 3, spt::Mismatched_Close_Tag>::Error' requested here

REPORT_ERRORS(parser);

^

./parse_error_generated.h:100:94: note: expanded from macro 'REPORT_ERRORS'

spt::IF::type>> {};

^

1 error generated.

Some complicated template magic has been implemented to show the ROW and COLUMN in the text where the error occured. gcc actually prints ROW = xxx and COL = xxx, which is great! If your IDE does background parsing, it will indicate that your HTML template is malformed as you type it.

Limitations

The number of maximum nodes and attributes per parse is hardcoded to 1024.

Future plans

Add more complicated templating functionality with loops, conditionals and perhaps lambdas, and also allow this to be used on the frontend JS with emscripten.

Optimize the hell out of the templating engine

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值