HtmlRender
在CppTinParser/render.hpp
中定义和实现。
使用c++实现的简易Html编辑类。
简介
目前,c++有几个Html解析器,而少见便捷规范的html生成器,HtmlRender则提供了一个简单的、规范的html内容生成器。用c++实现html内容生成器,并不是简单的字符串拼接,这样会导致代码编写不规范、易读性下降,而且无法应对复杂html生成任务。HtmlRender借鉴了python的第三方html编写库——dominate
。
使用接口
初始化
HtmlRender* item = HtmlRender(string tag, string content, map<string,string> kws, bool onetag=false, bool pre=false)
//tag 标签名称,如果为空字符串,则在生成时直接产生content,不添加标记
//content 标签内容
//kws 标签参数
//onetag 是否为单标签,比如<br>, <hr>等
//pre 是否显示为原文本
生成html文本
string result = HtmlRender.render()
该函数将生成并返回该HtmlRender
所包含的html文本内容。一般应只用tag = "html"
的HtmlRender
使用该函数,以此来实现完整的html文本。当然,任意HtmlRender
实例均可,单标签也可使用该函数,但是生成内容将大概率出现错误。
添加子元素
为了方便操作,HtmlRender
使用list作为容器来存取子元素指针,这里的子元素同样是HtmlRender
。具体增加代码如下:
HtmlRender* subitem = new HtmlRender(...)
item.add(subitem)
如果父元素本身就是通过new
创建,则使用如下代码:
item->add(subitem)
设置标签元素内容和参数
设置内容:
item.configcnt(string content)
设置参数:
item.configkws(map<string, string> kws)
获取父元素指针
除了顶级元素,任何一个标签元素在被使用add
方法后,都会有明确的父元素。
通过如下代码获取父元素指针:
HtmlRender* p_item = subitem->parent()
//p_item == &item
获取子元素指针列表
如果一个元素使用了add
方法,则必然含有子元素。
使用如下代码获取子元素指针列表
list<HtmlRender*> children = item.children()
实现原理
添加子元素
获取子元素指针,在子元素指针列表中添加该指针。
void HtmlRender::add(HtmlRender* item) {
//添加html内容
this->htmlcontent.push_back(item);
item->_parent = this;
}
渲染
首先生成元素自身标签、参数、内容,然后遍历子元素指针列表,获取所有子元素以及多级子元素的渲染生成内容,最后加上自身结束标签(如果有的话)。
string HtmlRender::render() {
//渲染为html文本
if (this->tag == ""){
return this->content;
}
string htmltext = "<" + this->tag;
for (auto &kw : this->kws) {
htmltext += " " + kw.first + "=\"" + kw.second + "\"";
}
htmltext += ">";
htmltext += this->content;
for (auto item = this->htmlcontent.begin(); item != this->htmlcontent.end(); ++item) {