#pragma once #include #include #include #include namespace printer { /* * @brief 所有可访问元素的基类:卷宗、故事线、情节等 */ class Access : public std::enable_shared_from_this { public: Access(std::shared_ptr handle); virtual ~Access() = default; std::shared_ptr accessPeers() const; void setHtmlRefer(const QString& href); QString htmlRefer() const; private: std::shared_ptr access_handle; QString refers_store; }; /* * @brief 可访问片段元素:故事片段本篇,故事片段引用 */ class Element : public Access { public: Element(std::shared_ptr handle); virtual ~Element() = default; virtual QString toOutsideHTML() const = 0; virtual QString toDefinitionHTML() const = 0; }; /* * @brief 可访问集合的基类:故事线、故事卷宗 */ class Group : public Access { public: Group(std::shared_ptr handle); virtual ~Group() = default; virtual QString toHTML() const = 0; void append(std::shared_ptr elm); QList> elements() const; private: QList> element_store; }; class StoryLine : public Group { public: StoryLine(std::shared_ptr handle); // 通过 Group 继承 QString toHTML() const override; }; class StoryVolume : public Group { public: StoryVolume(std::shared_ptr handle); // 通过 Group 继承 QString toHTML() const override; }; /* * @brief 情节片段引用定义 */ class FragmentRef : public Element { public: FragmentRef(std::shared_ptr handle); // 通过 Element 继承 QString toOutsideHTML() const override; QString toDefinitionHTML() const override; }; /* * @brief 情节片段本篇定义,存储情节引用定义 */ class Fragment : public Element{ private: QList> additionals_store; public: Fragment(std::shared_ptr handle); void appendRefers(std::shared_ptr inst); QList> additionals() const; // 通过 Element 继承 QString toOutsideHTML() const override; QString toDefinitionHTML() const override; }; class tools_printer { public: 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); void fragments_anchors_define(const QList> &list, const QDir &destdir); void storylines_anchors_define(const QList> &list, const QDir &destdir); void volumes_anchors_define(const QList> &list, const QDir &destdir); }; }