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; });