diff --git a/WsNovelParser/htmlprint.cpp b/WsNovelParser/htmlprint.cpp
index fb2d818..a5c0f2f 100644
--- a/WsNovelParser/htmlprint.cpp
+++ b/WsNovelParser/htmlprint.cpp
@@ -80,8 +80,50 @@ void StoryLine::buildPageHTML(QDomElement& parent) const {
StoryVolume::StoryVolume(std::shared_ptr handle) : Group(handle) {}
-void StoryVolume::buildPageHTML(QDomElement& doc) const
-{
+void StoryVolume::buildPageHTML(QDomElement& parent) const {
+ auto syntax_access = this->accessPeers();
+ auto volume_inst = std::dynamic_pointer_cast(syntax_access->element());
+
+ auto doc_inst = parent.ownerDocument();
+ auto dom_volume = doc_inst.createElement("div");
+ parent.appendChild(dom_volume);
+
+ auto dom_title = doc_inst.createElement("h1");
+ dom_title.appendChild(doc_inst.createTextNode(volume_inst->name()));
+
+ std::function>&)> rich_refer_build =
+ [&](QDomElement& parent_element, const QList> children) {
+ for (auto& child : children) {
+ auto doc_ins = parent_element.ownerDocument();
+ switch ((NovelNode)child->element()->typeMark())
+ {
+ case NovelNode::TextSection: {
+ auto text_inst = std::dynamic_pointer_cast(child->element());
+ auto dom_p = doc_ins.createElement("p");
+ dom_p.appendChild(doc_ins.createTextNode(text_inst->content()));
+ parent_element.appendChild(dom_p);
+ }break;
+ case NovelNode::ArticleDefine: {
+ auto article_inst = std::dynamic_pointer_cast(child->element());
+ auto article_group = doc_ins.createElement("div");
+ auto article_head = doc_ins.createElement("h2");
+ article_head.appendChild(doc_ins.createTextNode(article_inst->name()));
+ article_group.appendChild(article_head);
+ rich_refer_build(article_group, child->children());
+ parent_element.appendChild(article_group);
+ }break;
+ case NovelNode::FragmentRefer:{
+ auto fragment_inst = std::dynamic_pointer_cast(child->element());
+ auto refer_inst = this->getElement(fragment_inst->signature());
+ refer_inst->buildSliceHTML(parent_element);
+ }break;
+ default:
+ break;
+ }
+ }
+ };
+
+ rich_refer_build(dom_volume, syntax_access->children());
}
FragmentRef::FragmentRef(std::shared_ptr handle) : Element(handle) {}
@@ -97,8 +139,8 @@ std::shared_ptr printer::FragmentRef::hostFragment() const
}
void FragmentRef::buildSliceHTML(QDomElement& dom_parent) const {
- auto syntax_element = this->accessPeers()->element();
- auto refer_element = std::dynamic_pointer_cast(syntax_element);
+ auto syntax_access = this->accessPeers();
+ auto refer_element = std::dynamic_pointer_cast(syntax_access->element());
auto jump_to_host = this->hostFragment()->pageRefers();
auto doc = dom_parent.ownerDocument();
@@ -114,15 +156,34 @@ void FragmentRef::buildSliceHTML(QDomElement& dom_parent) const {
dom_href.setAttribute("href", jump_to_host);
dom_title.appendChild(dom_href);
- for (auto child : this->accessPeers()->children()) {
- if (child->element()->typeMark() == (int)NovelNode::TextSection) {
- auto text_inst = std::dynamic_pointer_cast(child->element());
- auto dom_p = doc.createElement("p");
- dom_p.appendChild(doc.createTextNode(text_inst->content()));
- dom_reference.appendChild(dom_p);
+ std::function>&)> rich_refer_build =
+ [&](QDomElement& parent_element, const QList> children) {
+ for (auto& child : children) {
+ auto doc_ins = parent_element.ownerDocument();
+ switch ((NovelNode)child->element()->typeMark())
+ {
+ case NovelNode::TextSection: {
+ auto text_inst = std::dynamic_pointer_cast(child->element());
+ auto dom_p = doc_ins.createElement("p");
+ dom_p.appendChild(doc_ins.createTextNode(text_inst->content()));
+ parent_element.appendChild(dom_p);
+ }break;
+ case NovelNode::ArticleDefine: {
+ auto article_inst = std::dynamic_pointer_cast(child->element());
+ auto article_group = doc_ins.createElement("div");
+ auto article_head = doc_ins.createElement("h2");
+ article_head.appendChild(doc_ins.createTextNode(article_inst->name()));
+ article_group.appendChild(article_head);
+ rich_refer_build(article_group, child->children());
+ parent_element.appendChild(article_group);
+ }break;
+ default:
+ break;
+ }
}
- }
+ };
+ rich_refer_build(dom_reference, syntax_access->children());
}
void FragmentRef::buildPageHTML(QDomElement& parent) const {
@@ -143,18 +204,18 @@ void FragmentRef::buildPageHTML(QDomElement& parent) const {
std::function>)> build_cascade =
[&](QList> children_items) {
- for (auto child : children_items) {
- if (child->element()->typeMark() == (int)NovelNode::TextSection) {
- auto text_inst = std::dynamic_pointer_cast(child->element());
- auto p = doc.createElement("p");
- p.appendChild(doc.createTextNode(text_inst->content()));
- refers_dom.appendChild(p);
- }
- else {
- build_cascade(child->children());
- }
+ for (auto child : children_items) {
+ if (child->element()->typeMark() == (int)NovelNode::TextSection) {
+ auto text_inst = std::dynamic_pointer_cast(child->element());
+ auto p = doc.createElement("p");
+ p.appendChild(doc.createTextNode(text_inst->content()));
+ refers_dom.appendChild(p);
}
- };
+ else {
+ build_cascade(child->children());
+ }
+ }
+ };
build_cascade(syntax_access->children());
}
@@ -225,7 +286,6 @@ void Fragment::buildPageHTML(QDomElement& parent) const {
for (auto& it : this->additionals()) {
it->buildPageHTML(dom_fragment);
}
-
}
#include
@@ -327,7 +387,7 @@ std::function>&, const QString&)> refe
auto element_addr = QString::number((qulonglong)item->accessPeers()->element().get());
item->setSliceRefer(summary_href + u8"#" + element_addr);
}
- };
+};
void tools_printer::storylines_anchors_define(const QList>& list, const QDir& root_dir) {
auto path = root_dir.filePath("storylines");