From 35214ca78ff001901370c9632e506cc4f7eba4be Mon Sep 17 00:00:00 2001 From: codeboss <2422523675@qq.com> Date: Thu, 18 Apr 2024 01:56:44 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B2=BE=E7=AE=80=E5=88=86=E5=8D=B7=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WsNovelParser/WsNovelParser.vcxproj | 3 + WsNovelParser/WsNovelParser.vcxproj.filters | 3 + WsNovelParser/WsNovelParser.vcxproj.user | 4 +- WsNovelParser/htmlprint.cpp | 73 +++++++++++++++++++-- WsNovelParser/htmlprint.h | 3 +- WsNovelParser/main.cpp | 16 ++++- libParse/libParse.vcxproj.user | 4 +- libSyntax/libSyntax.vcxproj.user | 4 +- libSyntax/libsyntax.cpp | 1 + libSyntax/syntax_novel.cpp | 2 +- libToken/libToken.vcxproj.user | 4 +- 11 files changed, 101 insertions(+), 16 deletions(-) diff --git a/WsNovelParser/WsNovelParser.vcxproj b/WsNovelParser/WsNovelParser.vcxproj index 36b818c..6daa1f1 100644 --- a/WsNovelParser/WsNovelParser.vcxproj +++ b/WsNovelParser/WsNovelParser.vcxproj @@ -107,6 +107,9 @@ + + + diff --git a/WsNovelParser/WsNovelParser.vcxproj.filters b/WsNovelParser/WsNovelParser.vcxproj.filters index b597620..a728b41 100644 --- a/WsNovelParser/WsNovelParser.vcxproj.filters +++ b/WsNovelParser/WsNovelParser.vcxproj.filters @@ -44,4 +44,7 @@ + + + \ No newline at end of file diff --git a/WsNovelParser/WsNovelParser.vcxproj.user b/WsNovelParser/WsNovelParser.vcxproj.user index 3c08e59..e5c371e 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-16T15:45:16.4474871Z + 2024-04-17T14:40:52.6884025Z - 2024-04-16T15:45:16.7053041Z + 2024-04-17T14:40:53.5267874Z \ No newline at end of file diff --git a/WsNovelParser/htmlprint.cpp b/WsNovelParser/htmlprint.cpp index 5d099a2..2b483fe 100644 --- a/WsNovelParser/htmlprint.cpp +++ b/WsNovelParser/htmlprint.cpp @@ -422,11 +422,11 @@ void tools_printer::volumes_anchors_define(const QList> lines) { - auto get_node_name = [](const std::shared_ptr item){ - return u8"node_" + QString::number((qulonglong)item->accessPeers()->element().get()); - }; +auto get_node_name = [](const std::shared_ptr item){ + return u8"node_" + QString::number((qulonglong)item->accessPeers()->element().get()); +}; +QString printer::tools_printer::storylines_paint(const QList> &lines) { QHash> node_records; QString nodes_description; for (auto& story : lines) { @@ -434,7 +434,7 @@ QString printer::tools_printer::storylines_paint(const QListsignature()] = story; nodes_description += get_node_name(story) + QString(u8"[label=\"%1\",shape=\"cds\"]\n").arg(story_elem->name()); - for (auto frag : story->elements()) { + 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); @@ -465,3 +465,66 @@ QString printer::tools_printer::storylines_paint(const QList>& vols, const QList>& lines) { + QHash> node_records; + + QString clusters_description; + for (auto& story : lines) { + QString nodes_description; + 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=\"ellipse\"]\n").arg(fragment_elem->name()); + } + } + + auto story_elem = std::dynamic_pointer_cast(story->accessPeers()->element()); + clusters_description += QString(u8"subgraph cluster_%1 { label=%3 \n %2 }") + .arg((qulonglong)story_elem.get()).arg(nodes_description).arg(story_elem->name()); + } + + + auto article_cluster = [&node_records]( + const std::shared_ptr article_access, QList &arrows_out)->QString { + QString nodes_description; + for (auto& fragment_access : article_access->children()) { + if (fragment_access->element()->typeMark() == (int)example_novel::NovelNode::FragmentRefer) { + auto refer_fragment = std::dynamic_pointer_cast(fragment_access->element()); + nodes_description += QString(u8"fragment_%1[label=\"%2\",shape=\"plaintext\"]\n") + .arg((qulonglong)refer_fragment.get()).arg(refer_fragment->fragmentRefer()); + auto symbo_refer = node_records[refer_fragment->referSignature()]; + arrows_out << QString(u8"fragment_%1 -- %2\n").arg((qulonglong)refer_fragment.get()).arg(get_node_name(symbo_refer)); + } + } + auto article_define = std::dynamic_pointer_cast(article_access->element()); + return QString(u8"subgraph cluster_%1{ label=%2 \n %3 }\n").arg((qulonglong)article_access->element().get()) + .arg(article_define->name()).arg(nodes_description); + }; + + QString arrows_link; + for (auto &vol : vols) { + QString members_description; + for (auto& eref : vol->accessPeers()->children()) { + QList arrows_temp; + switch ((example_novel::NovelNode)eref->element()->typeMark()){ + case example_novel::NovelNode::ArticleDefine: + members_description += article_cluster(eref, arrows_temp); + break; + default: + break; + } + for (auto& arrow : arrows_temp) { + arrows_link += arrow; + } + } + + auto volume_elem = std::dynamic_pointer_cast(vol->accessPeers()->element()); + clusters_description += QString(u8"subgraph cluster_%1 { label=%3 \n %2 }") + .arg((qulonglong)volume_elem.get()).arg(members_description).arg(volume_elem->name()); + } + + return QString("graph scale{ %1 \n %2}").arg(clusters_description).arg(arrows_link); +} diff --git a/WsNovelParser/htmlprint.h b/WsNovelParser/htmlprint.h index 3a47295..921f453 100644 --- a/WsNovelParser/htmlprint.h +++ b/WsNovelParser/htmlprint.h @@ -154,6 +154,7 @@ namespace printer { 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); + QString storylines_paint(const QList> &lines); + QString volumes_paint(const QList> &vols, const QList> &lines); }; } \ No newline at end of file diff --git a/WsNovelParser/main.cpp b/WsNovelParser/main.cpp index d18dcfb..6337434 100644 --- a/WsNovelParser/main.cpp +++ b/WsNovelParser/main.cpp @@ -74,6 +74,17 @@ int main(int argc, char* argv[]) { txt << dot_src; txt.flush(); } + system("dot -Tsvg relates.dot -o relates.svg"); + + auto vols_src = tool.volumes_paint(tool.volume_defines.values(), tool.storyline_defines.values()); + QFile vols_file(QDir::current().filePath(u8"volumes_group.dot")); + if (vols_file.open(QIODevice::WriteOnly | QIODevice::Text)) { + QTextStream txt(&vols_file); + txt.setCodec(u8"UTF-8"); + txt << vols_src; + txt.flush(); + } + system("fdp -Tsvg volumes_group.dot -o volumes_group.svg"); std::function, int)> tnode_print = [&](std::shared_ptr node, int intend) { @@ -156,6 +167,10 @@ int main(int argc, char* argv[]) { auto img = doc_inst.createElement(u8"img"); img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"relates.svg")); dom_relate.appendChild(img); + dom_relate.appendChild(doc_inst.createElement("br")); + img = doc_inst.createElement(u8"img"); + img.setAttribute(u8"src", u8"file:///" + QDir::current().filePath(u8"volumes_group.svg")); + dom_relate.appendChild(img); QTextStream tout(&tfile); doc_inst.save(tout, 2); @@ -163,7 +178,6 @@ int main(int argc, char* argv[]) { } } - 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 2ef0a1b..b265dab 100644 --- a/libParse/libParse.vcxproj.user +++ b/libParse/libParse.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-04-16T15:45:17.3540175Z + 2024-04-17T14:40:53.7303429Z - 2024-04-16T15:45:17.5173655Z + 2024-04-17T14:40:53.9873724Z \ No newline at end of file diff --git a/libSyntax/libSyntax.vcxproj.user b/libSyntax/libSyntax.vcxproj.user index 8395fc1..e0ba63b 100644 --- a/libSyntax/libSyntax.vcxproj.user +++ b/libSyntax/libSyntax.vcxproj.user @@ -5,9 +5,9 @@ WindowsLocalDebugger - 2024-04-16T15:45:16.8232289Z + 2024-04-17T14:40:54.1672966Z - 2024-04-16T15:45:17.0319953Z + 2024-04-17T14:40:54.3959724Z \ No newline at end of file diff --git a/libSyntax/libsyntax.cpp b/libSyntax/libsyntax.cpp index ba07be5..04c216e 100644 --- a/libSyntax/libsyntax.cpp +++ b/libSyntax/libsyntax.cpp @@ -114,6 +114,7 @@ std::tuple Seqs::match(const QListtoken_present(); for (auto& r : mbrs_store) { + auto v_token_seqs = r->token_present(); auto result = r->match(stream.mid(token_offset)); token_offset += std::get<1>(result); diff --git a/libSyntax/syntax_novel.cpp b/libSyntax/syntax_novel.cpp index 0588a35..2450d67 100644 --- a/libSyntax/syntax_novel.cpp +++ b/libSyntax/syntax_novel.cpp @@ -85,7 +85,7 @@ ExprRule(u8"volume_define", (int)NovelExprs::VOLUME_DEFINE) .reloadRule(remove_nl, std::make_shared(Buff << OptMulT(newl) << MR(leftb) << OptMulT(newl) << MR(volume) << OptMulT(newl) << MR(ntext) << OptMulT(newl) - << OptMulR(std::make_shared(Buff << fragment_refer << decl_expr << article_decl)) + << OptMulR(std::make_shared(Buff << decl_expr << article_decl)) << MR(rightb) << OptMulT(newl))); auto document_define = diff --git a/libToken/libToken.vcxproj.user b/libToken/libToken.vcxproj.user index 99ea6ba..cd86d16 100644 --- a/libToken/libToken.vcxproj.user +++ b/libToken/libToken.vcxproj.user @@ -2,9 +2,9 @@ - 2024-04-16T15:45:17.1080516Z + 2024-04-17T14:40:54.5095005Z - 2024-04-16T15:45:17.2738131Z + 2024-04-17T14:40:54.8818904Z \ No newline at end of file