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