From ca59dd7c781d50b82747d98ca8721aa56f544e1e Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Tue, 16 Apr 2024 23:40:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=85=B3=E7=B3=BB?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WsNovelParser/WsNovelParser.vcxproj.user | 4 +-- WsNovelParser/htmlprint.cpp | 44 ++++++++++++++++++++++++ WsNovelParser/htmlprint.h | 2 ++ WsNovelParser/main.cpp | 24 +++++++++++-- libParse/libParse.vcxproj.user | 4 +-- libSyntax/libSyntax.vcxproj.user | 4 +-- libToken/libToken.vcxproj.user | 4 +-- 7 files changed, 75 insertions(+), 11 deletions(-) diff --git a/WsNovelParser/WsNovelParser.vcxproj.user b/WsNovelParser/WsNovelParser.vcxproj.user index 78dfa6a..527e815 100644 --- a/WsNovelParser/WsNovelParser.vcxproj.user +++ b/WsNovelParser/WsNovelParser.vcxproj.user @@ -6,9 +6,9 @@ -path D:\Projects\Cpp\WsNovelParser\x64\test_file - 2024-04-05T16:18:59.8731740Z + 2024-04-16T12:53:46.2857569Z - 2024-04-05T16:19:00.1378580Z + 2024-04-16T12:53:46.5528331Z \ No newline at end of file diff --git a/WsNovelParser/htmlprint.cpp b/WsNovelParser/htmlprint.cpp index 2f028f9..5d099a2 100644 --- a/WsNovelParser/htmlprint.cpp +++ b/WsNovelParser/htmlprint.cpp @@ -421,3 +421,47 @@ void tools_printer::volumes_anchors_define(const QListelements(), page_address); } } + +QString printer::tools_printer::storylines_paint(const QList> lines) { + auto get_node_name = [](const std::shared_ptr item){ + return u8"node_" + QString::number((qulonglong)item->accessPeers()->element().get()); + }; + + QHash> node_records; + QString nodes_description; + for (auto& story : lines) { + auto story_elem = std::dynamic_pointer_cast(story->accessPeers()->element()); + node_records[story_elem->signature()] = story; + nodes_description += get_node_name(story) + QString(u8"[label=\"%1\",shape=\"cds\"]\n").arg(story_elem->name()); + + for (auto frag : story->elements()) { + auto fragment_peers = frag->accessPeers()->element(); + if (fragment_peers->typeMark() == (int)example_novel::NovelNode::FragmentDefine) { + auto fragment_elem = std::dynamic_pointer_cast(fragment_peers); + node_records[fragment_elem->signature()] = frag; + nodes_description += get_node_name(frag) + QString(u8"[label=\"%1\",shape=\"rect\"]\n").arg(fragment_elem->name()); + } + } + } + + QString arrows_link; + for (auto &story : lines) { + auto story_elem = std::dynamic_pointer_cast(story->accessPeers()->element()); + + QString previous_node = get_node_name(story); + for (auto &frag : story->elements()) { + if (example_novel::NovelNode::FragmentDefine == (example_novel::NovelNode) frag->accessPeers()->element()->typeMark()) { + arrows_link += previous_node + u8"->" + get_node_name(frag) + u8"\n"; + previous_node = get_node_name(frag); + } + else if (example_novel::NovelNode::FragmentRefer == (example_novel::NovelNode)frag->accessPeers()->element()->typeMark()) { + auto frag_refer = std::dynamic_pointer_cast(frag->accessPeers()->element()); + auto frag_src = node_records[frag_refer->referSignature()]; + arrows_link += previous_node + u8"->" + get_node_name(frag_src) + u8"\n"; + previous_node = get_node_name(frag_src); + } + } + } + + return QString(u8"digraph{ rankdir = LR \n %1\n %2 }").arg(nodes_description).arg(arrows_link); +} diff --git a/WsNovelParser/htmlprint.h b/WsNovelParser/htmlprint.h index b6aebf8..3a47295 100644 --- a/WsNovelParser/htmlprint.h +++ b/WsNovelParser/htmlprint.h @@ -153,5 +153,7 @@ namespace printer { 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); + + QString storylines_paint(const QList> lines); }; } \ No newline at end of file diff --git a/WsNovelParser/main.cpp b/WsNovelParser/main.cpp index f54a030..03c75a7 100644 --- a/WsNovelParser/main.cpp +++ b/WsNovelParser/main.cpp @@ -66,7 +66,14 @@ int main(int argc, char* argv[]) { for (auto& node : tool.volume_defines) html_output(node); - + auto dot_src = tool.storylines_paint(tool.storyline_defines.values()); + QFile dot_file(QDir::current().filePath(u8"relates.dot")); + if (dot_file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream txt(&dot_file); + txt.setCodec(u8"UTF-8"); + txt << dot_src; + txt.flush(); + } std::function, int)> tnode_print = [&](std::shared_ptr node, int intend) { @@ -103,7 +110,7 @@ int main(int argc, char* argv[]) { dom_storyline.appendChild(dom_line); auto line_href = doc_inst.createElement("a"); - line_href.setAttribute(u8"href", u8"file:///"+inst_line->pageRefers()); + line_href.setAttribute(u8"href", u8"file:///" + inst_line->pageRefers()); line_href.appendChild(doc_inst.createTextNode(inst_line->accessPeers()->element()->signature())); dom_line.appendChild(line_href); } @@ -130,7 +137,7 @@ int main(int argc, char* argv[]) { dom_fragment.appendChild(dom_fragment_title); body.appendChild(dom_fragment); - for (auto &inst_frag : tool.fragment_defines) { + for (auto& inst_frag : tool.fragment_defines) { auto dom_fragment_ref = doc_inst.createElement("p"); dom_fragment.appendChild(dom_fragment_ref); @@ -140,12 +147,23 @@ int main(int argc, char* argv[]) { dom_fragment_ref.appendChild(frag_href); } + auto dom_relate = doc_inst.createElement(u8"div"); + auto dom_relate_title = doc_inst.createElement(u8"h2"); + dom_relate_title.appendChild(doc_inst.createTextNode(u8"ÁªÏµÍ¼")); + dom_relate.appendChild(dom_fragment_title); + body.appendChild(dom_relate); + + auto img = doc_inst.createElement(u8"img"); + img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"relates.svg")); + dom_relate.appendChild(img); + QTextStream tout(&tfile); doc_inst.save(tout, 2); tout.flush(); } } + system("dot -Tsvg relates.dot -o relates.svg"); tnode_print(novel_accesstree, 0); } catch (lib_syntax::SyntaxException* e) { diff --git a/libParse/libParse.vcxproj.user b/libParse/libParse.vcxproj.user index be4c104..52d78f3 100644 --- a/libParse/libParse.vcxproj.user +++ b/libParse/libParse.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-04-05T16:19:00.3474812Z + 2024-04-16T12:53:47.1986642Z - 2024-04-05T16:19:00.4450682Z + 2024-04-16T12:53:47.3829821Z \ No newline at end of file diff --git a/libSyntax/libSyntax.vcxproj.user b/libSyntax/libSyntax.vcxproj.user index 8132312..3056edb 100644 --- a/libSyntax/libSyntax.vcxproj.user +++ b/libSyntax/libSyntax.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-04-05T16:19:00.1942518Z + 2024-04-16T12:53:46.6414549Z - 2024-04-05T16:19:00.2951725Z + 2024-04-16T12:53:47.0693524Z \ No newline at end of file diff --git a/libToken/libToken.vcxproj.user b/libToken/libToken.vcxproj.user index 394cfca..42682cf 100644 --- a/libToken/libToken.vcxproj.user +++ b/libToken/libToken.vcxproj.user @@ -2,9 +2,9 @@ - 2024-04-05T16:19:00.4973995Z + 2024-04-16T12:53:47.4685693Z - 2024-04-05T16:19:00.6479589Z + 2024-04-16T12:53:47.6504183Z \ No newline at end of file