From af4dde16299f6420dde0087aa22de823e1e7d095 Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Fri, 29 Mar 2024 00:16:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=9E=84=E5=BB=BA=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E7=BD=91=E7=BB=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WsNovelParser/htmlprint.cpp | 131 ++++++++++++++++++++++++++++-------- WsNovelParser/htmlprint.h | 48 ++++++++----- 2 files changed, 133 insertions(+), 46 deletions(-) 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