From 31ed703644f1a3e84e1bac733d4f28e5e79ecd29 Mon Sep 17 00:00:00 2001
From: codeboss <2422523675@qq.com>
Date: Sun, 31 Mar 2024 13:59:17 +0800
Subject: [PATCH] =?UTF-8?q?=E8=B7=AF=E5=BE=84=E9=87=8D=E7=BD=AE=E5=AE=8C?=
=?UTF-8?q?=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
WsNovelParser/WsNovelParser.vcxproj.user | 4 +-
WsNovelParser/htmlprint.cpp | 49 ++++++++++++++++++++----
WsNovelParser/htmlprint.h | 8 ++--
WsNovelParser/main.cpp | 15 ++++++++
libParse/libParse.vcxproj.user | 4 +-
libSyntax/ast_novel.cpp | 4 ++
libSyntax/ast_novel.h | 1 +
libSyntax/libSyntax.vcxproj.user | 4 +-
libToken/libToken.vcxproj.user | 4 +-
9 files changed, 75 insertions(+), 18 deletions(-)
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