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