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