diff --git a/WsNovelParser/WsNovelParser.vcxproj.user b/WsNovelParser/WsNovelParser.vcxproj.user index e658db6..79d638e 100644 --- a/WsNovelParser/WsNovelParser.vcxproj.user +++ b/WsNovelParser/WsNovelParser.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-03-28T12:35:16.3782516Z + 2024-03-31T05:42:51.9907375Z - 2024-03-28T12:35:17.0264292Z + 2024-03-31T05:42:52.0532400Z \ No newline at end of file diff --git a/WsNovelParser/htmlprint.cpp b/WsNovelParser/htmlprint.cpp index 6749f21..18dae35 100644 --- a/WsNovelParser/htmlprint.cpp +++ b/WsNovelParser/htmlprint.cpp @@ -1,4 +1,5 @@ #include "htmlprint.h" +#include using namespace example_novel; using namespace printer; @@ -119,7 +120,7 @@ void tools_printer::build_storyline(std::shared_ptr line, std::shared }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 refer_fragment = this->fragment_defines[refer_node->referSignature()]; auto inst = std::make_shared(novel_node); refer_fragment->appendRefers(inst); line->append(inst); @@ -131,23 +132,57 @@ void tools_printer::build_storyline(std::shared_ptr line, std::shared } } -void tools_printer::build_volumeline(std::shared_ptr line, std::shared_ptr novel_node) +void tools_printer::build_volumeline(std::shared_ptr volume, std::shared_ptr novel_node) { if (!novel_node) { - for (auto& inst_c : line->accessPeers()->children()) - build_volumeline(line, inst_c); + for (auto& inst_c : volume->accessPeers()->children()) + build_volumeline(volume, 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 refer_fragment = this->fragment_defines[refer_node->referSignature()]; auto inst = std::make_shared(novel_node); refer_fragment->appendRefers(inst); - line->append(inst); + volume->append(inst); return; } for (auto& inst_c : novel_node->children()) - build_volumeline(line, inst_c); + build_volumeline(volume, inst_c); + } +} + +void printer::tools_printer::fragments_anchors_define(const QList>& list, const QDir & destdir) { + for (auto &it : list) { + auto address_x = QString::number((qulonglong)it->accessPeers()->element().get()); + it->setHtmlRefer(destdir.absoluteFilePath(QString("%1.html").arg(address_x))); + } +} + +std::function>&, const QDir &)> refers_refresh = + [&](const QList> &items, const QDir &destdir){ + for (auto &item : items) { + auto refer = std::dynamic_pointer_cast(item); + if (refer) { + auto address_x = QString::number((qulonglong)refer->accessPeers()->element().get()); + refer->setHtmlRefer(destdir.absoluteFilePath(QString("%1.html").arg(address_x))); + } + } +}; + +void printer::tools_printer::storylines_anchors_define(const QList>& list, const QDir & destdir) { + for (auto &it : list) { + auto address_x = QString::number((qulonglong)it->accessPeers()->element().get()); + it->setHtmlRefer(destdir.absoluteFilePath(QString("%1.html").arg(address_x))); + refers_refresh(it->elements(), destdir); + } +} + +void printer::tools_printer::volumes_anchors_define(const QList>& list, const QDir & destdir) { + for (auto &it : list) { + auto address_x = QString::number((qulonglong)it->accessPeers()->element().get()); + it->setHtmlRefer(destdir.absoluteFilePath(QString("%1.html").arg(address_x))); + refers_refresh(it->elements(), destdir); } } diff --git a/WsNovelParser/htmlprint.h b/WsNovelParser/htmlprint.h index c2649a8..8066360 100644 --- a/WsNovelParser/htmlprint.h +++ b/WsNovelParser/htmlprint.h @@ -57,7 +57,6 @@ namespace printer { public: StoryLine(std::shared_ptr handle); - // ͨ¹ý Group ¼Ì³Ð QString toHTML() const override; @@ -67,7 +66,6 @@ namespace printer { public: StoryVolume(std::shared_ptr handle); - // ͨ¹ý Group ¼Ì³Ð QString toHTML() const override; @@ -106,7 +104,7 @@ namespace printer { class tools_printer { - private: + public: QHash> fragment_defines; QHash> storyline_defines; QHash> volume_defines; @@ -118,5 +116,9 @@ namespace printer { 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); }; } \ No newline at end of file diff --git a/WsNovelParser/main.cpp b/WsNovelParser/main.cpp index 50764a5..d003ea2 100644 --- a/WsNovelParser/main.cpp +++ b/WsNovelParser/main.cpp @@ -7,8 +7,10 @@ #include #include #include +#include #include "novelparser.h" +#include "htmlprint.h" using namespace example_novel; @@ -22,6 +24,19 @@ int main(int argc, char* argv[]) { auto parser = std::make_shared(); auto novel_accesstree = parser->parse(files); + printer::tools_printer tool; + tool.build_fragments(novel_accesstree); + tool.build_refers_network(novel_accesstree); + + auto dest = QDir::current(); + dest.mkdir("storylines"); + dest.mkdir("volumes"); + dest.mkdir("fragments"); + + tool.fragments_anchors_define(tool.fragment_defines.values(), QDir(dest.filePath("fragments"))); + tool.storylines_anchors_define(tool.storyline_defines.values(), QDir(dest.filePath("storylines"))); + tool.volumes_anchors_define(tool.volume_defines.values(), QDir(dest.filePath("volumes"))); + std::function, int)> tnode_print = [&](std::shared_ptr node, int intend) { auto name = node->element()->signature(); diff --git a/libParse/libParse.vcxproj.user b/libParse/libParse.vcxproj.user index 161051b..59cfff3 100644 --- a/libParse/libParse.vcxproj.user +++ b/libParse/libParse.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-03-28T12:35:17.4728899Z + 2024-03-31T05:42:52.1001219Z - 2024-03-28T12:35:17.7556506Z + 2024-03-31T05:42:52.1782463Z \ No newline at end of file diff --git a/libSyntax/ast_novel.cpp b/libSyntax/ast_novel.cpp index dc9ead8..cda39c3 100644 --- a/libSyntax/ast_novel.cpp +++ b/libSyntax/ast_novel.cpp @@ -35,6 +35,10 @@ QString FragmentRefers::storyRefer() const { return story_ref; } QString FragmentRefers::fragmentRefer() const { return fragm_ref; } +QString FragmentRefers::referSignature() const { + return story_ref + u8"&" + fragm_ref; +} + int FragmentRefers::typeMark() const { return (int)NovelNode::FragmentRefer; } bool example_novel::FragmentRefers::isAnonymous() const diff --git a/libSyntax/ast_novel.h b/libSyntax/ast_novel.h index 97359bb..5fdaddb 100644 --- a/libSyntax/ast_novel.h +++ b/libSyntax/ast_novel.h @@ -57,6 +57,7 @@ namespace example_novel QString storyRefer() const; QString fragmentRefer() const; + QString referSignature() const; // SyntaxElement interface public: diff --git a/libSyntax/libSyntax.vcxproj.user b/libSyntax/libSyntax.vcxproj.user index 0ef4279..d396399 100644 --- a/libSyntax/libSyntax.vcxproj.user +++ b/libSyntax/libSyntax.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-03-28T12:35:17.9061468Z + 2024-03-31T05:42:52.3344976Z - 2024-03-28T12:35:18.2310593Z + 2024-03-31T05:42:52.5226570Z \ No newline at end of file diff --git a/libToken/libToken.vcxproj.user b/libToken/libToken.vcxproj.user index 17b9e57..26e5b18 100644 --- a/libToken/libToken.vcxproj.user +++ b/libToken/libToken.vcxproj.user @@ -2,9 +2,9 @@ - 2024-03-28T12:35:17.1430384Z + 2024-03-31T05:42:52.2094883Z - 2024-03-28T12:35:17.3463137Z + 2024-03-31T05:42:52.3032378Z \ No newline at end of file