diff --git a/WsNovelParser/htmlprint.cpp b/WsNovelParser/htmlprint.cpp
index 8ee8e47..6749f21 100644
--- a/WsNovelParser/htmlprint.cpp
+++ b/WsNovelParser/htmlprint.cpp
@@ -3,76 +3,151 @@
using namespace example_novel;
using namespace printer;
-Access::Access(std::shared_ptr handle) :access_handle(handle) {}
+Access::Access(std::shared_ptr handle) :access_handle(handle) {}
-std::shared_ptr Access::accessPeers() const { return access_handle; }
+std::shared_ptr Access::accessPeers() const { return access_handle; }
void Access::setHtmlRefer(const QString& href) { this->refers_store = href; }
QString Access::htmlRefer() const { return this->refers_store; }
-Element::Element(std::shared_ptr handle) :Access(handle) {}
+Element::Element(std::shared_ptr handle) :Access(handle) {}
-std::shared_ptr Element::siblingNext() const {
- return this->sibling_store;
+Group::Group(std::shared_ptr handle) : Access(handle) {}
+
+void Group::append(std::shared_ptr elm)
+{
+ element_store.append(elm);
}
-void Element::setNext(std::shared_ptr inst) {
- this->sibling_store = inst;
-}
-
-Group::Group(std::shared_ptr handle) : Access(handle) {}
-
-void Group::setChild(std::shared_ptr elm) {
- this->element_store = elm;
-}
-
-std::shared_ptr Group::element() const {
+QList> Group::elements() const
+{
return this->element_store;
}
-StoryLine::StoryLine(std::shared_ptr handle) :Group(handle) {}
+StoryLine::StoryLine(std::shared_ptr handle) :Group(handle) {}
-QString printer::StoryLine::toHTML() const
+QString StoryLine::toHTML() const
{
return QString();
}
-StoryVolume::StoryVolume(std::shared_ptr handle) : Group(handle) {}
+StoryVolume::StoryVolume(std::shared_ptr handle) : Group(handle) {}
-QString printer::StoryVolume::toHTML() const
+QString StoryVolume::toHTML() const
{
return QString();
}
-FragmentRef::FragmentRef(std::shared_ptr handle) : Element(handle) {}
+FragmentRef::FragmentRef(std::shared_ptr handle) : Element(handle) {}
-QString printer::FragmentRef::toOutsideHTML() const
+QString FragmentRef::toOutsideHTML() const
{
return QString();
}
-QString printer::FragmentRef::toDefinitionHTML() const
+QString FragmentRef::toDefinitionHTML() const
{
return QString();
}
-Fragment::Fragment(std::shared_ptr handle) : Element(handle) {}
+Fragment::Fragment(std::shared_ptr handle) : Element(handle) {}
-void printer::Fragment::appendRefers(std::shared_ptr inst) {
+void Fragment::appendRefers(std::shared_ptr inst) {
this->additionals_store.append(inst);
}
-QList> printer::Fragment::additionals() const {
+QList> Fragment::additionals() const {
return this->additionals_store;
}
-QString printer::Fragment::toOutsideHTML() const
+QString Fragment::toOutsideHTML() const
{
return QString();
}
-QString printer::Fragment::toDefinitionHTML() const
+QString Fragment::toDefinitionHTML() const
{
return QString();
}
+
+#include
+void tools_printer::build_fragments(std::shared_ptr novel_root)
+{
+ if (novel_root->element()->typeMark() == (int)example_novel::NovelNode::FragmentDefine) {
+ auto inst = std::make_shared(novel_root);
+ this->fragment_defines[novel_root->element()->signature()] = inst;
+ }
+
+ for (auto& inst_c : novel_root->children()) {
+ build_fragments(inst_c);
+ }
+}
+
+void tools_printer::build_refers_network(std::shared_ptr novel_node)
+{
+ switch ((example_novel::NovelNode)novel_node->element()->typeMark()) {
+ case example_novel::NovelNode::StoryDefine: {
+ auto storyinst = std::make_shared(novel_node);
+ this->storyline_defines[novel_node->element()->signature()] = storyinst;
+ build_storyline(storyinst);
+ }return;
+ case example_novel::NovelNode::VolumeDefine: {
+ auto volumeinst = std::make_shared(novel_node);
+ this->volume_defines[novel_node->element()->signature()] = volumeinst;
+ build_volumeline(volumeinst);
+ }return;
+ }
+
+ for (auto& inst_c : novel_node->children())
+ build_refers_network(inst_c);
+}
+
+void tools_printer::build_storyline(std::shared_ptr line, std::shared_ptr novel_node)
+{
+ if (!novel_node) {
+ for (auto& inst_c : line->accessPeers()->children()) {
+ build_storyline(line, inst_c);
+ }
+ }
+ else {
+ switch ((example_novel::NovelNode)novel_node->element()->typeMark())
+ {
+ case example_novel::NovelNode::FragmentDefine: {
+ auto inst = this->fragment_defines[novel_node->element()->signature()];
+ line->append(inst);
+ }return;
+ case example_novel::NovelNode::FragmentRefer: {
+ auto refer_node = std::dynamic_pointer_cast(novel_node->element());
+ auto refer_fragment = this->fragment_defines[refer_node->signature().mid(1)];
+ auto inst = std::make_shared(novel_node);
+ refer_fragment->appendRefers(inst);
+ line->append(inst);
+ }return;
+ }
+
+ for (auto& inst_c : novel_node->children())
+ build_storyline(line, inst_c);
+ }
+}
+
+void tools_printer::build_volumeline(std::shared_ptr line, std::shared_ptr novel_node)
+{
+ if (!novel_node) {
+ for (auto& inst_c : line->accessPeers()->children())
+ build_volumeline(line, inst_c);
+ }
+ else {
+ if (example_novel::NovelNode::FragmentRefer == (example_novel::NovelNode)novel_node->element()->typeMark()) {
+ auto refer_node = std::dynamic_pointer_cast(novel_node->element());
+ auto refer_fragment = this->fragment_defines[refer_node->signature().mid(1)];
+ auto inst = std::make_shared(novel_node);
+ refer_fragment->appendRefers(inst);
+ line->append(inst);
+ return;
+ }
+
+ for (auto& inst_c : novel_node->children())
+ build_volumeline(line, inst_c);
+ }
+}
diff --git a/WsNovelParser/htmlprint.h b/WsNovelParser/htmlprint.h
index 5898a2c..c2649a8 100644
--- a/WsNovelParser/htmlprint.h
+++ b/WsNovelParser/htmlprint.h
@@ -11,16 +11,16 @@ namespace printer {
*/
class Access : public std::enable_shared_from_this {
public:
- Access(std::shared_ptr handle);
+ Access(std::shared_ptr handle);
virtual ~Access() = default;
- std::shared_ptr accessPeers() const;
+ std::shared_ptr accessPeers() const;
void setHtmlRefer(const QString& href);
QString htmlRefer() const;
private:
- std::shared_ptr access_handle;
+ std::shared_ptr access_handle;
QString refers_store;
};
@@ -29,17 +29,11 @@ namespace printer {
*/
class Element : public Access {
public:
- Element(std::shared_ptr handle);
+ Element(std::shared_ptr handle);
virtual ~Element() = default;
virtual QString toOutsideHTML() const = 0;
virtual QString toDefinitionHTML() const = 0;
-
- std::shared_ptr siblingNext() const;
- void setNext(std::shared_ptr inst);
-
- private:
- std::shared_ptr sibling_store;
};
/*
@@ -47,21 +41,21 @@ namespace printer {
*/
class Group : public Access {
public:
- Group(std::shared_ptr handle);
+ Group(std::shared_ptr handle);
virtual ~Group() = default;
virtual QString toHTML() const = 0;
- void setChild(std::shared_ptr elm);
- std::shared_ptr element() const;
+ void append(std::shared_ptr elm);
+ QList> elements() const;
private:
- std::shared_ptr element_store;
+ QList> element_store;
};
class StoryLine : public Group {
public:
- StoryLine(std::shared_ptr handle);
+ StoryLine(std::shared_ptr handle);
// 通过 Group 继承
@@ -71,7 +65,7 @@ namespace printer {
class StoryVolume : public Group {
public:
- StoryVolume(std::shared_ptr handle);
+ StoryVolume(std::shared_ptr handle);
// 通过 Group 继承
@@ -79,9 +73,12 @@ namespace printer {
};
+ /*
+ * @brief 情节片段引用定义
+ */
class FragmentRef : public Element {
public:
- FragmentRef(std::shared_ptr handle);
+ FragmentRef(std::shared_ptr handle);
// 通过 Element 继承
QString toOutsideHTML() const override;
@@ -96,7 +93,7 @@ namespace printer {
QList> additionals_store;
public:
- Fragment(std::shared_ptr handle);
+ Fragment(std::shared_ptr handle);
void appendRefers(std::shared_ptr inst);
QList> additionals() const;
@@ -107,4 +104,19 @@ namespace printer {
QString toDefinitionHTML() const override;
};
+
+ class tools_printer {
+ private:
+ QHash> fragment_defines;
+ QHash> storyline_defines;
+ QHash> volume_defines;
+
+ public:
+ void build_fragments(std::shared_ptr novel_root);
+
+ void build_refers_network(std::shared_ptr novel_node);
+
+ void build_storyline(std::shared_ptr line, std::shared_ptr novel_node = nullptr);
+ void build_volumeline(std::shared_ptr line, std::shared_ptr novel_node = nullptr);
+ };
}
\ No newline at end of file