我试图制作一个C++程序来创建一个格式化的CSS文件。
我首先要做的是获取HTML文件,并将其构建到具有以下类型节点的树中。
struct node
{
std::string element_type;
std::vector<std::string> class_list;
std::string iden;
std::vector<node*> children;
};现在,我正在尝试创建一个函数,该函数取树的根,并返回一个字符串,该字符串是文档的格式化CSS (它只关注CSS、class、es和id的属性)。
例如,如果HTML文件是
<html>
<body>
<div class="row">
<h1 id="title">Here's my title</h1>
</div>
<div class="row red">
<p>Here's some text inside a div of class row and red</p>
</div>
<div class="row">
<a href="google.com">Cool, you can click here to go to Google</a>
</row>
</body>
</html>然后,在它变成一棵树之后,我有了一个功能。
std::string DocTree::_tree2Str(node * rt)我打算让它返回字符串
html {}
html > body {}
html > body > div.row {}
html > body > div.row > h1#title {}
html > body > div.row > a {}
html > body > div.row.red {}
html > body > div.row.red > p {}下面是函数的实现:
std::string DocTree::_tree2Str(node * rt)
{
std::string css("");
if (rt)
{
css.append(rt->element_type);
if (!rt->class_list.empty())
{
for (std::vector<std::string>::iterator it(rt->class_list.begin()), offend(rt->class_list.end()); it != offend; ++it)
{
css.append("." + *it);
}
}
if (!rt->iden.empty())
{
css.append("#" + rt->iden);
}
if (!rt->children.empty())
{
for (std::vector<node*>::iterator it(rt->children.begin()), offend(rt->children.end()); it != offend; ++it)
{
css.append("\n\t" + _tree2Str(*it));
}
}
}
return css;
}我跳过的唯一一件事是" > ",因为我不知道如何将它转换到递归函数中。每次函数被称为时,它都应该在函数的开头打印,除非是第一次。
此外,可能还有其他逻辑谬误。有人能帮我吗?
发布于 2014-10-29 03:01:37
您可以创建一个private _innerTree2Str(node * rt, bool printGt)方法,该方法包含_tree2Str方法的内容,以及顶部的行if(printGt) css.append(" > ");。所有对_tree2Str(node)的调用都变成了对_innerTree2Str(node, true)的调用
然后_tree2Str变成
std::string DocTree::_tree2Str(node * rt)
{
return _innerTree2Str(rt, false);
}这样,当您第一次调用_innerTree2Str时,printGt变量是false,并且您不会追加" > ",每隔一次printGt将为true
您可以将printGt参数直接添加到_tree2Str,而不是创建第二个方法,但是您将依赖调用方记住传入printGt参数的false
https://stackoverflow.com/questions/26621967
复制相似问题