From 71d7de9f18ffb2903aa15e13c85ba899f8e39fef Mon Sep 17 00:00:00 2001
From: codeboss <2422523675@qq.com>
Date: Sat, 17 May 2025 19:05:07 +0800
Subject: [PATCH] =?UTF-8?q?=E6=A0=A1=E6=AD=A3=E5=B1=82=E7=BA=A7=E6=AF=94?=
=?UTF-8?q?=E8=BE=83=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
WsNovelParser/WsNovelParser.vcxproj.user | 2 +-
libParse/parse_novel.cpp | 19 +++++++++++++------
2 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/WsNovelParser/WsNovelParser.vcxproj.user b/WsNovelParser/WsNovelParser.vcxproj.user
index 6e591db..5716425 100644
--- a/WsNovelParser/WsNovelParser.vcxproj.user
+++ b/WsNovelParser/WsNovelParser.vcxproj.user
@@ -3,7 +3,7 @@
$(SolutionDir)$(Platform)\$(Configuration)\
WindowsLocalDebugger
- --path "D:/Projects/Cpp/WsNovelParser/x64/test_file/" --dest E:\
+ --path "E:\novel-set" --dest F:\novelout
--path "D:\Projects\Cpp\WsNovelParser\x64\test_file" --dest E:\
diff --git a/libParse/parse_novel.cpp b/libParse/parse_novel.cpp
index 1f94721..6909d6b 100644
--- a/libParse/parse_novel.cpp
+++ b/libParse/parse_novel.cpp
@@ -413,9 +413,11 @@ std::shared_ptr FragmentLayerCheck::_sets_fill(std::shared_ptr node) {
auto fragm = std::static_pointer_cast(node->bind()->element());
for (auto node_t : fragm->children()) {
- auto refn = std::static_pointer_cast(node_t);
- auto target_node = _node_set[refn->referSignature()];
- std::const_pointer_cast(node)->appendNext(target_node);
+ auto refn = std::dynamic_pointer_cast(node_t);
+ if(refn){
+ auto target_node = _node_set[refn->referSignature()];
+ std::const_pointer_cast(node)->appendNext(target_node);
+ }
}
}
@@ -440,14 +442,19 @@ void FragmentLayerCheck::layer_check(std::shared_ptr node)
story_layer_check(node);
break;
default:
- layer_check(node);
+ for(auto ins : node->children())
+ layer_check(ins);
break;
}
}
void FragmentLayerCheck::story_layer_check(std::shared_ptr story) {
auto fragms_list = story->children();
- for (auto curr = ++fragms_list.begin(); curr != fragms_list.end(); ++curr) {
+ decltype(fragms_list) real_elms;
+ std::copy_if(fragms_list.begin(), fragms_list.end(), std::back_inserter(real_elms),
+ [](std::shared_ptr ins) { return ins->element()->typeMark() == (int) NovelNode::FragmentSlice; });
+
+ for (auto curr = ++real_elms.begin(); curr != real_elms.end(); ++curr) {
auto prev = curr - 1;
auto curr_sign = (*curr)->element()->signature();
auto prev_sign = (*prev)->element()->signature();
@@ -471,7 +478,7 @@ void FragmentLayerCheck::sibling_element_compair(std::shared_ptr max1) {
decltype(prev_childs) tempx;
std::copy_if(curr_childs.begin(), curr_childs.end(), std::back_inserter(tempx),
[=](std::shared_ptr ins) { return ins->layerNumber() >= min0; });